@efebia/one-env 1.0.0 → 1.0.1
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 +60 -43
- package/lib/cli/commands/upload.d.ts +11 -0
- package/lib/cli/commands/upload.d.ts.map +1 -0
- package/lib/cli/commands/upload.js +111 -0
- package/lib/cli/commands/upload.js.map +1 -0
- package/lib/cli/env-tool.d.ts +1 -0
- package/lib/cli/env-tool.d.ts.map +1 -1
- package/lib/cli/env-tool.js +15 -0
- package/lib/cli/env-tool.js.map +1 -1
- package/lib/cli/types.d.ts +10 -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
|
+
- 📤 **Upload secrets** to 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,29 @@ 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
|
+
### Upload to AWS Secrets Manager
|
|
156
|
+
|
|
157
|
+
Upload your environment configuration to AWS Secrets Manager:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# Upload to AWS (with confirmation prompt)
|
|
161
|
+
one-env upload -s ./env-schema.js --file env.prod.yml --secret-name prod-envs
|
|
162
|
+
|
|
163
|
+
# Upload with environment tag
|
|
164
|
+
one-env upload -s ./env-schema.js --file env.prod.yml --secret-name prod-envs --environment production
|
|
165
|
+
|
|
166
|
+
# Dry-run to preview what will be uploaded
|
|
167
|
+
one-env upload -s ./env-schema.js --file env.prod.yml --secret-name prod-envs --dry-run
|
|
168
|
+
|
|
169
|
+
# Skip confirmation prompt (for CI/CD)
|
|
170
|
+
one-env upload -s ./env-schema.js --file env.prod.yml --secret-name prod-envs --force
|
|
171
|
+
|
|
172
|
+
# With specific AWS profile and region
|
|
173
|
+
one-env upload -s ./env-schema.js --file env.prod.yml --secret-name prod-envs --profile production --region us-east-1
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Security Note**: Never commit files containing actual secrets. Use `.gitignore` to exclude environment files with sensitive data.
|
|
177
|
+
|
|
148
178
|
## API Reference
|
|
149
179
|
|
|
150
180
|
### `createEnv(options)`
|
|
@@ -227,49 +257,36 @@ export default z.object({
|
|
|
227
257
|
|
|
228
258
|
### 2. Environment-specific Files
|
|
229
259
|
|
|
230
|
-
|
|
260
|
+
The schema auto-generates environment files with defaults:
|
|
231
261
|
|
|
232
262
|
```
|
|
233
263
|
env.local.yml # Local development (gitignored)
|
|
234
|
-
env.test.yml # Test environment
|
|
235
|
-
env.example.yml # Example file (committed)
|
|
236
264
|
```
|
|
237
265
|
|
|
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
|
-
```
|
|
266
|
+
Use the `generate` command to create new environment files from your schema, eliminating the need for example files.
|
|
253
267
|
|
|
254
|
-
###
|
|
268
|
+
### 3. Singleton Pattern
|
|
255
269
|
|
|
256
|
-
|
|
270
|
+
Create a singleton instance to avoid initialization issues:
|
|
257
271
|
|
|
258
272
|
```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>;
|
|
273
|
+
// env.ts
|
|
274
|
+
import { createEnvWithInit } from '@efebia/one-env';
|
|
275
|
+
import EnvSchema from '../../env-schema.js';
|
|
265
276
|
|
|
266
277
|
const env = createEnvWithInit(EnvSchema);
|
|
267
278
|
export default env;
|
|
268
279
|
```
|
|
269
280
|
|
|
281
|
+
This pattern:
|
|
282
|
+
- Prevents race conditions during initialization
|
|
283
|
+
- Handles import order dependencies gracefully
|
|
284
|
+
- Ensures consistent state across your application
|
|
285
|
+
- Avoids errors from calling `env.get()` before `env.init()`
|
|
286
|
+
|
|
270
287
|
## Error Handling
|
|
271
288
|
|
|
272
|
-
one-env provides clear error messages for configuration issues:
|
|
289
|
+
@efebia/one-env provides clear error messages for configuration issues:
|
|
273
290
|
|
|
274
291
|
```
|
|
275
292
|
Environment validation failed:
|
|
@@ -280,8 +297,8 @@ Environment validation failed:
|
|
|
280
297
|
|
|
281
298
|
## Requirements
|
|
282
299
|
|
|
283
|
-
- Node.js >=
|
|
284
|
-
- Zod
|
|
300
|
+
- Node.js >= 20.0.0
|
|
301
|
+
- Zod (^4.0.0 peer dependency)
|
|
285
302
|
|
|
286
303
|
## License
|
|
287
304
|
|
|
@@ -293,4 +310,4 @@ Contributions are welcome! Please feel free to submit a Pull Request.
|
|
|
293
310
|
|
|
294
311
|
## Support
|
|
295
312
|
|
|
296
|
-
For bugs and feature requests, please [create an issue](https://github.com/
|
|
313
|
+
For bugs and feature requests, please [create an issue](https://github.com/efebia/be-libs/issues).
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upload command implementation
|
|
3
|
+
* Uploads environment configuration to AWS Secrets Manager
|
|
4
|
+
*/
|
|
5
|
+
import { UploadOptions } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Handles the upload command
|
|
8
|
+
* @param options - Command options
|
|
9
|
+
*/
|
|
10
|
+
export declare function handleUploadCommand(options: UploadOptions): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/upload.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ5C;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkH/E"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upload command implementation
|
|
3
|
+
* Uploads 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 upload command
|
|
14
|
+
* @param options - Command options
|
|
15
|
+
*/
|
|
16
|
+
export async function handleUploadCommand(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 upload:')}`);
|
|
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('Upload cancelled'));
|
|
78
|
+
process.exit(0);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Upload 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 uploaded`);
|
|
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=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/cli/commands/upload.ts"],"names":[],"mappings":"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"}
|
package/lib/cli/env-tool.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
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
|
+
* - upload: Uploads environment configuration to AWS Secrets Manager
|
|
9
10
|
*/
|
|
10
11
|
export {};
|
|
11
12
|
//# 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;;;;;;;;GAQG"}
|
package/lib/cli/env-tool.js
CHANGED
|
@@ -6,12 +6,14 @@
|
|
|
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
|
+
* - upload: Uploads environment configuration to AWS Secrets Manager
|
|
9
10
|
*/
|
|
10
11
|
import { Command } from 'commander';
|
|
11
12
|
import chalk from 'chalk';
|
|
12
13
|
import { handleGenerateCommand } from './commands/generate.js';
|
|
13
14
|
import { handleValidateCommand } from './commands/validate.js';
|
|
14
15
|
import { handleValidateAwsCommand } from './commands/validate-aws.js';
|
|
16
|
+
import { handleUploadCommand } from './commands/upload.js';
|
|
15
17
|
// ============================================================================
|
|
16
18
|
// MAIN CLI SETUP
|
|
17
19
|
// ============================================================================
|
|
@@ -46,6 +48,19 @@ program
|
|
|
46
48
|
.option('--profile <profile>', 'AWS profile to use (optional)')
|
|
47
49
|
.option('--json', 'Output results in JSON format', false)
|
|
48
50
|
.action(handleValidateAwsCommand);
|
|
51
|
+
// Upload command
|
|
52
|
+
program
|
|
53
|
+
.command('upload')
|
|
54
|
+
.description('Upload environment configuration to AWS Secrets Manager')
|
|
55
|
+
.requiredOption('-s, --schema <path>', 'Path to schema file (TypeScript or JavaScript)')
|
|
56
|
+
.requiredOption('--file <path>', 'Path to the environment file to upload')
|
|
57
|
+
.option('--secret-name <name>', 'Name of the secret in AWS Secrets Manager', 'envs')
|
|
58
|
+
.option('--region <region>', 'AWS region', process.env['AWS_REGION'] || 'eu-west-1')
|
|
59
|
+
.option('--profile <profile>', 'AWS profile to use (optional)')
|
|
60
|
+
.option('--environment <env>', 'Environment tag (e.g., dev, staging, prod)')
|
|
61
|
+
.option('--dry-run', 'Preview what would be uploaded without making changes', false)
|
|
62
|
+
.option('--force', 'Skip confirmation prompts', false)
|
|
63
|
+
.action(handleUploadCommand);
|
|
49
64
|
// Check dependencies before running
|
|
50
65
|
try {
|
|
51
66
|
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,16 @@ export interface ValidateAwsOptions {
|
|
|
18
18
|
profile?: string;
|
|
19
19
|
json: boolean;
|
|
20
20
|
}
|
|
21
|
+
export interface UploadOptions {
|
|
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
|
+
}
|
|
21
31
|
export interface ValidationResult {
|
|
22
32
|
success: boolean;
|
|
23
33
|
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":"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;AAED,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAClB;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"}
|
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"}
|