run method
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);
}