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

prettier-plugin-groq

v0.2.5

Published

Prettier GROQ plugin

Downloads

2,567

Readme

Prettier GROQ

This formatter follows the Prettier philosophy of being opinionated and provide few options. The input code is formatted directly from the AST, thereby not preserving whitespace and ignoring comments (see currently unsupported below).

Overview

Groups

Much of the formatting work revolves around grouping object properties in different ways:

  1. All properties are placed on separate lines except for properties using the shorthand syntax (see options below).
  2. All properties of the same value type are grouped and separated from the next group by an empty line.
  3. All properties that include projections or object-like values are separated by an empty line.
*[] {
   _id, _type, _createdAt,

   foo->,
   bar[]->,

   'abc': *[defined(test)],
   'def': *[defined(test)] | order(test asc),
   'ghi': *[defined(test)] | order(test asc) | [0...10],

   $value >= other_value => {
      'foo': 123
   },

   'a': 'a',
   'b': 2 + 2,
   'c': [1, 2, 3],
   'd': count(value),

   'e': {
      alpha, beta
   },

   f {
      gamma->
   }
}

Line length

The formatter respects the printWidth setting and wraps your code accordingly.

*[
   _id == $id
   && $type == _type
   && category == 'long_query'
   && active == true
   && featured == true
   && !(_id in path('drafts.**'))
   && (other == true || test < 10)
] | order(_id asc) [0...10]

Object expansion

The expansion operator is printed inline if the projection has exactly 2 properties. This is useful for simple exceptions.

*[] {
   ...,

   body[] {
      ..., _type == 'image' => @->
   },

   preview {
      ..., asset->
   }
}

Select

The select function arguments are always printed on separate lines:

*[] {
   'selection': select(
      popularity > 20 => 'high',
      popularity > 10 => 'medium',
      popularity <= 10 => 'low'
   )
}

Order

The order component is rarely used with many arguments and is therefore always printed inline.

*[] | order(few asc, items desc)

This is also done to prevent wrapping the order scope before wrapping the filter component in long queries:

Bad:

*[_id == $id && $type == _type && category == 'long_query'] | order(
   featured asc
) [0...10]

Better:

*[
   _id == $id
   && $type == _type
   && category == 'long_query'
] | order(featured asc) [0...10]

Installation

Install as a development dependency

npm install --save-dev prettier-plugin-groq

Integration

When installed locally, the plugin should automatically be picked up by your editor if it supports Prettier (VS Code, Sublime Text 3). When installed globally, the plugin is picked up by the prettier CLI:

prettier -w file.groq

Options

  • groqInlineShorthandProperties (default: true)

    Controls whether object properties using the shorthand syntax will be grouped inline:

    *[] {
      _id, _type, other, value
    }

    or not:

    *[] {
      _id,
      _type,
      other,
      value
    }

Currently unsupported

  • Inline comments //like this as they're currently ignored by the parser
  • Map components * | ([ like, this ]) as they're currently not supported by the parser