@d3lm/lint-preset 1.6.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -20
- package/dist/bin/comments.js +14 -1
- package/dist/bin/comments.js.map +1 -1
- package/dist/comments.cjs +14 -1
- package/dist/comments.cjs.map +1 -1
- package/dist/comments.d.cts +10 -8
- package/dist/comments.d.ts +10 -8
- package/dist/comments.js +14 -1
- package/dist/comments.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -276,40 +276,34 @@ In the same way, a paragraph that splits a parenthetical is not reported as `unb
|
|
|
276
276
|
|
|
277
277
|
With a `tolerance`, a paragraph has no `underfill`, `widow`, or `unbalanced` verdict when it already has the layout that the tool produces for a wider `width`, up to `width` plus `tolerance`. Its suggestion then keeps the lines as they are. With `width: 100` and `tolerance: 5`, a paragraph that is laid out the way the tool lays it out for a width of 105 passes. A paragraph that only has hints keeps them, and a line past `maxWidth` is still an `overflow`.
|
|
278
278
|
|
|
279
|
+
The `tolerance` also holds for each line on its own, in both directions. A paragraph is not `unbalanced` when it has as many lines as the suggested rewrap and no line is more than `tolerance` columns shorter or longer than the same line of the rewrap. Its suggestion then keeps the lines as they are too. With `tolerance: 5`, a short word like `as` can start a line where the rewrap ends the line before with it. A line that is longer than in the rewrap must still end within `width` plus `tolerance`. This only applies to a paragraph whose only layout issue is `unbalanced`. A `widow` is still reported, and so is a paragraph that has an `orphan` hint too, so the rewrap still moves that word. A line that ends inside a link, code span, `{...}` group, or the head of a JSDoc tag is still `unbalanced` as well.
|
|
280
|
+
|
|
279
281
|
Hints are only checked in prose, never in code spans, code blocks, `@example`, or URLs. Rules that can't be measured, like writing complete sentences, are part of the agent's prompt (see `DEFAULT_RULES` in `src/comments/agent.ts`). The prompt treats the style rules as preferences, so the agent keeps punctuation that carries meaning or reads clearly, and never changes code, code spans, literals, patterns, or quotations.
|
|
280
282
|
|
|
281
283
|
### Text That Stays on One Line
|
|
282
284
|
|
|
283
|
-
The rewrap never breaks a line inside a code span, a `{...}` group like a JSDoc type or `{@link ...}`, or a Markdown link
|
|
284
|
-
|
|
285
|
-
Each of them is one word for the layout. A line that ends inside one is `unbalanced`, whatever else holds for the paragraph, so `check` fails and the rewrap joins it. The only exception is a code span in a Rust file, which keeps its paragraph as written (see [Rust](#rust)). One that is longer than `maxWidth` allows stays intact. On a single line it is an `overflow`. When it continues on the next line, joining it would add a line that is too long, so its paragraph is kept as written (`unbreakable text across lines`), and only shortening it or moving its target to a link reference definition fixes it.
|
|
285
|
+
The rewrap never breaks a line inside a code span, a `{...}` group like a JSDoc type or `{@link ...}`, or a Markdown link like `[text](target)`, `[text][label]`, or `[text]`. Links split across lines can't be followed in an editor, so a line that ends inside one of these is `unbalanced`, and the rewrap joins it. If one is too long to fit within `maxWidth`, it stays intact and is reported as `overflow`.
|
|
286
286
|
|
|
287
287
|
### Text Kept as Written
|
|
288
288
|
|
|
289
|
-
The tool rewraps prose paragraphs, list items, and JSDoc tag descriptions. Everything else
|
|
289
|
+
The tool only rewraps prose paragraphs, list items, and JSDoc tag descriptions. Everything else keeps its line breaks and has no suggestion:
|
|
290
290
|
|
|
291
|
-
- Code gets no checks
|
|
292
|
-
- Layout syntax gets hints but no verdicts
|
|
293
|
-
- Text that only looks like code or hand layout keeps its line breaks but still gets `overflow
|
|
294
|
-
- Line comments (`//`)
|
|
291
|
+
- **Code** gets no checks except `banner`. This covers code blocks, `@example`, `@default`, tool directives like `eslint-disable-next-line`, legal comments, and paragraphs that parse as code.
|
|
292
|
+
- **Layout syntax** gets hints but no verdicts. This covers Markdown tables, box-drawing characters, divider lines, and aligned columns.
|
|
293
|
+
- **Text that only looks like code or hand layout** keeps its line breaks, but it still gets `overflow`.
|
|
294
|
+
- **Line comments** (`//`) only get `overflow`. To fix one, the agent shortens it or turns it into a block comment, which the tool then rewraps.
|
|
295
295
|
|
|
296
|
-
To keep a drawing that
|
|
296
|
+
To keep a drawing that's wider than the width, put it in a code fence or add `comments-ignore` to the comment.
|
|
297
297
|
|
|
298
298
|
### Rust
|
|
299
299
|
|
|
300
|
-
In `.rs` files, the tool checks
|
|
301
|
-
|
|
302
|
-
Rust comments are found with `rustc`'s own lexer (`ra_ap_rustc_lexer`, built into a native addon with [NAPI-RS](https://napi.rs)), so raw strings, byte and C strings, characters, lifetimes, nested block comments, a shebang, and the frontmatter of a cargo script never produce false matches. The lexer never stops early. A source with a token that never ends, like an unterminated block comment or string, is skipped and named like a file with a syntax error, because that token holds every comment after it. Like rustc, the tool reads a `/*` inside a block comment as the start of a nested comment, even inside a code span.
|
|
303
|
-
|
|
304
|
-
Doc comments are Markdown, and the checks above already treat them that way. Code blocks are doctests, so they are never touched, including hidden lines that start with `#`. Headings like `# Examples` and link reference definitions like ``[`Foo`]: crate::Foo`` are kept as written. Intra-doc links like ``[`count_provider_reads`]``, ``[`permissions`](crate::permissions)``, ``[the parser][`Parser`]``, or `[HashMap<K, V>]` always stay on one line, with their text and their target (see [Text That Stays on One Line](#text-that-stays-on-one-line)). A link that continues on the next line is joined, which rustdoc resolves the same way, since it reads runs of whitespace in a link as one space. A code span that continues on the next line is different. rustdoc shows the spaces at the start of the next line inside the code span, and how many there are depends on the indentation of every line of the item's docs, so a paragraph with such a code span is kept as written in Rust (`code span across lines`), and the tool never splits a code span itself. Rust has no JSDoc tags, so a line that starts with `@` is prose. Paragraphs are code when they parse as Rust statements, items, fields, match arms, or associated items (with `ra_ap_syntax`, the parser of rust-analyzer). A `/*!` or `//!` comment is an inner doc comment, not a legal comment, so only `@license`, `@preserve`, and copyright notices make a Rust comment legal.
|
|
305
|
-
|
|
306
|
-
The code fingerprint that makes sure only comments changed compares the tokens of a Rust file, without whitespace and comments. Each run of doc comments counts as one token of its style, since doc comments are attributes of the item after them. So rewording or rewrapping a doc comment is no code change, but turning `///` into `//`, into `//!`, or into `/** */`, or moving it to another item, is.
|
|
300
|
+
In `.rs` files, the tool checks doc comments (`///`, `//!`, `/** */`, `/*! */`) and plain block comments the same way it checks JSDoc. Plain `//` comments only get `overflow`. Comments are found with rustc's own lexer, which ships as a native addon built with [NAPI-RS](https://napi.rs). Doctests, intra-doc links, and anything else that would change what rustdoc renders are left intact.
|
|
307
301
|
|
|
308
|
-
The width
|
|
302
|
+
The width defaults to `comment_width` from `rustfmt.toml`, or 80 if it isn't set. Setting `width` in the `comments` config overrides it.
|
|
309
303
|
|
|
310
|
-
The
|
|
304
|
+
The addon ships for macOS (arm64, x64) and Linux with glibc (x64, arm64). On other platforms, Rust files fail with a message that explains how to build the addon (`pnpm run build:native`, which needs a Rust toolchain). To skip Rust files, leave `.rs` out of `extensions`.
|
|
311
305
|
|
|
312
|
-
`native/verify/verify.mjs`
|
|
306
|
+
`native/verify/verify.mjs` checks that rewrapping Rust comments never changes code or rustdoc output. It runs on a fixture crate and, optionally, on a `--corpus` of real crates:
|
|
313
307
|
|
|
314
308
|
```bash
|
|
315
309
|
pnpm run build
|
|
@@ -318,7 +312,7 @@ node native/verify/verify.mjs --corpus ~/.cargo/registry/src/index.crates.io-194
|
|
|
318
312
|
|
|
319
313
|
### Configuration
|
|
320
314
|
|
|
321
|
-
`width` is the preferred line length, and `maxWidth` is the hard maximum, including indentation and the comment prefix. The CLI defaults `maxWidth` to 120, or to `width` if that is larger. The wrapper may go past `width`, up to `maxWidth`, to keep a parenthetical on one line. `tolerance` (default 0) lets lines in paragraphs of three or more lines go that many columns past `width` when that saves a line. `check` also accepts a paragraph that already has the layout for a wider `width`, up to `width` plus `tolerance`, while the tool itself still wraps to `width`. A comment that is one paragraph stays on one line up to `singleLineWidth` plus `tolerance`, capped by `maxWidth`. A word, code span, or link longer than `maxWidth` is never split and is reported as `overflow`.
|
|
315
|
+
`width` is the preferred line length, and `maxWidth` is the hard maximum, including indentation and the comment prefix. The CLI defaults `maxWidth` to 120, or to `width` if that is larger. The wrapper may go past `width`, up to `maxWidth`, to keep a parenthetical on one line. `tolerance` (default 0) lets lines in paragraphs of three or more lines go that many columns past `width` when that saves a line. `check` also accepts a paragraph that already has the layout for a wider `width`, up to `width` plus `tolerance`, and a paragraph whose lines are each within `tolerance` columns of the suggested rewrap (see [Issues](#issues)), while the tool itself still wraps to `width`. A comment that is one paragraph stays on one line up to `singleLineWidth` plus `tolerance`, capped by `maxWidth`. A word, code span, or link longer than `maxWidth` is never split and is reported as `overflow`.
|
|
322
316
|
|
|
323
317
|
Like prettier, `comments` looks for a config file in the current directory and its parents, up to the repository root. The config can be a `comments.config.{ts,mts,js,mjs,cjs}`, `.commentsrc`, or `.commentsrc.json` file, or a `comments` key in `package.json`. All options are optional.
|
|
324
318
|
|
package/dist/bin/comments.js
CHANGED
|
@@ -1685,7 +1685,20 @@ function analyzeParagraph(paragraph, options, language) {
|
|
|
1685
1685
|
}
|
|
1686
1686
|
return false;
|
|
1687
1687
|
};
|
|
1688
|
-
const
|
|
1688
|
+
const staysNearLayout = () => {
|
|
1689
|
+
if (currentLines.length !== wrapped.length || splitTokenLine(currentLines, units) !== -1) {
|
|
1690
|
+
return false;
|
|
1691
|
+
}
|
|
1692
|
+
return currentLines.every((words, position) => {
|
|
1693
|
+
const length = words.join(" ").length;
|
|
1694
|
+
const suggestedLength = wrapped[position].join(" ").length;
|
|
1695
|
+
const limit = (position === 0 ? firstLimit : restLimit) + layoutOptions.tolerance;
|
|
1696
|
+
return Math.abs(length - suggestedLength) <= layoutOptions.tolerance && length <= Math.max(suggestedLength, limit);
|
|
1697
|
+
});
|
|
1698
|
+
};
|
|
1699
|
+
const hasVerdict = lineIssues.some((issue) => isVerdict(issue));
|
|
1700
|
+
const onlyUnbalanced = lineIssues.every((issue) => issue.type === "unbalanced");
|
|
1701
|
+
const accepted = hasVerdict && (matchesWiderLayout() || onlyUnbalanced && staysNearLayout());
|
|
1689
1702
|
const suggested = accepted ? currentLines : wrapped;
|
|
1690
1703
|
const suggestion = suggested.map(
|
|
1691
1704
|
(words, position) => `${prefix}${position === 0 ? paragraph.marker : hang}${words.join(" ")}`
|