@efebia/one-env 1.0.1 → 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 CHANGED
@@ -9,7 +9,7 @@ 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
+ - 📤 **Push & Pull**: Sync secrets with AWS Secrets Manager
13
13
  - 💡 **Developer friendly**: Autocomplete for all environment variables
14
14
 
15
15
  ## Installation
@@ -152,25 +152,58 @@ one-env validate-aws -s ./env-schema.js --secret-name my-app/prod --profile prod
152
152
  one-env validate-aws -s ./env-schema.js --secret-name my-app/prod --region us-east-1
153
153
  ```
154
154
 
155
- ### Upload to AWS Secrets Manager
155
+ ### Pull from AWS Secrets Manager
156
156
 
157
- Upload your environment configuration to AWS Secrets Manager:
157
+ Pull your environment configuration from AWS Secrets Manager to a local file:
158
158
 
159
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
160
+ # Pull from AWS to local file
161
+ one-env pull -s ./env-schema.js --secret-name dev-envs
162
162
 
163
- # Upload with environment tag
164
- one-env upload -s ./env-schema.js --file env.prod.yml --secret-name prod-envs --environment production
163
+ # Pull with custom output file
164
+ one-env pull -s ./env-schema.js --secret-name prod-envs --output env.prod.yml
165
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
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
168
186
 
169
187
  # Skip confirmation prompt (for CI/CD)
170
- one-env upload -s ./env-schema.js --file env.prod.yml --secret-name prod-envs --force
188
+ one-env push -s ./env-schema.js --file env.prod.yml --secret-name prod-envs --force
171
189
 
172
190
  # 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
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
174
207
  ```
175
208
 
176
209
  **Security Note**: Never commit files containing actual secrets. Use `.gitignore` to exclude environment files with sensitive data.
@@ -310,4 +343,11 @@ Contributions are welcome! Please feel free to submit a Pull Request.
310
343
 
311
344
  ## Support
312
345
 
313
- For bugs and feature requests, please [create an issue](https://github.com/efebia/be-libs/issues).
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"}
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Upload command implementation
3
- * Uploads environment configuration to AWS Secrets Manager
2
+ * Push command implementation
3
+ * Pushes environment configuration to AWS Secrets Manager
4
4
  */
5
5
  import chalk from 'chalk';
6
6
  import { createSecretsManagerClient, createOrUpdateSecret, getSecretValue } from '../utils/aws.js';
@@ -10,10 +10,10 @@ import { printValidationResults, printStatus } from '../utils/formatting.js';
10
10
  import { loadSchema, formatSchemaSource } from '../utils/schema-loader.js';
11
11
  import readline from 'node:readline/promises';
12
12
  /**
13
- * Handles the upload command
13
+ * Handles the push command
14
14
  * @param options - Command options
15
15
  */
16
- export async function handleUploadCommand(options) {
16
+ export async function handlePushCommand(options) {
17
17
  // Configure AWS client
18
18
  const client = createSecretsManagerClient(options.region, options.profile);
19
19
  try {
@@ -55,7 +55,7 @@ export async function handleUploadCommand(options) {
55
55
  if (secretExists) {
56
56
  console.log(`\n${chalk.yellow('Note:')} Secret already exists and will be updated`);
57
57
  }
58
- console.log(`\n${chalk.cyan('Configuration to upload:')}`);
58
+ console.log(`\n${chalk.cyan('Configuration to push:')}`);
59
59
  console.log(JSON.stringify(envData, null, 2));
60
60
  return;
61
61
  }
@@ -74,11 +74,11 @@ export async function handleUploadCommand(options) {
74
74
  const answer = await rl.question(`\nDo you want to continue? (yes/no): `);
75
75
  rl.close();
76
76
  if (answer.toLowerCase() !== 'yes' && answer.toLowerCase() !== 'y') {
77
- console.log('\n' + chalk.yellow('Upload cancelled'));
77
+ console.log('\n' + chalk.yellow('Push cancelled'));
78
78
  process.exit(0);
79
79
  }
80
80
  }
81
- // Upload to AWS
81
+ // Push to AWS
82
82
  printStatus(`${secretExists ? 'Updating' : 'Creating'} secret '${options.secretName}' in AWS Secrets Manager...`, 'info');
83
83
  const tags = options.environment ? [
84
84
  { Key: 'Environment', Value: options.environment },
@@ -88,7 +88,7 @@ export async function handleUploadCommand(options) {
88
88
  ];
89
89
  await createOrUpdateSecret(client, options.secretName, envData, tags);
90
90
  printStatus(`Secret '${options.secretName}' ${secretExists ? 'updated' : 'created'} successfully!`, 'success');
91
- console.log(`\n${chalk.green.bold('Success!')} Environment configuration has been uploaded`);
91
+ console.log(`\n${chalk.green.bold('Success!')} Environment configuration has been pushed`);
92
92
  console.log(`\nYou can validate it with:`);
93
93
  console.log(chalk.cyan(` one-env validate-aws --schema ${options.schema} --secret-name ${options.secretName} --region ${options.region}`));
94
94
  }
@@ -108,4 +108,4 @@ export async function handleUploadCommand(options) {
108
108
  process.exit(1);
109
109
  }
110
110
  }
111
- //# sourceMappingURL=upload.js.map
111
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/cli/commands/push.ts"],"names":[],"mappings":"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"}
@@ -6,7 +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
- * - upload: Uploads environment configuration to AWS Secrets Manager
9
+ * - pull: Pulls environment configuration from AWS Secrets Manager
10
+ * - push: Pushes environment configuration to AWS Secrets Manager
10
11
  */
11
12
  export {};
12
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;;;;;;;;GAQG"}
1
+ {"version":3,"file":"env-tool.d.ts","sourceRoot":"","sources":["../../src/cli/env-tool.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG"}
@@ -6,14 +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
- * - upload: Uploads environment configuration to AWS Secrets Manager
9
+ * - pull: Pulls environment configuration from AWS Secrets Manager
10
+ * - push: Pushes environment configuration to AWS Secrets Manager
10
11
  */
11
12
  import { Command } from 'commander';
12
13
  import chalk from 'chalk';
13
14
  import { handleGenerateCommand } from './commands/generate.js';
14
15
  import { handleValidateCommand } from './commands/validate.js';
15
16
  import { handleValidateAwsCommand } from './commands/validate-aws.js';
16
- import { handleUploadCommand } from './commands/upload.js';
17
+ import { handlePushCommand } from './commands/push.js';
18
+ import { handlePullCommand } from './commands/pull.js';
17
19
  // ============================================================================
18
20
  // MAIN CLI SETUP
19
21
  // ============================================================================
@@ -48,19 +50,30 @@ program
48
50
  .option('--profile <profile>', 'AWS profile to use (optional)')
49
51
  .option('--json', 'Output results in JSON format', false)
50
52
  .action(handleValidateAwsCommand);
51
- // Upload command
53
+ // Pull command
52
54
  program
53
- .command('upload')
54
- .description('Upload environment configuration to AWS Secrets Manager')
55
+ .command('pull')
56
+ .description('Pull environment configuration from AWS Secrets Manager')
55
57
  .requiredOption('-s, --schema <path>', 'Path to schema file (TypeScript or JavaScript)')
56
- .requiredOption('--file <path>', 'Path to the environment file to upload')
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')
57
70
  .option('--secret-name <name>', 'Name of the secret in AWS Secrets Manager', 'envs')
58
71
  .option('--region <region>', 'AWS region', process.env['AWS_REGION'] || 'eu-west-1')
59
72
  .option('--profile <profile>', 'AWS profile to use (optional)')
60
73
  .option('--environment <env>', 'Environment tag (e.g., dev, staging, prod)')
61
- .option('--dry-run', 'Preview what would be uploaded without making changes', false)
74
+ .option('--dry-run', 'Preview what would be pushed without making changes', false)
62
75
  .option('--force', 'Skip confirmation prompts', false)
63
- .action(handleUploadCommand);
76
+ .action(handlePushCommand);
64
77
  // Check dependencies before running
65
78
  try {
66
79
  await import('js-yaml');
@@ -1 +1 @@
1
- {"version":3,"file":"env-tool.js","sourceRoot":"","sources":["../../src/cli/env-tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env-tool.js","sourceRoot":"","sources":["../../src/cli/env-tool.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ export interface ValidateAwsOptions {
18
18
  profile?: string;
19
19
  json: boolean;
20
20
  }
21
- export interface UploadOptions {
21
+ export interface PushOptions {
22
22
  schema: string;
23
23
  file: string;
24
24
  secretName: string;
@@ -28,6 +28,14 @@ export interface UploadOptions {
28
28
  dryRun: boolean;
29
29
  force: boolean;
30
30
  }
31
+ export interface PullOptions {
32
+ schema: string;
33
+ secretName: string;
34
+ output: string;
35
+ region: string;
36
+ profile?: string;
37
+ force: boolean;
38
+ }
31
39
  export interface ValidationResult {
32
40
  success: boolean;
33
41
  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;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
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@efebia/one-env",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Type-safe environment configuration with validation and CLI tools",
5
5
  "keywords": [
6
6
  "env",
@@ -1,11 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/cli/commands/upload.ts"],"names":[],"mappings":"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"}