Node Source Walk AST Traversal
node-source-walk is a JavaScript utility library designed for synchronously traversing Abstract Syntax Trees (ASTs) or raw source code strings. It allows developers to apply a callback function to every node within the AST, with the crucial capability to halt the traversal prematurely using `stopWalking()`. The current stable version is 7.0.1. Releases tend to align with Node.js LTS updates, primarily dropping support for older Node.js versions. A key differentiator is its flexibility in supporting both top-down (`walk`, `traverse`) and bottom-up (`moonwalk`) traversals, accepting either source code or a pre-parsed AST, and offering the option to replace its default `@babel/parser` with a custom parser.
Common errors
-
TypeError: Walker is not a constructor
cause Attempting to import `Walker` using named import syntax (`import { Walker } from '...'`) or destructuring (`const { Walker } = require('...')`) when it is exported as a default.fixUse default import for ESM (`import Walker from 'node-source-walk';`) or direct `require` assignment for CommonJS (`const Walker = require('node-source-walk');`). -
SyntaxError: Unexpected token 'import' (or similar parsing errors for modern JS/TS features)
cause The default `@babel/parser` might not have the necessary plugins enabled to parse specific syntax (e.g., JSX, Flow, TypeScript).fixInitialize the `Walker` with `plugins` option to enable required `@babel/parser` plugins, for example: `new Walker({ plugins: ['jsx', 'typescript'] })`. -
Error: node-source-walk requires Node.js version >= 18.
cause Running a version of `node-source-walk` (v7.0.0 or higher) on an unsupported Node.js runtime environment (e.g., Node.js 16).fixUpgrade your Node.js runtime to version 18 or newer. Check your project's `engines` field in `package.json` for compatibility.
Warnings
- breaking Version 7.0.0 and above drop support for Node.js versions older than 18. Projects running on Node.js 16 or earlier must upgrade their Node.js environment or remain on a previous major version of `node-source-walk`.
- breaking In version 6.0.0, the `shouldStop` and `reverseTraverse` methods were made private. Direct access or usage of these methods in your application logic will now fail.
- breaking Version 6.0.0 dropped support for Node.js 12. If you are migrating from a version below 6.0.0 and still using Node.js 12, an upgrade to Node.js 14 or higher (or eventually Node.js 18 for v7+) is required.
- gotcha When providing a custom parser to `Walker`, ensure it exposes a `.parse` method that accepts a string and returns a valid AST. The library passes all other options to this custom parser.
Install
-
npm install node-source-walk -
yarn add node-source-walk -
pnpm add node-source-walk
Imports
- Walker
import { Walker } from 'node-source-walk';import Walker from 'node-source-walk';
- Walker
const { Walker } = require('node-source-walk');const Walker = require('node-source-walk'); - Walker (Type)
import type { WalkerOptions } from 'node-source-walk';
Quickstart
import Walker from 'node-source-walk';
// Example source code string
const src = `
const add = (a, b) => a + b;
function subtract(a, b) {
return a - b;
}
console.log(add(5, 3));
console.log(subtract(10, 4));
`;
const walker = new Walker();
let foundFunctionDeclaration = false;
console.log('Walking AST for function declarations...');
walker.walk(src, node => {
if (node.type === 'FunctionDeclaration') {
console.log(`Found function declaration: ${node.id.name}`);
foundFunctionDeclaration = true;
// Stop walking after finding the first one
walker.stopWalking();
}
});
if (!foundFunctionDeclaration) {
console.log('No function declarations found.');
}
// Example with custom parser options (for JSX)
const jsxSrc = `
import React from 'react';
function MyComponent() {
return <div>Hello, JSX!</div>;
}
`;
const jsxWalker = new Walker({
plugins: ['jsx'] // Ensure JSX plugin is enabled for parsing
});
console.log('\nWalking AST for JSX elements...');
let foundJsxElement = false;
jsxWalker.walk(jsxSrc, node => {
if (node.type === 'JSXElement') {
console.log('Found a JSXElement!');
foundJsxElement = true;
jsxWalker.stopWalking();
}
});
if (!foundJsxElement) {
console.log('No JSX elements found.');
}