generateExport function

bool generateExport(
  1. Directory directory, {
  2. String? fileName,
  3. String ext = '.exports',
  4. bool recursive = true,
})

Implementation

bool generateExport(
  Directory directory, {
  String? fileName,
  String ext = '.exports',
  bool recursive = true,
}) {
  print('[GEN] Library: ${directory.path}');

  final items = directory.listSync();
  items.sort((a, b) => a.path.compareTo(b.path));

  var isLibrary = false;
  final libFileName =
      directory.absolute.path + '/' + '${packageName}_' + 'library.dart';
  final libFile = File(libFileName);
  if (libFile.existsSync()) {
    isLibrary = true;
  }

  final directoryName = fileName ??
      directory.absolute.path.substring(
        directory.absolute.path.lastIndexOf('/') + 1,
      );

  final exportFile = File(
      '${directory.absolute.path}${Platform.pathSeparator}$directoryName$ext.dart');

  var exports = '';
  for (var item in items) {
    if (item is Directory && recursive) {
      if (isLibrary && item.path == 'lib/src') {
        continue;
      }

      if (getLibraryName(item) != null) {
        print('${item.path} is a library, skipping');
        continue;
      }

      final res = generateExport(item);
      if (!res) continue;

      final subDirName = item.absolute.path.substring(
        item.absolute.path.lastIndexOf('/') + 1,
      );

      exports +=
          "export '$subDirName${Platform.pathSeparator}$subDirName.exports.dart';\n";
      continue;
    }

    if (item is File &&
        item.path.toLowerCase().endsWith('.dart') &&
        !item.path.toLowerCase().endsWith('generated_plugin_registrant.dart') &&
        !item.path.toLowerCase().endsWith('.g.dart')) {
      final content = item.readAsStringSync();
      var force = false;
      if (content.contains('genexp: force')) {
        force = true;
      }

      if (!force) {
        if (content.contains('genexp: ignore')) {
          continue;
        }

        if (content.contains('// GENERATED CODE - DO NOT MODIFY BY HAND')) {
          continue;
        }
      }

      if (content.contains(RegExp(r'part of .+;'))) {
        continue;
      }

      if (item.absolute.path == exportFile.absolute.path) continue;
      fixImport(item);
      final path =
          item.absolute.path.substring(directory.absolute.path.length + 1);
      exports += "export '$path';\n";
      continue;
    }
  }

  if (exports.isNotEmpty) {
    final content = '$_templateHeader$exports';

    exportFile.writeAsStringSync(content, flush: true);
    return true;
  }

  return false;
}