discoverModuleInfos function

List<ModuleInfo> discoverModuleInfos(
  1. String pluginName, {
  2. String baseDir = '.',
})

Implementation

List<ModuleInfo> discoverModuleInfos(
  String pluginName, {
  String baseDir = '.',
}) {
  final libDir = Directory(p.join(baseDir, 'lib'));
  if (!libDir.existsSync()) {
    return [ModuleInfo(lib: pluginName, module: pluginName, isCpp: false)];
  }
  final specs = libDir
      .listSync(recursive: true)
      .whereType<File>()
      .where((f) => f.path.endsWith('.native.dart'))
      .toList();
  if (specs.isEmpty) {
    return [ModuleInfo(lib: pluginName, module: pluginName, isCpp: false)];
  }

  final modules = <ModuleInfo>[];
  for (final spec in specs) {
    final content = spec.readAsStringSync();
    final stem = p
        .basename(spec.path)
        .replaceAll(RegExp(r'\.native\.dart$'), '');
    final libName = extractLibNameFromSpec(spec) ?? stem.replaceAll('-', '_');
    final moduleMatch = RegExp(
      r'abstract class (\w+) extends HybridObject',
    ).firstMatch(content);
    final moduleName = moduleMatch?.group(1) ?? _toPascalCase(stem);
    // Parse annotation once; avoids two extra file reads vs calling isCppModule + isNativeCppModule.
    final analyzer = PlatformTargetAnalyzer.fromContent(content);

    if (!modules.any((m) => m.module == moduleName)) {
      modules.add(
        ModuleInfo(
          lib: libName,
          module: moduleName,
          isCpp: analyzer.requiresCpp,
          isNativeCpp: analyzer.isNativeCpp,
          isAndroidCpp: analyzer.supportsAndroid,
          iosIsCpp: analyzer.supportsIosCpp,
          macosIsCpp: analyzer.supportsMacosCpp,
        ),
      );
    }
  }
  return modules;
}