genLibrary function
Implementation
void genLibrary({
required Directory lib,
}) {
print('[GEN] Library: ${lib.path}');
if (!lib.existsSync()) throw Exception('lib directory not found');
final src = Directory(lib.path + Platform.pathSeparator + 'src');
if (!src.existsSync()) throw Exception('lib/src directory not found');
final packageName = getPackageName();
final sources = <String>[];
final imports = <String>[];
final libFile = File('lib/${packageName}_library.dart');
if (libFile.existsSync()) {
final contents = libFile.readAsStringSync();
final lines = contents.split('\n');
for (var line in lines) {
if (line.trim().startsWith('import ')) {
final startIdx = contents.indexOf(line);
final endIdx = contents.indexOf(';', startIdx) + 1;
final code = contents.substring(startIdx, endIdx);
imports.add(code);
}
}
}
final files = src.listSync(recursive: true);
for (final file in files.whereType<File>().where(
(element) => element.path.toLowerCase().endsWith('.dart'),
)) {
var contents = file.readAsStringSync();
if (contents.contains('genlib: ignore')) {
continue;
}
if (contents.contains('// GENERATED CODE - DO NOT MODIFY BY HAND')) {
continue;
}
final lines = contents.split('\n');
var hasPart = false;
if (lines.any((element) =>
element.trim().startsWith('part of') ||
element.trim().startsWith('part'))) {
if (!contents.contains('part of $packageName')) {
continue;
}
hasPart = true;
}
for (final line in lines) {
if (line.trim().startsWith('import ')) {
final startIdx = contents.indexOf(line);
final endIdx = contents.indexOf(';', startIdx) + 1;
final code = contents.substring(startIdx, endIdx);
contents = contents.replaceAll(code, '');
imports.add(code);
}
}
if (!hasPart) {
var finalContent = 'part of $packageName;\n\n$contents';
file.writeAsStringSync(finalContent, flush: true);
} else {
file.writeAsStringSync(contents, flush: true);
}
sources.add(file.path.substring(file.path.indexOf('lib/') + 4));
}
final buff = StringBuffer();
buff.writeln('library $packageName;');
final finalImports = imports.toSet().toList();
for (var imp in finalImports) {
buff.writeln(imp);
}
buff.writeln('');
buff.writeln('');
for (var s in sources) {
buff.writeln("part '$s';");
}
libFile.writeAsStringSync(buff.toString(), flush: true);
}