resolveModules function
Expands selectedKeys with their transitive dependencies, always prepends
core, and returns modules in install order (dependencies before dependents,
no duplicates). Unknown keys are ignored here (validate separately).
Implementation
List<Module> resolveModules(Iterable<String> selectedKeys) {
final resolved = <String, Module>{};
void add(Module module) {
if (resolved.containsKey(module.key)) return;
for (final depKey in module.dependsOn) {
final dep = kModules[depKey];
if (dep != null) add(dep);
}
resolved[module.key] = module;
}
for (final key in selectedKeys) {
final module = kModules[key];
if (module != null) add(module);
}
return [coreModule, ...resolved.values];
}