findStringsFile function

Future<String?> findStringsFile(
  1. String packagePath,
  2. String packageName
)

Find slang generated file in a package Returns import path (e.g., 'package:pkg_a/i18n/translations.g.dart') or null

Implementation

Future<String?> findStringsFile(String packagePath, String packageName) async {
  // Common locations for slang generated files
  // Note: slang can generate as strings.g.dart OR translations.g.dart
  final searchPaths = [
    'lib/i18n/strings.g.dart',
    'lib/i18n/translations.g.dart',
    'lib/l10n/strings.g.dart',
    'lib/l10n/translations.g.dart',
    'lib/translations/strings.g.dart',
    'lib/translations/translations.g.dart',
    'lib/generated/strings.g.dart',
    'lib/generated/translations.g.dart',
  ];

  for (final relativePath in searchPaths) {
    final file = File(p.join(packagePath, relativePath));
    if (await file.exists()) {
      // Convert to package import path
      final importPath = relativePath.replaceFirst('lib/', '');
      return 'package:$packageName/$importPath';
    }
  }

  // Fallback: search lib directory recursively for .g.dart files with slang patterns
  final libDir = Directory(p.join(packagePath, 'lib'));
  if (!await libDir.exists()) {
    return null;
  }

  await for (final entity in libDir.list(recursive: true)) {
    if (entity is File) {
      final filename = p.basename(entity.path);
      if (filename == 'strings.g.dart' || filename == 'translations.g.dart') {
        // Convert absolute path to package import
        final relativePath = p.relative(entity.path, from: p.join(packagePath, 'lib'));
        return 'package:$packageName/$relativePath';
      }
    }
  }

  return null;
}