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 🙏

© 2025 – Pkg Stats / Ryan Hefner

nuclide-reprint-js

v0.0.35

Published

Pretty printing for the Javascript AST

Downloads

26

Readme

Reprint

Takes in an AST and pretty prints it.

(function foo(someLongArgument, anotherLongArgument,
   aThirdReallyLongArgumentNameThatCouldBreakThings) { dosomething()})(1, 2, 3);

(function bar(
  a,
  b,
  c
){})();

Becomes:

(function foo(
  someLongArgument,
  anotherLongArgument,
  aThirdReallyLongArgumentNameThatCouldBreakThings,
) {
  dosomething();
})(1, 2, 3);

(function bar(a, b, c) {})();

Ideology

This only reprints the existing AST, it should not result in a change that alters the AST in any way. Fixing the AST is the job of another tool.

We do:

  • Add trailing commas
  • Add parens around the single argument in an arrow function

We don't:

  • Separate long string literals with + so the line can break
    • May be worth doing this since it almost has to be done within a formatter, it doesn't make much sense for this to be done as a transform with no context of how the code will be printed.
  • Switch the type of quotes around string literals
    • This can change how things must be escaped
    • Could potentially fix this by not considering literal.raw part of the AST, but literal.raw is required in order to print integral number literals that exceed MAX_SAFE_INTEGER
  • Simplify unnecessary parenthesis around series of expressions

Code Patterns and Terminology

Simple

Simple means that no context is needed in order to produce the output. Nodes below the tree rooted at the current node are not considered additional context.

Complex

Complex means that context is required to produce the output. This means nodes above, or siblings of the current node are required.

Printer

A printer takes in a node and any context in order to produce an array of lines.

Wrapper

A wrapper is similar to a printer except that it also takes in some already printed lines.

Resolver

A resolver works on lines and options (not the full context) in order to remove markers.

Marker

A marker is a special string that conveys some information to a resolver. It may tell the resolver to add a space, or that it's okay to break at the current location.