Parse, inspect, transform, and serialize content through syntax trees
—
Core content processing functionality providing a three-phase pipeline for parsing text to syntax trees, running transformations, and compiling back to text format. Supports both synchronous and asynchronous operation modes.
Parses text input into a syntax tree using the configured parser.
/**
* Parse text to a syntax tree
* @param file - File to parse (string, VFile, or compatible)
* @returns Syntax tree representing the input
* @throws Error if no parser is configured
*/
parse<ParseTree extends Node = Node>(file?: Compatible): ParseTree;Usage Examples:
import { unified } from "unified";
const processor = unified().use(someParser);
// Parse string content
const tree = processor.parse("# Hello World");
// Parse with VFile
import { VFile } from "vfile";
const file = new VFile({value: "# Hello", path: "readme.md"});
const tree = processor.parse(file);Errors:
"Cannot \parse` without `parser`"` if no parser is configuredCompiles a syntax tree back to text using the configured compiler.
/**
* Compile a syntax tree to text
* @param tree - Syntax tree to compile
* @param file - File context (optional)
* @returns Compiled text or custom result
* @throws Error if no compiler is configured
*/
stringify<CompileTree extends Node = Node, CompileResult = CompileResults>(
tree: CompileTree,
file?: Compatible
): CompileResult;Usage Examples:
import { unified } from "unified";
const processor = unified()
.use(someParser)
.use(someCompiler);
const tree = processor.parse("# Hello World");
const output = processor.stringify(tree);
console.log(String(output)); // Compiled textResult Types:
string or Uint8Array: Standard text outputRuns all configured transformers on a syntax tree asynchronously.
/**
* Run transformers on a syntax tree (async)
* @param tree - Tree to transform
* @param file - File context (optional)
* @param done - Completion callback (optional)
* @returns Promise resolving to transformed tree if no callback
*/
run(
tree: HeadTree extends undefined ? Node : HeadTree,
file?: Compatible,
done?: RunCallback<TailTree extends undefined ? Node : TailTree>
): Promise<TailTree extends undefined ? Node : TailTree> | undefined;
// Overloaded signatures
run(
tree: HeadTree extends undefined ? Node : HeadTree,
done: RunCallback<TailTree extends undefined ? Node : TailTree>
): undefined;Usage Examples:
import { unified } from "unified";
const processor = unified()
.use(someParser)
.use(someTransformer)
.use(anotherTransformer);
// Promise-based usage
const tree = processor.parse("content");
const transformedTree = await processor.run(tree);
// Callback-based usage
processor.run(tree, (error, resultTree, file) => {
if (error) throw error;
console.log("Transformed:", resultTree);
});
// With file context
import { VFile } from "vfile";
const file = new VFile("content");
const tree = processor.parse(file);
const result = await processor.run(tree, file);Runs all configured transformers on a syntax tree synchronously.
/**
* Run transformers on a syntax tree (sync)
* @param tree - Tree to transform
* @param file - File context (optional)
* @returns Transformed tree
* @throws Error if async transformers are configured
*/
runSync<HeadTree extends Node = Node, TailTree extends Node = Node>(
tree: HeadTree,
file?: Compatible
): TailTree;Usage Examples:
const processor = unified()
.use(someParser)
.use(someSyncTransformer);
const tree = processor.parse("content");
const transformedTree = processor.runSync(tree);Errors:
"\runSync` finished async. Use `run` instead"` if async transformers are usedComplete processing pipeline: parse → run → stringify, executed asynchronously.
/**
* Process content through complete pipeline (async)
* @param file - Input content to process
* @param done - Completion callback (optional)
* @returns Promise resolving to processed VFile if no callback
*/
process(
file?: Compatible,
done?: ProcessCallback<VFileWithOutput<CompileResult>>
): Promise<VFileWithOutput<CompileResult>> | undefined;Usage Examples:
import { unified } from "unified";
const processor = unified()
.use(someParser)
.use(someTransformer)
.use(someCompiler);
// Promise-based usage
const result = await processor.process("# Hello World");
console.log(String(result)); // Final output
console.log(result.path); // File metadata
// Callback-based usage
processor.process("content", (error, file) => {
if (error) throw error;
console.log("Result:", String(file));
});
// With VFile input
import { VFile } from "vfile";
const input = new VFile({value: "content", path: "input.md"});
const result = await processor.process(input);Result Structure:
file.value: Contains the final compiled output (string/Uint8Array)file.result: Contains custom compiler results (non-serialized output)file.messages: Processing messages and warningsComplete processing pipeline executed synchronously.
/**
* Process content through complete pipeline (sync)
* @param file - Input content to process
* @returns Processed VFile with result
* @throws Error if async operations are detected
*/
processSync<CompileResult = CompileResults>(
file?: Compatible
): VFileWithOutput<CompileResult>;Usage Examples:
const processor = unified()
.use(someParser)
.use(someSyncTransformer)
.use(someCompiler);
const result = processor.processSync("# Hello World");
console.log(String(result));Errors:
"Cannot \process` without `parser`"` if no parser configured"Cannot \process` without `compiler`"` if no compiler configured"\processSync` finished async. Use `process` instead"` for async operationsparser functioncompiler functionInstall with Tessl CLI
npx tessl i tessl/npm-unified