@tsed/cli-core
Version:
Build your CLI with TypeScript and Decorators
41 lines (40 loc) • 1.74 kB
JavaScript
import { GlobalProviders, injector, logger } from "@tsed/di";
import chalk from "chalk";
import figures from "figures";
import { CliFs } from "../services/CliFs.js";
import { ProjectPackageJson } from "../services/ProjectPackageJson.js";
const all = (promises) => Promise.all(promises);
export async function loadPlugins() {
const $inj = injector();
const name = $inj.settings.get("name");
const rootDir = $inj.settings.get("project.rootDir");
const projectPackageJson = $inj.invoke(ProjectPackageJson);
const fs = $inj.invoke(CliFs);
const promises = Object.keys(projectPackageJson.allDependencies)
.filter((mod) => mod.startsWith(`@${name}/cli-plugin`) || mod.includes(`${name}-cli-plugin`))
.map(async (mod) => {
try {
const { default: plugin } = await fs.importModule(mod, rootDir);
if (!$inj.has(plugin)) {
const provider = GlobalProviders.get(plugin)?.clone();
if (provider?.imports.length) {
await all(provider.imports.map(async (token) => {
$inj.add(token, GlobalProviders.get(token)?.clone());
if ($inj.settings.get("loaded")) {
await $inj.invoke(token);
}
}));
}
$inj.add(plugin, provider);
if ($inj.settings.get("loaded")) {
await $inj.invoke(plugin);
}
}
logger().info(chalk.green(figures.tick), mod, "module loaded");
}
catch (er) {
logger().warn(chalk.red(figures.cross), "Fail to load plugin", mod);
}
});
await all(promises);
}