parse method
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,
);
}