genLibrary function

void genLibrary({
  1. required Directory lib,
})

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