resolve method

EnvironmentConfig resolve({
  1. String? cliEnvironment,
  2. String? cliFlavor,
  3. Map<String, String>? cliDartDefines,
  4. Map<String, String> envVars = const {},
  5. Map<String, EnvironmentConfig> configEnvironments = const {},
})

Resolves environment settings given optional CLI arguments, environment variables, and configured environments.

Implementation

EnvironmentConfig resolve({
  String? cliEnvironment,
  String? cliFlavor,
  Map<String, String>? cliDartDefines,
  Map<String, String> envVars = const {},
  Map<String, EnvironmentConfig> configEnvironments = const {},
}) {
  // 1. Determine environment name
  final envName = cliEnvironment?.trim() ??
      envVars['ENVIRONMENT']?.trim() ??
      envVars['ENV']?.trim();

  if (envName == null || envName.isEmpty) {
    // Return default unconfigured environment if none specified
    return EnvironmentConfig(
      name: 'default',
      flavor: cliFlavor?.trim() ?? envVars['FLAVOR']?.trim(),
      dartDefines: cliDartDefines ?? {},
    );
  }

  final parsedTarget = TargetEnvironment.parse(envName);
  final normalizedName = envName.toLowerCase();

  // Find base config from file config if present (matching normalized name or target name)
  final baseConfig = configEnvironments[normalizedName] ??
      configEnvironments[parsedTarget.name];

  // 2. Resolve flavor (CLI > ENV > Config > Target default fallback)
  final resolvedFlavor =
      cliFlavor?.trim() ?? envVars['FLAVOR']?.trim() ?? baseConfig?.flavor;

  // 3. Resolve Fastlane lane (Config > Default matching environment)
  final resolvedLane = baseConfig?.lane ??
      (parsedTarget == TargetEnvironment.production
          ? 'production'
          : parsedTarget == TargetEnvironment.staging
              ? 'internal'
              : null);

  // 4. Resolve Shorebird App ID
  final resolvedShorebirdAppId = baseConfig?.shorebirdAppId;

  // 5. Merge Dart Defines (Config base overridden by CLI defines)
  final mergedDefines = <String, String>{};
  if (baseConfig != null) {
    mergedDefines.addAll(baseConfig.dartDefines);
  }
  if (cliDartDefines != null) {
    mergedDefines.addAll(cliDartDefines);
  }

  return EnvironmentConfig(
    name: baseConfig?.name ?? normalizedName,
    flavor: resolvedFlavor,
    lane: resolvedLane,
    dartDefines: mergedDefines,
    shorebirdAppId: resolvedShorebirdAppId,
  );
}