addAssets method

void addAssets(
  1. String pubspecPath,
  2. List<String> assetPaths
)

Adds a list of assets to the pubspec.yaml under the flutter: assets: section.

Implementation

void addAssets(String pubspecPath, List<String> assetPaths) {
  final file = File(pubspecPath);
  if (!file.existsSync()) {
    throw CliException('pubspec.yaml not found at $pubspecPath');
  }

  final lines = file.readAsLinesSync();

  int flutterIndex = -1;
  for (int i = 0; i < lines.length; i++) {
    if (lines[i].trim() == 'flutter:' && !lines[i].startsWith(' ')) {
      flutterIndex = i;
      break;
    }
  }

  if (flutterIndex == -1) {
    // Append flutter: section with assets
    lines.add('');
    lines.add('flutter:');
    lines.add('  assets:');
    for (final asset in assetPaths) {
      lines.add('    - $asset');
    }
    file.writeAsStringSync(lines.join('\n'));
    return;
  }

  // Find if 'assets:' is already under 'flutter:'
  int assetsIndex = -1;
  for (int i = flutterIndex + 1; i < lines.length; i++) {
    final line = lines[i];
    if (line.isNotEmpty && !line.startsWith(' ') && !line.startsWith('#')) {
      break; // Out of flutter section
    }
    if (line.trim() == 'assets:') {
      assetsIndex = i;
      break;
    }
  }

  if (assetsIndex == -1) {
    // Insert assets: line and the items
    final insertLines = ['  assets:'];
    for (final asset in assetPaths) {
      insertLines.add('    - $asset');
    }
    lines.insertAll(flutterIndex + 1, insertLines);
  } else {
    // Insert assets under the existing assets: block
    final insertLines = <String>[];
    for (final asset in assetPaths) {
      // check if asset already added
      bool alreadyExists = false;
      for (int i = assetsIndex + 1; i < lines.length; i++) {
        final line = lines[i];
        if (line.trim().startsWith('- ') && line.contains(asset)) {
          alreadyExists = true;
          break;
        }
        if (line.isNotEmpty && !line.startsWith('   ') && !line.startsWith('  -')) {
          break; // Finished assets section
        }
      }
      if (!alreadyExists) {
        insertLines.add('    - $asset');
      }
    }
    lines.insertAll(assetsIndex + 1, insertLines);
  }

  file.writeAsStringSync(lines.join('\n'));
}