codtracker-js/node_modules/eslint/lib/rules/line-comment-position.js
2025-04-19 23:12:19 -04:00

153 lines
4.2 KiB
JavaScript

/**
* @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',
});
}
}
});
},
};
},
};