removeAssets static method

void removeAssets(
  1. List<String> assetPaths
)

Implementation

static void removeAssets(List<String> assetPaths) {
  final file = File(_pubspecPath);

  if (!file.existsSync()) return;

  final lines = file.readAsLinesSync();

  final toRemove = assetPaths.toSet();

  final result = <String>[];

  bool inFlutter = false;
  bool inAssets = false;

  int? assetsIndex;
  int? flutterIndex;

  for (final line in lines) {
    final trimmed = line.trim();

    // root flutter section
    if (!line.startsWith(' ') && trimmed == 'flutter:') {
      inFlutter = true;
      flutterIndex = result.length;

      result.add(line);

      continue;
    }

    // assets section
    if (inFlutter && line.startsWith('  ') && trimmed == 'assets:') {
      inAssets = true;
      assetsIndex = result.length;

      result.add(line);

      continue;
    }

    // exit assets block
    if (inAssets &&
        trimmed.isNotEmpty &&
        line.startsWith('  ') &&
        !line.startsWith('    ') &&
        trimmed != 'assets:') {
      inAssets = false;
    }

    // remove assets
    if (inAssets && trimmed.startsWith('- ')) {
      final asset = trimmed.substring(2).trim();

      if (toRemove.contains(asset)) {
        continue;
      }
    }

    result.add(line);
  }

  // remove empty assets section
  if (assetsIndex != null) {
    bool hasAssets = false;

    for (int i = assetsIndex + 1; i < result.length; i++) {
      final line = result[i];

      if (line.startsWith('    - ')) {
        hasAssets = true;
        break;
      }

      if (line.startsWith('  ') &&
          !line.startsWith('    ') &&
          line.trim().isNotEmpty) {
        break;
      }

      if (!line.startsWith(' ') && line.trim().isNotEmpty) {
        break;
      }
    }

    if (!hasAssets) {
      result.removeAt(assetsIndex);
    }
  }

  // remove empty flutter section
  if (flutterIndex != null) {
    bool hasFlutterContent = false;

    for (int i = flutterIndex + 1; i < result.length; i++) {
      final line = result[i];

      if (line.startsWith('  ') && line.trim().isNotEmpty) {
        hasFlutterContent = true;
        break;
      }

      if (!line.startsWith(' ') && line.trim().isNotEmpty) {
        break;
      }
    }

    if (!hasFlutterContent) {
      result.removeAt(flutterIndex);
    }
  }

  file.writeAsStringSync('${result.join('\n')}\n');
}