fumadocs-core
Version:
The React.js library for building a documentation website
68 lines (66 loc) • 1.65 kB
JavaScript
import { generateCodeBlockTabs } from "./codeblock-utils.js";
import { visit } from "unist-util-visit";
import convert from "npm-to-yarn";
//#region src/mdx-plugins/remark-npm.ts
const aliases = ["npm", "package-install"];
/**
* It generates multiple tabs of codeblocks for different package managers from a npm command codeblock.
*/
function remarkNpm({ persist = false, packageManagers = [
{
command: (cmd) => convert(cmd, "npm"),
name: "npm"
},
{
command: (cmd) => convert(cmd, "pnpm"),
name: "pnpm"
},
{
command: (cmd) => convert(cmd, "yarn"),
name: "yarn"
},
{
command: (cmd) => convert(cmd, "bun"),
name: "bun"
}
] } = {}) {
return (tree) => {
visit(tree, "code", (node) => {
if (!node.lang || !aliases.includes(node.lang)) return;
let code = node.value;
if (node.lang === "package-install" && !code.startsWith("npm") && !code.startsWith("npx")) code = `npm install ${code}`;
const options = {
persist,
tabs: [],
triggers: []
};
for (const manager of packageManagers) {
const value = manager.value ?? manager.name;
const command = manager.command(code);
if (!command || command.length === 0) continue;
options.defaultValue ??= value;
options.triggers.push({
value,
children: [{
type: "text",
value: manager.name
}]
});
options.tabs.push({
value,
children: [{
type: "code",
lang: "bash",
meta: node.meta,
value: command
}]
});
}
Object.assign(node, generateCodeBlockTabs(options));
return "skip";
});
};
}
//#endregion
export { remarkNpm };
//# sourceMappingURL=remark-npm.js.map