resolvePackages static method

Future<PackageMap> resolvePackages({
  1. required String workspacePath,
  2. required List<Glob> packages,
  3. required List<Glob> ignore,
  4. required Map<String, List<Glob>> categories,
  5. required MelosLogger logger,
  6. bool discoverNestedWorkspaces = false,
})

Implementation

static Future<PackageMap> resolvePackages({
  required String workspacePath,
  required List<Glob> packages,
  required List<Glob> ignore,
  required Map<String, List<Glob>> categories,
  required MelosLogger logger,
  bool discoverNestedWorkspaces = false,
}) async {
  final pubspecFiles = await _resolvePubspecFiles(
    workspacePath: workspacePath,
    packages: packages,
    ignore: [
      ...ignore,
      for (final pattern in _commonIgnorePatterns)
        createGlob(pattern, currentDirectoryPath: workspacePath),
    ],
    discoverNestedWorkspaces: discoverNestedWorkspaces,
  );

  final packageMap = <String, Package>{};

  for (final pubspecFile in pubspecFiles) {
    final pubspecDirPath = pubspecFile.parent.path;
    final pubspec = Pubspec.parse(pubspecFile.readAsStringSync());
    final name = pubspec.name;

    if (packageMap.containsKey(name)) {
      throw MelosConfigException(
        '''
Multiple packages with the name `$name` found in the workspace, which is unsupported.
To fix this problem, consider renaming your packages to have a unique name.

The packages that caused the problem are:
- $name at ${printablePath(relativePath(pubspecDirPath, workspacePath))}
- $name at ${printablePath(relativePath(packageMap[name]!.path, workspacePath))}
''',
      );
    }

    final filteredCategories = <String>[];

    categories.forEach((key, value) {
      final isCategoryMatching = value.any(
        (category) => category.matches(
          relativePath(pubspecDirPath, workspacePath),
        ),
      );

      if (isCategoryMatching) {
        filteredCategories.add(key);
      }
    });

    packageMap[name] = Package(
      name: name,
      path: pubspecDirPath,
      pathRelativeToWorkspace: relativePath(pubspecDirPath, workspacePath),
      version: pubspec.version ?? Version.none,
      publishTo: pubspec.publishTo.let(Uri.parse),
      packageMap: packageMap,
      dependencies: pubspec.dependencies.keys.toList(),
      devDependencies: pubspec.devDependencies.keys.toList(),
      dependencyOverrides: pubspec.dependencyOverrides.keys.toList(),
      pubspec: pubspec,
      categories: filteredCategories,
    );
  }

  return PackageMap(packageMap, logger);
}