buildDslLibraryComponentResolutionJson function

Map<String, dynamic> buildDslLibraryComponentResolutionJson(
  1. FFProject project, {
  2. required String componentName,
  3. String? libraryName,
  4. Map<String, FFProject> libraryProjects = const {},
})

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,
  };
}