getPackages function

Future<List<DartPackageInfo>> getPackages(
  1. String query
)

Implementation

Future<List<DartPackageInfo>> getPackages(String query) async {
  final responses = await Future.wait([1, 2].map((page) => http.get(Uri.parse(
      'https://pub.dev/packages?page=$page&q=${Uri.encodeComponent(query)}'))));
  return responses.expand((e) {
    var found = Document.html(e.body);
    final packages = found.getElementsByClassName('packages-item');

    String? getText(Element source, String className) {
      final found = source.getElementsByClassName(className);
      if (found.isNotEmpty) {
        return found.first.text;
      } else {
        return null;
      }
    }

    return packages.map((e) {
      String? author;
      String? recentVersion;

      e.getElementsByClassName('packages-metadata').forEach((element) {
        var link = element.getElementsByTagName('a').forEach((a) {
          var href = a.attributes['href'];
          if (href != null) {
            if (href.startsWith('/packages')) {
              /// This is the version number
              try {
                recentVersion = Version.parse(a.text).toString();
              } catch (e) {}
            } else if (href.startsWith('/publishers')) {
              author = a.text;
            }
          }
        });
      });

      return DartPackageInfo(
        name: getText(e, 'packages-title'),
        description: getText(e, 'packages-description'),
        author: author,
        recentVersion: recentVersion,
        likes: int.tryParse(getText(e, 'packages-score-value-number') ?? '0'),
        platforms: [],
      );
    }).where((element) =>
        element.name != null &&
        element.name!.toLowerCase().contains(query.toLowerCase()));
  }).toList();
}