@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 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: `zod` v4 is a peer dependency and must be installed separately.
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
- // config.ts
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.example.yml
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
- Use different files for different environments:
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
- ### 3. CI/CD Integration
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
- ### 4. Type Exports
268
+ ### 3. Singleton Pattern
255
269
 
256
- Export types for use across your application:
270
+ Create a singleton instance to avoid initialization issues:
257
271
 
258
272
  ```typescript
259
- // config.ts
260
- import { createEnvWithInit } from 'one-env';
261
- import { z } from 'zod/v4';
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 >= 18.0.0
284
- - Zod v4 (peer dependency)
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/yourusername/one-env/issues).
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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"}
@@ -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;;;;;;;GAOG"}
1
+ {"version":3,"file":"env-tool.d.ts","sourceRoot":"","sources":["../../src/cli/env-tool.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
@@ -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');
@@ -1 +1 @@
1
- {"version":3,"file":"env-tool.js","sourceRoot":"","sources":["../../src/cli/env-tool.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,mBAAmB;AACnB,OAAO;KACF,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,cAAc,CAAC,qBAAqB,EAAE,gDAAgD,CAAC;KACvF,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,eAAe,CAAC;KAClE,MAAM,CAAC,aAAa,EAAE,8CAA8C,EAAE,KAAK,CAAC;KAC5E,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEnC,mBAAmB;AACnB,OAAO;KACF,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,mDAAmD,CAAC;KAChE,cAAc,CAAC,qBAAqB,EAAE,gDAAgD,CAAC;KACvF,MAAM,CAAC,mBAAmB,EAAE,8BAA8B,EAAE,eAAe,CAAC;KAC5E,MAAM,CAAC,QAAQ,EAAE,+BAA+B,EAAE,KAAK,CAAC;KACxD,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEnC,uBAAuB;AACvB,OAAO;KACF,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,qDAAqD,CAAC;KAClE,cAAc,CAAC,qBAAqB,EAAE,gDAAgD,CAAC;KACvF,MAAM,CAAC,sBAAsB,EAAE,2CAA2C,EAAE,MAAM,CAAC;KACnF,MAAM,CAAC,mBAAmB,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC;KACnF,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;KAC9D,MAAM,CAAC,QAAQ,EAAE,+BAA+B,EAAE,KAAK,CAAC;KACxD,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAEtC,oCAAoC;AACpC,IAAI,CAAC;IACD,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;AAC5B,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,oCAAoC,CAAC,CAAC;IAC5E,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,cAAc;AACd,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"env-tool.js","sourceRoot":"","sources":["../../src/cli/env-tool.ts"],"names":[],"mappings":"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"}
@@ -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;
@@ -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"}
@@ -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,EAAE,oBAAoB,EAAyB,MAAM,iCAAiC,CAAC;AAE9F;;;;;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"}
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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"aws.js","sourceRoot":"","sources":["../../../src/cli/utils/aws.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE9F;;;;;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"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@efebia/one-env",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Type-safe environment configuration with validation and CLI tools",
5
5
  "keywords": [
6
6
  "env",