UNPKG

remark-mdx-remove-esm

Version:

Remark plugin to remove import and/or export statements (mdxjsEsm)

89 lines (69 loc) 2.27 kB
import type { Plugin } from "unified"; import type { Root, Node, Literal } from "mdast"; import type { MdxjsEsm } from "mdast-util-mdxjs-esm"; import { remove } from "unist-util-remove"; export type MdxEsmSpecifier = "import" | "export"; export type MdxRemoveEsmOptions = MdxEsmSpecifier | MdxEsmSpecifier[]; function isLiteral(node: Node): node is Literal { return "value" in node; } function isMdxjsEsm(node: Literal): node is MdxjsEsm { return node.type === "mdxjsEsm"; } export function clsx( arr: (MdxEsmSpecifier | false | null | undefined | 0)[], ): MdxEsmSpecifier[] { return arr.filter((item): item is MdxEsmSpecifier => !!item); } const RemarkMdxRemoveEsm: Plugin<[MdxRemoveEsmOptions?], Root> = (options) => { if (typeof options === "undefined") return removeAllEsm(); if (typeof options === "string") { if (options === "export") return removeExports(); else if (options === "import") return removeImports(); } if (Array.isArray(options)) { if (options.includes("import") && options.includes("export")) { return removeAllEsm(); } else if (options.includes("export")) { return removeExports(); } else if (options.includes("import")) { return removeImports(); } } function removeAllEsm() { return (tree: Root): undefined => { remove(tree, "mdxjsEsm"); }; } function removeExports() { return (tree: Root): undefined => { remove(tree, (node) => { // type predicate if (!isLiteral(node)) return; // type predicate if (!isMdxjsEsm(node)) return; const type = node.data?.estree?.body[0].type; return ( type === "ExportNamedDeclaration" || type === "ExportDefaultDeclaration" || type === "ExportAllDeclaration" ); }); }; } function removeImports() { return (tree: Root): undefined => { // remove import declarations remove(tree, (node) => { // type predicate if (!isLiteral(node)) return; // type predicate if (!isMdxjsEsm(node)) return; const type = node.data?.estree?.body[0].type; return type === "ImportDeclaration"; }); }; } return; }; export default RemarkMdxRemoveEsm;