/** * @fileoverview Rule to enforce the position of line comments * @author Alberto Rodríguez * @deprecated in ESLint v9.3.0 */ "use strict"; const astUtils = require("./utils/ast-utils"); //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ /** @type {import('../types').Rule.RuleModule} */ module.exports = { meta: { deprecated: { message: "Formatting rules are being moved out of ESLint core.", url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/", deprecatedSince: "9.3.0", availableUntil: "10.0.0", replacedBy: [ { message: "ESLint Stylistic now maintains deprecated stylistic core rules.", url: "https://eslint.style/guide/migration", plugin: { name: "@stylistic/eslint-plugin-js", url: "https://eslint.style/packages/js", }, rule: { name: "line-comment-position", url: "https://eslint.style/rules/js/line-comment-position", }, }, ], }, type: "layout", docs: { description: "Enforce position of line comments", recommended: false, url: "https://eslint.org/docs/latest/rules/line-comment-position", }, schema: [ { oneOf: [ { enum: ["above", "beside"], }, { type: "object", properties: { position: { enum: ["above", "beside"], }, ignorePattern: { type: "string", }, applyDefaultPatterns: { type: "boolean", }, applyDefaultIgnorePatterns: { type: "boolean", }, }, additionalProperties: false, }, ], }, ], messages: { above: "Expected comment to be above code.", beside: "Expected comment to be beside code.", }, }, create(context) { const options = context.options[0]; let above, ignorePattern, applyDefaultIgnorePatterns = true; if (!options || typeof options === "string") { above = !options || options === "above"; } else { above = !options.position || options.position === "above"; ignorePattern = options.ignorePattern; if (Object.hasOwn(options, "applyDefaultIgnorePatterns")) { applyDefaultIgnorePatterns = options.applyDefaultIgnorePatterns; } else { applyDefaultIgnorePatterns = options.applyDefaultPatterns !== false; } } const defaultIgnoreRegExp = astUtils.COMMENTS_IGNORE_PATTERN; const fallThroughRegExp = /^\s*falls?\s?through/u; const customIgnoreRegExp = new RegExp(ignorePattern, "u"); const sourceCode = context.sourceCode; //-------------------------------------------------------------------------- // Public //-------------------------------------------------------------------------- return { Program() { const comments = sourceCode.getAllComments(); comments .filter(token => token.type === "Line") .forEach(node => { if ( applyDefaultIgnorePatterns && (defaultIgnoreRegExp.test(node.value) || fallThroughRegExp.test(node.value)) ) { return; } if ( ignorePattern && customIgnoreRegExp.test(node.value) ) { return; } const previous = sourceCode.getTokenBefore(node, { includeComments: true, }); const isOnSameLine = previous && previous.loc.end.line === node.loc.start.line; if (above) { if (isOnSameLine) { context.report({ node, messageId: "above", }); } } else { if (!isOnSameLine) { context.report({ node, messageId: "beside", }); } } }); }, }; }, };