generateSeparate static method
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());
}
}