@d3lm/lint-preset 1.4.5 → 1.5.0
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 +166 -0
- package/dist/bin/comments.js +3162 -0
- package/dist/bin/comments.js.map +1 -0
- package/dist/{chunk-6LUTQQJB.cjs → chunk-M3BAUCCR.cjs} +20 -27
- package/dist/chunk-M3BAUCCR.cjs.map +1 -0
- package/dist/{chunk-QEMNOAEQ.js → chunk-SMTCD6GW.js} +20 -27
- package/dist/chunk-SMTCD6GW.js.map +1 -0
- package/dist/comments.cjs +1409 -0
- package/dist/comments.cjs.map +1 -0
- package/dist/comments.d.cts +257 -0
- package/dist/comments.d.ts +257 -0
- package/dist/comments.js +1407 -0
- package/dist/comments.js.map +1 -0
- package/dist/eslint.cjs +9 -9
- package/dist/eslint.js +1 -1
- package/dist/oxlint.cjs +10 -12
- package/dist/oxlint.cjs.map +1 -1
- package/dist/oxlint.js +6 -8
- package/dist/oxlint.js.map +1 -1
- package/dist/rules.cjs +50 -11
- package/dist/rules.cjs.map +1 -1
- package/dist/rules.js +50 -11
- package/dist/rules.js.map +1 -1
- package/package.json +13 -1
- package/dist/chunk-6LUTQQJB.cjs.map +0 -1
- package/dist/chunk-QEMNOAEQ.js.map +0 -1
package/dist/rules.cjs
CHANGED
|
@@ -264,8 +264,9 @@ var BLOCK_LINE_WITH_TEXT = /^(\s*\*)(\s*)(\S.*?)\s*$/;
|
|
|
264
264
|
var BLOCK_LINE_EMPTY = /^\s*\*\s*$/;
|
|
265
265
|
var CODE_FENCE_LINE = /^\s*\*\s*```/;
|
|
266
266
|
var LIST_ITEM_LINE = /^(?:[-*+]|\d+[.)])\s/;
|
|
267
|
+
var CODE_TAG = /^@(?:example|default|defaultValue)\b/;
|
|
267
268
|
var DEFAULT_LINE_ENDINGS = Object.freeze(["etc.", "...", "e.g.", "i.e."]);
|
|
268
|
-
var DEFAULT_PARAGRAPH_ENDINGS = Object.freeze([".", "!", "?", ":", ";", "
|
|
269
|
+
var DEFAULT_PARAGRAPH_ENDINGS = Object.freeze([".", "!", "?", ":", ";", ")", "]", "}"]);
|
|
269
270
|
var DEFAULT_OPTIONS = {
|
|
270
271
|
ignoredWords: /* @__PURE__ */ new Set(),
|
|
271
272
|
ignoredPatterns: [],
|
|
@@ -288,7 +289,8 @@ var DEFAULT_OPTIONS = {
|
|
|
288
289
|
requireParagraphCapital: true,
|
|
289
290
|
paragraphEndings: DEFAULT_PARAGRAPH_ENDINGS,
|
|
290
291
|
requireJSDocSpacing: true,
|
|
291
|
-
enforceParamStyle: true
|
|
292
|
+
enforceParamStyle: true,
|
|
293
|
+
forbidTagIndent: true
|
|
292
294
|
}
|
|
293
295
|
};
|
|
294
296
|
function isUpperCase(char) {
|
|
@@ -301,7 +303,7 @@ function isTrailingPunctuation(char) {
|
|
|
301
303
|
return char === "." || char === "!" || char === "?" || char === ";" || char === ":";
|
|
302
304
|
}
|
|
303
305
|
function isBlockEndingPunctuation(char) {
|
|
304
|
-
return char === "." || char === "!" || char === "?" || char === ";" || char === ":" || char === ")" || char === "]" || char === "}" || char === "
|
|
306
|
+
return char === "." || char === "!" || char === "?" || char === ";" || char === ":" || char === ")" || char === "]" || char === "}" || char === ">";
|
|
305
307
|
}
|
|
306
308
|
function indexOfLastNonSpace(value) {
|
|
307
309
|
for (let index = value.length - 1; index >= 0; index -= 1) {
|
|
@@ -554,8 +556,11 @@ function checkParameterLine(context, comment, lines, lineIndex, text, starSegmen
|
|
|
554
556
|
if (!description) {
|
|
555
557
|
return;
|
|
556
558
|
}
|
|
557
|
-
|
|
558
|
-
|
|
559
|
+
const lastIndex = lastTagLine(lines, lineIndex);
|
|
560
|
+
const lastMatch = lastIndex === lineIndex ? void 0 : BLOCK_LINE_WITH_TEXT.exec(lines[lastIndex]);
|
|
561
|
+
const ending = lastMatch ? lastMatch[3] : description;
|
|
562
|
+
if (!ending.endsWith(".")) {
|
|
563
|
+
const textEndOffset = lastMatch ? offsetOfLine(comment, lines, lastIndex) + lastMatch[1].length + lastMatch[2].length + lastMatch[3].length : textStart + text.length;
|
|
559
564
|
context.report({
|
|
560
565
|
loc,
|
|
561
566
|
messageId: "paramDescriptionPeriod",
|
|
@@ -563,6 +568,17 @@ function checkParameterLine(context, comment, lines, lineIndex, text, starSegmen
|
|
|
563
568
|
});
|
|
564
569
|
}
|
|
565
570
|
}
|
|
571
|
+
function lastTagLine(lines, lineIndex) {
|
|
572
|
+
let last = lineIndex;
|
|
573
|
+
while (last + 1 < lines.length - 1) {
|
|
574
|
+
const next = lines[last + 1];
|
|
575
|
+
if (BLOCK_LINE_EMPTY.test(next) || JSDOC_TAG_LINE.test(next) || CODE_FENCE_LINE.test(next) || !BLOCK_LINE_WITH_TEXT.test(next)) {
|
|
576
|
+
break;
|
|
577
|
+
}
|
|
578
|
+
last += 1;
|
|
579
|
+
}
|
|
580
|
+
return last;
|
|
581
|
+
}
|
|
566
582
|
function checkMultiLineBlock(context, comment, options) {
|
|
567
583
|
const { block } = options;
|
|
568
584
|
const loc = comment.loc;
|
|
@@ -601,6 +617,9 @@ function checkMultiLineBlock(context, comment, options) {
|
|
|
601
617
|
let paragraphStart = true;
|
|
602
618
|
let skipParagraphEnding = false;
|
|
603
619
|
let previousText;
|
|
620
|
+
let previousIsCode = false;
|
|
621
|
+
let afterTag = false;
|
|
622
|
+
let insideTagProse = false;
|
|
604
623
|
for (let index = 1; index < lines.length - 1; index += 1) {
|
|
605
624
|
const line = lines[index];
|
|
606
625
|
if (CODE_FENCE_LINE.test(line)) {
|
|
@@ -608,18 +627,20 @@ function checkMultiLineBlock(context, comment, options) {
|
|
|
608
627
|
paragraphStart = true;
|
|
609
628
|
skipParagraphEnding = false;
|
|
610
629
|
previousText = void 0;
|
|
630
|
+
insideTagProse = false;
|
|
611
631
|
continue;
|
|
612
632
|
}
|
|
613
633
|
if (insideCodeBlock) {
|
|
614
634
|
continue;
|
|
615
635
|
}
|
|
616
636
|
if (BLOCK_LINE_EMPTY.test(line)) {
|
|
617
|
-
if (previousText !== void 0 && block.requireParagraphCapital && !skipParagraphEnding) {
|
|
637
|
+
if (previousText !== void 0 && block.requireParagraphCapital && !skipParagraphEnding && !previousIsCode) {
|
|
618
638
|
reportParagraphEnding(context, comment, previousText, options);
|
|
619
639
|
}
|
|
620
640
|
paragraphStart = true;
|
|
621
641
|
skipParagraphEnding = false;
|
|
622
642
|
previousText = void 0;
|
|
643
|
+
insideTagProse = false;
|
|
623
644
|
continue;
|
|
624
645
|
}
|
|
625
646
|
const match = BLOCK_LINE_WITH_TEXT.exec(line);
|
|
@@ -640,13 +661,28 @@ function checkMultiLineBlock(context, comment, options) {
|
|
|
640
661
|
});
|
|
641
662
|
continue;
|
|
642
663
|
}
|
|
643
|
-
|
|
664
|
+
const isTagLine = JSDOC_TAG_LINE.test(line);
|
|
665
|
+
if (block.requireJSDocSpacing && isTagLine && !afterTag && previousText !== void 0) {
|
|
644
666
|
const previousLine = lines[index - 1];
|
|
645
667
|
if (!BLOCK_LINE_EMPTY.test(previousLine) && !JSDOC_TAG_LINE.test(previousLine)) {
|
|
646
668
|
context.report({ loc, messageId: "blockJSDocBlankLine" });
|
|
647
669
|
}
|
|
648
670
|
}
|
|
649
|
-
|
|
671
|
+
afterTag ||= isTagLine;
|
|
672
|
+
if (isTagLine) {
|
|
673
|
+
insideTagProse = !CODE_TAG.test(text);
|
|
674
|
+
} else if (LIST_ITEM_LINE.test(text)) {
|
|
675
|
+
insideTagProse = false;
|
|
676
|
+
} else if (insideTagProse && block.forbidTagIndent && spaces.length > 1) {
|
|
677
|
+
const indentStart = offsetOfLine(comment, lines, index) + starSegment.length;
|
|
678
|
+
context.report({
|
|
679
|
+
loc,
|
|
680
|
+
messageId: "tagContinuationIndent",
|
|
681
|
+
fix: (fixer) => fixer.replaceTextRange([indentStart, indentStart + spaces.length], " ")
|
|
682
|
+
});
|
|
683
|
+
}
|
|
684
|
+
const isCodeLine = spaces.length > 1 || paragraphStart && /^`[^`]+`$/.test(text);
|
|
685
|
+
if (paragraphStart && block.requireParagraphCapital && !isTagLine && !isCodeLine) {
|
|
650
686
|
const firstChar = text[0];
|
|
651
687
|
if (firstChar && isLowerCase(firstChar) && !skipParagraphFirstWord(text, options)) {
|
|
652
688
|
const lineOffset = offsetOfLine(comment, lines, index);
|
|
@@ -665,8 +701,9 @@ function checkMultiLineBlock(context, comment, options) {
|
|
|
665
701
|
} else {
|
|
666
702
|
previousText = text;
|
|
667
703
|
}
|
|
704
|
+
previousIsCode = isCodeLine;
|
|
668
705
|
}
|
|
669
|
-
if (previousText !== void 0 && block.requireParagraphCapital && !skipParagraphEnding) {
|
|
706
|
+
if (previousText !== void 0 && block.requireParagraphCapital && !skipParagraphEnding && !previousIsCode) {
|
|
670
707
|
reportParagraphEnding(context, comment, previousText, options);
|
|
671
708
|
}
|
|
672
709
|
}
|
|
@@ -687,7 +724,8 @@ var messages = {
|
|
|
687
724
|
blockParagraphEnding: "Paragraph should end with one of {{endings}}.",
|
|
688
725
|
blockJSDocBlankLine: "Insert a blank line before JSDoc tags.",
|
|
689
726
|
paramMissingDash: "@param should use ' - ' between name and description.",
|
|
690
|
-
paramDescriptionPeriod: "@param description should end with a period."
|
|
727
|
+
paramDescriptionPeriod: "@param description should end with a period.",
|
|
728
|
+
tagContinuationIndent: "Continuation lines of a JSDoc tag should not be indented."
|
|
691
729
|
};
|
|
692
730
|
var rule3 = {
|
|
693
731
|
meta: {
|
|
@@ -745,7 +783,8 @@ var rule3 = {
|
|
|
745
783
|
uniqueItems: true
|
|
746
784
|
},
|
|
747
785
|
requireJSDocSpacing: { type: "boolean" },
|
|
748
|
-
enforceParamStyle: { type: "boolean" }
|
|
786
|
+
enforceParamStyle: { type: "boolean" },
|
|
787
|
+
forbidTagIndent: { type: "boolean" }
|
|
749
788
|
}
|
|
750
789
|
}
|
|
751
790
|
}
|
package/dist/rules.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/lint-preset/lint-preset/dist/rules.cjs","../src/rules/block-scoped-case.ts","../src/rules/comment-preceding-blank-line.ts","../src/rules/comment-syntax.ts","../src/rules/newline-around-multiline.ts","../src/rules/no-blank-line-between-imports.ts","../src/rules/no-implicit-object-return.ts","../src/rules/no-member-access-on-ternary.ts","../src/rules/index.ts"],"names":["rule"],"mappings":"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","file":"/home/runner/work/lint-preset/lint-preset/dist/rules.cjs","sourcesContent":[null,"import type { Rule } from 'eslint';\n\nconst leadingWhitespace = (line: string) => /^[ \\t]*/.exec(line)?.[0].length ?? 0;\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'suggestion',\n docs: {\n description: 'Require case clauses to use block scope (braces).',\n },\n fixable: 'code',\n schema: [],\n messages: {\n missingBlock: 'Case clause should be wrapped in a block (braces).',\n },\n },\n create(context) {\n const sourceCode = context.sourceCode;\n\n return {\n SwitchCase(node) {\n const { consequent } = node;\n\n if (consequent.length === 0) {\n return;\n }\n\n // already wrapped in a single BlockStatement\n if (consequent.length === 1 && consequent[0].type === 'BlockStatement') {\n return;\n }\n\n context.report({\n node,\n messageId: 'missingBlock',\n fix(fixer) {\n const caseKeyword = sourceCode.getFirstToken(node);\n\n if (!caseKeyword) {\n return [];\n }\n\n const colonToken = sourceCode.getTokenAfter(\n node.test ? (node.test as Rule.Node) : caseKeyword,\n (token) => token.value === ':',\n );\n\n if (!colonToken) {\n return [];\n }\n\n const lastConsequent = consequent.at(-1);\n const lastToken = sourceCode.getLastToken(lastConsequent as Rule.Node);\n\n if (!lastToken) {\n return [];\n }\n\n const caseIndent = ' '.repeat(caseKeyword.loc.start.column);\n const bodyIndent = caseIndent + ' ';\n\n const text = sourceCode.getText();\n const bodyText = text.slice(colonToken.range[1], lastToken.range[1]);\n\n const lines = bodyText.split('\\n');\n\n /**\n * Lines after the colon line keep their relative nesting; we only shift\n * them so the shallowest one lands at the desired body indent.\n */\n const restLines = lines.slice(1);\n const restIndents = restLines.filter((line) => line.trim() !== '').map((line) => leadingWhitespace(line));\n const indentDelta = restIndents.length > 0 ? bodyIndent.length - Math.min(...restIndents) : 0;\n\n const bodyLines: string[] = [];\n\n // code sharing the colon line (e.g. `case 1: foo()`) must be preserved\n const firstLine = lines[0].trim();\n\n if (firstLine) {\n bodyLines.push(bodyIndent + firstLine);\n }\n\n for (const line of restLines) {\n if (line.trim() === '') {\n bodyLines.push('');\n continue;\n }\n\n const lead = leadingWhitespace(line);\n const newIndent = Math.max(0, lead + indentDelta);\n\n bodyLines.push(' '.repeat(newIndent) + line.slice(lead));\n }\n\n while (bodyLines.length > 0 && bodyLines[0] === '') {\n bodyLines.shift();\n }\n\n while (bodyLines.length > 0 && bodyLines.at(-1) === '') {\n bodyLines.pop();\n }\n\n const result = ` {\\n${bodyLines.join('\\n')}\\n${caseIndent}}`;\n\n return fixer.replaceTextRange([colonToken.range[1], lastToken.range[1]], result);\n },\n });\n },\n };\n },\n};\n\nexport default rule;\n","import type { Rule } from 'eslint';\n\ninterface Comment {\n type: string;\n value: string;\n range?: [number, number];\n loc?: Rule.Node['loc'];\n}\n\ninterface RuleOptions {\n allowInObjects?: boolean;\n allowInArrays?: boolean;\n allowInInterfaces?: boolean;\n allowInUnions?: boolean;\n}\n\nconst UNION_OR_INTERSECTION_TYPES = new Set(['TSUnionType', 'TSIntersectionType']);\n\nfunction isMultiLineBlock(comment: { type: string; value: string }): boolean {\n return comment.type === 'Block' && comment.value.includes('\\n');\n}\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'layout',\n docs: {\n description:\n 'Require a blank line before comments, with an exception for comments inside chained member-call expressions.',\n },\n fixable: 'whitespace',\n schema: [\n {\n type: 'object',\n properties: {\n allowInObjects: {\n type: 'boolean',\n },\n allowInArrays: {\n type: 'boolean',\n },\n allowInInterfaces: {\n type: 'boolean',\n },\n allowInUnions: {\n type: 'boolean',\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n missingBlankLine: 'Expected blank line before comment.',\n },\n },\n create(context) {\n const sourceCode = context.sourceCode;\n\n const options = (context.options[0] as RuleOptions | undefined) ?? {};\n\n const allowInObjects = options.allowInObjects ?? false;\n const allowInArrays = options.allowInArrays ?? false;\n const allowInInterfaces = options.allowInInterfaces ?? false;\n const allowInUnions = options.allowInUnions ?? false;\n\n function isChainedCallContext(comment: Comment): boolean {\n if (!comment.range) {\n return false;\n }\n\n let current = (sourceCode.getNodeByRangeIndex(comment.range[0]) ?? undefined) as Rule.Node | undefined;\n\n while (current?.type === 'CallExpression' || current?.type === 'MemberExpression') {\n if (current.type === 'CallExpression' && current.callee.type === 'MemberExpression') {\n return true;\n }\n\n current = current.parent as Rule.Node | undefined;\n }\n\n return false;\n }\n\n function isCommentAllowedByEnclosure(comment: Comment): boolean {\n if (!comment.range) {\n return false;\n }\n\n const node = sourceCode.getNodeByRangeIndex(comment.range[0]) as Rule.Node | null;\n\n if (!node) {\n return false;\n }\n\n // TS-specific node types aren't part of the ESTree `Rule.Node` union\n const type = node.type as string;\n\n if (allowInObjects && (type === 'ObjectExpression' || type === 'ObjectPattern')) {\n return true;\n }\n\n if (allowInArrays && (type === 'ArrayExpression' || type === 'ArrayPattern')) {\n return true;\n }\n\n if (allowInInterfaces && (type === 'TSInterfaceBody' || type === 'TSTypeLiteral')) {\n return true;\n }\n\n if (allowInUnions && UNION_OR_INTERSECTION_TYPES.has(type)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * A comment before the leading `|` or `&` of a multiline union or intersection\n * type describes its first member, so it's treated like a comment at block start.\n */\n function isBeforeFirstTypeConstituent(comment: Comment): boolean {\n const tokenAfter = sourceCode.getTokenAfter(comment as unknown as Rule.Node);\n\n if (!tokenAfter || (tokenAfter.value !== '|' && tokenAfter.value !== '&')) {\n return false;\n }\n\n const node = sourceCode.getNodeByRangeIndex(tokenAfter.range[0]);\n\n return node !== null && UNION_OR_INTERSECTION_TYPES.has(node.type) && node.range?.[0] === tokenAfter.range[0];\n }\n\n function findEnclosingImport(index: number): Rule.Node | undefined {\n let current = (sourceCode.getNodeByRangeIndex(index) ?? undefined) as Rule.Node | undefined;\n\n while (current && current.type !== 'ImportDeclaration') {\n current = (current.parent ?? undefined) as Rule.Node | undefined;\n }\n\n return current;\n }\n\n /**\n * Imports must form a single block (see `no-blank-line-between-imports`),\n * so a comment between two imports can't be preceded by a blank line.\n */\n function isBetweenImports(comment: Comment): boolean {\n const tokenBefore = sourceCode.getTokenBefore(comment as unknown as Rule.Node);\n const tokenAfter = sourceCode.getTokenAfter(comment as unknown as Rule.Node);\n\n if (!tokenBefore || !tokenAfter) {\n return false;\n }\n\n const importBefore = findEnclosingImport(tokenBefore.range[0]);\n const importAfter = findEnclosingImport(tokenAfter.range[0]);\n\n return importBefore !== undefined && importAfter !== undefined && importBefore !== importAfter;\n }\n\n function isAtBlockStart(comment: Comment): boolean {\n const tokenBefore = sourceCode.getTokenBefore(comment as unknown as Rule.Node, {\n includeComments: false,\n });\n\n if (!tokenBefore) {\n return true;\n }\n\n return ['{', '(', '['].includes(tokenBefore.value);\n }\n\n function isExempt(comment: Comment): boolean {\n return (\n isAtBlockStart(comment) ||\n isBeforeFirstTypeConstituent(comment) ||\n isChainedCallContext(comment) ||\n isCommentAllowedByEnclosure(comment) ||\n isBetweenImports(comment)\n );\n }\n\n /**\n * Stacked multi-line block comments must always be separated by a blank line,\n * even where the exemptions would let a comment hug the preceding line.\n */\n function followsMultiLineBlock(comment: Comment): boolean {\n if (!isMultiLineBlock(comment)) {\n return false;\n }\n\n const previous = sourceCode.getTokenBefore(comment as unknown as Rule.Node, { includeComments: true });\n\n return previous !== null && isMultiLineBlock(previous);\n }\n\n return {\n Program() {\n const comments = sourceCode.getAllComments();\n\n for (const comment of comments) {\n if (!comment.loc || !comment.range) {\n continue;\n }\n\n const commentLine = comment.loc.start.line;\n\n if (commentLine <= 1) {\n continue;\n }\n\n if (!followsMultiLineBlock(comment) && isExempt(comment)) {\n continue;\n }\n\n const tokenBefore = sourceCode.getTokenBefore(comment as unknown as Rule.Node, {\n includeComments: true,\n });\n\n if (!tokenBefore?.loc) {\n continue;\n }\n\n const linesBetween = commentLine - tokenBefore.loc.end.line;\n\n if (linesBetween >= 2) {\n continue;\n }\n\n if (linesBetween === 0) {\n continue;\n }\n\n /**\n * Insert the blank line before the comment's leading indentation so the\n * comment keeps its position instead of being dedented.\n */\n const commentStart = comment.range[0];\n const lineStart = sourceCode.getText().lastIndexOf('\\n', commentStart - 1) + 1;\n\n context.report({\n loc: comment.loc,\n messageId: 'missingBlankLine',\n fix(fixer) {\n return fixer.insertTextBeforeRange([lineStart, lineStart], '\\n');\n },\n });\n }\n },\n };\n },\n};\n\nexport default rule;\n","import type { AST, Rule } from 'eslint';\n\ninterface CommentLike {\n readonly type: string;\n readonly value: string;\n readonly range?: [number, number];\n readonly loc?: Rule.Node['loc'];\n}\n\ninterface LineOptions {\n readonly requireLeadingSpace: boolean;\n readonly requireLowercase: boolean;\n readonly forbidTrailingPunctuation: boolean;\n readonly allowedEndings: readonly string[];\n readonly maxLength: number;\n}\n\ninterface BlockOptions {\n readonly requireCapital: boolean;\n readonly requireTrailingPunctuation: boolean;\n readonly requireJSDocOpening: boolean;\n readonly enforceOpening: boolean;\n readonly enforceClosing: boolean;\n readonly requireSpaceAfterStar: boolean;\n readonly requireParagraphCapital: boolean;\n readonly paragraphEndings: readonly string[];\n readonly requireJSDocSpacing: boolean;\n readonly enforceParamStyle: boolean;\n}\n\ninterface ResolvedOptions {\n readonly ignoredWords: ReadonlySet<string>;\n readonly ignoredPatterns: readonly RegExp[];\n readonly ignoreUrls: boolean;\n readonly ignoreDirectives: boolean;\n readonly line: LineOptions;\n readonly block: BlockOptions;\n}\n\ntype MessageId =\n | 'lineLeadingSpace'\n | 'lineLowercase'\n | 'lineTrailingPunctuation'\n | 'lineMaxLength'\n | 'blockCapital'\n | 'blockTrailingPunctuation'\n | 'blockSingleLineJSDoc'\n | 'blockJSDocOpening'\n | 'blockOpening'\n | 'blockClosing'\n | 'blockEmptyLineBeforeClose'\n | 'blockLineSpaceAfterStar'\n | 'blockParagraphCapital'\n | 'blockParagraphEnding'\n | 'blockJSDocBlankLine'\n | 'paramMissingDash'\n | 'paramDescriptionPeriod';\n\ntype AnyComment = CommentLike | AST.Token;\n\nconst URL_PATTERN = /\\bhttps?:\\/\\//;\n\nconst DIRECTIVE_PATTERN =\n /^\\s*(?:eslint(?:-[a-z-]+)?\\b|@ts-[a-z-]+|@(?:jsx|jsxFrag|jsxImportSource|jsxRuntime)\\b|istanbul\\s|c8\\s|v8\\s|prettier-ignore\\b|stylelint-[a-z-]+|webpack[A-Z][a-zA-Z]*|#(?:region|endregion)\\b|type\\s*:)/;\n\nconst TAG_PATTERN = /^\\s*(?:TODO|FIXME|HACK|NOTE|BUG|XXX|SAFETY|WARNING|INFO|OPTIMIZE|REVIEW|PERF|DEPRECATED)\\b/i;\n\nconst FIRST_WORD_PATTERN = /^\\s*([A-Za-z_$][\\w$]*)/;\n\n// requires 2+ chars so sentence-starting \"A\" is not mistaken for an acronym; \"I\" is a legitimate capital\nconst ALL_CAPS_WORD = /^(?:I|[A-Z][A-Z0-9_]+)$/;\n\nconst JSDOC_TAG_LINE = /^\\s*\\*\\s*@[A-Za-z]/;\nconst SINGLE_LINE_JSDOC_TAG = /^@[A-Za-z][\\w-]*$/;\nconst PARAM_DESC_RE = /^@param\\s+(?:\\{[^}]*\\}\\s+)?(\\S+)\\s+(.*\\S)\\s*$/;\nconst BLOCK_LINE_WITH_TEXT = /^(\\s*\\*)(\\s*)(\\S.*?)\\s*$/;\nconst BLOCK_LINE_EMPTY = /^\\s*\\*\\s*$/;\nconst CODE_FENCE_LINE = /^\\s*\\*\\s*```/;\nconst LIST_ITEM_LINE = /^(?:[-*+]|\\d+[.)])\\s/;\n\nconst DEFAULT_LINE_ENDINGS = Object.freeze(['etc.', '...', 'e.g.', 'i.e.']);\nconst DEFAULT_PARAGRAPH_ENDINGS = Object.freeze(['.', '!', '?', ':', ';', '`', ')', ']', '}']);\n\nconst DEFAULT_OPTIONS: ResolvedOptions = {\n ignoredWords: new Set<string>(),\n ignoredPatterns: [],\n ignoreUrls: true,\n ignoreDirectives: true,\n line: {\n requireLeadingSpace: true,\n requireLowercase: true,\n forbidTrailingPunctuation: true,\n allowedEndings: DEFAULT_LINE_ENDINGS,\n maxLength: 120,\n },\n block: {\n requireCapital: true,\n requireTrailingPunctuation: true,\n requireJSDocOpening: true,\n enforceOpening: false,\n enforceClosing: false,\n requireSpaceAfterStar: true,\n requireParagraphCapital: true,\n paragraphEndings: DEFAULT_PARAGRAPH_ENDINGS,\n requireJSDocSpacing: true,\n enforceParamStyle: true,\n },\n};\n\nfunction isUpperCase(char: string): boolean {\n return char !== char.toLowerCase() && char === char.toUpperCase();\n}\n\nfunction isLowerCase(char: string): boolean {\n return char !== char.toUpperCase() && char === char.toLowerCase();\n}\n\nfunction isTrailingPunctuation(char: string): boolean {\n return char === '.' || char === '!' || char === '?' || char === ';' || char === ':';\n}\n\nfunction isBlockEndingPunctuation(char: string): boolean {\n return (\n char === '.' ||\n char === '!' ||\n char === '?' ||\n char === ';' ||\n char === ':' ||\n char === ')' ||\n char === ']' ||\n char === '}' ||\n char === '`' ||\n char === '>'\n );\n}\n\nfunction indexOfLastNonSpace(value: string): number {\n for (let index = value.length - 1; index >= 0; index -= 1) {\n const char = value.codePointAt(index);\n\n if (char !== 0x20 && char !== 0x09 && char !== 0x0a && char !== 0x0d) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction endsWithAny(value: string, endings: readonly string[]): boolean {\n for (const ending of endings) {\n if (value.endsWith(ending)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction resolveOptions(raw: unknown): ResolvedOptions {\n if (!raw || typeof raw !== 'object') {\n return DEFAULT_OPTIONS;\n }\n\n const input = raw as Record<string, unknown>;\n const line = (input.line ?? {}) as Partial<LineOptions>;\n const block = (input.block ?? {}) as Partial<BlockOptions>;\n\n const patterns = Array.isArray(input.ignoredPatterns)\n ? (input.ignoredPatterns as string[]).map((source) => new RegExp(source))\n : DEFAULT_OPTIONS.ignoredPatterns;\n\n return {\n ignoredWords: new Set(Array.isArray(input.ignoredWords) ? (input.ignoredWords as string[]) : []),\n ignoredPatterns: patterns,\n ignoreUrls: (input.ignoreUrls as boolean | undefined) ?? DEFAULT_OPTIONS.ignoreUrls,\n ignoreDirectives: (input.ignoreDirectives as boolean | undefined) ?? DEFAULT_OPTIONS.ignoreDirectives,\n line: { ...DEFAULT_OPTIONS.line, ...line },\n block: { ...DEFAULT_OPTIONS.block, ...block },\n };\n}\n\nfunction isHashbang(comment: AnyComment): boolean {\n // espree reports hashbangs as `Shebang`; other parsers use a `Line` comment starting with `!` at offset 0\n return (\n comment.type === 'Shebang' || (comment.type === 'Line' && comment.range?.[0] === 0 && comment.value.startsWith('!'))\n );\n}\n\n// unlike `shouldSkipComment`, this does not exempt TODO-style tags since they can be rewrapped like any other prose\nfunction isUnwrappable(trimmed: string, options: ResolvedOptions): boolean {\n if (options.ignoreDirectives && DIRECTIVE_PATTERN.test(trimmed)) {\n return true;\n }\n\n if (options.ignoreUrls && URL_PATTERN.test(trimmed)) {\n return true;\n }\n\n return options.ignoredPatterns.some((pattern) => pattern.test(trimmed));\n}\n\nfunction shouldSkipComment(value: string, options: ResolvedOptions): boolean {\n const trimmed = value.trim();\n\n if (!trimmed) {\n return true;\n }\n\n if (options.ignoreDirectives && TAG_PATTERN.test(trimmed)) {\n return true;\n }\n\n return isUnwrappable(trimmed, options);\n}\n\nfunction checkLineCommentLength(context: Rule.RuleContext, comment: AnyComment, options: ResolvedOptions): void {\n const loc = comment.loc;\n\n if (!loc || loc.end.column <= options.line.maxLength || isUnwrappable(comment.value.trim(), options)) {\n return;\n }\n\n context.report({\n loc,\n messageId: 'lineMaxLength',\n data: {\n maxLength: String(options.line.maxLength),\n },\n });\n}\n\nfunction checkLineComment(context: Rule.RuleContext, comment: AnyComment, options: ResolvedOptions): void {\n const { line } = options;\n const raw = comment.value;\n const loc = comment.loc;\n const range = comment.range;\n\n if (!loc || !range) {\n return;\n }\n\n const rangeStart = range[0];\n\n if (line.requireLeadingSpace && raw.length > 0) {\n const first = raw.codePointAt(0);\n\n // allow \"///\" banner comments and tab-indented comments\n if (first !== 0x20 && first !== 0x2f && first !== 0x09) {\n context.report({\n loc,\n messageId: 'lineLeadingSpace',\n fix: (fixer) => fixer.insertTextAfterRange([rangeStart, rangeStart + 2], ' '),\n });\n }\n }\n\n const trimmed = raw.trim();\n\n if (!trimmed) {\n return;\n }\n\n const firstWordMatch = FIRST_WORD_PATTERN.exec(trimmed);\n\n if (firstWordMatch && line.requireLowercase) {\n const word = firstWordMatch[1];\n const firstChar = word[0];\n\n if (isUpperCase(firstChar) && !ALL_CAPS_WORD.test(word) && !options.ignoredWords.has(word)) {\n context.report({\n loc,\n messageId: 'lineLowercase',\n fix: (fixer) => {\n const offset = rangeStart + 2 + raw.indexOf(firstChar);\n\n return fixer.replaceTextRange([offset, offset + 1], firstChar.toLowerCase());\n },\n });\n }\n }\n\n if (line.forbidTrailingPunctuation && !endsWithAny(trimmed, line.allowedEndings)) {\n const lastChar = trimmed.at(-1) ?? '';\n\n if (isTrailingPunctuation(lastChar)) {\n context.report({\n loc,\n messageId: 'lineTrailingPunctuation',\n fix: (fixer) => {\n const offset = rangeStart + 2 + indexOfLastNonSpace(raw);\n\n return fixer.removeRange([offset, offset + 1]);\n },\n });\n }\n }\n}\n\nfunction isSingleLineJsdocBlock(comment: AnyComment): boolean {\n return comment.type === 'Block' && comment.value.startsWith('*') && !comment.value.includes('\\n');\n}\n\nfunction checkSingleLineJsdocBlock(context: Rule.RuleContext, comment: AnyComment): void {\n const loc = comment.loc;\n const range = comment.range;\n\n if (!loc || !range) {\n return;\n }\n\n const inner = comment.value.slice(1).trim();\n\n if (!inner || SINGLE_LINE_JSDOC_TAG.test(inner)) {\n return;\n }\n\n const sourceLine = context.sourceCode.lines[loc.start.line - 1] ?? '';\n const prefix = sourceLine.slice(0, loc.start.column);\n const canFix = /^\\s*$/.test(prefix);\n\n context.report({\n loc,\n messageId: 'blockSingleLineJSDoc',\n fix: canFix ? (fixer) => fixer.replaceTextRange(range, `/**\\n${prefix} * ${inner}\\n${prefix} */`) : undefined,\n });\n}\n\nfunction checkSingleLineBlock(context: Rule.RuleContext, comment: AnyComment, options: ResolvedOptions): void {\n const { block } = options;\n const raw = comment.value;\n const loc = comment.loc;\n const range = comment.range;\n\n if (!loc || !range) {\n return;\n }\n\n const trimmed = raw.trim();\n\n if (!trimmed) {\n return;\n }\n\n const rangeStart = range[0];\n const firstWordMatch = FIRST_WORD_PATTERN.exec(trimmed);\n\n if (firstWordMatch && block.requireCapital) {\n const word = firstWordMatch[1];\n const firstChar = word[0];\n\n if (isLowerCase(firstChar) && !ALL_CAPS_WORD.test(word) && !options.ignoredWords.has(word)) {\n context.report({\n loc,\n messageId: 'blockCapital',\n fix: (fixer) => {\n const offset = rangeStart + 2 + raw.indexOf(firstChar);\n\n return fixer.replaceTextRange([offset, offset + 1], firstChar.toUpperCase());\n },\n });\n }\n }\n\n if (block.requireTrailingPunctuation) {\n const lastChar = trimmed.at(-1) ?? '';\n\n if (!isBlockEndingPunctuation(lastChar)) {\n context.report({\n loc,\n messageId: 'blockTrailingPunctuation',\n fix: (fixer) => {\n const offset = rangeStart + 2 + indexOfLastNonSpace(raw);\n\n return fixer.insertTextAfterRange([offset, offset + 1], '.');\n },\n });\n }\n }\n}\n\nfunction offsetOfLine(comment: AnyComment, lines: readonly string[], lineIndex: number): number {\n const range = comment.range;\n\n if (!range) {\n return 0;\n }\n\n // base = range start + length of `/*`, then cumulative line lengths plus their '\\n' separators\n let offset = range[0] + 2;\n\n for (let index = 0; index < lineIndex; index += 1) {\n offset += lines[index].length + 1;\n }\n\n return offset;\n}\n\nfunction skipParagraphFirstWord(text: string, options: ResolvedOptions): boolean {\n const match = FIRST_WORD_PATTERN.exec(text);\n\n if (!match) {\n return true;\n }\n\n const word = match[1];\n\n return ALL_CAPS_WORD.test(word) || options.ignoredWords.has(word);\n}\n\nfunction reportParagraphEnding(\n context: Rule.RuleContext,\n comment: AnyComment,\n text: string,\n options: ResolvedOptions,\n): void {\n const { block } = options;\n const loc = comment.loc;\n\n if (!loc) {\n return;\n }\n\n for (const ending of block.paragraphEndings) {\n if (text.endsWith(ending)) {\n return;\n }\n }\n\n context.report({\n loc,\n messageId: 'blockParagraphEnding',\n data: { endings: `[${block.paragraphEndings.join(' ')}]` },\n });\n}\n\nfunction checkParameterLine(\n context: Rule.RuleContext,\n comment: AnyComment,\n lines: readonly string[],\n lineIndex: number,\n text: string,\n starSegment: string,\n spaces: string,\n): void {\n const loc = comment.loc;\n\n if (!loc) {\n return;\n }\n\n const match = PARAM_DESC_RE.exec(text);\n\n if (!match) {\n return;\n }\n\n const descPart = match[2];\n const textStart = offsetOfLine(comment, lines, lineIndex) + starSegment.length + spaces.length;\n\n if (!descPart.startsWith('- ')) {\n const prefixMatch = /^@param\\s+(?:\\{[^}]*\\}\\s+)?\\S+\\s+/.exec(text);\n\n if (!prefixMatch) {\n return;\n }\n\n const descStartOffset = textStart + prefixMatch[0].length;\n\n context.report({\n loc,\n messageId: 'paramMissingDash',\n fix: (fixer) => fixer.insertTextBeforeRange([descStartOffset, descStartOffset + 1], '- '),\n });\n\n return;\n }\n\n const description = descPart.slice(2).trim();\n\n if (!description) {\n return;\n }\n\n if (!description.endsWith('.')) {\n const textEndOffset = textStart + text.length;\n\n context.report({\n loc,\n messageId: 'paramDescriptionPeriod',\n fix: (fixer) => fixer.insertTextAfterRange([textEndOffset - 1, textEndOffset], '.'),\n });\n }\n}\n\nfunction checkMultiLineBlock(context: Rule.RuleContext, comment: AnyComment, options: ResolvedOptions): void {\n const { block } = options;\n const loc = comment.loc;\n const range = comment.range;\n\n if (!loc || !range) {\n return;\n }\n\n const lines = comment.value.split('\\n');\n const firstLine = lines[0];\n const lastLine = lines.at(-1) ?? '';\n\n // the comment value excludes the `/*` opener, so a `/**` comment has a value starting with `*`\n if (block.requireJSDocOpening && !comment.value.startsWith('*')) {\n const openerEnd = range[0] + 2;\n\n context.report({\n loc,\n messageId: 'blockJSDocOpening',\n fix: (fixer) => fixer.insertTextAfterRange([range[0], openerEnd], '*'),\n });\n }\n\n if (block.enforceOpening) {\n const opening = firstLine.trim();\n\n if (opening !== '' && opening !== '*') {\n context.report({ loc, messageId: 'blockOpening' });\n\n return;\n }\n }\n\n if (block.enforceClosing) {\n if (lastLine.trim() !== '') {\n context.report({ loc, messageId: 'blockClosing' });\n\n return;\n }\n\n if (lines.length >= 3 && BLOCK_LINE_EMPTY.test(lines.at(-2) ?? '')) {\n context.report({ loc, messageId: 'blockEmptyLineBeforeClose' });\n }\n }\n\n let insideCodeBlock = false;\n let paragraphStart = true;\n let skipParagraphEnding = false;\n let previousText: string | undefined;\n\n for (let index = 1; index < lines.length - 1; index += 1) {\n const line = lines[index];\n\n if (CODE_FENCE_LINE.test(line)) {\n insideCodeBlock = !insideCodeBlock;\n paragraphStart = true;\n skipParagraphEnding = false;\n previousText = undefined;\n\n continue;\n }\n\n if (insideCodeBlock) {\n continue;\n }\n\n if (BLOCK_LINE_EMPTY.test(line)) {\n if (previousText !== undefined && block.requireParagraphCapital && !skipParagraphEnding) {\n reportParagraphEnding(context, comment, previousText, options);\n }\n\n paragraphStart = true;\n skipParagraphEnding = false;\n previousText = undefined;\n\n continue;\n }\n\n const match = BLOCK_LINE_WITH_TEXT.exec(line);\n\n if (!match) {\n continue;\n }\n\n const [, starSegment, spaces, text] = match;\n\n // list items and JSDoc tags (plus wrapped continuation lines) are exempt from paragraph endings\n if (LIST_ITEM_LINE.test(text) || JSDOC_TAG_LINE.test(line)) {\n skipParagraphEnding = true;\n }\n\n if (block.requireSpaceAfterStar && spaces.length === 0) {\n const lineOffset = offsetOfLine(comment, lines, index);\n const starEnd = lineOffset + starSegment.length;\n\n context.report({\n loc,\n messageId: 'blockLineSpaceAfterStar',\n fix: (fixer) => fixer.insertTextAfterRange([starEnd - 1, starEnd], ' '),\n });\n\n continue;\n }\n\n if (block.requireJSDocSpacing && JSDOC_TAG_LINE.test(line) && previousText !== undefined) {\n const previousLine = lines[index - 1];\n\n if (!BLOCK_LINE_EMPTY.test(previousLine) && !JSDOC_TAG_LINE.test(previousLine)) {\n context.report({ loc, messageId: 'blockJSDocBlankLine' });\n }\n }\n\n if (paragraphStart && block.requireParagraphCapital && !JSDOC_TAG_LINE.test(line)) {\n const firstChar = text[0];\n\n if (firstChar && isLowerCase(firstChar) && !skipParagraphFirstWord(text, options)) {\n const lineOffset = offsetOfLine(comment, lines, index);\n const charOffset = lineOffset + starSegment.length + spaces.length;\n\n context.report({\n loc,\n messageId: 'blockParagraphCapital',\n fix: (fixer) => fixer.replaceTextRange([charOffset, charOffset + 1], firstChar.toUpperCase()),\n });\n }\n }\n\n paragraphStart = false;\n\n if (block.enforceParamStyle && /^@param\\s/.test(text)) {\n checkParameterLine(context, comment, lines, index, text, starSegment, spaces);\n\n previousText = undefined;\n } else {\n previousText = text;\n }\n }\n\n if (previousText !== undefined && block.requireParagraphCapital && !skipParagraphEnding) {\n reportParagraphEnding(context, comment, previousText, options);\n }\n}\n\nconst messages: Record<MessageId, string> = {\n lineLeadingSpace: 'Line comment should start with a space.',\n lineLowercase: 'Line comment should start with a lowercase letter.',\n lineTrailingPunctuation: 'Line comment should not end with punctuation.',\n lineMaxLength:\n 'Line comment exceeds the maximum line length of {{maxLength}}; use a multi-line block comment instead.',\n blockCapital: 'Block comment should start with an uppercase letter.',\n blockTrailingPunctuation: 'Block comment should end with punctuation.',\n blockSingleLineJSDoc: 'JSDoc-style block comments (/** ... */) must span multiple lines.',\n blockJSDocOpening: \"Multi-line block comments must start with '/**', not '/*'.\",\n blockOpening: \"Block comment should start with '/**\\\\n *' (or '/*\\\\n *').\",\n blockClosing: \"Block comment should end with '\\\\n */'.\",\n blockEmptyLineBeforeClose: 'Block comment should not end with an empty line.',\n blockLineSpaceAfterStar: \"Each line of a block comment requires a space after '*'.\",\n blockParagraphCapital: 'Paragraph should start with an uppercase letter.',\n blockParagraphEnding: 'Paragraph should end with one of {{endings}}.',\n blockJSDocBlankLine: 'Insert a blank line before JSDoc tags.',\n paramMissingDash: \"@param should use ' - ' between name and description.\",\n paramDescriptionPeriod: '@param description should end with a period.',\n};\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Enforce comment casing, punctuation, and JSDoc/paragraph structure for line, single-line block, and multi-line block comments.',\n },\n fixable: 'code',\n schema: [\n {\n type: 'object',\n additionalProperties: false,\n properties: {\n ignoredWords: {\n type: 'array',\n items: { type: 'string' },\n uniqueItems: true,\n },\n ignoredPatterns: {\n type: 'array',\n items: { type: 'string' },\n uniqueItems: true,\n },\n ignoreUrls: { type: 'boolean' },\n ignoreDirectives: { type: 'boolean' },\n line: {\n type: 'object',\n additionalProperties: false,\n properties: {\n requireLeadingSpace: { type: 'boolean' },\n requireLowercase: { type: 'boolean' },\n forbidTrailingPunctuation: { type: 'boolean' },\n allowedEndings: {\n type: 'array',\n items: { type: 'string' },\n uniqueItems: true,\n },\n maxLength: { type: 'integer', minimum: 1 },\n },\n },\n block: {\n type: 'object',\n additionalProperties: false,\n properties: {\n requireCapital: { type: 'boolean' },\n requireTrailingPunctuation: { type: 'boolean' },\n requireJSDocOpening: { type: 'boolean' },\n enforceOpening: { type: 'boolean' },\n enforceClosing: { type: 'boolean' },\n requireSpaceAfterStar: { type: 'boolean' },\n requireParagraphCapital: { type: 'boolean' },\n paragraphEndings: {\n type: 'array',\n items: { type: 'string' },\n uniqueItems: true,\n },\n requireJSDocSpacing: { type: 'boolean' },\n enforceParamStyle: { type: 'boolean' },\n },\n },\n },\n },\n ],\n messages,\n },\n create(context) {\n const sourceCode = context.sourceCode;\n const options = resolveOptions(context.options[0]);\n\n return {\n Program() {\n const comments = sourceCode.getAllComments();\n\n for (const comment of comments) {\n if (isHashbang(comment)) {\n continue;\n }\n\n if (comment.type === 'Line') {\n checkLineCommentLength(context, comment, options);\n }\n\n // the shape check must run before `shouldSkipComment`, whose URL/pattern exemptions only apply to wording\n if (isSingleLineJsdocBlock(comment)) {\n checkSingleLineJsdocBlock(context, comment);\n\n continue;\n }\n\n if (shouldSkipComment(comment.value, options)) {\n continue;\n }\n\n if (comment.type === 'Line') {\n checkLineComment(context, comment, options);\n\n continue;\n }\n\n if (comment.value.includes('\\n')) {\n checkMultiLineBlock(context, comment, options);\n } else {\n checkSingleLineBlock(context, comment, options);\n }\n }\n },\n };\n },\n};\n\nexport default rule;\n","import type { Rule } from 'eslint';\n\nfunction isAlwaysPadded(node: Rule.Node) {\n /**\n * Class methods and static blocks always get blank lines between\n * siblings, even when single-line, so they never feel crammed together.\n */\n return node.type === 'MethodDefinition' || node.type === 'StaticBlock';\n}\n\nfunction isImportOrExport(node: Rule.Node) {\n /**\n * Imports and re-exports are grouped together with no blank lines between\n * them, so this rule ignores them entirely, both as a subject and as a\n * neighbor. Declared exports (export const/function/class) still pad like\n * regular code, since they contain real multiline bodies.\n */\n if (node.type === 'ImportDeclaration' || node.type === 'ExportAllDeclaration') {\n return true;\n }\n\n return node.type === 'ExportNamedDeclaration' && !node.declaration;\n}\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'layout',\n docs: {\n description:\n 'Require blank lines around multiline statements, class methods, static blocks, and switch case bodies.',\n },\n fixable: 'whitespace',\n schema: [],\n messages: {\n missingBlankBefore: 'Expected blank line before this.',\n missingBlankAfter: 'Expected blank line after this.',\n },\n },\n create(context) {\n const sourceCode = context.sourceCode;\n\n function checkBody(body: Rule.Node[], options: { alwaysPadMembers?: boolean } = {}) {\n for (let index = 0; index < body.length; index++) {\n const node = body[index];\n\n if (!node.loc || isImportOrExport(node)) {\n continue;\n }\n\n const isMultiline = node.loc.start.line !== node.loc.end.line;\n const forceByKind = options.alwaysPadMembers === true && isAlwaysPadded(node);\n const needsPadding = isMultiline || forceByKind;\n\n if (!needsPadding) {\n continue;\n }\n\n if (index > 0) {\n const previous = body[index - 1];\n\n if (previous.loc && !isImportOrExport(previous)) {\n const linesBetween = node.loc.start.line - previous.loc.end.line;\n\n if (linesBetween < 2) {\n context.report({\n node,\n messageId: 'missingBlankBefore',\n fix(fixer) {\n const previousToken = sourceCode.getLastToken(previous);\n\n if (!previousToken) {\n return null;\n }\n\n return fixer.insertTextAfter(previousToken, '\\n');\n },\n });\n }\n }\n }\n\n if (index < body.length - 1) {\n const next = body[index + 1];\n\n if (next.loc && !isImportOrExport(next)) {\n const linesBetween = next.loc.start.line - node.loc.end.line;\n\n if (linesBetween < 2) {\n context.report({\n node,\n messageId: 'missingBlankAfter',\n fix(fixer) {\n const lastToken = sourceCode.getLastToken(node);\n\n if (!lastToken) {\n return null;\n }\n\n return fixer.insertTextAfter(lastToken, '\\n');\n },\n });\n }\n }\n }\n }\n }\n\n return {\n Program(node) {\n checkBody(node.body as Rule.Node[]);\n },\n BlockStatement(node) {\n checkBody(node.body as Rule.Node[]);\n },\n StaticBlock(node) {\n checkBody(node.body as Rule.Node[]);\n },\n SwitchCase(node) {\n checkBody(node.consequent as Rule.Node[]);\n },\n ClassBody(node) {\n checkBody(node.body as Rule.Node[], { alwaysPadMembers: true });\n },\n };\n },\n};\n\nexport default rule;\n","import type { AST, Rule } from 'eslint';\n\ninterface Comment {\n type: string;\n value: string;\n range?: [number, number];\n loc?: Rule.Node['loc'];\n}\n\ntype TokenOrComment = AST.Token | Comment;\n\ninterface RuleOptions {\n groups?: string[];\n}\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'layout',\n docs: {\n description:\n 'Disallow blank lines between import declarations so all imports form a single block, optionally allowing blank lines between configured groups.',\n },\n fixable: 'whitespace',\n schema: [\n {\n type: 'object',\n properties: {\n groups: {\n type: 'array',\n items: { type: 'string' },\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n blankLineBetweenImports: 'Imports must form a single block without blank lines.',\n },\n },\n create(context) {\n const sourceCode = context.sourceCode;\n\n const options = (context.options[0] as RuleOptions | undefined) ?? {};\n\n const groupPatterns = (options.groups ?? []).map((pattern) => new RegExp(pattern, 'u'));\n\n /**\n * Imports matching none of the patterns share the implicit `-1` group, so\n * a blank line is only allowed where the group changes.\n */\n function getGroup(source: unknown): number {\n return groupPatterns.findIndex((pattern) => pattern.test(String(source)));\n }\n\n function checkGap(left: TokenOrComment, right: TokenOrComment) {\n if (!left.loc || !right.loc || !left.range || !right.range) {\n return;\n }\n\n if (right.loc.start.line - left.loc.end.line < 2) {\n return;\n }\n\n const gapRange: [number, number] = [left.range[1], right.range[0]];\n const gapText = sourceCode.getText().slice(gapRange[0], gapRange[1]);\n const indentation = gapText.slice(gapText.lastIndexOf('\\n') + 1);\n\n context.report({\n loc: right.loc,\n messageId: 'blankLineBetweenImports',\n fix(fixer) {\n return fixer.replaceTextRange(gapRange, `\\n${indentation}`);\n },\n });\n }\n\n return {\n Program(program) {\n const body = program.body;\n\n for (let index = 1; index < body.length; index++) {\n const previous = body[index - 1];\n const current = body[index];\n\n if (previous.type !== 'ImportDeclaration' || current.type !== 'ImportDeclaration') {\n continue;\n }\n\n if (getGroup(previous.source.value) !== getGroup(current.source.value)) {\n continue;\n }\n\n const lastToken = sourceCode.getLastToken(previous);\n const firstToken = sourceCode.getFirstToken(current);\n\n if (!lastToken || !firstToken) {\n continue;\n }\n\n const tokens: TokenOrComment[] = [\n lastToken,\n ...sourceCode.getTokensBetween(previous, current, { includeComments: true }),\n firstToken,\n ];\n\n for (let tokenIndex = 1; tokenIndex < tokens.length; tokenIndex++) {\n checkGap(tokens[tokenIndex - 1], tokens[tokenIndex]);\n }\n }\n },\n };\n },\n};\n\nexport default rule;\n","import type { Rule } from 'eslint';\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Disallow returning an object literal from an arrow function concise body (e.g. `() => ({})`); require a block body with an explicit return.',\n },\n fixable: 'code',\n schema: [],\n messages: {\n implicitObjectReturn:\n 'Avoid returning an object literal directly from an arrow function; use a block body with an explicit return.',\n },\n },\n create(context) {\n const sourceCode = context.sourceCode;\n\n return {\n ArrowFunctionExpression(node) {\n const body = node.body;\n\n // only concise bodies that resolve straight to an object literal\n if (!node.expression || body.type !== 'ObjectExpression') {\n return;\n }\n\n context.report({\n node: body,\n messageId: 'implicitObjectReturn',\n fix(fixer) {\n const arrowToken = sourceCode.getTokenBefore(body, (token) => token.value === '=>');\n\n // an object concise body is always parenthesized, otherwise it parses as a block\n const openParen = sourceCode.getTokenBefore(body);\n const closeParen = sourceCode.getTokenAfter(body);\n\n if (!arrowToken || openParen?.value !== '(' || closeParen?.value !== ')') {\n return null;\n }\n\n const objectText = sourceCode.getText(body);\n\n return fixer.replaceTextRange([arrowToken.range[1], closeParen.range[1]], ` { return ${objectText}; }`);\n },\n });\n },\n };\n },\n};\n\nexport default rule;\n","import type { Rule } from 'eslint';\n\n// type-only wrappers that leave the ternary as the runtime receiver, e.g. `(a ? b : c)!.push()`\nconst TYPE_WRAPPERS = new Set(['TSNonNullExpression', 'TSAsExpression', 'TSSatisfiesExpression', 'TSTypeAssertion']);\n\ninterface MaybeWrapped {\n type: string;\n expression?: MaybeWrapped;\n}\n\nfunction unwrapTypeWrappers(node: MaybeWrapped): MaybeWrapped {\n let current = node;\n\n while (TYPE_WRAPPERS.has(current.type) && current.expression) {\n current = current.expression;\n }\n\n return current;\n}\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Disallow calling a method or accessing a property on a ternary (e.g. `(a ? b : c).push(x)`); assign the ternary to a named variable first.',\n },\n schema: [],\n messages: {\n memberAccessOnTernary:\n 'Avoid accessing a member on a ternary; assign the ternary to a named variable first, then use the variable.',\n },\n },\n create(context) {\n return {\n MemberExpression(node) {\n const receiver = unwrapTypeWrappers(node.object as MaybeWrapped);\n\n if (receiver.type !== 'ConditionalExpression') {\n return;\n }\n\n context.report({\n node,\n messageId: 'memberAccessOnTernary',\n });\n },\n };\n },\n};\n\nexport default rule;\n","import type { ESLint } from 'eslint';\nimport blockScopedCase from './block-scoped-case.js';\nimport commentPrecedingBlankLine from './comment-preceding-blank-line.js';\nimport commentSyntax from './comment-syntax.js';\nimport newlineAroundMultiline from './newline-around-multiline.js';\nimport noBlankLineBetweenImports from './no-blank-line-between-imports.js';\nimport noImplicitObjectReturn from './no-implicit-object-return.js';\nimport noMemberAccessOnTernary from './no-member-access-on-ternary.js';\n\nexport const customRules: ESLint.Plugin = {\n meta: {\n name: '@d3lm/lint-preset-rules',\n version: '0.1.0',\n },\n rules: {\n 'newline-around-multiline': newlineAroundMultiline,\n 'block-scoped-case': blockScopedCase,\n 'comment-syntax': commentSyntax,\n 'comment-preceding-blank-line': commentPrecedingBlankLine,\n 'no-implicit-object-return': noImplicitObjectReturn,\n 'no-blank-line-between-imports': noBlankLineBetweenImports,\n 'no-member-access-on-ternary': noMemberAccessOnTernary,\n },\n};\n\nexport default customRules;\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/lint-preset/lint-preset/dist/rules.cjs","../src/rules/block-scoped-case.ts","../src/rules/comment-preceding-blank-line.ts","../src/rules/comment-syntax.ts","../src/rules/newline-around-multiline.ts","../src/rules/no-blank-line-between-imports.ts","../src/rules/no-implicit-object-return.ts","../src/rules/no-member-access-on-ternary.ts","../src/rules/index.ts"],"names":["rule"],"mappings":"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","file":"/home/runner/work/lint-preset/lint-preset/dist/rules.cjs","sourcesContent":[null,"import type { Rule } from 'eslint';\n\nconst leadingWhitespace = (line: string) => /^[ \\t]*/.exec(line)?.[0].length ?? 0;\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'suggestion',\n docs: {\n description: 'Require case clauses to use block scope (braces).',\n },\n fixable: 'code',\n schema: [],\n messages: {\n missingBlock: 'Case clause should be wrapped in a block (braces).',\n },\n },\n create(context) {\n const sourceCode = context.sourceCode;\n\n return {\n SwitchCase(node) {\n const { consequent } = node;\n\n if (consequent.length === 0) {\n return;\n }\n\n if (consequent.length === 1 && consequent[0].type === 'BlockStatement') {\n return;\n }\n\n context.report({\n node,\n messageId: 'missingBlock',\n fix(fixer) {\n const caseKeyword = sourceCode.getFirstToken(node);\n\n if (!caseKeyword) {\n return [];\n }\n\n const colonToken = sourceCode.getTokenAfter(\n node.test ? (node.test as Rule.Node) : caseKeyword,\n (token) => token.value === ':',\n );\n\n if (!colonToken) {\n return [];\n }\n\n const lastConsequent = consequent.at(-1);\n const lastToken = sourceCode.getLastToken(lastConsequent as Rule.Node);\n\n if (!lastToken) {\n return [];\n }\n\n const caseIndent = ' '.repeat(caseKeyword.loc.start.column);\n const bodyIndent = caseIndent + ' ';\n\n const text = sourceCode.getText();\n const bodyText = text.slice(colonToken.range[1], lastToken.range[1]);\n\n const lines = bodyText.split('\\n');\n const restLines = lines.slice(1);\n const restIndents = restLines.filter((line) => line.trim() !== '').map((line) => leadingWhitespace(line));\n const indentDelta = restIndents.length > 0 ? bodyIndent.length - Math.min(...restIndents) : 0;\n\n const bodyLines: string[] = [];\n const firstLine = lines[0].trim();\n\n if (firstLine) {\n bodyLines.push(bodyIndent + firstLine);\n }\n\n for (const line of restLines) {\n if (line.trim() === '') {\n bodyLines.push('');\n\n continue;\n }\n\n const lead = leadingWhitespace(line);\n const newIndent = Math.max(0, lead + indentDelta);\n\n bodyLines.push(' '.repeat(newIndent) + line.slice(lead));\n }\n\n while (bodyLines.length > 0 && bodyLines[0] === '') {\n bodyLines.shift();\n }\n\n while (bodyLines.length > 0 && bodyLines.at(-1) === '') {\n bodyLines.pop();\n }\n\n const result = ` {\\n${bodyLines.join('\\n')}\\n${caseIndent}}`;\n\n return fixer.replaceTextRange([colonToken.range[1], lastToken.range[1]], result);\n },\n });\n },\n };\n },\n};\n\nexport default rule;\n","import type { Rule } from 'eslint';\n\ninterface Comment {\n type: string;\n value: string;\n range?: [number, number];\n loc?: Rule.Node['loc'];\n}\n\ninterface RuleOptions {\n allowInObjects?: boolean;\n allowInArrays?: boolean;\n allowInInterfaces?: boolean;\n allowInUnions?: boolean;\n}\n\nconst UNION_OR_INTERSECTION_TYPES = new Set(['TSUnionType', 'TSIntersectionType']);\n\nfunction isMultiLineBlock(comment: { type: string; value: string }): boolean {\n return comment.type === 'Block' && comment.value.includes('\\n');\n}\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'layout',\n docs: {\n description:\n 'Require a blank line before comments, with an exception for comments inside chained member-call expressions.',\n },\n fixable: 'whitespace',\n schema: [\n {\n type: 'object',\n properties: {\n allowInObjects: {\n type: 'boolean',\n },\n allowInArrays: {\n type: 'boolean',\n },\n allowInInterfaces: {\n type: 'boolean',\n },\n allowInUnions: {\n type: 'boolean',\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n missingBlankLine: 'Expected blank line before comment.',\n },\n },\n create(context) {\n const sourceCode = context.sourceCode;\n\n const options = (context.options[0] as RuleOptions | undefined) ?? {};\n\n const allowInObjects = options.allowInObjects ?? false;\n const allowInArrays = options.allowInArrays ?? false;\n const allowInInterfaces = options.allowInInterfaces ?? false;\n const allowInUnions = options.allowInUnions ?? false;\n\n function isChainedCallContext(comment: Comment): boolean {\n if (!comment.range) {\n return false;\n }\n\n let current = (sourceCode.getNodeByRangeIndex(comment.range[0]) ?? undefined) as Rule.Node | undefined;\n\n while (current?.type === 'CallExpression' || current?.type === 'MemberExpression') {\n if (current.type === 'CallExpression' && current.callee.type === 'MemberExpression') {\n return true;\n }\n\n current = current.parent as Rule.Node | undefined;\n }\n\n return false;\n }\n\n function isCommentAllowedByEnclosure(comment: Comment): boolean {\n if (!comment.range) {\n return false;\n }\n\n const node = sourceCode.getNodeByRangeIndex(comment.range[0]) as Rule.Node | null;\n\n if (!node) {\n return false;\n }\n\n // TS-specific node types aren't part of the ESTree `Rule.Node` union\n const type = node.type as string;\n\n if (allowInObjects && (type === 'ObjectExpression' || type === 'ObjectPattern')) {\n return true;\n }\n\n if (allowInArrays && (type === 'ArrayExpression' || type === 'ArrayPattern')) {\n return true;\n }\n\n if (allowInInterfaces && (type === 'TSInterfaceBody' || type === 'TSTypeLiteral')) {\n return true;\n }\n\n if (allowInUnions && UNION_OR_INTERSECTION_TYPES.has(type)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * A comment before the leading `|` or `&` of a multiline union or intersection type describes\n * its first member, so it's treated like a comment at block start.\n */\n function isBeforeFirstTypeConstituent(comment: Comment): boolean {\n const tokenAfter = sourceCode.getTokenAfter(comment as unknown as Rule.Node);\n\n if (!tokenAfter || (tokenAfter.value !== '|' && tokenAfter.value !== '&')) {\n return false;\n }\n\n const node = sourceCode.getNodeByRangeIndex(tokenAfter.range[0]);\n\n return node !== null && UNION_OR_INTERSECTION_TYPES.has(node.type) && node.range?.[0] === tokenAfter.range[0];\n }\n\n function findEnclosingImport(index: number): Rule.Node | undefined {\n let current = (sourceCode.getNodeByRangeIndex(index) ?? undefined) as Rule.Node | undefined;\n\n while (current && current.type !== 'ImportDeclaration') {\n current = (current.parent ?? undefined) as Rule.Node | undefined;\n }\n\n return current;\n }\n\n /**\n * Imports must form a single block (see `no-blank-line-between-imports`), so a comment between\n * two imports can't be preceded by a blank line.\n */\n function isBetweenImports(comment: Comment): boolean {\n const tokenBefore = sourceCode.getTokenBefore(comment as unknown as Rule.Node);\n const tokenAfter = sourceCode.getTokenAfter(comment as unknown as Rule.Node);\n\n if (!tokenBefore || !tokenAfter) {\n return false;\n }\n\n const importBefore = findEnclosingImport(tokenBefore.range[0]);\n const importAfter = findEnclosingImport(tokenAfter.range[0]);\n\n return importBefore !== undefined && importAfter !== undefined && importBefore !== importAfter;\n }\n\n function isAtBlockStart(comment: Comment): boolean {\n const tokenBefore = sourceCode.getTokenBefore(comment as unknown as Rule.Node, {\n includeComments: false,\n });\n\n if (!tokenBefore) {\n return true;\n }\n\n return ['{', '(', '['].includes(tokenBefore.value);\n }\n\n function isExempt(comment: Comment): boolean {\n return (\n isAtBlockStart(comment) ||\n isBeforeFirstTypeConstituent(comment) ||\n isChainedCallContext(comment) ||\n isCommentAllowedByEnclosure(comment) ||\n isBetweenImports(comment)\n );\n }\n\n function followsMultiLineBlock(comment: Comment): boolean {\n if (!isMultiLineBlock(comment)) {\n return false;\n }\n\n const previous = sourceCode.getTokenBefore(comment as unknown as Rule.Node, { includeComments: true });\n\n return previous !== null && isMultiLineBlock(previous);\n }\n\n return {\n Program() {\n const comments = sourceCode.getAllComments();\n\n for (const comment of comments) {\n if (!comment.loc || !comment.range) {\n continue;\n }\n\n const commentLine = comment.loc.start.line;\n\n if (commentLine <= 1) {\n continue;\n }\n\n if (!followsMultiLineBlock(comment) && isExempt(comment)) {\n continue;\n }\n\n const tokenBefore = sourceCode.getTokenBefore(comment as unknown as Rule.Node, {\n includeComments: true,\n });\n\n if (!tokenBefore?.loc) {\n continue;\n }\n\n const linesBetween = commentLine - tokenBefore.loc.end.line;\n\n if (linesBetween >= 2) {\n continue;\n }\n\n if (linesBetween === 0) {\n continue;\n }\n\n const commentStart = comment.range[0];\n const lineStart = sourceCode.getText().lastIndexOf('\\n', commentStart - 1) + 1;\n\n context.report({\n loc: comment.loc,\n messageId: 'missingBlankLine',\n fix(fixer) {\n return fixer.insertTextBeforeRange([lineStart, lineStart], '\\n');\n },\n });\n }\n },\n };\n },\n};\n\nexport default rule;\n","import type { AST, Rule } from 'eslint';\n\ninterface CommentLike {\n readonly type: string;\n readonly value: string;\n readonly range?: [number, number];\n readonly loc?: Rule.Node['loc'];\n}\n\ninterface LineOptions {\n readonly requireLeadingSpace: boolean;\n readonly requireLowercase: boolean;\n readonly forbidTrailingPunctuation: boolean;\n readonly allowedEndings: readonly string[];\n readonly maxLength: number;\n}\n\ninterface BlockOptions {\n readonly requireCapital: boolean;\n readonly requireTrailingPunctuation: boolean;\n readonly requireJSDocOpening: boolean;\n readonly enforceOpening: boolean;\n readonly enforceClosing: boolean;\n readonly requireSpaceAfterStar: boolean;\n readonly requireParagraphCapital: boolean;\n readonly paragraphEndings: readonly string[];\n readonly requireJSDocSpacing: boolean;\n readonly enforceParamStyle: boolean;\n readonly forbidTagIndent: boolean;\n}\n\ninterface ResolvedOptions {\n readonly ignoredWords: ReadonlySet<string>;\n readonly ignoredPatterns: readonly RegExp[];\n readonly ignoreUrls: boolean;\n readonly ignoreDirectives: boolean;\n readonly line: LineOptions;\n readonly block: BlockOptions;\n}\n\ntype MessageId =\n | 'lineLeadingSpace'\n | 'lineLowercase'\n | 'lineTrailingPunctuation'\n | 'lineMaxLength'\n | 'blockCapital'\n | 'blockTrailingPunctuation'\n | 'blockSingleLineJSDoc'\n | 'blockJSDocOpening'\n | 'blockOpening'\n | 'blockClosing'\n | 'blockEmptyLineBeforeClose'\n | 'blockLineSpaceAfterStar'\n | 'blockParagraphCapital'\n | 'blockParagraphEnding'\n | 'blockJSDocBlankLine'\n | 'paramMissingDash'\n | 'paramDescriptionPeriod'\n | 'tagContinuationIndent';\n\ntype AnyComment = CommentLike | AST.Token;\n\nconst URL_PATTERN = /\\bhttps?:\\/\\//;\n\nconst DIRECTIVE_PATTERN =\n /^\\s*(?:eslint(?:-[a-z-]+)?\\b|@ts-[a-z-]+|@(?:jsx|jsxFrag|jsxImportSource|jsxRuntime)\\b|istanbul\\s|c8\\s|v8\\s|prettier-ignore\\b|stylelint-[a-z-]+|webpack[A-Z][a-zA-Z]*|#(?:region|endregion)\\b|type\\s*:)/;\n\nconst TAG_PATTERN = /^\\s*(?:TODO|FIXME|HACK|NOTE|BUG|XXX|SAFETY|WARNING|INFO|OPTIMIZE|REVIEW|PERF|DEPRECATED)\\b/i;\n\nconst FIRST_WORD_PATTERN = /^\\s*([A-Za-z_$][\\w$]*)/;\n\n/**\n * The pattern requires 2+ chars, so sentence-starting \"A\" is not mistaken for an acronym, while \"I\"\n * is a legitimate capital.\n */\nconst ALL_CAPS_WORD = /^(?:I|[A-Z][A-Z0-9_]+)$/;\n\nconst JSDOC_TAG_LINE = /^\\s*\\*\\s*@[A-Za-z]/;\nconst SINGLE_LINE_JSDOC_TAG = /^@[A-Za-z][\\w-]*$/;\nconst PARAM_DESC_RE = /^@param\\s+(?:\\{[^}]*\\}\\s+)?(\\S+)\\s+(.*\\S)\\s*$/;\nconst BLOCK_LINE_WITH_TEXT = /^(\\s*\\*)(\\s*)(\\S.*?)\\s*$/;\nconst BLOCK_LINE_EMPTY = /^\\s*\\*\\s*$/;\nconst CODE_FENCE_LINE = /^\\s*\\*\\s*```/;\nconst LIST_ITEM_LINE = /^(?:[-*+]|\\d+[.)])\\s/;\n\n// tags whose content is code, which keeps its indentation\nconst CODE_TAG = /^@(?:example|default|defaultValue)\\b/;\n\nconst DEFAULT_LINE_ENDINGS = Object.freeze(['etc.', '...', 'e.g.', 'i.e.']);\nconst DEFAULT_PARAGRAPH_ENDINGS = Object.freeze(['.', '!', '?', ':', ';', ')', ']', '}']);\n\nconst DEFAULT_OPTIONS: ResolvedOptions = {\n ignoredWords: new Set<string>(),\n ignoredPatterns: [],\n ignoreUrls: true,\n ignoreDirectives: true,\n line: {\n requireLeadingSpace: true,\n requireLowercase: true,\n forbidTrailingPunctuation: true,\n allowedEndings: DEFAULT_LINE_ENDINGS,\n maxLength: 120,\n },\n block: {\n requireCapital: true,\n requireTrailingPunctuation: true,\n requireJSDocOpening: true,\n enforceOpening: false,\n enforceClosing: false,\n requireSpaceAfterStar: true,\n requireParagraphCapital: true,\n paragraphEndings: DEFAULT_PARAGRAPH_ENDINGS,\n requireJSDocSpacing: true,\n enforceParamStyle: true,\n forbidTagIndent: true,\n },\n};\n\nfunction isUpperCase(char: string): boolean {\n return char !== char.toLowerCase() && char === char.toUpperCase();\n}\n\nfunction isLowerCase(char: string): boolean {\n return char !== char.toUpperCase() && char === char.toLowerCase();\n}\n\nfunction isTrailingPunctuation(char: string): boolean {\n return char === '.' || char === '!' || char === '?' || char === ';' || char === ':';\n}\n\nfunction isBlockEndingPunctuation(char: string): boolean {\n return (\n char === '.' ||\n char === '!' ||\n char === '?' ||\n char === ';' ||\n char === ':' ||\n char === ')' ||\n char === ']' ||\n char === '}' ||\n char === '>'\n );\n}\n\nfunction indexOfLastNonSpace(value: string): number {\n for (let index = value.length - 1; index >= 0; index -= 1) {\n const char = value.codePointAt(index);\n\n if (char !== 0x20 && char !== 0x09 && char !== 0x0a && char !== 0x0d) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction endsWithAny(value: string, endings: readonly string[]): boolean {\n for (const ending of endings) {\n if (value.endsWith(ending)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction resolveOptions(raw: unknown): ResolvedOptions {\n if (!raw || typeof raw !== 'object') {\n return DEFAULT_OPTIONS;\n }\n\n const input = raw as Record<string, unknown>;\n const line = (input.line ?? {}) as Partial<LineOptions>;\n const block = (input.block ?? {}) as Partial<BlockOptions>;\n\n const patterns = Array.isArray(input.ignoredPatterns)\n ? (input.ignoredPatterns as string[]).map((source) => new RegExp(source))\n : DEFAULT_OPTIONS.ignoredPatterns;\n\n return {\n ignoredWords: new Set(Array.isArray(input.ignoredWords) ? (input.ignoredWords as string[]) : []),\n ignoredPatterns: patterns,\n ignoreUrls: (input.ignoreUrls as boolean | undefined) ?? DEFAULT_OPTIONS.ignoreUrls,\n ignoreDirectives: (input.ignoreDirectives as boolean | undefined) ?? DEFAULT_OPTIONS.ignoreDirectives,\n line: { ...DEFAULT_OPTIONS.line, ...line },\n block: { ...DEFAULT_OPTIONS.block, ...block },\n };\n}\n\nfunction isHashbang(comment: AnyComment): boolean {\n /**\n * Espree reports hashbangs as `Shebang`, while other parsers use a `Line` comment starting with\n * `!` at offset 0.\n */\n return (\n comment.type === 'Shebang' || (comment.type === 'Line' && comment.range?.[0] === 0 && comment.value.startsWith('!'))\n );\n}\n\nfunction isUnwrappable(trimmed: string, options: ResolvedOptions): boolean {\n if (options.ignoreDirectives && DIRECTIVE_PATTERN.test(trimmed)) {\n return true;\n }\n\n if (options.ignoreUrls && URL_PATTERN.test(trimmed)) {\n return true;\n }\n\n return options.ignoredPatterns.some((pattern) => pattern.test(trimmed));\n}\n\nfunction shouldSkipComment(value: string, options: ResolvedOptions): boolean {\n const trimmed = value.trim();\n\n if (!trimmed) {\n return true;\n }\n\n if (options.ignoreDirectives && TAG_PATTERN.test(trimmed)) {\n return true;\n }\n\n return isUnwrappable(trimmed, options);\n}\n\nfunction checkLineCommentLength(context: Rule.RuleContext, comment: AnyComment, options: ResolvedOptions): void {\n const loc = comment.loc;\n\n if (!loc || loc.end.column <= options.line.maxLength || isUnwrappable(comment.value.trim(), options)) {\n return;\n }\n\n context.report({\n loc,\n messageId: 'lineMaxLength',\n data: {\n maxLength: String(options.line.maxLength),\n },\n });\n}\n\nfunction checkLineComment(context: Rule.RuleContext, comment: AnyComment, options: ResolvedOptions): void {\n const { line } = options;\n const raw = comment.value;\n const loc = comment.loc;\n const range = comment.range;\n\n if (!loc || !range) {\n return;\n }\n\n const rangeStart = range[0];\n\n if (line.requireLeadingSpace && raw.length > 0) {\n const first = raw.codePointAt(0);\n\n // allow \"///\" banner comments and tab-indented comments\n if (first !== 0x20 && first !== 0x2f && first !== 0x09) {\n context.report({\n loc,\n messageId: 'lineLeadingSpace',\n fix: (fixer) => fixer.insertTextAfterRange([rangeStart, rangeStart + 2], ' '),\n });\n }\n }\n\n const trimmed = raw.trim();\n\n if (!trimmed) {\n return;\n }\n\n const firstWordMatch = FIRST_WORD_PATTERN.exec(trimmed);\n\n if (firstWordMatch && line.requireLowercase) {\n const word = firstWordMatch[1];\n const firstChar = word[0];\n\n if (isUpperCase(firstChar) && !ALL_CAPS_WORD.test(word) && !options.ignoredWords.has(word)) {\n context.report({\n loc,\n messageId: 'lineLowercase',\n fix: (fixer) => {\n const offset = rangeStart + 2 + raw.indexOf(firstChar);\n\n return fixer.replaceTextRange([offset, offset + 1], firstChar.toLowerCase());\n },\n });\n }\n }\n\n if (line.forbidTrailingPunctuation && !endsWithAny(trimmed, line.allowedEndings)) {\n const lastChar = trimmed.at(-1) ?? '';\n\n if (isTrailingPunctuation(lastChar)) {\n context.report({\n loc,\n messageId: 'lineTrailingPunctuation',\n fix: (fixer) => {\n const offset = rangeStart + 2 + indexOfLastNonSpace(raw);\n\n return fixer.removeRange([offset, offset + 1]);\n },\n });\n }\n }\n}\n\nfunction isSingleLineJsdocBlock(comment: AnyComment): boolean {\n return comment.type === 'Block' && comment.value.startsWith('*') && !comment.value.includes('\\n');\n}\n\nfunction checkSingleLineJsdocBlock(context: Rule.RuleContext, comment: AnyComment): void {\n const loc = comment.loc;\n const range = comment.range;\n\n if (!loc || !range) {\n return;\n }\n\n const inner = comment.value.slice(1).trim();\n\n if (!inner || SINGLE_LINE_JSDOC_TAG.test(inner)) {\n return;\n }\n\n const sourceLine = context.sourceCode.lines[loc.start.line - 1] ?? '';\n const prefix = sourceLine.slice(0, loc.start.column);\n const canFix = /^\\s*$/.test(prefix);\n\n context.report({\n loc,\n messageId: 'blockSingleLineJSDoc',\n fix: canFix ? (fixer) => fixer.replaceTextRange(range, `/**\\n${prefix} * ${inner}\\n${prefix} */`) : undefined,\n });\n}\n\nfunction checkSingleLineBlock(context: Rule.RuleContext, comment: AnyComment, options: ResolvedOptions): void {\n const { block } = options;\n const raw = comment.value;\n const loc = comment.loc;\n const range = comment.range;\n\n if (!loc || !range) {\n return;\n }\n\n const trimmed = raw.trim();\n\n if (!trimmed) {\n return;\n }\n\n const rangeStart = range[0];\n const firstWordMatch = FIRST_WORD_PATTERN.exec(trimmed);\n\n if (firstWordMatch && block.requireCapital) {\n const word = firstWordMatch[1];\n const firstChar = word[0];\n\n if (isLowerCase(firstChar) && !ALL_CAPS_WORD.test(word) && !options.ignoredWords.has(word)) {\n context.report({\n loc,\n messageId: 'blockCapital',\n fix: (fixer) => {\n const offset = rangeStart + 2 + raw.indexOf(firstChar);\n\n return fixer.replaceTextRange([offset, offset + 1], firstChar.toUpperCase());\n },\n });\n }\n }\n\n if (block.requireTrailingPunctuation) {\n const lastChar = trimmed.at(-1) ?? '';\n\n if (!isBlockEndingPunctuation(lastChar)) {\n context.report({\n loc,\n messageId: 'blockTrailingPunctuation',\n fix: (fixer) => {\n const offset = rangeStart + 2 + indexOfLastNonSpace(raw);\n\n return fixer.insertTextAfterRange([offset, offset + 1], '.');\n },\n });\n }\n }\n}\n\nfunction offsetOfLine(comment: AnyComment, lines: readonly string[], lineIndex: number): number {\n const range = comment.range;\n\n if (!range) {\n return 0;\n }\n\n let offset = range[0] + 2;\n\n for (let index = 0; index < lineIndex; index += 1) {\n offset += lines[index].length + 1;\n }\n\n return offset;\n}\n\nfunction skipParagraphFirstWord(text: string, options: ResolvedOptions): boolean {\n const match = FIRST_WORD_PATTERN.exec(text);\n\n if (!match) {\n return true;\n }\n\n const word = match[1];\n\n return ALL_CAPS_WORD.test(word) || options.ignoredWords.has(word);\n}\n\nfunction reportParagraphEnding(\n context: Rule.RuleContext,\n comment: AnyComment,\n text: string,\n options: ResolvedOptions,\n): void {\n const { block } = options;\n const loc = comment.loc;\n\n if (!loc) {\n return;\n }\n\n for (const ending of block.paragraphEndings) {\n if (text.endsWith(ending)) {\n return;\n }\n }\n\n context.report({\n loc,\n messageId: 'blockParagraphEnding',\n data: { endings: `[${block.paragraphEndings.join(' ')}]` },\n });\n}\n\nfunction checkParameterLine(\n context: Rule.RuleContext,\n comment: AnyComment,\n lines: readonly string[],\n lineIndex: number,\n text: string,\n starSegment: string,\n spaces: string,\n): void {\n const loc = comment.loc;\n\n if (!loc) {\n return;\n }\n\n const match = PARAM_DESC_RE.exec(text);\n\n if (!match) {\n return;\n }\n\n const descPart = match[2];\n const textStart = offsetOfLine(comment, lines, lineIndex) + starSegment.length + spaces.length;\n\n if (!descPart.startsWith('- ')) {\n const prefixMatch = /^@param\\s+(?:\\{[^}]*\\}\\s+)?\\S+\\s+/.exec(text);\n\n if (!prefixMatch) {\n return;\n }\n\n const descStartOffset = textStart + prefixMatch[0].length;\n\n context.report({\n loc,\n messageId: 'paramMissingDash',\n fix: (fixer) => fixer.insertTextBeforeRange([descStartOffset, descStartOffset + 1], '- '),\n });\n\n return;\n }\n\n const description = descPart.slice(2).trim();\n\n if (!description) {\n return;\n }\n\n const lastIndex = lastTagLine(lines, lineIndex);\n const lastMatch = lastIndex === lineIndex ? undefined : BLOCK_LINE_WITH_TEXT.exec(lines[lastIndex]);\n const ending = lastMatch ? lastMatch[3] : description;\n\n if (!ending.endsWith('.')) {\n const textEndOffset = lastMatch\n ? offsetOfLine(comment, lines, lastIndex) + lastMatch[1].length + lastMatch[2].length + lastMatch[3].length\n : textStart + text.length;\n\n context.report({\n loc,\n messageId: 'paramDescriptionPeriod',\n fix: (fixer) => fixer.insertTextAfterRange([textEndOffset - 1, textEndOffset], '.'),\n });\n }\n}\n\nfunction lastTagLine(lines: readonly string[], lineIndex: number): number {\n let last = lineIndex;\n\n // the last line of the value holds the closing `*/`\n while (last + 1 < lines.length - 1) {\n const next = lines[last + 1];\n\n if (\n BLOCK_LINE_EMPTY.test(next) ||\n JSDOC_TAG_LINE.test(next) ||\n CODE_FENCE_LINE.test(next) ||\n !BLOCK_LINE_WITH_TEXT.test(next)\n ) {\n break;\n }\n\n last += 1;\n }\n\n return last;\n}\n\nfunction checkMultiLineBlock(context: Rule.RuleContext, comment: AnyComment, options: ResolvedOptions): void {\n const { block } = options;\n const loc = comment.loc;\n const range = comment.range;\n\n if (!loc || !range) {\n return;\n }\n\n const lines = comment.value.split('\\n');\n const firstLine = lines[0];\n const lastLine = lines.at(-1) ?? '';\n\n // the comment value excludes the `/*` opener, so a `/**` comment has a value starting with `*`\n if (block.requireJSDocOpening && !comment.value.startsWith('*')) {\n const openerEnd = range[0] + 2;\n\n context.report({\n loc,\n messageId: 'blockJSDocOpening',\n fix: (fixer) => fixer.insertTextAfterRange([range[0], openerEnd], '*'),\n });\n }\n\n if (block.enforceOpening) {\n const opening = firstLine.trim();\n\n if (opening !== '' && opening !== '*') {\n context.report({ loc, messageId: 'blockOpening' });\n\n return;\n }\n }\n\n if (block.enforceClosing) {\n if (lastLine.trim() !== '') {\n context.report({ loc, messageId: 'blockClosing' });\n\n return;\n }\n\n if (lines.length >= 3 && BLOCK_LINE_EMPTY.test(lines.at(-2) ?? '')) {\n context.report({ loc, messageId: 'blockEmptyLineBeforeClose' });\n }\n }\n\n let insideCodeBlock = false;\n let paragraphStart = true;\n let skipParagraphEnding = false;\n let previousText: string | undefined;\n let previousIsCode = false;\n let afterTag = false;\n let insideTagProse = false;\n\n for (let index = 1; index < lines.length - 1; index += 1) {\n const line = lines[index];\n\n if (CODE_FENCE_LINE.test(line)) {\n insideCodeBlock = !insideCodeBlock;\n paragraphStart = true;\n skipParagraphEnding = false;\n previousText = undefined;\n insideTagProse = false;\n\n continue;\n }\n\n if (insideCodeBlock) {\n continue;\n }\n\n if (BLOCK_LINE_EMPTY.test(line)) {\n if (previousText !== undefined && block.requireParagraphCapital && !skipParagraphEnding && !previousIsCode) {\n reportParagraphEnding(context, comment, previousText, options);\n }\n\n paragraphStart = true;\n skipParagraphEnding = false;\n previousText = undefined;\n insideTagProse = false;\n\n continue;\n }\n\n const match = BLOCK_LINE_WITH_TEXT.exec(line);\n\n if (!match) {\n continue;\n }\n\n const [, starSegment, spaces, text] = match;\n\n if (LIST_ITEM_LINE.test(text) || JSDOC_TAG_LINE.test(line)) {\n skipParagraphEnding = true;\n }\n\n if (block.requireSpaceAfterStar && spaces.length === 0) {\n const lineOffset = offsetOfLine(comment, lines, index);\n const starEnd = lineOffset + starSegment.length;\n\n context.report({\n loc,\n messageId: 'blockLineSpaceAfterStar',\n fix: (fixer) => fixer.insertTextAfterRange([starEnd - 1, starEnd], ' '),\n });\n\n continue;\n }\n\n const isTagLine = JSDOC_TAG_LINE.test(line);\n\n /**\n * Only the first tag needs a blank line before it, since a line between two tags continues\n * the first one.\n */\n if (block.requireJSDocSpacing && isTagLine && !afterTag && previousText !== undefined) {\n const previousLine = lines[index - 1];\n\n if (!BLOCK_LINE_EMPTY.test(previousLine) && !JSDOC_TAG_LINE.test(previousLine)) {\n context.report({ loc, messageId: 'blockJSDocBlankLine' });\n }\n }\n\n afterTag ||= isTagLine;\n\n if (isTagLine) {\n insideTagProse = !CODE_TAG.test(text);\n } else if (LIST_ITEM_LINE.test(text)) {\n insideTagProse = false;\n } else if (insideTagProse && block.forbidTagIndent && spaces.length > 1) {\n const indentStart = offsetOfLine(comment, lines, index) + starSegment.length;\n\n context.report({\n loc,\n messageId: 'tagContinuationIndent',\n fix: (fixer) => fixer.replaceTextRange([indentStart, indentStart + spaces.length], ' '),\n });\n }\n\n const isCodeLine = spaces.length > 1 || (paragraphStart && /^`[^`]+`$/.test(text));\n\n if (paragraphStart && block.requireParagraphCapital && !isTagLine && !isCodeLine) {\n const firstChar = text[0];\n\n if (firstChar && isLowerCase(firstChar) && !skipParagraphFirstWord(text, options)) {\n const lineOffset = offsetOfLine(comment, lines, index);\n const charOffset = lineOffset + starSegment.length + spaces.length;\n\n context.report({\n loc,\n messageId: 'blockParagraphCapital',\n fix: (fixer) => fixer.replaceTextRange([charOffset, charOffset + 1], firstChar.toUpperCase()),\n });\n }\n }\n\n paragraphStart = false;\n\n if (block.enforceParamStyle && /^@param\\s/.test(text)) {\n checkParameterLine(context, comment, lines, index, text, starSegment, spaces);\n\n previousText = undefined;\n } else {\n previousText = text;\n }\n\n previousIsCode = isCodeLine;\n }\n\n if (previousText !== undefined && block.requireParagraphCapital && !skipParagraphEnding && !previousIsCode) {\n reportParagraphEnding(context, comment, previousText, options);\n }\n}\n\nconst messages: Record<MessageId, string> = {\n lineLeadingSpace: 'Line comment should start with a space.',\n lineLowercase: 'Line comment should start with a lowercase letter.',\n lineTrailingPunctuation: 'Line comment should not end with punctuation.',\n lineMaxLength:\n 'Line comment exceeds the maximum line length of {{maxLength}}; use a multi-line block comment instead.',\n blockCapital: 'Block comment should start with an uppercase letter.',\n blockTrailingPunctuation: 'Block comment should end with punctuation.',\n blockSingleLineJSDoc: 'JSDoc-style block comments (/** ... */) must span multiple lines.',\n blockJSDocOpening: \"Multi-line block comments must start with '/**', not '/*'.\",\n blockOpening: \"Block comment should start with '/**\\\\n *' (or '/*\\\\n *').\",\n blockClosing: \"Block comment should end with '\\\\n */'.\",\n blockEmptyLineBeforeClose: 'Block comment should not end with an empty line.',\n blockLineSpaceAfterStar: \"Each line of a block comment requires a space after '*'.\",\n blockParagraphCapital: 'Paragraph should start with an uppercase letter.',\n blockParagraphEnding: 'Paragraph should end with one of {{endings}}.',\n blockJSDocBlankLine: 'Insert a blank line before JSDoc tags.',\n paramMissingDash: \"@param should use ' - ' between name and description.\",\n paramDescriptionPeriod: '@param description should end with a period.',\n tagContinuationIndent: 'Continuation lines of a JSDoc tag should not be indented.',\n};\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Enforce comment casing, punctuation, and JSDoc/paragraph structure for line, single-line block, and multi-line block comments.',\n },\n fixable: 'code',\n schema: [\n {\n type: 'object',\n additionalProperties: false,\n properties: {\n ignoredWords: {\n type: 'array',\n items: { type: 'string' },\n uniqueItems: true,\n },\n ignoredPatterns: {\n type: 'array',\n items: { type: 'string' },\n uniqueItems: true,\n },\n ignoreUrls: { type: 'boolean' },\n ignoreDirectives: { type: 'boolean' },\n line: {\n type: 'object',\n additionalProperties: false,\n properties: {\n requireLeadingSpace: { type: 'boolean' },\n requireLowercase: { type: 'boolean' },\n forbidTrailingPunctuation: { type: 'boolean' },\n allowedEndings: {\n type: 'array',\n items: { type: 'string' },\n uniqueItems: true,\n },\n maxLength: { type: 'integer', minimum: 1 },\n },\n },\n block: {\n type: 'object',\n additionalProperties: false,\n properties: {\n requireCapital: { type: 'boolean' },\n requireTrailingPunctuation: { type: 'boolean' },\n requireJSDocOpening: { type: 'boolean' },\n enforceOpening: { type: 'boolean' },\n enforceClosing: { type: 'boolean' },\n requireSpaceAfterStar: { type: 'boolean' },\n requireParagraphCapital: { type: 'boolean' },\n paragraphEndings: {\n type: 'array',\n items: { type: 'string' },\n uniqueItems: true,\n },\n requireJSDocSpacing: { type: 'boolean' },\n enforceParamStyle: { type: 'boolean' },\n forbidTagIndent: { type: 'boolean' },\n },\n },\n },\n },\n ],\n messages,\n },\n create(context) {\n const sourceCode = context.sourceCode;\n const options = resolveOptions(context.options[0]);\n\n return {\n Program() {\n const comments = sourceCode.getAllComments();\n\n for (const comment of comments) {\n if (isHashbang(comment)) {\n continue;\n }\n\n if (comment.type === 'Line') {\n checkLineCommentLength(context, comment, options);\n }\n\n /**\n * The shape check must run before `shouldSkipComment`, whose URL/pattern exemptions only\n * apply to wording.\n */\n if (isSingleLineJsdocBlock(comment)) {\n checkSingleLineJsdocBlock(context, comment);\n\n continue;\n }\n\n if (shouldSkipComment(comment.value, options)) {\n continue;\n }\n\n if (comment.type === 'Line') {\n checkLineComment(context, comment, options);\n\n continue;\n }\n\n if (comment.value.includes('\\n')) {\n checkMultiLineBlock(context, comment, options);\n } else {\n checkSingleLineBlock(context, comment, options);\n }\n }\n },\n };\n },\n};\n\nexport default rule;\n","import type { Rule } from 'eslint';\n\nfunction isAlwaysPadded(node: Rule.Node) {\n return node.type === 'MethodDefinition' || node.type === 'StaticBlock';\n}\n\nfunction isImportOrExport(node: Rule.Node) {\n /**\n * Imports and re-exports are grouped together with no blank lines between them.\n */\n if (node.type === 'ImportDeclaration' || node.type === 'ExportAllDeclaration') {\n return true;\n }\n\n return node.type === 'ExportNamedDeclaration' && !node.declaration;\n}\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'layout',\n docs: {\n description:\n 'Require blank lines around multiline statements, class methods, static blocks, and switch case bodies.',\n },\n fixable: 'whitespace',\n schema: [],\n messages: {\n missingBlankBefore: 'Expected blank line before this.',\n missingBlankAfter: 'Expected blank line after this.',\n },\n },\n create(context) {\n const sourceCode = context.sourceCode;\n\n function checkBody(body: Rule.Node[], options: { alwaysPadMembers?: boolean } = {}) {\n for (let index = 0; index < body.length; index++) {\n const node = body[index];\n\n if (!node.loc || isImportOrExport(node)) {\n continue;\n }\n\n const isMultiline = node.loc.start.line !== node.loc.end.line;\n const forceByKind = options.alwaysPadMembers === true && isAlwaysPadded(node);\n const needsPadding = isMultiline || forceByKind;\n\n if (!needsPadding) {\n continue;\n }\n\n if (index > 0) {\n const previous = body[index - 1];\n\n if (previous.loc && !isImportOrExport(previous)) {\n const linesBetween = node.loc.start.line - previous.loc.end.line;\n\n if (linesBetween < 2) {\n context.report({\n node,\n messageId: 'missingBlankBefore',\n fix(fixer) {\n const previousToken = sourceCode.getLastToken(previous);\n\n if (!previousToken) {\n return null;\n }\n\n return fixer.insertTextAfter(previousToken, '\\n');\n },\n });\n }\n }\n }\n\n if (index < body.length - 1) {\n const next = body[index + 1];\n\n if (next.loc && !isImportOrExport(next)) {\n const linesBetween = next.loc.start.line - node.loc.end.line;\n\n if (linesBetween < 2) {\n context.report({\n node,\n messageId: 'missingBlankAfter',\n fix(fixer) {\n const lastToken = sourceCode.getLastToken(node);\n\n if (!lastToken) {\n return null;\n }\n\n return fixer.insertTextAfter(lastToken, '\\n');\n },\n });\n }\n }\n }\n }\n }\n\n return {\n Program(node) {\n checkBody(node.body as Rule.Node[]);\n },\n BlockStatement(node) {\n checkBody(node.body as Rule.Node[]);\n },\n StaticBlock(node) {\n checkBody(node.body as Rule.Node[]);\n },\n SwitchCase(node) {\n checkBody(node.consequent as Rule.Node[]);\n },\n ClassBody(node) {\n checkBody(node.body as Rule.Node[], { alwaysPadMembers: true });\n },\n };\n },\n};\n\nexport default rule;\n","import type { AST, Rule } from 'eslint';\n\ninterface Comment {\n type: string;\n value: string;\n range?: [number, number];\n loc?: Rule.Node['loc'];\n}\n\ntype TokenOrComment = AST.Token | Comment;\n\ninterface RuleOptions {\n groups?: string[];\n}\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'layout',\n docs: {\n description:\n 'Disallow blank lines between import declarations so all imports form a single block, optionally allowing blank lines between configured groups.',\n },\n fixable: 'whitespace',\n schema: [\n {\n type: 'object',\n properties: {\n groups: {\n type: 'array',\n items: { type: 'string' },\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n blankLineBetweenImports: 'Imports must form a single block without blank lines.',\n },\n },\n create(context) {\n const sourceCode = context.sourceCode;\n\n const options = (context.options[0] as RuleOptions | undefined) ?? {};\n\n const groupPatterns = (options.groups ?? []).map((pattern) => new RegExp(pattern, 'u'));\n\n function getGroup(source: unknown): number {\n return groupPatterns.findIndex((pattern) => pattern.test(String(source)));\n }\n\n function checkGap(left: TokenOrComment, right: TokenOrComment) {\n if (!left.loc || !right.loc || !left.range || !right.range) {\n return;\n }\n\n if (right.loc.start.line - left.loc.end.line < 2) {\n return;\n }\n\n const gapRange: [number, number] = [left.range[1], right.range[0]];\n const gapText = sourceCode.getText().slice(gapRange[0], gapRange[1]);\n const indentation = gapText.slice(gapText.lastIndexOf('\\n') + 1);\n\n context.report({\n loc: right.loc,\n messageId: 'blankLineBetweenImports',\n fix(fixer) {\n return fixer.replaceTextRange(gapRange, `\\n${indentation}`);\n },\n });\n }\n\n return {\n Program(program) {\n const body = program.body;\n\n for (let index = 1; index < body.length; index++) {\n const previous = body[index - 1];\n const current = body[index];\n\n if (previous.type !== 'ImportDeclaration' || current.type !== 'ImportDeclaration') {\n continue;\n }\n\n if (getGroup(previous.source.value) !== getGroup(current.source.value)) {\n continue;\n }\n\n const lastToken = sourceCode.getLastToken(previous);\n const firstToken = sourceCode.getFirstToken(current);\n\n if (!lastToken || !firstToken) {\n continue;\n }\n\n const tokens: TokenOrComment[] = [\n lastToken,\n ...sourceCode.getTokensBetween(previous, current, { includeComments: true }),\n firstToken,\n ];\n\n for (let tokenIndex = 1; tokenIndex < tokens.length; tokenIndex++) {\n checkGap(tokens[tokenIndex - 1], tokens[tokenIndex]);\n }\n }\n },\n };\n },\n};\n\nexport default rule;\n","import type { Rule } from 'eslint';\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Disallow returning an object literal from an arrow function concise body (e.g. `() => ({})`); require a block body with an explicit return.',\n },\n fixable: 'code',\n schema: [],\n messages: {\n implicitObjectReturn:\n 'Avoid returning an object literal directly from an arrow function; use a block body with an explicit return.',\n },\n },\n create(context) {\n const sourceCode = context.sourceCode;\n\n return {\n ArrowFunctionExpression(node) {\n const body = node.body;\n\n if (!node.expression || body.type !== 'ObjectExpression') {\n return;\n }\n\n context.report({\n node: body,\n messageId: 'implicitObjectReturn',\n fix(fixer) {\n const arrowToken = sourceCode.getTokenBefore(body, (token) => token.value === '=>');\n\n // an object concise body is always parenthesized, otherwise it parses as a block\n const openParen = sourceCode.getTokenBefore(body);\n const closeParen = sourceCode.getTokenAfter(body);\n\n if (!arrowToken || openParen?.value !== '(' || closeParen?.value !== ')') {\n return null;\n }\n\n const objectText = sourceCode.getText(body);\n\n return fixer.replaceTextRange([arrowToken.range[1], closeParen.range[1]], ` { return ${objectText}; }`);\n },\n });\n },\n };\n },\n};\n\nexport default rule;\n","import type { Rule } from 'eslint';\n\n// type-only wrappers that leave the ternary as the runtime receiver, e.g. `(a ? b : c)!.push()`\nconst TYPE_WRAPPERS = new Set(['TSNonNullExpression', 'TSAsExpression', 'TSSatisfiesExpression', 'TSTypeAssertion']);\n\ninterface MaybeWrapped {\n type: string;\n expression?: MaybeWrapped;\n}\n\nfunction unwrapTypeWrappers(node: MaybeWrapped): MaybeWrapped {\n let current = node;\n\n while (TYPE_WRAPPERS.has(current.type) && current.expression) {\n current = current.expression;\n }\n\n return current;\n}\n\nconst rule: Rule.RuleModule = {\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Disallow calling a method or accessing a property on a ternary (e.g. `(a ? b : c).push(x)`); assign the ternary to a named variable first.',\n },\n schema: [],\n messages: {\n memberAccessOnTernary:\n 'Avoid accessing a member on a ternary; assign the ternary to a named variable first, then use the variable.',\n },\n },\n create(context) {\n return {\n MemberExpression(node) {\n const receiver = unwrapTypeWrappers(node.object as MaybeWrapped);\n\n if (receiver.type !== 'ConditionalExpression') {\n return;\n }\n\n context.report({\n node,\n messageId: 'memberAccessOnTernary',\n });\n },\n };\n },\n};\n\nexport default rule;\n","import type { ESLint } from 'eslint';\nimport blockScopedCase from './block-scoped-case.js';\nimport commentPrecedingBlankLine from './comment-preceding-blank-line.js';\nimport commentSyntax from './comment-syntax.js';\nimport newlineAroundMultiline from './newline-around-multiline.js';\nimport noBlankLineBetweenImports from './no-blank-line-between-imports.js';\nimport noImplicitObjectReturn from './no-implicit-object-return.js';\nimport noMemberAccessOnTernary from './no-member-access-on-ternary.js';\n\nexport const customRules: ESLint.Plugin = {\n meta: {\n name: '@d3lm/lint-preset-rules',\n version: '0.1.0',\n },\n rules: {\n 'newline-around-multiline': newlineAroundMultiline,\n 'block-scoped-case': blockScopedCase,\n 'comment-syntax': commentSyntax,\n 'comment-preceding-blank-line': commentPrecedingBlankLine,\n 'no-implicit-object-return': noImplicitObjectReturn,\n 'no-blank-line-between-imports': noBlankLineBetweenImports,\n 'no-member-access-on-ternary': noMemberAccessOnTernary,\n },\n};\n\nexport default customRules;\n"]}
|