Unist-utils

Utilidades AST estrictamente tipadas para unist/mdast/hast usadas por el core de Boltdocs, todos los plugins oficiales @bdocs/* y el procesador MDX Sätteri. Única fuente de verdad para helpers de visita, builders de AST, helpers de h-properties, mutación de class-list y parsing de meta strings.

@bdocs/unist-utils es un paquete npm independiente que expone las utilidades AST estrictamente tipadas que comparten el core de boltdocs, todos los plugins oficiales @bdocs/* y el procesador MDX Sätteri. Antes de este paquete, los mismos helpers vivían duplicados en dos lugares del monorepo con tipados sutilmente distintos; ahora son una sola fuente de verdad.

Esta página es la referencia oficial. Úsala cuando necesites recorrer o mutar el árbol MDAST/HAST de un archivo MDX — desde un plugin de remark personalizado, un transformer en tiempo de build, hasta un componente en runtime que quiera formas estáticamente verificables.

100% tipado, de extremo a extremo

Cada export público está completamente tipado. Sin any, sin unknown en los bordes — Node, Parent, ElementNode, MdxJsxElement, etc. están todos declarados en el paquete para que los autores de plugins puedan escribir código tipado-only con confianza.

Por qué existeLink

Tres razones:

  1. Única fuente de verdad. Antes, visitNodes, createMdxElement, setNodeProperty, parseMetaString, etc. estaban duplicados entre packages/core/src/node/plugins/plugin-utils.ts y los adaptadores del plugin Sätteri. Ahora viven en un sitio, con una firma.
  2. Superficie pública para autores de plugins. Los plugins externos se veían forzados a alcanzar el barrel interno de boltdocs o a escribir sus propios helpers AST con tipados más flojos. @bdocs/unist-utils les da una superficie tipada y los desacopla de los internos de boltdocs.
  3. Prepara el terreno para APIs de plugin más ricas. Las siguientes fases se construyen sobre este paquete en lugar de sobre boltdocs mismo.

Superficie públicaLink

GrupoExports
Constantes de tipo de nodoMDX_NODES, MdxNodeType, re-exports SKIP, EXIT desde unist-util-visit@5
Tipos unist genéricosNode, Parent
MDASTMdxJsxAttribute, MdxJsxAttributeValueExpression, MdxJsxElement, MdxJsxChild, CodeNode, PlainTextNode
HASTElementNode, HastNode, HastChild
HelpersNodeWithHProperties
Type guardsisMdxJsxElement, isMdxJsxTextElement, isMdxJsxLike, isElementNode, isTextNode
VisitoresvisitNodes, visitRehypeElements, visitMdxElements, visitRemarkHeadings, visitRemarkLinks
BuilderscreateMdxAttribute, createMdxElement, createRehypeElement
PropiedadessetNodeProperty, getNodeProperty
Class listaddNodeClass, removeNodeClass, hasNodeClass
Parser de metaparseMetaString, ParsedMeta

Cada export también se re-exporta desde el core de boltdocs para compatibilidad hacia atrás.

Contrato de comportamiento — SKIP / EXITLink

unist-util-visit@5 exporta SKIP y EXIT como el string 'skip' y el booleano false respectivamente — no como Symbols.


EjemplosLink

Recorrer bloques de código MDASTLink

my-plugin.ts
import {
  MDX_NODES,
  type CodeNode,
  type Node,
  type Parent,
} from "@bdocs/unist-utils";

export function remarkCodeFences() {
  return (tree: Node) => {
    const collected: Array<{ node: CodeNode; parent: Parent; index: number }> =
      [];
    visitNodes(tree, MDX_NODES.CODE, (node, index, parent) => {
      if (node.lang === "mermaid") {
        collected.push({ node, parent, index });
      }
    });
    for (const { node, parent, index } of collected) {
      parent.children[index] = {
        type: "mdxJsxFlowElement",
        name: "Mermaid",
      } as Node;
    }
  };
}

Construir JSX de MDXLink

ts
import {
  createMdxElement,
  createMdxAttribute,
  type MdxJsxChild,
} from "@bdocs/unist-utils";

const children: MdxJsxChild[] = [];
const el = createMdxElement("MyChart", {
  chart: "graph TD",
  config: createMdxAttribute("config", { theme: "dark" }),
});

Manipular class listsLink

ts
import {
  addNodeClass,
  removeNodeClass,
  hasNodeClass,
} from "@bdocs/unist-utils";

addNodeClass(node, "shiki-fallback");
if (hasNodeClass(node, "shiki")) removeNodeClass(node, "shiki");

Parsear meta stringsLink

ts
import { parseMetaString } from "@bdocs/unist-utils";

const meta = parseMetaString('title="Mi Ejemplo" lineNumbers');
// → { title: 'Mi Ejemplo', lineNumbers: true }

Migración desde boltdocsLink

Código antiguo (todavía funciona como shim):

ts
import { visitNodes, createMdxAttribute } from "boltdocs";

Código nuevo (preferido):

ts
import { visitNodes, createMdxAttribute } from "@bdocs/unist-utils";

LicenciaLink

Publicado bajo la MIT License, igual que el resto del monorepo de Boltdocs.

Last updated on October 18, 2026

Was this page helpful?