scan method

Future<ProjectDiagnosis> scan(
  1. String pubspecPath,
  2. ScanOptions opts
)

Implementation

Future<ProjectDiagnosis> scan(String pubspecPath, ScanOptions opts) async {
  final info = await PubspecParser().parse(pubspecPath);
  final sdk = _detectSdk();
  final packages = opts.includeDev ? info.all : info.dependencies;

  if (packages.isEmpty) {
    return ProjectDiagnosis(
      results: [],
      scannedAt: DateTime.now(),
      pubspecPath: pubspecPath,
      dartSdkVersion: sdk?.toString(),
    );
  }

  Map<String, PackageMetadata> meta;

  if (opts.offline) {
    meta = await _fromCacheOnly(packages);
  } else {
    _pub ??= PubApiClient(cache: _cache, concurrency: opts.concurrency);
    _gh ??= GitHubClient(cache: _cache);

    meta = await _pub!.fetchAll(packages, fresh: opts.fresh);
    await _augmentGitHub(meta);
    await _probeRepos(meta);
  }

  final repoReachability = {
    for (final m in meta.values)
      if (m.repositoryUrl != null && m.repoHealth != null)
        m.repositoryUrl.toString(): true,
  };

  final scorer =
      RiskScorer(dartSdkVersion: sdk, repoReachability: repoReachability);
  final results = meta.values.map(scorer.diagnose).toList()
    ..sort((a, b) => b.riskScore.compareTo(a.riskScore));

  return ProjectDiagnosis(
    results: results,
    scannedAt: DateTime.now(),
    pubspecPath: pubspecPath,
    dartSdkVersion: sdk?.toString(),
  );
}