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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@dvorakdominik/prettier-plugin-less-detached-rules

v0.1.0

Published

Prettier plugin that formats LESS detached ruleset arguments passed to mixin calls.

Readme

prettier-plugin-less-detached-rules

A Prettier plugin that formats LESS detached ruleset arguments inside mixin calls.

The problem

Prettier's built-in LESS formatter leaves the content of detached rulesets inside mixin arguments unformatted:

// Before (what Prettier produces without this plugin)
.container {
  .mediaMin(tablet, {color: red;
margin: 0; padding:10px;});
}
// After (with this plugin)
.container {
  .mediaMin(tablet, {
    color: red;
    margin: 0;
    padding: 10px;
  });
}

Installation

npm install --save-dev @dvorakdominik/prettier-plugin-less-detached-rules

Requires Prettier ≥ 3.0 as a peer dependency.

Configuration

Add the plugin to your .prettierrc (or equivalent):

{
  "plugins": ["@dvorakdominik/prettier-plugin-less-detached-rules"]
}

That's it — formatting of LESS files with detached ruleset arguments now works correctly.

Compatibility

| Dependency | Version | |---|---| | Node.js | ≥ 20 | | Prettier | ≥ 3.0 |

Other LESS plugins

This plugin is designed to coexist with other Prettier LESS plugins (e.g. prettier-plugin-css-grid). It correctly delegates text transformations from upstream plugins before applying its own processing.

Plugin order in your configuration follows the standard Prettier plugin ordering rules — place this plugin last if using it alongside other LESS plugins:

{
  "plugins": ["prettier-plugin-css-grid", "@dvorakdominik/prettier-plugin-less-detached-rules"]
}

Known limitations

  • One detached ruleset per mixin call: if a single mixin call contains multiple detached ruleset arguments (e.g. .mixin({a: 1}, {b: 2})), only the first will be formatted. This is an uncommon LESS pattern.
  • Module-level re-entrancy guard: the plugin uses a module-level counter to prevent infinite recursion. Concurrent prettier.format() calls within the same Node.js process that share this module instance are not safe. In practice, Prettier's worker pool uses separate child processes, so this is not an issue in normal usage.
  • Silent formatting failures: if the inner content of a detached ruleset is syntactically invalid, the plugin skips it rather than aborting the entire file. Set PRETTIER_PLUGIN_DEBUG=1 to log skipped nodes to stderr.

How it works

  1. Runs Prettier on the file to establish correct outer indentation.
  2. Parses the result with postcss-less to locate mixin calls whose params include a {…} block.
  3. For each such block, formats the inner content with Prettier using a dummy wrapper rule (.x { … }), then adjusts the indentation to match the call site.
  4. Returns the final AST to Prettier for printing.

Re-entrant calls (triggered by step 3) are detected via a depth counter and delegated directly to the built-in LESS parser, preventing infinite recursion while still allowing other plugins to run.

License

MIT © Dominik Dvořák