Security News
Fluent Assertions Faces Backlash After Abandoning Open Source Licensing
Fluent Assertions is facing backlash after dropping the Apache license for a commercial model, leaving users blindsided and questioning contributor rights.
snapdragon-node
Advanced tools
The snapdragon-node npm package is a utility for creating, visiting, and manipulating AST (Abstract Syntax Tree) nodes. It is commonly used in conjunction with other libraries to parse and transform code or data structures.
Creating Nodes
This feature allows you to create new AST nodes. In this example, a new node of type 'text' with the value 'Hello, world!' is created.
const Node = require('snapdragon-node');
const node = new Node({ type: 'text', value: 'Hello, world!' });
console.log(node);
Visiting Nodes
This feature allows you to visit nodes of a specific type within an AST. In this example, all 'text' nodes within the root node are visited, and their values are logged.
const Node = require('snapdragon-node');
const visit = require('snapdragon-visit');
const node = new Node({ type: 'root', nodes: [new Node({ type: 'text', value: 'Hello' }), new Node({ type: 'text', value: 'World' })] });
visit(node, 'text', (node) => console.log(node.value));
Manipulating Nodes
This feature allows you to manipulate existing nodes. In this example, the value of a 'text' node is changed from 'Hello' to 'Hello, world!'.
const Node = require('snapdragon-node');
const node = new Node({ type: 'text', value: 'Hello' });
node.value = 'Hello, world!';
console.log(node);
Unist (Universal Syntax Tree) is a project that provides a set of specifications for syntax trees. It is similar to snapdragon-node in that it deals with ASTs, but it is more focused on providing a universal format for different types of syntax trees.
Babel-types is a utility library for AST nodes used by Babel. It provides methods for building, validating, and converting AST nodes. It is similar to snapdragon-node but is more specialized for use with Babel's ecosystem.
Class for creating AST nodes.
Please consider following this project's author, Jon Schlinkert, and consider starring the project to show your :heart: and support.
Install with npm:
$ npm install --save snapdragon-node
const Node = require('snapdragon-node');
// either pass on object with "type" and (optional) "val"
const node1 = new Node({type: 'star', val: '*'});
// or pass "val" (first) and "type" (second) as string
const node2 = new Node('*', 'star');
// both result in => Node { type: 'star', val: '*' }
With snapdragon v0.9.0 and higher, it's recommended that you use this.node()
to create a new Node
inside parser handlers (instead of doing new Node()
).
Example usage inside a snapdragon parser handler function.
const Node = require('snapdragon-node');
const Token = require('snapdragon-token');
// create a new AST node
const node = new Node({ type: 'star', value: '*' });
// convert a Lexer Token into an AST Node
const token = new Token({ type: 'star', value: '*' });
const node = new Node(token);
AST Nodes are represented as Node
objects that implement the following interface:
interface Node {
type: string;
value: string | undefined
nodes: array | undefined
}
type
{string} - A string representing the node variant type. This property is often used for classifying the purpose or nature of the node, so that parsers or compilers can determine what to do with it.value
{string|undefined} (optional) - In general, value should only be a string when node.nodes
is undefined. This is not reinforced, but is considered good practice. Use a different property name to store arbitrary strings on the node when node.nodes
is an array.nodes
{array|undefined} (optional) - array of child nodesA number of useful methods and non-enumerable properties are also exposed for adding, finding and removing child nodes, etc.
Continue reading the API documentation for more details.
Create a new AST Node
with the given type
and value
, or an object to initialize with.
Params
type
{object|string}: Either an object to initialize with, or a string to be used as the node.type
.value
{string|boolean}: If the first argument is a string, the second argument may be a string value to set on node.value
.clone
{boolean}: When an object is passed as the first argument, pass true as the last argument to deep clone values before assigning them to the new node.returns
{Object}: node instanceExample
console.log(new Node({ type: 'star', value: '*' }));
console.log(new Node('star', '*'));
// both result in => Node { type: 'star', value: '*' }
Return a clone of the node. Values that are arrays or plain objects are deeply cloned.
returns
{Object}: returns a clone of the nodeExample
const node = new Node({type: 'star', value: '*'});
consle.log(node.clone() !== node);
//=> true
Return a string created from node.value
and/or recursively visiting over node.nodes
.
returns
{String}Example
const node = new Node({type: 'star', value: '*'});
consle.log(node.stringify());
//=> '*'
Push a child node onto the node.nodes
array.
Params
node
{Object}returns
{Number}: Returns the length of node.nodes
, like Array.push
Example
const foo = new Node({type: 'foo'});
const bar = new Node({type: 'bar'});
foo.push(bar);
Unshift a child node onto node.nodes
, and set node
as the parent on child.parent
.
Params
node
{Object}returns
{Number}: Returns the length of node.nodes
Example
const foo = new Node({type: 'foo'});
const bar = new Node({type: 'bar'});
foo.unshift(bar);
Pop a node from node.nodes
.
returns
{Number}: Returns the popped node
Example
const node = new Node({type: 'foo'});
node.push(new Node({type: 'a'}));
node.push(new Node({type: 'b'}));
node.push(new Node({type: 'c'}));
node.push(new Node({type: 'd'}));
console.log(node.nodes.length);
//=> 4
node.pop();
console.log(node.nodes.length);
//=> 3
Shift a node from node.nodes
.
returns
{Object}: Returns the shifted node
Example
const node = new Node({type: 'foo'});
node.push(new Node({type: 'a'}));
node.push(new Node({type: 'b'}));
node.push(new Node({type: 'c'}));
node.push(new Node({type: 'd'}));
console.log(node.nodes.length);
//=> 4
node.shift();
console.log(node.nodes.length);
//=> 3
Remove node
from node.nodes
.
Params
node
{Object}returns
{Object}: Returns the removed node.Example
node.remove(childNode);
Get the first child node from node.nodes
that matches the given type
. If type
is a number, the child node at that index is returned.
Params
type
{String}returns
{Object}: Returns a child node or undefined.Example
const child = node.find(1); //<= index of the node to get
const child = node.find('foo'); //<= node.type of a child node
const child = node.find(/^(foo|bar)$/); //<= regex to match node.type
const child = node.find(['foo', 'bar']); //<= array of node.type(s)
Returns true if node.nodes
array contains the given node
.
Params
type
{String}returns
{Boolean}Example
const foo = new Node({type: 'foo'});
const bar = new Node({type: 'bar'});
cosole.log(foo.has(bar)); // false
foo.push(bar);
cosole.log(foo.has(bar)); // true
Return true if the node.nodes
has the given type
.
Params
type
{String}returns
{Boolean}Example
const foo = new Node({type: 'foo'});
const bar = new Node({type: 'bar'});
foo.push(bar);
cosole.log(foo.hasType('qux')); // false
cosole.log(foo.hasType(/^(qux|bar)$/)); // true
cosole.log(foo.hasType(['qux', 'bar'])); // true
Return true if the node is the given type
.
Params
type
{String}returns
{Boolean}Example
const node = new Node({type: 'bar'});
cosole.log(node.isType('foo')); // false
cosole.log(node.isType(/^(foo|bar)$/)); // true
cosole.log(node.isType(['foo', 'bar'])); // true
Returns true if node.value
is an empty string, or node.nodes
does not contain any non-empty text nodes.
Params
fn
{Function}: (optional) Filter function that is called on node
and/or child nodes. isEmpty
will return false immediately when the filter function returns false on any nodes.returns
{Boolean}Example
const node = new Node({type: 'text'});
node.isEmpty(); //=> true
node.value = 'foo';
node.isEmpty(); //=> false
Returns true if the node has an ancestor node of the given type
Params
type
{String}returns
{Boolean}Example
const box = new Node({type: 'box'});
const marble = new Node({type: 'marble'});
box.push(marble);
marble.isInside('box'); //=> true
Get the siblings array, or null
if it doesn't exist.
returns
{Array}Example
const foo = new Node({type: 'foo'});
const bar = new Node({type: 'bar'});
const baz = new Node({type: 'baz'});
foo.push(bar);
foo.push(baz);
console.log(bar.siblings.length) // 2
console.log(baz.siblings.length) // 2
Calculate the node's current index on node.parent.nodes
, or -1
if the node does not have a parent, or is not on node.parent.nodes
.
returns
{Number}Example
const foo = new Node({type: 'foo'});
const bar = new Node({type: 'bar'});
const baz = new Node({type: 'baz'});
const qux = new Node({type: 'qux'});
foo.push(bar);
foo.push(baz);
foo.unshift(qux);
console.log(bar.index) // 1
console.log(baz.index) // 2
console.log(qux.index) // 0
Get the previous node from the siblings array or null
.
returns
{Object}Example
const foo = new Node({type: 'foo'});
const bar = new Node({type: 'bar'});
const baz = new Node({type: 'baz'});
foo.push(bar);
foo.push(baz);
console.log(baz.prev.type) // 'bar'
Get the next element from the siblings array, or null
if a next node does not exist.
returns
{Object}Example
const parent = new Node({type: 'root'});
const foo = new Node({type: 'foo'});
const bar = new Node({type: 'bar'});
const baz = new Node({type: 'baz'});
parent.push(foo);
parent.push(bar);
parent.push(baz);
console.log(foo.next.type) // 'bar'
console.log(bar.next.type) // 'baz'
Get the first child node from node.nodes
.
returns
{Object}: The first node, or undefiendExample
const foo = new Node({type: 'foo'});
const bar = new Node({type: 'bar'});
const baz = new Node({type: 'baz'});
const qux = new Node({type: 'qux'});
foo.push(bar);
foo.push(baz);
foo.push(qux);
console.log(foo.first.type) // 'bar'
Get the last child node from node.nodes
.
returns
{Object}: The last node, or undefiendExample
const foo = new Node({type: 'foo'});
const bar = new Node({type: 'bar'});
const baz = new Node({type: 'baz'});
const qux = new Node({type: 'qux'});
foo.push(bar);
foo.push(baz);
foo.push(qux);
console.log(foo.last.type) // 'qux'
Get the node.depth
. The root node has a depth of 0. Add 1 to child nodes for each level of nesting.
returns
{Object}: The last node, or undefiendExample
const foo = new Node({type: 'foo'});
foo.push(bar);
console.log(foo.depth) // 1
console.log(bar.depth) // 2
Static method that returns true if the given value is a node.
Params
node
{Object}returns
{Boolean}Example
const Node = require('snapdragon-node');
const node = new Node({type: 'foo'});
console.log(Node.isNode(node)); //=> true
console.log(Node.isNode({})); //=> false
node.isNode
{boolean} - this value is set to true
when a node is created. This can be useful in situationas as a fast alternative to using instanceof Node
if you need to determine if a value is a node
object.node.size
{number} - the number of child nodes that have been pushed or unshifted onto node.nodes
using the node's API. This is useful for determining if nodes were added to node.nodes
without using node.push()
or node.unshift()
(for example: if (node.nodes && node.size !== node.nodes.length)
)node.parent
{object} (instance of Node)See the changelog.
Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.
Please read the contributing guide for advice on opening issues, pull requests, and coding standards.
Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
$ npm install && npm test
(This project's readme.md is generated by verb, please don't edit the readme directly. Any changes to the readme must be made in the .verb.md readme template.)
To generate the readme, run the following command:
$ npm install -g verbose/verb#dev verb-generate-readme && verb
You might also be interested in these projects:
Jon Schlinkert
Copyright © 2018, Jon Schlinkert. Released under the MIT License.
This file was generated by verb-generate-readme, v0.8.0, on November 24, 2018.
3.0.0 - 2018-11-24
Removed
node.define
was removed. Use define-property or Object.defineProperty
instead.Added
node.isEmpty
methodnode.clone
method, for cloning the nodenode.stringify
method, for returning a string from node.value
and/or from recursing over child nodes.FAQs
Class for creating AST nodes.
The npm package snapdragon-node receives a total of 7,406,799 weekly downloads. As such, snapdragon-node popularity was classified as popular.
We found that snapdragon-node demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Fluent Assertions is facing backlash after dropping the Apache license for a commercial model, leaving users blindsided and questioning contributor rights.
Research
Security News
Socket researchers uncover the risks of a malicious Python package targeting Discord developers.
Security News
The UK is proposing a bold ban on ransomware payments by public entities to disrupt cybercrime, protect critical services, and lead global cybersecurity efforts.