constructDepsFrom method
Gets the ConstructYamls based on the dependencies
of the project requesting revali
Implementation
Future<List<ConstructYaml>> constructDepsFrom(Directory root) async {
if (__constructs case final constructs?) {
return constructs;
}
final pubspec = root.childFile('pubspec.yaml');
final pubspecYaml = loadYaml(await pubspec.readAsString()) as YamlMap;
final devDependencies = pubspecYaml['dev_dependencies'] as YamlMap?;
final revaliConstructs = <ConstructYaml>[];
final packageConfigFile = await root.getPackageConfig();
if (!packageConfigFile.existsSync()) {
throw Exception('Failed to find package_config.json, run `dart pub get`');
}
final config = await loadProjectPackageConfig(root);
if (config == null) {
throw Exception('Failed to load package_config.json, run `dart pub get`');
}
final packages = {
for (final package in config.packages)
package.name: relativePackageUri(package),
};
for (final key in devDependencies?.keys ?? []) {
final packageUri = 'package:$key/';
final uri = Uri.parse(packageUri);
final package = await Isolate.resolvePackageUri(uri);
if (package == null) {
continue;
}
final packageDir = fs.directory(package);
final construct = packageDir.parent.childFile(constructYamlFileName);
if (!construct.existsSync()) {
continue;
}
final packageRootUri = packages[key] ?? '__unknown_version__';
final constructContent = await construct.readAsString();
final constructYaml = loadYaml(constructContent) as YamlMap;
final json = {...constructYaml.value};
json['package_path'] = packageDir.parent.path;
json['package_uri'] = packageUri;
json['package_name'] = key;
json['package_root_uri'] = packageRootUri;
revaliConstructs.add(ConstructYaml.fromJson(json));
}
await checkConstructs(revaliConstructs);
return __constructs = revaliConstructs;
}