installMissingCloudflarePackages function

Future<void> installMissingCloudflarePackages({
  1. required String npm,
  2. required Iterable<String> packages,
})

Installs only Node packages that are not already declared.

Reinstalling a declared package without a version can rewrite an exact dependency to npm's configured save prefix, even when nothing changed.

Implementation

Future<void> installMissingCloudflarePackages({
  required String npm,
  required Iterable<String> packages,
}) async {
  final packageJson = File("cloudflare/package.json");
  final declared = <String>{};
  if (packageJson.existsSync()) {
    final decoded = jsonDecode(await packageJson.readAsString());
    if (decoded is Map) {
      for (final section in ["dependencies", "devDependencies"]) {
        final values = decoded[section];
        if (values is Map) {
          declared.addAll(values.keys.map((key) => key.toString()));
        }
      }
    }
  }
  final missing = packages.where((package) => !declared.contains(package));
  if (missing.isEmpty) {
    return;
  }
  await command(
    "Package installation.",
    [npm, "install", ...missing],
    workingDirectory: "cloudflare",
    runInShell: true,
  );
}