Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 2x 1x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 2x 2x 2x 2x 2x 3x 3x 1x 3x 3x 3x 3x 3x 3x 1x 1x 1x 1x 1x | #!/usr/bin/env node
import 'reflect-metadata';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
import { Command } from 'commander';
import type { Container } from 'inversify';
import { DispatchActionCommand } from '../../envilder/application/dispatch/DispatchActionCommand.js';
import type { DispatchActionCommandHandler } from '../../envilder/application/dispatch/DispatchActionCommandHandler.js';
import type { CliOptions } from '../../envilder/domain/CliOptions.js';
import type { ILogger } from '../../envilder/domain/ports/ILogger.js';
import { PackageVersionReader } from '../../envilder/infrastructure/package/PackageVersionReader.js';
import { TYPES } from '../../envilder/types.js';
import { Startup } from './Startup.js';
let serviceProvider: Container;
async function executeCommand(options: CliOptions): Promise<void> {
const commandHandler = serviceProvider.get<DispatchActionCommandHandler>(
TYPES.DispatchActionCommandHandler,
);
const command = DispatchActionCommand.fromCliOptions(options);
await commandHandler.handleCommand(command);
}
export async function main() {
const program = new Command();
const version = await readPackageVersion();
program
.name('envilder')
.description(
'🌟 A CLI tool to manage environment variables with AWS SSM. What do you want to do today?\n\n' +
'✨ Generate a .env file?\n' +
' Example: envilder --map=param-map.json --envfile=.env\n\n' +
'🔄 Sync your local .env file back to AWS SSM?\n' +
' Example: envilder --push --map=param-map.json --envfile=.env\n\n' +
'🎯 Create or update a single secret?\n' +
' Example: envilder --push --key=API_KEY --value=secret123 --ssm-path=/my/path\n',
)
.version(version)
.option(
'--map <path>',
'Path to the JSON file with environment variable mapping (required for most commands)',
)
.option(
'--envfile <path>',
'Path to the .env file to be generated or imported (required for most commands)',
)
.option('--profile <name>', 'AWS CLI profile to use (optional)')
.option('--push', 'Push local .env file back to AWS SSM')
.option(
'--key <name>',
'Single environment variable name to push (only with --push)',
)
.option(
'--value <value>',
'Value of the single environment variable to push (only with --push)',
)
.option(
'--ssm-path <path>',
'SSM path for the single environment variable (only with --push)',
)
.action(async (options: CliOptions) => {
serviceProvider = Startup.build()
.configureServices()
.configureInfrastructure(options.profile)
.create();
await executeCommand(options);
});
await program.parseAsync(process.argv);
}
function readPackageVersion(): Promise<string> {
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const packageJsonPath = join(__dirname, '../../../package.json');
return new PackageVersionReader().getVersion(packageJsonPath);
}
main().catch((error) => {
const logger = serviceProvider.get<ILogger>(TYPES.ILogger);
logger.error('🚨 Uh-oh! Looks like Mario fell into the wrong pipe! 🍄💥');
logger.error(error instanceof Error ? error.message : String(error));
});
|