build method
Generates the outputs for a given BuildStep
.
Implementation
@override
Future build(BuildStep buildStep) async {
var assetToModule = (await buildStep.fetchResource(_assetToModule))
.putIfAbsent(_platform, () => {});
var assetToPrimary = (await buildStep.fetchResource(_assetToPrimary))
.putIfAbsent(_platform, () => {});
var modules = await _transitiveModules(
buildStep, buildStep.inputId, assetToModule, assetToPrimary, _platform);
var connectedComponents = stronglyConnectedComponents<Module>(
modules,
(m) => m.directDependencies.map((d) =>
assetToModule[d] ??
Module(d, [d], [], _platform, false, isMissing: true)),
equals: (a, b) => a.primarySource == b.primarySource,
hashCode: (m) => m.primarySource.hashCode);
Module merge(List<Module> c) =>
_mergeComponent(c, assetToPrimary, _platform);
bool primarySourceInPackage(Module m) =>
m.primarySource.package == buildStep.inputId.package;
// Ensure deterministic output by sorting the modules.
var cleanModules = SplayTreeSet<Module>(
(a, b) => a.primarySource.compareTo(b.primarySource))
..addAll(connectedComponents.map(merge).where(primarySourceInPackage));
await buildStep.writeAsString(
AssetId(buildStep.inputId.package,
'lib/${metaModuleCleanExtension(_platform)}'),
jsonEncode(MetaModule(cleanModules.toList())));
}