Socket
Socket
Sign inDemoInstall

@hishprorg/mollitia-cumque

Package Overview
Dependencies
Maintainers
0
Versions
41
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@hishprorg/mollitia-cumque

<code>@hishprorg/mollitia-cumque</code> Tools for working with ESTree AST <img alt="npm" src="https://img.shields.io/npm


Version published
Weekly downloads
2
Maintainers
0
Weekly downloads
 
Created
Source

@hishprorg/mollitia-cumque

Tools for working with ESTree AST

npm Circle CI codecov License

Installation

npm i @hishprorg/mollitia-cumque
# or
yarn add @hishprorg/mollitia-cumque

Usage

// Supports both CommonJS and ES Modules
// ES Module
import { traverse, builders as b } from '@hishprorg/mollitia-cumque';
// CommonJS
const { traverse, builders: b } = require('@hishprorg/mollitia-cumque');

Basic operations

Traversing an AST

const { traverse } = require('@hishprorg/mollitia-cumque');

traverse(ast, {
  Program(path) {
    // Do something with the path
  }
});

Building Nodes

const { builders: b } = require('@hishprorg/mollitia-cumque');

b.identifier('x'); // => { type: 'Identifier', name: 'x' }

Checking node types

const { traverse, is } = require('@hishprorg/mollitia-cumque');
const { parseModule } = require('meriyah');

const ast = parseModule(`x = 0`);

traverse(ast, {
  AssignmentExpression(path) {
    if (is.identifier(path.node.left, { name: 'x' })) {
      // `left` is an identifier with name `x`
    }
  }
});

Replacing a node

const { traverse, builders: b } = require('@hishprorg/mollitia-cumque');
const { parseModule } = require('meriyah');

const ast = parseModule('a = b');

traverse(ast, {
  Identifier(path) {
    if (path.node.name === 'a') {
      path.replaceWith(b.identifier('c'));
    }
  }
});

// Now the AST represents - `c = b`

Collecting scope information

const { traverse } = require('@hishprorg/mollitia-cumque');

traverse(ast, {
  // Enable scope
  $: { scope: true },
  Program(path) {
    // `path.scope` is now available in all paths
  }
});
Checking if a binding is available
const { traverse } = require('@hishprorg/mollitia-cumque');
const { parseModule } = require('meriyah');

const ast = parseModule(`
import { a } from 'source';

const { b, c: [d, { e }] } = a;
`);

traverse(ast, {
  $: { scope: true },
  Program(path) {
    path.scope.hasBinding('a') // => true
    path.scope.hasBinding('b') // => true
    path.scope.hasBinding('c') // => false
    path.scope.hasBinding('d') // => true
    path.scope.hasBinding('e') // => true
  }
});
Getting all references of a binding
const { traverse } = require('@hishprorg/mollitia-cumque');
const { parseModule } = require('meriyah');

const ast = parseModule(`
import { a } from 'source';

fn(a);
s = a;
let obj = { a };
`);

traverse(ast, {
  $: { scope: true },
  Program(path) {
    // Returns all the paths that reference the binding `a`
    path.scope.getBinding('a').references // => [NodePath, NodePath, NodePath]
  }
});
Checking if a global has been used
const { traverse } = require('@hishprorg/mollitia-cumque');
const { parseModule } = require('meriyah');

const ast = parseModule(`
const fx = require('fx-mod');
`);

traverse(ast, {
  $: { scope: true },
  Program(path) {
    path.scope.hasGlobalBinding('require') // => true
  }
});
Renaming a binding
const { traverse } = require('@hishprorg/mollitia-cumque');
const { parseModule } = require('meriyah');

const ast = parseModule(`
const a = 0

a.reload()
while (a.ok) a.run()
`);

traverse(ast, {
  $: { scope: true },
  Program(path) {
    // `a` -> `b`
    path.scope.renameBinding('a', 'b')
  }
});

// Output code:
// const b = 0
//
// b.reload()
// while (b.ok) b.run()

Utilities

There are several static utilities that you can use.

  • evaluate
    Evaluates the given path.
    const { utils: u, traverse } = require('@hishprorg/mollitia-cumque');
    // We are using `meriyah` but you can use any parser (like `acorn`)
    const { parseModule } = require('meriyah');
    
    traverse(parseModule(`1 + 2`), {
      BinaryExpression(path) {
        u.evaluate(path) // => { value: 3 }
      }
    });
    
    traverse(parseModule(`1 === 2`), {
      BinaryExpression(path) {
        u.evaluate(path) // => { value: false }
      }
    });
    
    traverse(parseModule(`iDoNotKnowWhatThisIs === 55`), {
      BinaryExpression(path) {
        u.evaluate(path) // => undefined
      }
    });
    
    traverse(parseModule(`
      ({
        text: 'This is an object',
        data: [1, 'two']
      })
    `), {
      ObjectExpression(path) {
        u.evaluate(path) // => { value: { text: 'This is an object', data: [1, 'two'] } }
      }
    });
    
    traverse(parseModule(`1 > 5 ? 'YES' : 'NO'`), {
      ConditionalExpression(path) {
        u.evaluate(path) // => { value: 'NO' }
      }
    });
    
  • evaluateTruthy
    Evaluates the path for truthiness and returns true, false or undefined depending on evaluation result.

There's more functionalities, please read the documentation.

Documentation

You can find the documentation at https://@hishprorg/mollitia-cumque.netlify.app/

Why another traverser?

I know there is Babel. But there are other tools which are faster than Babel. For example, meriyah is 3x faster than @babel/parser, astring is up to 50x faster than @babel/generator. But these tool only work with ESTree AST. I wanted to use these faster alternatives for one of my projects but could not find any traverser with batteries-included. So I built one myself, with awesome scope analysis, it has all the things that you would need for traversing an ESTree AST. Also, a little bit faster than Babel.

License

Licensed under the MIT License.

Keywords

FAQs

Package last updated on 22 Jun 2024

Did you know?

Socket

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.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc