@dvorakdominik/prettier-plugin-less-detached-rules
v0.1.0
Published
Prettier plugin that formats LESS detached ruleset arguments passed to mixin calls.
Maintainers
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-rulesRequires 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=1to log skipped nodes to stderr.
How it works
- Runs Prettier on the file to establish correct outer indentation.
- Parses the result with
postcss-lessto locate mixin calls whose params include a{…}block. - 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. - 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
