generateAllInOne static method

Future<void> generateAllInOne(
  1. List<String> assetEntries,
  2. AssetConfig config
)

Generate a single aggregated file: assets.gen.dart

Implementation

static Future<void> generateAllInOne(
  List<String> assetEntries,
  AssetConfig config,
) async {
  final assets = await _expandAssetEntries(assetEntries);

  if (!config.outputDirectory.existsSync()) {
    config.outputDirectory.createSync(recursive: true);
  }

  // Group by first meaningful folder (after "assets" if present)
  final Map<String, List<String>> groups = {};

  for (final a in assets) {
    final normalized = a.replaceAll('\\', '/');
    final segments = normalized.split('/');
    String group;
    if (segments.isNotEmpty && segments[0] == 'assets') {
      if (segments.length >= 3) {
        group = segments[1];
      } else if (segments.length == 2) {
        group = 'root';
      } else {
        group = 'root';
      }
    } else {
      group = segments.isNotEmpty ? segments[0] : 'root';
    }
    groups.putIfAbsent(group, () => []).add(normalized);
  }

  final sb = StringBuffer();
  sb.writeln('// GENERATED CODE - DO NOT MODIFY BY HAND');
  sb.writeln('// Generated by asset generator');
  sb.writeln();
  sb.writeln('class Assets {');
  sb.writeln('  Assets._();');

  // create static fields for each group
  for (final group in groups.keys) {
    final className = _pascalCaseSafe(group == 'root' ? 'AssetsRoot' : group);
    final fieldName = _camelCaseSafe(group == 'root' ? 'assets' : group);
    sb.writeln('  static const $className $fieldName = $className();');
  }

  sb.writeln('}');
  sb.writeln();

  // write classes for each group
  for (final entry in groups.entries) {
    final group = entry.key;
    final paths = entry.value;
    final className = _pascalCaseSafe(group == 'root' ? 'AssetsRoot' : group);

    sb.writeln('abstract class $className {');

    // field name uniqueness map
    final used = <String, int>{};

    for (final path in paths) {
      final base = _basenameWithoutExtension(path);
      var fieldName = _sanitizeFieldName(base);
      if (used.containsKey(fieldName)) {
        used[fieldName] = used[fieldName]! + 1;
        fieldName = '${fieldName}_${used[fieldName]}';
      } else {
        used[fieldName] = 1;
      }
      sb.writeln("  static const String $fieldName = '$path';");
    }

    sb.writeln('}');
    sb.writeln();
  }

  final outFile = File(
    '${config.outputDirectory.path}${Platform.pathSeparator}assets.gen.dart',
  );
  outFile.writeAsStringSync(sb.toString());
}