@sern/cli
Version:
Official CLI for @sern/handler
89 lines (87 loc) • 3.26 kB
JavaScript
import { require } from '../chunk-S2QRDR2W.js';
import { getConfig } from '../chunk-PZE2TMOK.js';
import { fromCwd } from '../chunk-H6QGMA6W.js';
import { greenBright } from 'colorette';
import fs from 'fs';
import prompt from 'prompts';
import { fetch } from 'undici';
import esbuild from 'esbuild';
import { resolve } from 'path';
var link = `https://raw.githubusercontent.com/sern-handler/awesome-plugins/main/pluginlist.json`;
async function fetchPluginData() {
return fetch(link).then((res) => res.json()).then((data) => data).catch(() => []);
}
function pluginsQ(choices) {
return [{
name: "list",
type: "autocompleteMultiselect",
message: "What plugins do you want to install?",
choices: choices.map((e) => ({ title: e.name, value: e })),
min: 1
}];
}
async function plugins(args, opts) {
const plugins2 = await fetchPluginData();
let selectedPlugins;
if (args.length) {
const normalizedArgs = args.map((str) => str.toLowerCase());
console.log("Trying to find plugins to install...");
const results = plugins2.reduce((acc, cur) => {
if (normalizedArgs.includes(cur.name.toLowerCase())) {
return [...acc, cur];
}
return acc;
}, []);
selectedPlugins = results;
} else {
selectedPlugins = (await prompt(pluginsQ(plugins2))).list;
}
if (!selectedPlugins.length) {
process.exit(1);
}
const { language } = await getConfig();
for await (const plgData of selectedPlugins) {
const pluginText = await download(plgData.link);
const dir = fromCwd("/src/plugins");
const linkNoExtension = `${process.cwd()}/src/plugins/${plgData.name}`;
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
if (language === "typescript") {
fs.writeFileSync(linkNoExtension + ".ts", pluginText);
} else {
const { type = void 0 } = require(resolve("package.json"));
const format = type === void 0 || type === "cjs" ? "cjs" : "esm";
const transformResult = await esbuild.transform(pluginText, {
target: "node18",
format,
loader: "ts",
banner: `/**
Partial information: ${plgData.description}
@author ${plgData.author}
@example${plgData.example}*/`
});
if (transformResult.warnings.length > 0) {
console.log(transformResult.warnings.map((msg) => msg.text).join("\n"));
}
console.warn("transforming plugins with js strips comments");
console.warn("We provided some minimal information at top of file, or view the documentation for this plugin here:");
console.warn(plgData.link);
fs.writeFileSync(linkNoExtension + ".js", transformResult.code);
}
}
const pluginNames = selectedPlugins.map((data) => {
return "Installed " + data.name + " from " + data.author.join(",");
});
console.log(`Successfully downloaded plugin(s):
${greenBright(pluginNames.join("\n"))}`);
}
async function download(url) {
const data = await fetch(url, { method: "GET" }).then((res) => res.text()).catch(() => null);
if (!data)
throw new Error("Download failed! Kindly contact developers");
return data;
}
export { fetchPluginData, plugins, pluginsQ };
//# sourceMappingURL=out.js.map
//# sourceMappingURL=plugins.js.map