const DependencyResolver = require('dependency-resolver');
const reorderDependencies = (languages) => {
const resolver = new DependencyResolver();
for (const lang of languages) {
resolver.add(lang.name);
for (const required of lang.requires) {
resolver.setDependency(lang.name, required);
}
}
return resolver.sort().map((name) =>
languages.find((l) => l.name === name)
);
};
const languagesByGroup = (languages, groupIdentifier) => {
const groupName = groupIdentifier.replace(":", "");
return languages.filter((el) => el.categories.includes(groupName));
};
const isGroup = (id) => id[0] === ":";
const filter = (allLanguages, includes) => {
if (!includes || includes.length === 0) { return reorderDependencies(allLanguages); }
let languages = [];
for (const item of includes) {
if (isGroup(item)) {
languages = languages.concat(languagesByGroup(allLanguages, item));
} else {
const languageName = item;
const found = allLanguages.find((el) => el.name === languageName);
if (found) { languages.push(found); } else {
console.error(`[ERROR] Language '${languageName}' could not be found.`);
process.exit(1);
}
}
}
for (const lang of languages) {
lang.requires.forEach(needed => {
if (!languages.find((el) => el.name === needed)) {
console.info(`[INFO] Adding ${needed}... ${lang.name} requires ${needed}.`);
languages.push(allLanguages.find((el) => el.name === needed));
}
});
}
return reorderDependencies(languages);
};
module.exports = { reorderDependencies, filter };