fetchDependencyRepoUrl function

Future<String?> fetchDependencyRepoUrl(
  1. String packageName, {
  2. ProjectType type = gg.ProjectType.dart,
  3. Future<Response> packageFetcher(
    1. Uri
    )?,
})

Fetches the repository URL for a dependency from its registry: pub.dev for Dart/Flutter, the npm registry for TypeScript. Returns the URL if found, otherwise null.

Implementation

Future<String?> fetchDependencyRepoUrl(
  String packageName, {
  gg.ProjectType type = gg.ProjectType.dart,
  Future<http.Response> Function(Uri)? packageFetcher,
}) async {
  final fetcher = packageFetcher ?? http.get;

  if (type == gg.ProjectType.typescript) {
    return _fetchNpmRepoUrl(packageName, fetcher);
  }

  final url = Uri.parse('https://pub.dev/api/packages/$packageName');
  final response = await fetcher(url);
  if (response.statusCode != 200) {
    throw Exception(
      cError('Failed to fetch package info from pub.dev for $packageName'),
    );
  }
  final data = jsonDecode(response.body) as Map<String, dynamic>;
  if (data.containsKey('latest')) {
    final latest = data['latest'] as Map<String, dynamic>;
    if (latest.containsKey('pubspec')) {
      final pubspec = latest['pubspec'] as Map<String, dynamic>;
      if (pubspec.containsKey('repository')) {
        final repoUrl = pubspec['repository'] as String;
        return repoUrl;
      }
    }
  }
  return null;
}