transferPackageConfig static method

Future transferPackageConfig({
  1. required String fromPackage,
  2. required String toPackage,
  3. required StdoutSession stdoutSession,
  4. ({String newPackageName, String oldPackageName})? packageNameReplacementInfo,
})

Implementation

static Future transferPackageConfig({
  required String fromPackage,
  required String toPackage,
  required StdoutSession stdoutSession,
  ({
    String oldPackageName,
    String newPackageName
  })? packageNameReplacementInfo,
}) async {
  // we need to turn relative paths into absolute paths as the
  // functionality to find the package config is relying on absolute paths
  if (path.isRelative(fromPackage)) {
    fromPackage = path.absolute(fromPackage);
  }
  if (path.isRelative(toPackage)) {
    toPackage = path.absolute(toPackage);
  }

  final packageConfig =
      await package_config.findPackageConfig(Directory(fromPackage));
  if (packageConfig == null) {
    throw Exception('No package config found for $fromPackage');
  }
  await package_config.savePackageConfig(packageConfig, Directory(toPackage));

  // now we need to replace all references to "fromPackage" with "toPackage"
  // and apply potentially given package replacements
  final packageConfigFile = File(
    path.join(toPackage, '.dart_tool', 'package_config.json'),
  );
  if (!packageConfigFile.existsSync()) {
    throw Exception('No package config file found for $toPackage');
  }
  final packageConfigContent = await packageConfigFile.readAsString();
  final packageConfigJson = jsonDecode(packageConfigContent);
  for (final packageEntry in packageConfigJson['packages']) {
    final rootUri = Uri.parse(packageEntry['rootUri']);
    if (rootUri.isScheme('file')) {
      final rootPath = rootUri.toFilePath();
      if (path.equals(fromPackage, rootPath)) {
        packageEntry['rootUri'] = Uri.file(toPackage).toString();
      }
    }
    if (packageNameReplacementInfo != null) {
      // adapt rootUri of root package
      if (packageConfigJson['name'] ==
          packageNameReplacementInfo.newPackageName) {
        packageEntry['rootUri'] = '../';
      }
    }
  }
  // remove old package
  if (packageNameReplacementInfo != null) {
    (packageConfigJson['packages'] as List<dynamic>).removeWhere((entry) =>
        entry['name'] == packageNameReplacementInfo.oldPackageName);
  }
  await packageConfigFile.writeAsString(jsonEncode(packageConfigJson));
}