npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@xinminlabs/node-mutation

v1.17.1

Published

ast node mutation apis

Downloads

87

Readme

npm version CI

NodeMutation

NodeMutation provides a set of APIs to rewrite node source code.

Table of Contents

Installation

Install NodeMutation using npm:

npm install --save @xinminlabs/node-mutation

Or yarn;

yarn add @xinminlabs/node-mutation

Usage

  1. initialize the NodeMutation instance:
import { Node } from "typescript"

mutation = new NodeMutation<Node>(filePath: string, source: string, { adapter: "typescript" | "espree" | "gonzales-pe" })
  1. call the rewrite apis:
// append the code to the current node.
mutation.append(node: Node, code: string)
// delete source code of the child ast node
mutation.delete(node: Node, selectors: string | string[], options: DeleteOptions)
// insert code to the ast node.
mutation.insert(node: Node, code: string, options: InsertOptions)
// prepend code to the ast node.
mutation.prepend(node: Node, code: string)
// remove source code of the ast node
mutation.remove(node: Node, options: RemoveOptions)
// replace child node of the ast node with new code
mutation.replace(node: Node, selectors: string | string[], options: ReplaceOptions)
// replace the ast node with new code
mutation.replaceWith(node: Node, code: string)
// no operation
mutation.noop(node: Node)
// group actions
mutation.group(() => {
  mutation.delete(node: Node, selectors: string | string[], options: DeleteOptions)
  mutation.insert(node: Node, code: string, options: InsertOptions)
})
  1. process actions and write the new source code to file:
mutation.process()

Evaluated Value

NodeMutation supports to evaluate the value of the node, and use the evaluated value to rewrite the source code.

source = 'class Synvert {}'
node = espree.parse(source)
mutation.replace node, '{{id}}', with: 'Foobar'
source # class Foobar {}

See more in TypescriptAdapter, SyntaxTreeAdapter, and GonzalesPeAdapter

Configuration

adapter

Different parsers, like typescript and espree, will generate different AST nodes, to make NodeMutation work for them all, we define an Adapter interface, if you implement the Adapter interface, you can set it as NodeMutation's adapter.

It provides 3 adapters:

  1. TypescriptAdapter
  2. EspreeAdapter
  3. GonzalesPeAdapter
NodeMutation.configure({ adapter: new EspreeAdapter() }); // default is TypescriptAdapter

strategy

It provides 2 strategies to handle conflicts when processing actions:

  1. Strategy.KEEP_RUNNING: keep running and ignore the conflict action.
  2. Strategy.THROW_ERROR: throw error when conflict action is found.
NodeMutation.configure({ strategy: Strategy.KEEP_RUNNING }); // default is Strategy.THROW_ERROR

tabWidth

NodeMutation.configure({ tabWidth: 4 }); // default is 2

Contributing Guide

  1. Fork and clone the repo.

  2. Run npm install to install dependencies.

  3. Run npm run test or npm run watch:test to run tests.

  4. Make some changes and make tests all passed.

  5. Push the changes to the repo.