< Summary - Envilder Core (TypeScript)

Information
Class: src/envilder/apps/gha/Gha.ts
Assembly: Default
File(s): src/envilder/apps/gha/Gha.ts
Tag: 151_24479375065
Line coverage
100%
Covered lines: 31
Uncovered lines: 0
Coverable lines: 31
Total lines: 96
Line coverage: 100%
Branch coverage
88%
Covered branches: 16
Total branches: 18
Branch coverage: 88.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

File(s)

src/envilder/apps/gha/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 { Startup } from './Startup.js';
 12
 13/**
 14 * Reads GitHub Actions inputs from environment variables.
 15 * GitHub Actions passes inputs as INPUT_<NAME> environment variables.
 16 */
 17function readInputs(): {
 18  options: CliOptions;
 19  provider?: string;
 20  vaultUrl?: string;
 21} {
 1122  const mapFile = process.env.INPUT_MAP_FILE;
 1123  const envFile = process.env.INPUT_ENV_FILE;
 1124  const provider = process.env.INPUT_PROVIDER;
 1125  const vaultUrl = process.env.INPUT_VAULT_URL;
 26
 1127  return {
 28    options: {
 29      map: mapFile,
 30      envfile: envFile,
 31      // GitHub Action only supports pull mode
 32      push: false,
 33    },
 34    provider: provider || undefined,
 35    vaultUrl: vaultUrl || undefined,
 36  };
 37}
 38
 39async function executeCommand(
 40  serviceProvider: Container,
 41  options: CliOptions,
 42): Promise<void> {
 743  const commandHandler = serviceProvider.get<DispatchActionCommandHandler>(
 44    TYPES.DispatchActionCommandHandler,
 45  );
 46
 747  const command = DispatchActionCommand.fromCliOptions(options);
 748  await commandHandler.handleCommand(command);
 49}
 50
 51export async function main() {
 1152  const { options, provider, vaultUrl } = readInputs();
 53
 54  let serviceProvider: Container;
 1155  let logger: ILogger = new ConsoleLogger();
 56
 1157  try {
 1158    const fileConfig = options.map ? await readMapFileConfig(options.map) : {};
 59
 1160    const config: MapFileConfig = {
 61      ...fileConfig,
 62      ...(provider && { provider }),
 63      ...(vaultUrl && { vaultUrl }),
 64    };
 65
 1166    const startup = Startup.build();
 1167    startup.configureServices().configureInfrastructure(config);
 1168    serviceProvider = startup.create();
 1169    logger = serviceProvider.get<ILogger>(TYPES.ILogger);
 70  } catch (error) {
 171    const message = error instanceof Error ? error.message : String(error);
 172    logger.error(`🚨 Failed to initialize: ${message}`);
 173    throw error;
 74  }
 75
 1076  try {
 77    // Validate required inputs
 1078    if (!options.map || !options.envfile) {
 379      throw new Error(
 80        '🚨 Missing required inputs! Please provide map-file and env-file.',
 81      );
 82    }
 83
 784    logger.info('🔑 Envilder GitHub Action - Starting secret pull...');
 785    logger.info(`📋 Map file: ${options.map}`);
 786    logger.info(`📄 Env file: ${options.envfile}`);
 87
 788    await executeCommand(serviceProvider, options);
 89
 790    logger.info('✅ Secrets pulled successfully!');
 91  } catch (error) {
 392    logger.error('🚨 Uh-oh! Looks like Mario fell into the wrong pipe! 🍄💥');
 393    logger.error(error instanceof Error ? error.message : String(error));
 394    throw error;
 95  }
 96}

Methods/Properties

readInputs
executeCommand
main