kjelsrud.dev/node_modules/@astrojs/mdx/dist/rehype-optimize-static.js
2023-07-19 21:31:30 +02:00

63 lines
2.3 KiB
JavaScript

import { visit } from "estree-util-visit";
import { toHtml } from "hast-util-to-html";
const exportConstComponentsRe = /export\s+const\s+components\s*=/;
function rehypeOptimizeStatic(options) {
return (tree) => {
var _a, _b, _c, _d, _e, _f;
const customComponentNames = new Set(options == null ? void 0 : options.customComponentNames);
for (const child of tree.children) {
if (child.type === "mdxjsEsm" && exportConstComponentsRe.test(child.value)) {
const objectPropertyNodes = (_d = (_c = (_b = (_a = child.data.estree.body[0]) == null ? void 0 : _a.declarations) == null ? void 0 : _b[0]) == null ? void 0 : _c.init) == null ? void 0 : _d.properties;
if (objectPropertyNodes) {
for (const objectPropertyNode of objectPropertyNodes) {
const componentName = ((_e = objectPropertyNode.key) == null ? void 0 : _e.name) ?? ((_f = objectPropertyNode.key) == null ? void 0 : _f.value);
if (componentName) {
customComponentNames.add(componentName);
}
}
}
}
}
const allPossibleElements = /* @__PURE__ */ new Set();
const elementStack = [];
visit(tree, {
enter(node) {
const isCustomComponent = node.tagName && customComponentNames.has(node.tagName);
if (node.type.startsWith("mdx") || isCustomComponent) {
for (const el of elementStack) {
allPossibleElements.delete(el);
}
elementStack.length = 0;
}
if (node.type === "element" || node.type === "mdxJsxFlowElement") {
elementStack.push(node);
allPossibleElements.add(node);
}
},
leave(node, _, __, parents) {
if (node.type === "element" || node.type === "mdxJsxFlowElement") {
elementStack.pop();
const parent = parents[parents.length - 1];
if (allPossibleElements.has(parent)) {
allPossibleElements.delete(node);
}
}
}
});
for (const el of allPossibleElements) {
if (el.type === "mdxJsxFlowElement") {
el.attributes.push({
type: "mdxJsxAttribute",
name: "set:html",
value: toHtml(el.children)
});
} else {
el.properties["set:html"] = toHtml(el.children);
}
el.children = [];
}
};
}
export {
rehypeOptimizeStatic
};