updateVSCodeLaunchConfig static method

void updateVSCodeLaunchConfig()

Implementation

static void updateVSCodeLaunchConfig() {
  final root = ConfigService.root;
  final flavorConfig = ConfigService.load();
  final flavors = flavorConfig.flavors;
  final separate = flavorConfig.useSeparateMains;
  final vscodeDir = Directory(p.join(root, '.vscode'));
  if (!vscodeDir.existsSync()) vscodeDir.createSync();

  final launchFile = File(p.join(vscodeDir.path, 'launch.json'));
  Map<String, dynamic> config;

  if (launchFile.existsSync()) {
    try {
      config = jsonDecode(launchFile.readAsStringSync());
    } catch (_) {
      config = {'version': '0.2.0', 'configurations': []};
    }
  } else {
    config = {'version': '0.2.0', 'configurations': []};
  }

  final List<dynamic> currentConfigs = config['configurations'] ?? [];

  // Remove existing flavor configs
  currentConfigs.removeWhere(
    (c) =>
        c is Map &&
        c['name'] is String &&
        (c['name'] as String).startsWith('Flutter: '),
  );

  for (final flavor in flavors) {
    final String program =
        separate ? 'lib/main/main_$flavor.dart' : 'lib/main.dart';

    final Map<String, dynamic> flavorConfig = {
      'name': 'Flutter: $flavor',
      'request': 'launch',
      'type': 'dart',
      'program': program,
      'args': ['--flavor', flavor],
    };

    // ENV mode: only pass --dart-define=FLAVOR=<flavor> for identification.
    // Field values are loaded from .env.<flavor> at runtime.
    (flavorConfig['args'] as List<String>).addAll([
      '--dart-define',
      'FLAVOR=$flavor',
    ]);

    currentConfigs.add(flavorConfig);
  }

  config['configurations'] = currentConfigs;
  const encoder = JsonEncoder.withIndent('  ');
  launchFile.writeAsStringSync(encoder.convert(config));
}