unist-util-visit

Tiny utility to walk unist syntax trees and run a visitor on matching nodes

Library
npm
v5.1.0
360 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
40 /100 Fair
Development Activity 0
Maintenance 20
Community 60
Maturity 60
Momentum 20

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
88 /100 Excellent
Architecture 85
Code Quality 90
Innovation 90
Learning Curve 85

unist-util-visit is a small, focused utility from the unified/syntax-tree collective for walking unist abstract syntax trees such as mdast (Markdown), hast (HTML), and nlcst (natural language). It performs depth-first traversal and calls a visitor function for every node, or only for nodes matching a unist-util-is compatible test.

The visitor receives each node along with its index and parent, and can inspect, mutate, skip subtrees, or stop the walk entirely by returning control actions. It is one of the most widely depended-on building blocks in the remark, rehype, and retext plugin ecosystems.

What You Get

  • A single visit(tree[, test], visitor[, reverse]) function that covers the common tree-walking use case
  • Control actions CONTINUE, SKIP, and EXIT to steer or stop traversal from inside the visitor
  • unist-util-is compatible tests so you can target nodes by type, property, or predicate function
  • Rich TypeScript types that infer the concrete node and parent types for a given tree and test
  • ESM-only, dependency-light package that works in Node.js, Deno, and browsers via esm.sh

Common Use Cases

  • Writing remark, rehype, or retext plugins that transform Markdown, HTML, or prose syntax trees
  • Collecting or rewriting specific node types (links, headings, images, text) across a document
  • Mutating a tree in place - removing, replacing, or reordering nodes during a single walk
  • Extracting data such as all headings or code blocks for tables of contents or indexes

Under The Hood

Architecture

The entire runtime lives in lib/index.js, where the exported visit function is a thin ergonomic wrapper around visitParents from the sibling unist-util-visit-parents package. visit first normalizes its overloaded arguments - detecting whether the second argument is a visitor or a unist-util-is test and whether the third is a visitor or the reverse flag - then delegates the actual depth-first traversal to visitParents. It adapts the parents-stack callback signature into the friendlier (node, index, parent) shape by taking the last element of the parents array as parent and computing index via parent.children.indexOf(node). The CONTINUE, EXIT, and SKIP action constants are simply re-exported from the parents package. index.js at the root re-exports the public runtime and the types live in index.d.ts.

Tech Stack

This is pure ESM JavaScript ("type": "module", single "exports": "./index.js") authored with JSDoc and compiled to .d.ts declarations via the TypeScript compiler. Runtime dependencies are minimal: @types/unist, unist-util-is, and unist-util-visit-parents. Development tooling includes c8 for coverage, tsd and type-coverage for type checking, and xo/prettier/remark for linting and formatting. It targets Node.js 16 and up.

Code Quality

Quality is exemplary for a micro-utility. A dedicated test.js suite exercises the API and the build enforces 100% code coverage (c8 --100) and 100% type coverage (typeCoverage.atLeast: 100, strict). The source is densely annotated with JSDoc, including elaborate conditional-type machinery that infers which nodes reach the visitor and what their parents can be. Naming is consistent with the wider syntax-tree ecosystem and error handling is unnecessary given the pure, side-effect-free traversal design.

API Design

The public surface is deliberately tiny: one visit function plus three action constants. Function overloads make the test argument optional while preserving precise types, so a visitor for 'text' nodes is typed as receiving a text node. The README documents every export and type thoroughly, and getting started requires almost no boilerplate - import visit, pass a tree and a callback. This minimalism and strong typing are why it underpins so much of the unified ecosystem.

Used by 36 apps in this directory

TypeScript
89%
Other

strapi

CMS

73,368

Open-source headless CMS that auto-generates REST and GraphQL APIs from your content models, with a fully customizable admin panel you control.

View details
93
Repo Health
84
Technical
63
Dependency
Built with
TypeScript 89%
JavaScript 11%
Updated 1 weeks ago
TypeScript
92%
Other

Suna

AI Agents

20,306

Turn your company into a git repo — one config, one command center, a workforce of AI agents that runs the real work around the clock.

View details
90
Repo Health
79
Technical
65
Dependency
Built with
TypeScript 92%
Updated 6 days ago
TypeScript
72%
Apache 2.0

Supabase

Authentication · Databases · Developer Tools

113,827

The open-source Postgres development platform that replaces Firebase with authentication, real-time APIs, edge functions, storage, and vector embeddings — all built on PostgreSQL.

View details
90
Repo Health
91
Technical
62
Dependency
Built with
TypeScript 72%
MDX 26%
Updated 6 days ago
Python
71%
Apache 2.0

SurfSense

AI Assistants · Search

16,586

The open-source, unlimited NotebookLM alternative with real-time collaboration, a desktop app, and no vendor lock-in.

View details
88
Repo Health
71
Technical
66
Dependency
Built with
Python 71%
TypeScript 27%
Updated 6 days ago
Rust
93%
Other

Tabby

AI Code Assistants

33,924

Self-hosted AI coding assistant — run GitHub Copilot-grade code completion on your own hardware with no cloud dependency.

View details
55
Repo Health
78
Technical
61
Dependency
Built with
Rust 93%
Updated 4 months ago
TypeScript
98%
Apache 2.0

TinaCMS

CMS

13,845

An open-source, Git-backed headless CMS that gives editors a live visual editing UI over Markdown, MDX, JSON, and YAML content while developers keep everything in version control.

View details
92
Repo Health
74
Technical
59
Dependency
Built with
TypeScript 98%
Updated 1 weeks ago
TypeScript
65%
Other

Typebot

AI Assistants · AI Development · Developer Tools

10,576

Build sophisticated chatbots visually, embed them anywhere without iframes, and own your data — fully self-hostable with a modular block system and 30+ integrations.

View details
94
Repo Health
82
Technical
64
Dependency
Built with
TypeScript 65%
MDX 34%
Updated 1 weeks ago
Rust
33%
Other

Windmill

Automation · Developer Tools

18,257

Turn scripts into webhooks, workflows, and auto-generated UIs — the fastest self-hostable workflow engine, 13x faster than Airflow.

View details
91
Repo Health
82
Technical
64
Dependency
Built with
Rust 33%
TypeScript 24%
Svelte 22%
Updated 6 days ago
Python
57%
Apache 2.0

Zulip

Team Chat

26,102

Topic-based team chat that brings the structure of email threads to real-time messaging, so distributed teams never lose context across hundreds of concurrent conversations.

View details
96
Repo Health
86
Technical
60
Dependency
Built with
Python 57%
TypeScript 19%
JavaScript 11%
Updated 1 weeks ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers