generateSeparate static method

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

Generate separate files per group + a master aggregator file (assets.gen.dart)

Implementation

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

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

  // Group by first folder
  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') {
      group = (segments.length >= 3) ? segments[1] : 'root';
    } else {
      group = segments.isNotEmpty ? segments[0] : 'root';
    }
    groups.putIfAbsent(group, () => []).add(normalized);
  }

  for (final entry in groups.entries) {
    final group = entry.key;
    final paths = entry.value;

    // Class name
    final baseClass = _pascalCaseSafe(group == 'root' ? 'AssetsRoot' : group);
    final className = '${config.preClass}$baseClass${config.postClass}';

    // File name
    final fileName =
        '${_snakeCase(config.preClass)}_${_snakeCase(group)}${config.postClass.isNotEmpty ? "_${_snakeCase(config.postClass)}" : ""}.g.dart';
    final filePath =
        '${config.outputDirectory.path}${Platform.pathSeparator}$fileName';

    final sb = StringBuffer();
    sb.writeln('// GENERATED CODE - DO NOT MODIFY BY HAND');
    sb.writeln('// Assets for group: $group');
    sb.writeln();
    sb.writeln('abstract class $className {');

    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();

    File(filePath).writeAsStringSync(sb.toString());
  }
}