main function

void main(
  1. List<String> args
)

Simple script to generate type-safe environment configuration extension on FlutterEnvironmentConfig. Only runs for consumer projects that import this library.

Implementation

void main(List<String> args) async {
  print(_cyan('🔧 Generating FlutterEnvironmentConfig...'));
  print('');

  // Detect project context and configuration
  final projectConfig = await detectProjectConfig();

  if (projectConfig == null) {
    print(_yellow(
        '⚠️  This command should be run from a project that uses flutter_environment_config.'));
    print('');
    print(
        '💡 Make sure you have added flutter_environment_config to your pubspec.yaml:');
    print('   dependencies:');
    print('     flutter_environment_config: ^1.0.0');
    return;
  }

  final workingDirectory = Directory(projectConfig.workingDir);
  final outputPath = projectConfig.outputPath;

  print(_blue('📋 Configuration:'));
  print('📁 Working directory: ${workingDirectory.path}');
  print('📄 Output path: $outputPath');
  print('');

  // Read environment variables from all .env files in the working directory
  final envVariables = <String, EnvVariable>{};
  final envFiles = await scanEnvFiles(workingDirectory);

  if (envFiles.isEmpty) {
    print('❌ No .env.* files found in ${workingDirectory.path}');
    print(
        '💡 Create .env files like .env.develop, .env.staging, .env.production');
    return;
  }

  print(_yellow('📂 Reading environment files:'));
  for (final envFile in envFiles) {
    final file = File(envFile);
    if (await file.exists()) {
      print('📖 Reading $envFile');
      final variables = await readEnvFile(file);
      for (final entry in variables.entries) {
        if (!envVariables.containsKey(entry.key)) {
          envVariables[entry.key] = EnvVariable(
            entry.value.key,
            entry.value.value,
            entry.value.type,
            {envFile},
          );
        } else {
          // Add this file to the list of files that contain this variable
          envVariables[entry.key]!.availableInFiles.add(envFile);
        }
      }
    }
  }

  if (envVariables.isEmpty) {
    print('❌ No environment variables found. Make sure you have .env files.');
    return;
  }

  print('');
  print(_magenta('⚙️  Generating code...'));

  // Generate the extension
  final generatedCode =
      generateExtension(envVariables, envFiles, projectConfig);

  // Write to file
  final outputFile = File(outputPath);
  await outputFile.parent
      .create(recursive: true); // Create directories if needed
  await outputFile.writeAsString(generatedCode);

  print('');
  print(_green('✅ Generation completed:'));
  print('📊 Generated ${envVariables.length} environment variables');
  print('📁 Output: ${outputFile.path}');
  print('');
  print(_brightYellow('💡 Customize output directory in pubspec.yaml:'));
  print('   flutter_environment_config:');
  print('     output_dir: lib/generated  # or any other directory');

  print('');
  print(_brightCyan(
      '🎉 Done! You can now use FlutterEnvironmentConfigGeneration.propertyName for type-safe access.'));
}