@efebia/one-env 1.0.0 → 1.0.2
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 +100 -43
- package/lib/cli/commands/pull.d.ts +11 -0
- package/lib/cli/commands/pull.d.ts.map +1 -0
- package/lib/cli/commands/pull.js +98 -0
- package/lib/cli/commands/pull.js.map +1 -0
- package/lib/cli/commands/push.d.ts +11 -0
- package/lib/cli/commands/push.d.ts.map +1 -0
- package/lib/cli/commands/push.js +111 -0
- package/lib/cli/commands/push.js.map +1 -0
- package/lib/cli/env-tool.d.ts +2 -0
- package/lib/cli/env-tool.d.ts.map +1 -1
- package/lib/cli/env-tool.js +28 -0
- package/lib/cli/env-tool.js.map +1 -1
- package/lib/cli/types.d.ts +18 -0
- package/lib/cli/types.d.ts.map +1 -1
- package/lib/cli/utils/aws.d.ts +10 -1
- package/lib/cli/utils/aws.d.ts.map +1 -1
- package/lib/cli/utils/aws.js +34 -1
- package/lib/cli/utils/aws.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# one-env
|
|
1
|
+
# @efebia/one-env
|
|
2
2
|
|
|
3
3
|
Type-safe environment configuration management for Node.js applications with runtime validation and CLI tools.
|
|
4
4
|
|
|
@@ -9,22 +9,23 @@ Type-safe environment configuration management for Node.js applications with run
|
|
|
9
9
|
- 🛠️ **CLI tools** for generating, validating, and managing environment files
|
|
10
10
|
- 🌍 **Multiple sources**: Load from YAML files or JSON environment variables
|
|
11
11
|
- 🚀 **Production ready**: Validate AWS Secrets Manager configurations
|
|
12
|
+
- 📤 **Push & Pull**: Sync secrets with AWS Secrets Manager
|
|
12
13
|
- 💡 **Developer friendly**: Autocomplete for all environment variables
|
|
13
14
|
|
|
14
15
|
## Installation
|
|
15
16
|
|
|
16
17
|
```bash
|
|
17
18
|
# Using npm
|
|
18
|
-
npm install one-env zod
|
|
19
|
+
npm install @efebia/one-env zod
|
|
19
20
|
|
|
20
21
|
# Using yarn
|
|
21
|
-
yarn add one-env zod
|
|
22
|
+
yarn add @efebia/one-env zod
|
|
22
23
|
|
|
23
24
|
# Using pnpm
|
|
24
|
-
pnpm add one-env zod
|
|
25
|
+
pnpm add @efebia/one-env zod
|
|
25
26
|
```
|
|
26
27
|
|
|
27
|
-
Note:
|
|
28
|
+
Note: Zod (^4.0.0) is a peer dependency and must be installed separately.
|
|
28
29
|
|
|
29
30
|
## Quick Start
|
|
30
31
|
|
|
@@ -56,12 +57,16 @@ export default EnvSchema;
|
|
|
56
57
|
### 2. Use in your application
|
|
57
58
|
|
|
58
59
|
```typescript
|
|
59
|
-
//
|
|
60
|
-
import { createEnvWithInit } from 'one-env';
|
|
61
|
-
import EnvSchema from './env-schema';
|
|
60
|
+
// env.ts
|
|
61
|
+
import { createEnvWithInit } from '@efebia/one-env';
|
|
62
|
+
import EnvSchema from './env-schema.js';
|
|
62
63
|
|
|
63
|
-
// Create env instance
|
|
64
|
+
// Create env instance (singleton pattern)
|
|
64
65
|
const env = createEnvWithInit(EnvSchema);
|
|
66
|
+
export default env;
|
|
67
|
+
|
|
68
|
+
// app.ts
|
|
69
|
+
import env from './env.js';
|
|
65
70
|
|
|
66
71
|
// Initialize with YAML file
|
|
67
72
|
env.init({ file: './env.local.yml' });
|
|
@@ -80,11 +85,13 @@ export const config = {
|
|
|
80
85
|
};
|
|
81
86
|
```
|
|
82
87
|
|
|
88
|
+
**Note**: Using `createEnvWithInit` as a singleton helps with concurrency and prevents errors from calling `env.get()` before initialization due to import order issues.
|
|
89
|
+
|
|
83
90
|
### 3. Alternative: Immediate initialization
|
|
84
91
|
|
|
85
92
|
```typescript
|
|
86
|
-
import { createEnv } from 'one-env';
|
|
87
|
-
import EnvSchema from './env-schema';
|
|
93
|
+
import { createEnv } from '@efebia/one-env';
|
|
94
|
+
import EnvSchema from './env-schema.js';
|
|
88
95
|
|
|
89
96
|
// Initialize immediately
|
|
90
97
|
const env = createEnv({
|
|
@@ -98,7 +105,7 @@ const port = env.get('port');
|
|
|
98
105
|
|
|
99
106
|
## CLI Tools
|
|
100
107
|
|
|
101
|
-
one-env includes powerful CLI tools for managing your environment configuration:
|
|
108
|
+
@efebia/one-env includes powerful CLI tools for managing your environment configuration:
|
|
102
109
|
|
|
103
110
|
### Generate environment file
|
|
104
111
|
|
|
@@ -109,7 +116,7 @@ Create a new environment file with default values from your schema:
|
|
|
109
116
|
one-env generate -s ./env-schema.js
|
|
110
117
|
|
|
111
118
|
# Generate with custom output
|
|
112
|
-
one-env generate -s ./env-schema.js -o env.
|
|
119
|
+
one-env generate -s ./env-schema.js -o env.prod.yml
|
|
113
120
|
|
|
114
121
|
# Force overwrite existing file
|
|
115
122
|
one-env generate -s ./env-schema.js --force
|
|
@@ -145,6 +152,62 @@ one-env validate-aws -s ./env-schema.js --secret-name my-app/prod --profile prod
|
|
|
145
152
|
one-env validate-aws -s ./env-schema.js --secret-name my-app/prod --region us-east-1
|
|
146
153
|
```
|
|
147
154
|
|
|
155
|
+
### Pull from AWS Secrets Manager
|
|
156
|
+
|
|
157
|
+
Pull your environment configuration from AWS Secrets Manager to a local file:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# Pull from AWS to local file
|
|
161
|
+
one-env pull -s ./env-schema.js --secret-name dev-envs
|
|
162
|
+
|
|
163
|
+
# Pull with custom output file
|
|
164
|
+
one-env pull -s ./env-schema.js --secret-name prod-envs --output env.prod.yml
|
|
165
|
+
|
|
166
|
+
# Force overwrite existing file
|
|
167
|
+
one-env pull -s ./env-schema.js --secret-name dev-envs --force
|
|
168
|
+
|
|
169
|
+
# With specific AWS profile and region
|
|
170
|
+
one-env pull -s ./env-schema.js --secret-name dev-envs --profile development --region us-east-1
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Push to AWS Secrets Manager
|
|
174
|
+
|
|
175
|
+
Push your local environment configuration to AWS Secrets Manager:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Push to AWS (with confirmation prompt)
|
|
179
|
+
one-env push -s ./env-schema.js --file env.prod.yml --secret-name prod-envs
|
|
180
|
+
|
|
181
|
+
# Push with environment tag
|
|
182
|
+
one-env push -s ./env-schema.js --file env.prod.yml --secret-name prod-envs --environment production
|
|
183
|
+
|
|
184
|
+
# Dry-run to preview what will be pushed
|
|
185
|
+
one-env push -s ./env-schema.js --file env.prod.yml --secret-name prod-envs --dry-run
|
|
186
|
+
|
|
187
|
+
# Skip confirmation prompt (for CI/CD)
|
|
188
|
+
one-env push -s ./env-schema.js --file env.prod.yml --secret-name prod-envs --force
|
|
189
|
+
|
|
190
|
+
# With specific AWS profile and region
|
|
191
|
+
one-env push -s ./env-schema.js --file env.prod.yml --secret-name prod-envs --profile production --region us-east-1
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Typical Workflow
|
|
195
|
+
|
|
196
|
+
Update a single value in development:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# 1. Pull current configuration
|
|
200
|
+
one-env pull -s ./env-schema.js --secret-name dev-envs
|
|
201
|
+
|
|
202
|
+
# 2. Edit the file locally
|
|
203
|
+
vim env.pulled.yml # Change databaseUrl or any other value
|
|
204
|
+
|
|
205
|
+
# 3. Push changes back
|
|
206
|
+
one-env push -s ./env-schema.js --file env.pulled.yml --secret-name dev-envs
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Security Note**: Never commit files containing actual secrets. Use `.gitignore` to exclude environment files with sensitive data.
|
|
210
|
+
|
|
148
211
|
## API Reference
|
|
149
212
|
|
|
150
213
|
### `createEnv(options)`
|
|
@@ -227,49 +290,36 @@ export default z.object({
|
|
|
227
290
|
|
|
228
291
|
### 2. Environment-specific Files
|
|
229
292
|
|
|
230
|
-
|
|
293
|
+
The schema auto-generates environment files with defaults:
|
|
231
294
|
|
|
232
295
|
```
|
|
233
296
|
env.local.yml # Local development (gitignored)
|
|
234
|
-
env.test.yml # Test environment
|
|
235
|
-
env.example.yml # Example file (committed)
|
|
236
297
|
```
|
|
237
298
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
```yaml
|
|
241
|
-
# .github/workflows/validate.yml
|
|
242
|
-
- name: Validate environment
|
|
243
|
-
run: |
|
|
244
|
-
npx one-env validate -s ./env-schema.js --json
|
|
245
|
-
|
|
246
|
-
- name: Validate production secrets
|
|
247
|
-
run: |
|
|
248
|
-
npx one-env validate-aws \
|
|
249
|
-
-s ./env-schema.js \
|
|
250
|
-
--secret-name prod/myapp \
|
|
251
|
-
--profile production
|
|
252
|
-
```
|
|
299
|
+
Use the `generate` command to create new environment files from your schema, eliminating the need for example files.
|
|
253
300
|
|
|
254
|
-
###
|
|
301
|
+
### 3. Singleton Pattern
|
|
255
302
|
|
|
256
|
-
|
|
303
|
+
Create a singleton instance to avoid initialization issues:
|
|
257
304
|
|
|
258
305
|
```typescript
|
|
259
|
-
//
|
|
260
|
-
import { createEnvWithInit } from 'one-env';
|
|
261
|
-
import
|
|
262
|
-
import EnvSchema from './env-schema';
|
|
263
|
-
|
|
264
|
-
export type Config = z.infer<typeof EnvSchema>;
|
|
306
|
+
// env.ts
|
|
307
|
+
import { createEnvWithInit } from '@efebia/one-env';
|
|
308
|
+
import EnvSchema from '../../env-schema.js';
|
|
265
309
|
|
|
266
310
|
const env = createEnvWithInit(EnvSchema);
|
|
267
311
|
export default env;
|
|
268
312
|
```
|
|
269
313
|
|
|
314
|
+
This pattern:
|
|
315
|
+
- Prevents race conditions during initialization
|
|
316
|
+
- Handles import order dependencies gracefully
|
|
317
|
+
- Ensures consistent state across your application
|
|
318
|
+
- Avoids errors from calling `env.get()` before `env.init()`
|
|
319
|
+
|
|
270
320
|
## Error Handling
|
|
271
321
|
|
|
272
|
-
one-env provides clear error messages for configuration issues:
|
|
322
|
+
@efebia/one-env provides clear error messages for configuration issues:
|
|
273
323
|
|
|
274
324
|
```
|
|
275
325
|
Environment validation failed:
|
|
@@ -280,8 +330,8 @@ Environment validation failed:
|
|
|
280
330
|
|
|
281
331
|
## Requirements
|
|
282
332
|
|
|
283
|
-
- Node.js >=
|
|
284
|
-
- Zod
|
|
333
|
+
- Node.js >= 20.0.0
|
|
334
|
+
- Zod (^4.0.0 peer dependency)
|
|
285
335
|
|
|
286
336
|
## License
|
|
287
337
|
|
|
@@ -293,4 +343,11 @@ Contributions are welcome! Please feel free to submit a Pull Request.
|
|
|
293
343
|
|
|
294
344
|
## Support
|
|
295
345
|
|
|
296
|
-
For bugs and feature requests, please [create an issue](https://github.com/
|
|
346
|
+
For bugs and feature requests, please [create an issue](https://github.com/efebia/be-libs/issues).
|
|
347
|
+
|
|
348
|
+
## Changelog
|
|
349
|
+
|
|
350
|
+
### 1.0.2 (Upcoming)
|
|
351
|
+
- Add `pull` command to download secrets from AWS Secrets Manager
|
|
352
|
+
- Rename `upload` command to `push` for consistent workflow
|
|
353
|
+
- Fix Node.js version requirement (>= 20.0.0)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pull command implementation
|
|
3
|
+
* Pulls environment configuration from AWS Secrets Manager to a local file
|
|
4
|
+
*/
|
|
5
|
+
import { PullOptions } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Handles the pull command
|
|
8
|
+
* @param options - Command options
|
|
9
|
+
*/
|
|
10
|
+
export declare function handlePullCommand(options: PullOptions): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=pull.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/pull.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ1C;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+F3E"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pull command implementation
|
|
3
|
+
* Pulls environment configuration from AWS Secrets Manager to a local file
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { createSecretsManagerClient, getSecretValue } from '../utils/aws.js';
|
|
7
|
+
import { resolvePath, fileExists, writeFile, createYamlContent } from '../utils/file.js';
|
|
8
|
+
import { validateEnvData } from '../utils/validation.js';
|
|
9
|
+
import { printValidationResults, printStatus } from '../utils/formatting.js';
|
|
10
|
+
import { loadSchema, formatSchemaSource } from '../utils/schema-loader.js';
|
|
11
|
+
import readline from 'node:readline/promises';
|
|
12
|
+
/**
|
|
13
|
+
* Handles the pull command
|
|
14
|
+
* @param options - Command options
|
|
15
|
+
*/
|
|
16
|
+
export async function handlePullCommand(options) {
|
|
17
|
+
// Configure AWS client
|
|
18
|
+
const client = createSecretsManagerClient(options.region, options.profile);
|
|
19
|
+
try {
|
|
20
|
+
// Load schema dynamically
|
|
21
|
+
printStatus(`Loading schema from ${formatSchemaSource(options.schema)}...`, 'info');
|
|
22
|
+
const schema = await loadSchema(options.schema);
|
|
23
|
+
// Fetch secret from AWS
|
|
24
|
+
printStatus(`Fetching secret '${options.secretName}' from AWS Secrets Manager...`, 'info');
|
|
25
|
+
const secretData = await getSecretValue(client, options.secretName);
|
|
26
|
+
// Validate against schema
|
|
27
|
+
printStatus('Validating pulled configuration against schema...', 'info');
|
|
28
|
+
const validationResults = validateEnvData(secretData, schema, options.secretName, options.region);
|
|
29
|
+
if (!validationResults.success) {
|
|
30
|
+
console.error(`\n${chalk.red.bold('Warning:')} Pulled configuration has validation issues\n`);
|
|
31
|
+
printValidationResults(validationResults);
|
|
32
|
+
console.log(`\n${chalk.yellow('Note:')} The configuration will still be saved, but you should fix these issues before pushing.`);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
printStatus('Configuration is valid!', 'success');
|
|
36
|
+
}
|
|
37
|
+
// Check if output file exists
|
|
38
|
+
const outputPath = resolvePath(options.output);
|
|
39
|
+
if (fileExists(outputPath) && !options.force) {
|
|
40
|
+
const rl = readline.createInterface({
|
|
41
|
+
input: process.stdin,
|
|
42
|
+
output: process.stdout
|
|
43
|
+
});
|
|
44
|
+
console.log(`\n${chalk.yellow.bold('Warning:')} File '${options.output}' already exists`);
|
|
45
|
+
const answer = await rl.question(`\nDo you want to overwrite it? (yes/no): `);
|
|
46
|
+
rl.close();
|
|
47
|
+
if (answer.toLowerCase() !== 'yes' && answer.toLowerCase() !== 'y') {
|
|
48
|
+
console.log('\n' + chalk.yellow('Pull cancelled'));
|
|
49
|
+
process.exit(0);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Create YAML content with header
|
|
53
|
+
const header = `# Environment Configuration File
|
|
54
|
+
# Pulled from AWS Secrets Manager
|
|
55
|
+
# Secret: ${options.secretName}
|
|
56
|
+
# Region: ${options.region}
|
|
57
|
+
# Date: ${new Date().toISOString()}
|
|
58
|
+
#
|
|
59
|
+
# WARNING: This file contains secrets! Do not commit to version control.
|
|
60
|
+
# Add to .gitignore: ${options.output}
|
|
61
|
+
|
|
62
|
+
`;
|
|
63
|
+
const yamlContent = createYamlContent(secretData);
|
|
64
|
+
const fullContent = header + yamlContent.split('\n').slice(3).join('\n'); // Remove default header
|
|
65
|
+
// Write to file
|
|
66
|
+
writeFile(outputPath, fullContent);
|
|
67
|
+
printStatus(`Configuration saved to '${options.output}'`, 'success');
|
|
68
|
+
console.log(`\n${chalk.green.bold('Success!')} Environment configuration has been pulled`);
|
|
69
|
+
console.log(`\n${chalk.yellow.bold('Security reminder:')}`);
|
|
70
|
+
console.log(` - Do not commit this file to version control`);
|
|
71
|
+
console.log(` - Add '${options.output}' to your .gitignore file`);
|
|
72
|
+
console.log(` - Consider adding pattern 'env.*.yml' to .gitignore`);
|
|
73
|
+
console.log(`\n${chalk.cyan('Next steps:')}`);
|
|
74
|
+
console.log(` 1. Edit '${options.output}' to make your changes`);
|
|
75
|
+
console.log(` 2. Push changes back:`);
|
|
76
|
+
console.log(chalk.cyan(` one-env push --schema ${options.schema} --file ${options.output} --secret-name ${options.secretName} --region ${options.region}`));
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
const tips = [];
|
|
80
|
+
if (error.message.includes('not found')) {
|
|
81
|
+
tips.push('Check that the secret name and region are correct.');
|
|
82
|
+
tips.push('Ensure you have AWS credentials configured.');
|
|
83
|
+
}
|
|
84
|
+
else if (error.message.includes('credentials')) {
|
|
85
|
+
tips.push("Configure AWS credentials using 'aws configure' or environment variables.");
|
|
86
|
+
}
|
|
87
|
+
else if (error.message.includes('AccessDenied')) {
|
|
88
|
+
tips.push('Ensure your AWS credentials have permission to read secrets.');
|
|
89
|
+
tips.push('Required permission: secretsmanager:GetSecretValue');
|
|
90
|
+
}
|
|
91
|
+
console.error(`\n${chalk.red.bold('Error:')} ${error.message}\n`);
|
|
92
|
+
tips.forEach(tip => {
|
|
93
|
+
console.log(`${chalk.yellow('Tip:')} ${tip}`);
|
|
94
|
+
});
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=pull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/cli/commands/pull.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Push command implementation
|
|
3
|
+
* Pushes environment configuration to AWS Secrets Manager
|
|
4
|
+
*/
|
|
5
|
+
import { PushOptions } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Handles the push command
|
|
8
|
+
* @param options - Command options
|
|
9
|
+
*/
|
|
10
|
+
export declare function handlePushCommand(options: PushOptions): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=push.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ1C;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkH3E"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Push command implementation
|
|
3
|
+
* Pushes environment configuration to AWS Secrets Manager
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { createSecretsManagerClient, createOrUpdateSecret, getSecretValue } from '../utils/aws.js';
|
|
7
|
+
import { resolvePath, loadYamlFile } from '../utils/file.js';
|
|
8
|
+
import { validateEnvData } from '../utils/validation.js';
|
|
9
|
+
import { printValidationResults, printStatus } from '../utils/formatting.js';
|
|
10
|
+
import { loadSchema, formatSchemaSource } from '../utils/schema-loader.js';
|
|
11
|
+
import readline from 'node:readline/promises';
|
|
12
|
+
/**
|
|
13
|
+
* Handles the push command
|
|
14
|
+
* @param options - Command options
|
|
15
|
+
*/
|
|
16
|
+
export async function handlePushCommand(options) {
|
|
17
|
+
// Configure AWS client
|
|
18
|
+
const client = createSecretsManagerClient(options.region, options.profile);
|
|
19
|
+
try {
|
|
20
|
+
// Load schema dynamically
|
|
21
|
+
printStatus(`Loading schema from ${formatSchemaSource(options.schema)}...`, 'info');
|
|
22
|
+
const schema = await loadSchema(options.schema);
|
|
23
|
+
// Load environment file
|
|
24
|
+
printStatus(`Loading environment file '${options.file}'...`, 'info');
|
|
25
|
+
const filePath = resolvePath(options.file);
|
|
26
|
+
const envData = loadYamlFile(filePath);
|
|
27
|
+
// Validate against schema first
|
|
28
|
+
printStatus('Validating configuration against schema...', 'info');
|
|
29
|
+
const validationResults = validateEnvData(envData, schema, options.file);
|
|
30
|
+
if (!validationResults.success) {
|
|
31
|
+
console.error(`\n${chalk.red.bold('Error:')} Configuration validation failed\n`);
|
|
32
|
+
printValidationResults(validationResults);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
printStatus('Configuration is valid!', 'success');
|
|
36
|
+
// Check if secret exists (for dry-run info)
|
|
37
|
+
let secretExists = false;
|
|
38
|
+
try {
|
|
39
|
+
await getSecretValue(client, options.secretName);
|
|
40
|
+
secretExists = true;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (!error.message.includes('not found')) {
|
|
44
|
+
throw error; // Re-throw if it's not a "not found" error
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Dry-run mode
|
|
48
|
+
if (options.dryRun) {
|
|
49
|
+
console.log(`\n${chalk.blue.bold('DRY-RUN MODE:')} No changes will be made\n`);
|
|
50
|
+
console.log(chalk.cyan('Secret Details:'));
|
|
51
|
+
console.log(` Name: ${options.secretName}`);
|
|
52
|
+
console.log(` Region: ${options.region}`);
|
|
53
|
+
console.log(` Environment: ${options.environment || 'Not specified'}`);
|
|
54
|
+
console.log(` Status: ${secretExists ? 'UPDATE existing secret' : 'CREATE new secret'}`);
|
|
55
|
+
if (secretExists) {
|
|
56
|
+
console.log(`\n${chalk.yellow('Note:')} Secret already exists and will be updated`);
|
|
57
|
+
}
|
|
58
|
+
console.log(`\n${chalk.cyan('Configuration to push:')}`);
|
|
59
|
+
console.log(JSON.stringify(envData, null, 2));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// Confirmation prompt (unless --force)
|
|
63
|
+
if (!options.force) {
|
|
64
|
+
const rl = readline.createInterface({
|
|
65
|
+
input: process.stdin,
|
|
66
|
+
output: process.stdout
|
|
67
|
+
});
|
|
68
|
+
console.log(`\n${chalk.yellow.bold('Warning:')} You are about to ${secretExists ? 'UPDATE' : 'CREATE'} a secret in AWS Secrets Manager`);
|
|
69
|
+
console.log(` Secret: ${options.secretName}`);
|
|
70
|
+
console.log(` Region: ${options.region}`);
|
|
71
|
+
if (options.environment) {
|
|
72
|
+
console.log(` Environment: ${options.environment}`);
|
|
73
|
+
}
|
|
74
|
+
const answer = await rl.question(`\nDo you want to continue? (yes/no): `);
|
|
75
|
+
rl.close();
|
|
76
|
+
if (answer.toLowerCase() !== 'yes' && answer.toLowerCase() !== 'y') {
|
|
77
|
+
console.log('\n' + chalk.yellow('Push cancelled'));
|
|
78
|
+
process.exit(0);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Push to AWS
|
|
82
|
+
printStatus(`${secretExists ? 'Updating' : 'Creating'} secret '${options.secretName}' in AWS Secrets Manager...`, 'info');
|
|
83
|
+
const tags = options.environment ? [
|
|
84
|
+
{ Key: 'Environment', Value: options.environment },
|
|
85
|
+
{ Key: 'ManagedBy', Value: 'one-env' }
|
|
86
|
+
] : [
|
|
87
|
+
{ Key: 'ManagedBy', Value: 'one-env' }
|
|
88
|
+
];
|
|
89
|
+
await createOrUpdateSecret(client, options.secretName, envData, tags);
|
|
90
|
+
printStatus(`Secret '${options.secretName}' ${secretExists ? 'updated' : 'created'} successfully!`, 'success');
|
|
91
|
+
console.log(`\n${chalk.green.bold('Success!')} Environment configuration has been pushed`);
|
|
92
|
+
console.log(`\nYou can validate it with:`);
|
|
93
|
+
console.log(chalk.cyan(` one-env validate-aws --schema ${options.schema} --secret-name ${options.secretName} --region ${options.region}`));
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
const tips = [];
|
|
97
|
+
if (error.message.includes('credentials')) {
|
|
98
|
+
tips.push("Configure AWS credentials using 'aws configure' or environment variables.");
|
|
99
|
+
}
|
|
100
|
+
else if (error.message.includes('AccessDenied')) {
|
|
101
|
+
tips.push('Ensure your AWS credentials have permission to create/update secrets.');
|
|
102
|
+
tips.push('Required permissions: secretsmanager:CreateSecret, secretsmanager:UpdateSecret, secretsmanager:TagResource');
|
|
103
|
+
}
|
|
104
|
+
console.error(`\n${chalk.red.bold('Error:')} ${error.message}\n`);
|
|
105
|
+
tips.forEach(tip => {
|
|
106
|
+
console.log(`${chalk.yellow('Tip:')} ${tip}`);
|
|
107
|
+
});
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/cli/commands/push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAE9C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAoB;IACxD,uBAAuB;IACvB,MAAM,MAAM,GAAG,0BAA0B,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3E,IAAI,CAAC;QACD,0BAA0B;QAC1B,WAAW,CAAC,uBAAuB,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEhD,wBAAwB;QACxB,WAAW,CAAC,6BAA6B,OAAO,CAAC,IAAI,MAAM,EAAE,MAAM,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QAEvC,gCAAgC;QAChC,WAAW,CAAC,4CAA4C,EAAE,MAAM,CAAC,CAAC;QAClE,MAAM,iBAAiB,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAEzE,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,oCAAoC,CAAC,CAAC;YACjF,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,WAAW,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAC;QAElD,4CAA4C;QAC5C,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC;YACD,MAAM,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;YACjD,YAAY,GAAG,IAAI,CAAC;QACxB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACvC,MAAM,KAAK,CAAC,CAAC,2CAA2C;YAC5D,CAAC;QACL,CAAC;QAED,eAAe;QACf,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,4BAA4B,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,WAAW,IAAI,eAAe,EAAE,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,aAAa,YAAY,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;YAE1F,IAAI,YAAY,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;YACxF,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAE9C,OAAO;QACX,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;gBAChC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;aACzB,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,kCAAkC,CAAC,CAAC;YACzI,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3C,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC;YAC1E,EAAE,CAAC,KAAK,EAAE,CAAC;YAEX,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;QACL,CAAC;QAED,cAAc;QACd,WAAW,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,YAAY,OAAO,CAAC,UAAU,6BAA6B,EAAE,MAAM,CAAC,CAAC;QAE1H,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YAC/B,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE;YAClD,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE;SACzC,CAAC,CAAC,CAAC;YACA,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE;SACzC,CAAC;QAEF,MAAM,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAEtE,WAAW,CAAC,WAAW,OAAO,CAAC,UAAU,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,gBAAgB,EAAE,SAAS,CAAC,CAAC;QAE/G,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,4CAA4C,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,OAAO,CAAC,MAAM,kBAAkB,OAAO,CAAC,UAAU,aAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEhJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;QAC3F,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;YACnF,IAAI,CAAC,IAAI,CAAC,4GAA4G,CAAC,CAAC;QAC5H,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACf,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC"}
|
package/lib/cli/env-tool.d.ts
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* - generate: Creates new environment files with default values from schema
|
|
7
7
|
* - validate: Validates existing environment files against the schema
|
|
8
8
|
* - validate-aws: Validates AWS Secrets Manager secrets against the schema
|
|
9
|
+
* - pull: Pulls environment configuration from AWS Secrets Manager
|
|
10
|
+
* - push: Pushes environment configuration to AWS Secrets Manager
|
|
9
11
|
*/
|
|
10
12
|
export {};
|
|
11
13
|
//# sourceMappingURL=env-tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-tool.d.ts","sourceRoot":"","sources":["../../src/cli/env-tool.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"env-tool.d.ts","sourceRoot":"","sources":["../../src/cli/env-tool.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG"}
|
package/lib/cli/env-tool.js
CHANGED
|
@@ -6,12 +6,16 @@
|
|
|
6
6
|
* - generate: Creates new environment files with default values from schema
|
|
7
7
|
* - validate: Validates existing environment files against the schema
|
|
8
8
|
* - validate-aws: Validates AWS Secrets Manager secrets against the schema
|
|
9
|
+
* - pull: Pulls environment configuration from AWS Secrets Manager
|
|
10
|
+
* - push: Pushes environment configuration to AWS Secrets Manager
|
|
9
11
|
*/
|
|
10
12
|
import { Command } from 'commander';
|
|
11
13
|
import chalk from 'chalk';
|
|
12
14
|
import { handleGenerateCommand } from './commands/generate.js';
|
|
13
15
|
import { handleValidateCommand } from './commands/validate.js';
|
|
14
16
|
import { handleValidateAwsCommand } from './commands/validate-aws.js';
|
|
17
|
+
import { handlePushCommand } from './commands/push.js';
|
|
18
|
+
import { handlePullCommand } from './commands/pull.js';
|
|
15
19
|
// ============================================================================
|
|
16
20
|
// MAIN CLI SETUP
|
|
17
21
|
// ============================================================================
|
|
@@ -46,6 +50,30 @@ program
|
|
|
46
50
|
.option('--profile <profile>', 'AWS profile to use (optional)')
|
|
47
51
|
.option('--json', 'Output results in JSON format', false)
|
|
48
52
|
.action(handleValidateAwsCommand);
|
|
53
|
+
// Pull command
|
|
54
|
+
program
|
|
55
|
+
.command('pull')
|
|
56
|
+
.description('Pull environment configuration from AWS Secrets Manager')
|
|
57
|
+
.requiredOption('-s, --schema <path>', 'Path to schema file (TypeScript or JavaScript)')
|
|
58
|
+
.option('--secret-name <name>', 'Name of the secret in AWS Secrets Manager', 'envs')
|
|
59
|
+
.option('--output <file>', 'Output file name', 'env.pulled.yml')
|
|
60
|
+
.option('--region <region>', 'AWS region', process.env['AWS_REGION'] || 'eu-west-1')
|
|
61
|
+
.option('--profile <profile>', 'AWS profile to use (optional)')
|
|
62
|
+
.option('--force', 'Overwrite existing file without confirmation', false)
|
|
63
|
+
.action(handlePullCommand);
|
|
64
|
+
// Push command
|
|
65
|
+
program
|
|
66
|
+
.command('push')
|
|
67
|
+
.description('Push environment configuration to AWS Secrets Manager')
|
|
68
|
+
.requiredOption('-s, --schema <path>', 'Path to schema file (TypeScript or JavaScript)')
|
|
69
|
+
.requiredOption('--file <path>', 'Path to the environment file to push')
|
|
70
|
+
.option('--secret-name <name>', 'Name of the secret in AWS Secrets Manager', 'envs')
|
|
71
|
+
.option('--region <region>', 'AWS region', process.env['AWS_REGION'] || 'eu-west-1')
|
|
72
|
+
.option('--profile <profile>', 'AWS profile to use (optional)')
|
|
73
|
+
.option('--environment <env>', 'Environment tag (e.g., dev, staging, prod)')
|
|
74
|
+
.option('--dry-run', 'Preview what would be pushed without making changes', false)
|
|
75
|
+
.option('--force', 'Skip confirmation prompts', false)
|
|
76
|
+
.action(handlePushCommand);
|
|
49
77
|
// Check dependencies before running
|
|
50
78
|
try {
|
|
51
79
|
await import('js-yaml');
|
package/lib/cli/env-tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-tool.js","sourceRoot":"","sources":["../../src/cli/env-tool.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"env-tool.js","sourceRoot":"","sources":["../../src/cli/env-tool.ts"],"names":[],"mappings":"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"}
|
package/lib/cli/types.d.ts
CHANGED
|
@@ -18,6 +18,24 @@ export interface ValidateAwsOptions {
|
|
|
18
18
|
profile?: string;
|
|
19
19
|
json: boolean;
|
|
20
20
|
}
|
|
21
|
+
export interface PushOptions {
|
|
22
|
+
schema: string;
|
|
23
|
+
file: string;
|
|
24
|
+
secretName: string;
|
|
25
|
+
region: string;
|
|
26
|
+
profile?: string;
|
|
27
|
+
environment?: string;
|
|
28
|
+
dryRun: boolean;
|
|
29
|
+
force: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface PullOptions {
|
|
32
|
+
schema: string;
|
|
33
|
+
secretName: string;
|
|
34
|
+
output: string;
|
|
35
|
+
region: string;
|
|
36
|
+
profile?: string;
|
|
37
|
+
force: boolean;
|
|
38
|
+
}
|
|
21
39
|
export interface ValidationResult {
|
|
22
40
|
success: boolean;
|
|
23
41
|
source: string;
|
package/lib/cli/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACjB;AAGD,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC5B,eAAe,EAAE,cAAc,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAGD,MAAM,WAAW,oBAAoB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAGD,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,UAAU,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,YAAY,GAAG,WAAW,GAAG,kBAAkB,CAAC;IACtD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"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"}
|
package/lib/cli/utils/aws.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AWS utilities for the environment CLI tool
|
|
3
3
|
*/
|
|
4
|
-
import { SecretsManagerClient } from '@aws-sdk/client-secrets-manager';
|
|
4
|
+
import { SecretsManagerClient, Tag } from '@aws-sdk/client-secrets-manager';
|
|
5
5
|
/**
|
|
6
6
|
* Creates an AWS Secrets Manager client
|
|
7
7
|
* @param region - AWS region
|
|
@@ -17,4 +17,13 @@ export declare function createSecretsManagerClient(region: string, profile?: str
|
|
|
17
17
|
* @throws Error if secret not found or has no value
|
|
18
18
|
*/
|
|
19
19
|
export declare function getSecretValue(client: SecretsManagerClient, secretName: string): Promise<any>;
|
|
20
|
+
/**
|
|
21
|
+
* Creates or updates a secret in AWS Secrets Manager
|
|
22
|
+
* @param client - SecretsManagerClient instance
|
|
23
|
+
* @param secretName - Name of the secret to create/update
|
|
24
|
+
* @param secretData - The data to store in the secret
|
|
25
|
+
* @param tags - Optional tags to apply to the secret
|
|
26
|
+
* @throws Error if creation/update fails
|
|
27
|
+
*/
|
|
28
|
+
export declare function createOrUpdateSecret(client: SecretsManagerClient, secretName: string, secretData: any, tags?: Tag[]): Promise<void>;
|
|
20
29
|
//# sourceMappingURL=aws.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aws.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/aws.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"aws.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/aws.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACH,oBAAoB,EAIpB,GAAG,EACN,MAAM,iCAAiC,CAAC;AAEzC;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAWjG;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAsBnG;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,oBAAoB,EAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,GAAG,EACf,IAAI,CAAC,EAAE,GAAG,EAAE,GACb,OAAO,CAAC,IAAI,CAAC,CAyBf"}
|
package/lib/cli/utils/aws.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AWS utilities for the environment CLI tool
|
|
3
3
|
*/
|
|
4
|
-
import { SecretsManagerClient, GetSecretValueCommand } from '@aws-sdk/client-secrets-manager';
|
|
4
|
+
import { SecretsManagerClient, GetSecretValueCommand, CreateSecretCommand, UpdateSecretCommand } from '@aws-sdk/client-secrets-manager';
|
|
5
5
|
/**
|
|
6
6
|
* Creates an AWS Secrets Manager client
|
|
7
7
|
* @param region - AWS region
|
|
@@ -47,4 +47,37 @@ export async function getSecretValue(client, secretName) {
|
|
|
47
47
|
throw error;
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Creates or updates a secret in AWS Secrets Manager
|
|
52
|
+
* @param client - SecretsManagerClient instance
|
|
53
|
+
* @param secretName - Name of the secret to create/update
|
|
54
|
+
* @param secretData - The data to store in the secret
|
|
55
|
+
* @param tags - Optional tags to apply to the secret
|
|
56
|
+
* @throws Error if creation/update fails
|
|
57
|
+
*/
|
|
58
|
+
export async function createOrUpdateSecret(client, secretName, secretData, tags) {
|
|
59
|
+
const secretString = JSON.stringify(secretData, null, 2);
|
|
60
|
+
try {
|
|
61
|
+
// Try to create the secret first
|
|
62
|
+
const createCommand = new CreateSecretCommand({
|
|
63
|
+
Name: secretName,
|
|
64
|
+
SecretString: secretString,
|
|
65
|
+
Tags: tags
|
|
66
|
+
});
|
|
67
|
+
await client.send(createCommand);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error.name === 'ResourceExistsException') {
|
|
71
|
+
// Secret already exists, update it instead
|
|
72
|
+
const updateCommand = new UpdateSecretCommand({
|
|
73
|
+
SecretId: secretName,
|
|
74
|
+
SecretString: secretString
|
|
75
|
+
});
|
|
76
|
+
await client.send(updateCommand);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
50
83
|
//# sourceMappingURL=aws.js.map
|
package/lib/cli/utils/aws.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aws.js","sourceRoot":"","sources":["../../../src/cli/utils/aws.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"aws.js","sourceRoot":"","sources":["../../../src/cli/utils/aws.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACH,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EAEtB,MAAM,iCAAiC,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAc,EAAE,OAAgB;IACvE,MAAM,YAAY,GAAQ;QACtB,MAAM,EAAE,MAAM;KACjB,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACV,uCAAuC;QACvC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC;IACtC,CAAC;IAED,OAAO,IAAI,oBAAoB,CAAC,YAAY,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAA4B,EAAE,UAAkB;IACjF,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC;YACtC,QAAQ,EAAE,UAAU;SACvB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5C,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,IAAI,KAAK,CAAC,IAAI,KAAK,2BAA2B,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,oCAAoC,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,MAA4B,EAC5B,UAAkB,EAClB,UAAe,EACf,IAAY;IAEZ,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEzD,IAAI,CAAC;QACD,iCAAiC;QACjC,MAAM,aAAa,GAAG,IAAI,mBAAmB,CAAC;YAC1C,IAAI,EAAE,UAAU;YAChB,YAAY,EAAE,YAAY;YAC1B,IAAI,EAAE,IAAI;SACb,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,IAAI,KAAK,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;YAC3C,2CAA2C;YAC3C,MAAM,aAAa,GAAG,IAAI,mBAAmB,CAAC;gBAC1C,QAAQ,EAAE,UAAU;gBACpB,YAAY,EAAE,YAAY;aAC7B,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACJ,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;AACL,CAAC"}
|