run method

  1. @override
Future<bool> run()
override

Runs this command.

The return value is wrapped in a Future if necessary and returned by CommandRunner.runCommand.

Implementation

@override
Future<bool> run() async {
  final blockLogger = logger.headerBlock("Aggregate");

  final args = argResults!;
  final String distDir = Utils.getFinalDir(args['dist']);
  final String iacDir = Utils.pathFromRoot(KnownPaths.iac, rootDir);

  if (!Directory(rootDir).existsSync()) throw ArgumentError.notNull('input');
  if (Directory(distDir).existsSync()) {
    Directory(distDir).deleteSync(recursive: true);
  }
  Directory(distDir).createSync(recursive: true);

  final zips =
      await Utils.findFiles(subPath: 'lambdas', matcher: RegExps.lambdaZips)
          .toList();
  blockLogger.printLine(
      "   📥 Received ${zips.map((e) => path.basename(e.path)).join(', ')}");

  for (var zipFile in zips) {
    blockLogger.printFixed("   🚀 Copying ${path.basename(zipFile.path)}");
    zipFile.copySync(path.join(distDir, path.basename(zipFile.path)));
    blockLogger.printDone();
  }

  final iacFiles =
      await Utils.findFiles(matcher: RegExps.fileIaCJson).toList();
  final sharedIacFile =
      iacFiles.firstWhereOrNull((f) => f.path.contains('/shared/'));
  Map<String, dynamic> sharedIaC = sharedIacFile != null
      ? jsonDecode(sharedIacFile.readAsStringSync())
      : <String, dynamic>{};
  if (sharedIacFile != null) {
    iacFiles.remove(sharedIacFile);
    sharedIaC = _transformSharedIaC(sharedIaC);
  }

  final tfVarsMap = <String, dynamic>{
    ...sharedIaC,
    "lambda_configs": <String, dynamic>{},
  };
  blockLogger.printFixed("   🔩 Merging IaC definitions");
  for (var jsonFile in iacFiles) {
    final isLambda = jsonFile.path.contains('/lambdas/');
    if (!isLambda) continue; // We're only here for lambda configs

    final name = path.basename(jsonFile.parent.path);
    Map<String, dynamic> iac = jsonDecode(jsonFile.readAsStringSync());
    iac.remove(r"$schema");
    iac['routes'] = iac.takeOr('routes', fallback: []);
    iac['cloudfront_event'] = iac.takeOr('cloudfront_event', fallback: '');
    tfVarsMap['lambda_configs'][name] = iac;
  }
  File(path.join(distDir, 'iac.auto.tfvars.json'))
      .writeAsStringSync(jsonEncode(tfVarsMap));

  // If there's an IaC directory, put a copy there for convenience.
  if (Directory(iacDir).existsSync()) {
    File(path.join(iacDir, 'iac.auto.tfvars.json'))
        .writeAsStringSync(jsonEncode(tfVarsMap));
  }

  blockLogger.printDone();

  final gitCloser = blockLogger.printFixed("   📝 Noting IaC Hash");
  final gitHash = Utils.getGitHash(rootDir);
  final gitResult = gitHash != null;
  if (gitResult) {
    File(path.join(distDir, 'iac.hash')).writeAsStringSync(gitHash);
  }
  gitCloser(gitResult);

  return blockLogger.close(true);
}