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

prettier-printer

v1.1.4

Published

A pretty printing library

Downloads

2,000

Readme

Prettier Printer · GitHub stars npm

A pretty printing library for text documents that can be rendered to a desired maximum width. Basic features:

As an example, the evaluation output in this live CodeSandbox example is formatted using this library.

npm version Bower version Build Status Code Coverage

Contents

Tutorial

To be done.

In the meanwhile, read Philip Wadler's paper A prettier printer.

Reference

Typically one imports the library as:

import * as PP from 'prettier-printer'

The examples also utilize Ramda, bound as R.

Rendering documents

PP.render(maxCols, doc) ~> string v1.0.0

PP.render renders the document to a string trying to keep the width of the document within the specified maximum. A width of 0 means that there is no maximum. See also PP.renderWith.

For example:

PP.render(
  10,
  PP.indent('-- ', PP.group(PP.intersperse(PP.line, ['Hello,', 'world!'])))
)
// -- Hello,
// -- world!

PP.renderWith({text: (state, string) => state, line: state => state}, state, maxCols, doc) ~> state v1.0.0

PP.renderWith renders the document with the given actions text and line. You can use this function to output the document without creating an intermediate string of the whole document. See also PP.render.

Document constants

Any string that doesn't contain '\n' or '\r' characters is considered as an atomic document. For example, '' is an empty document and ' ' is a space.

PP.line ~> doc v1.0.0

PP.line renders as a new line unless undone by PP.group in which case PP.line renders as a space.

For example:

PP.render(20, ['Hello,', PP.line, 'world!'])
// Hello,
// world!
PP.render(20, PP.group(['Hello,', PP.line, 'world!']))
// Hello, world!

PP.lineBreak ~> doc v1.0.0

PP.lineBreak renders as a new line unless undone by PP.group in which case PP.lineBreak renders as empty.

For example:

PP.render(20, ['Lol', PP.lineBreak, 'Bal'])
// Lol
// Bal
PP.render(20, PP.group(['Lol', PP.lineBreak, 'Bal']))
// LolBal

PP.softLine ~> doc v1.0.0

PP.softLine renders as a space if the output fits and otherwise as a new line.

For example:

PP.render(
  20,
  PP.intersperse(
    PP.softLine,
    R.split(
      /\s+/,
      'Here is a paragraph of text that we will format to a desired width.'
    )
  )
)
// Here is a paragraph
// of text that we will
// format to a desired
// width.

PP.softBreak ~> doc v1.0.0

PP.softBreak renders as empty if the output fits and otherwise as a new line.

For example:

PP.render(10, PP.intersperse(PP.softBreak, R.split(/\b/, 'this.method(rocks)')))
// this.
// method(
// rocks)

Concatenating documents

An array of documents is considered as a concatenation of documents. For example, [] is an empty document and ['foo', 'bar'] is equivalent to 'foobar'.

PP.append(rhsDoc, lhsDoc) ~> doc v1.0.0

PP.append reverse concatenates the documents.

For example:

PP.render(0, PP.append('bar', 'foo'))
// foobar

PP.prepend(lhsDoc, rhsDoc) ~> doc v1.0.0

PP.prepend concatenates the documents.

For example:

PP.render(0, PP.prepend('foo', 'bar'))
// foobar

Lists of documents

PP.intersperse(doc, [...docs]) ~> [...docs] v1.0.0

PP.intersperse puts the given separator document between each document in the given list of documents.

For example:

PP.intersperse(',', ['a', 'b', 'c'])
// ['a', ',', 'b', ',', 'c']

PP.punctuate(sepDoc, [...docs]) ~> [...docs] v1.0.0

PP.punctuate concatenates the given separator after each document in the given list of documents except the last.

For example:

PP.punctuate(',', ['a', 'b', 'c'])
// [ [ 'a', ',' ], [ 'b', ',' ], 'c' ]

Lazy documents

PP.lazy(() => doc) ~> doc v1.0.0

PP.lazy creates a lazy document. The given thunk is only invoked as needed to compute the document.

Enclosing documents

PP.enclose([lhsDoc, rhsDoc], doc) ~> doc v1.0.0

PP.enclose encloses the given document between the given pair of documents.

For example:

PP.render(0, PP.enclose(PP.parens, 'foo'))
// (foo)

Document pair constants

PP.angles ~> ['<', '>'] v1.0.0
PP.braces ~> ['{', '}'] v1.0.0
PP.brackets ~> ['[', ']'] v1.0.0
PP.dquotes ~> ['"', '"'] v1.0.0
PP.lineBreaks ~> [PP.lineBreak, PP.lineBreak] v1.1.0
PP.lines ~> [PP.line, PP.line] v1.1.0
PP.parens ~> ['(', ')'] v1.0.0
PP.spaces ~> [' ', ' '] v1.0.0
PP.squotes ~> ["'", "'"] v1.0.0

Alternative documents

PP.choice(wideDoc, narrowDoc) ~> doc v1.0.0

PP.choice(wideDoc, narrowDoc) renders as the given wideDoc on a line if it fits within the maximum width and otherwise as the narrowDoc. PP.lines and PP.lineBreaks within the wideDoc are undone like with PP.group.

For example:

PP.render(5, PP.choice('wide', 'narrow'))
// 'wide'
PP.render(3, PP.choice('wide', 'narrow'))
// 'narrow'

Note that usually the idea is that the narrow version can indeed be rendered more narrowly.

For example:

const hyphen = PP.choice('', ['-', PP.lineBreak])

PP.render(5, PP.intersperse(hyphen, ['hy', 'phen', 'at', 'ed']))
// hy-
// phen-
// ated

PP.group(doc) ~> doc v1.0.0

PP.group allows PP.lines and PP.lineBreaks within the given document to be undone if the result fits within the maximum width. PP.group(doc) is equivalent to PP.choice(doc, doc).

Nested documents

PP.nest(string | number, doc) ~> doc v1.0.0

PP.nest increases the nesting after next new line by the given string or by the given number of spaces.

For example:

PP.render(6, PP.nest(2, PP.group(PP.intersperse(PP.line, ['foo', 'bar']))))
// foo
//   bar

Layout dependent documents

PP.column(column => doc) ~> doc v1.0.0

PP.column allows a document to depend on the column at which the document starts.

PP.nesting(nesting => doc) ~> doc v1.0.0

PP.nesting allows a document to depend on the nesting after the next new line.

Aligned documents

PP.align(doc) ~> doc v1.0.0

PP.align creates a document such that the nesting of the document is aligned to the current column.

For example:

PP.render(10, PP.group(['foo(', PP.align(['bar,', PP.line, 'baz']), ')']))
// foo(bar,
//     baz)

PP.hang(string | number, doc) ~> doc v1.0.0

PP.hang creates a document such that the document is nested by the given string or number of spaces starting from the current column.

For example:

PP.render(10, PP.group(['foo(', PP.hang(2, ['bar,', PP.line, 'baz']), ')']))
// foo(bar,
//       baz)

PP.indent(string | number, doc) ~> doc v1.0.0

PP.indent creates a document such that the document is indented by the given prefix or number of spaces starting from the current column.

PP.render(
  20,
  PP.nest(
    2,
    PP.group([
      'A comment:',
      PP.line,
      PP.line,
      PP.indent(
        '-- ',
        PP.intersperse(
          PP.softLine,
          R.split(/\s+/, 'This is the comment that you are looking for.')
        )
      )
    ])
  )
)
// A comment:
// 
//   -- This is the
//   -- comment that
//   -- you are looking
//   -- for.

Related Work