< Summary - Envilder CLI

Information
Class: src/envilder/apps/gha/entry/Gha.ts
Assembly: Default
File(s): src/envilder/apps/gha/entry/Gha.ts
Tag: 427_29134414720
Line coverage
100%
Covered lines: 31
Uncovered lines: 0
Coverable lines: 31
Total lines: 98
Line coverage: 100%
Branch coverage
93%
Covered branches: 15
Total branches: 16
Branch coverage: 93.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

File(s)

src/envilder/apps/gha/entry/Gha.ts

#LineLine coverage
 1import 'reflect-metadata';
 2import type { Container } from 'inversify';
 3import { DispatchActionCommand } from '../../../core/application/dispatch/DispatchActionCommand.js';
 4import type { DispatchActionCommandHandler } from '../../../core/application/dispatch/DispatchActionCommandHandler.js';
 5import type { CliOptions } from '../../../core/domain/CliOptions.js';
 6import type { MapFileConfig } from '../../../core/domain/MapFileConfig.js';
 7import type { ILogger } from '../../../core/domain/ports/ILogger.js';
 8import { ConsoleLogger } from '../../../core/infrastructure/logger/ConsoleLogger.js';
 9import { readMapFileConfig } from '../../../core/infrastructure/variableStore/FileVariableStore.js';
 10import { TYPES } from '../../../core/types.js';
 11import { presentGhaError } from '../errors/GhaErrorPresenter.js';
 12import { Startup } from '../Startup.js';
 13
 14/**
 15 * Reads GitHub Actions inputs from environment variables.
 16 * GitHub Actions passes inputs as INPUT_<NAME> environment variables.
 17 */
 18function readInputs(): {
 19  options: CliOptions;
 20  provider?: string;
 21  vaultUrl?: string;
 22} {
 1323  const mapFile = process.env.INPUT_MAP_FILE;
 1324  const envFile = process.env.INPUT_ENV_FILE;
 1325  const provider = process.env.INPUT_PROVIDER;
 1326  const vaultUrl = process.env.INPUT_VAULT_URL;
 27
 1328  return {
 29    options: {
 30      map: mapFile,
 31      envfile: envFile,
 32      // GitHub Action only supports pull mode
 33      push: false,
 34    },
 35    provider: provider || undefined,
 36    vaultUrl: vaultUrl || undefined,
 37  };
 38}
 39
 40async function executeCommand(
 41  serviceProvider: Container,
 42  options: CliOptions,
 43): Promise<void> {
 944  const commandHandler = serviceProvider.get<DispatchActionCommandHandler>(
 45    TYPES.DispatchActionCommandHandler,
 46  );
 47
 948  const command = DispatchActionCommand.fromCliOptions(options);
 949  await commandHandler.handleCommand(command);
 50}
 51
 52export async function main() {
 1353  const { options, provider, vaultUrl } = readInputs();
 54
 55  let serviceProvider: Container;
 1356  let logger: ILogger = new ConsoleLogger();
 57
 1358  try {
 1359    const fileConfig = options.map ? await readMapFileConfig(options.map) : {};
 60
 1361    const config: MapFileConfig = {
 62      ...fileConfig,
 63      ...(provider && { provider }),
 64      ...(vaultUrl && { vaultUrl }),
 65    };
 66
 1367    const startup = Startup.build();
 1368    startup.configureServices().configureInfrastructure(config);
 1369    serviceProvider = startup.create();
 1370    logger = serviceProvider.get<ILogger>(TYPES.ILogger);
 71  } catch (error) {
 172    const message = error instanceof Error ? error.message : String(error);
 173    logger.error(`🚨 Failed to initialize: ${message}`);
 174    throw error;
 75  }
 76
 1277  try {
 78    // Validate required inputs
 1279    if (!options.map || !options.envfile) {
 380      throw new Error(
 81        '🚨 Missing required inputs! Please provide map-file and env-file.',
 82      );
 83    }
 84
 985    logger.info('🔑 Envilder GitHub Action - Starting secret pull...');
 986    logger.info(`📋 Map file: ${options.map}`);
 987    logger.info(`📄 Env file: ${options.envfile}`);
 88
 989    await executeCommand(serviceProvider, options);
 90
 791    logger.info('✅ Secrets pulled successfully!');
 92  } catch (error) {
 593    for (const line of presentGhaError(error)) {
 1394      logger.error(line);
 95    }
 596    throw error;
 97  }
 98}

Methods/Properties

readInputs
executeCommand
main