buildDslLibraryComponentResolutionJson function
Resolves one library component name against linked library dependencies.
This is the payload behind flash dsl resources --library-component ....
Implementation
Map<String, dynamic> buildDslLibraryComponentResolutionJson(
FFProject project, {
required String componentName,
String? libraryName,
Map<String, FFProject> libraryProjects = const {},
}) {
final entries = <Map<String, dynamic>>[];
final allNames = <String>[];
for (final dep in listLibraryDependencies(project)) {
if (libraryName != null && dep.name != libraryName) {
continue;
}
final libraryProject = libraryProjects[dep.projectId];
if (libraryProject == null) {
entries.add(<String, dynamic>{
'library': dep.name,
'projectId': dep.projectId,
'available': false,
'components': const <Map<String, dynamic>>[],
});
continue;
}
final components = listLibraryComponents(
libraryProject,
libraryProjectId: dep.projectId,
libraryName: dep.name,
);
allNames.addAll([for (final component in components) component.name]);
entries.add(<String, dynamic>{
'library': dep.name,
'projectId': dep.projectId,
'available': true,
'components': [
for (final component in _sortedByName(components, (item) => item.name))
<String, dynamic>{'name': component.name, 'key': component.key},
],
});
}
Map<String, dynamic>? exactMatch;
for (final entry in entries) {
for (final component in (entry['components'] as List).cast<Map>()) {
if (component['name'] == componentName) {
exactMatch = <String, dynamic>{
'library': entry['library'],
'projectId': entry['projectId'],
'name': component['name'],
'key': component['key'],
};
break;
}
}
if (exactMatch != null) {
break;
}
}
return <String, dynamic>{
'kind': 'flash_dsl_library_component_resolution',
'query': componentName,
if (libraryName != null) 'library': libraryName,
'exactMatch': exactMatch,
'suggestions': suggestNearMatches(componentName, allNames),
'libraries': entries,
};
}