buildDslResourceInventoryJson function

Map<String, dynamic> buildDslResourceInventoryJson(
  1. FFProject project, {
  2. Map<String, FFProject> libraryProjects = const {},
})

Builds the full machine-readable resource inventory for one project.

Include libraryProjects when you want linked library pages/components to be expanded instead of reported as unavailable placeholders.

Implementation

Map<String, dynamic> buildDslResourceInventoryJson(
  FFProject project, {
  Map<String, FFProject> libraryProjects = const {},
}) {
  final localPages = listPages(project);
  final localComponents = listComponents(project);
  final componentNames = [for (final item in localComponents) item.name];
  final themeTokenNames = <String>[
    for (final token in listSpacingTokens(project)) token.name,
    for (final token in listRadiusTokens(project)) token.name,
    for (final token in listShadowTokens(project)) token.name,
    ..._themeColorSlotNames(project),
    ..._themeTextStyleNames(project),
  ]..sort();
  final libraries = [
    for (final dep in listLibraryDependencies(project))
      _libraryInventoryEntry(dep, libraryProjects[dep.projectId]),
  ]..sort((a, b) => (a['name'] as String).compareTo(b['name'] as String));

  return <String, dynamic>{
    'kind': 'flash_dsl_resource_inventory',
    'project': <String, dynamic>{
      'name': project.name,
      'pageCount': localPages.length,
      'componentCount': localComponents.length,
      'pages': [
        for (final page in _sortedByName(localPages, (item) => item.name))
          <String, dynamic>{
            'name': page.name,
            'key': page.key,
            'route': page.route,
          },
      ],
      'components': [
        for (final component in _sortedByName(
          localComponents,
          (item) => item.name,
        ))
          <String, dynamic>{'name': component.name, 'key': component.key},
      ],
    },
    'theme': _themeInventory(project),
    'libraries': libraries,
    'repeatedPatternCandidates': _findRepeatedPatternCandidates(project),
    'repeatedStyleCandidates': _findRepeatedStyleCandidates(project),
    'resourceMatchers': <String, dynamic>{
      'componentNames': componentNames..sort(),
      'themeTokenNames': themeTokenNames,
    },
  };
}