parse method

Future<PubspecData> parse(
  1. String projectPath, {
  2. bool includeDevDependencies = true,
  3. bool includeTransitive = false,
})

Parse the pubspec.yaml (and optionally pubspec.lock) located under projectPath.

When includeDevDependencies is false, the returned PubspecData.devDependencies will be an empty map.

When includeTransitive is true and a lockfile is present, packages that appear in the lockfile but not in the direct dependency lists are added to PubspecData.dependencies with DependencyInfo.isTransitive set to true.

Implementation

Future<PubspecData> parse(
  String projectPath, {
  bool includeDevDependencies = true,
  bool includeTransitive = false,
}) async {
  final pubspecFile = File(p.join(projectPath, 'pubspec.yaml'));
  if (!await pubspecFile.exists()) {
    throw ArgumentError('No pubspec.yaml found at $projectPath');
  }

  final pubspecContent = await pubspecFile.readAsString();
  final yaml = loadYaml(pubspecContent) as YamlMap;

  // --- SDK constraints ---------------------------------------------------
  final env = yaml['environment'] as YamlMap?;
  final sdkConstraints = SdkConstraints(
    dartSdk: env?['sdk']?.toString(),
    flutterSdk: env?['flutter']?.toString(),
  );

  // --- Direct dependencies ------------------------------------------------
  final deps =
      _parseDependencies(yaml['dependencies'] as YamlMap?, isDev: false);
  final devDeps = includeDevDependencies
      ? _parseDependencies(yaml['dev_dependencies'] as YamlMap?, isDev: true)
      : <String, DependencyInfo>{};

  // --- Lockfile -----------------------------------------------------------
  final lockFile = File(p.join(projectPath, 'pubspec.lock'));
  LockfileData? lockData;
  if (await lockFile.exists()) {
    try {
      lockData = await parseLockfile(lockFile);
      _mergeResolvedVersions(deps, lockData, isDev: false);
      _mergeResolvedVersions(devDeps, lockData, isDev: true);

      if (includeTransitive) {
        _addTransitiveDeps(deps, devDeps, lockData);
      }
    } catch (e, st) {
      Logger.warn(
        'Failed to parse pubspec.lock – resolved versions will be missing.',
      );
      Logger.debug('Lockfile parse error: $e\n$st');
    }
  } else {
    Logger.debug('No pubspec.lock found at $projectPath; skipping.');
  }

  return PubspecData(
    name: yaml['name']?.toString() ?? 'unknown',
    version: yaml['version']?.toString(),
    description: yaml['description']?.toString(),
    sdkConstraints: sdkConstraints,
    dependencies: deps,
    devDependencies: devDeps,
  );
}