123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
-
-
- "use strict";
-
- const astUtils = require("../util/ast-utils");
-
-
-
-
-
- module.exports = {
- meta: {
- type: "suggestion",
-
- docs: {
- description: "disallow specified warning terms in comments",
- category: "Best Practices",
- recommended: false,
- url: "https://eslint.org/docs/rules/no-warning-comments"
- },
-
- schema: [
- {
- type: "object",
- properties: {
- terms: {
- type: "array",
- items: {
- type: "string"
- }
- },
- location: {
- enum: ["start", "anywhere"]
- }
- },
- additionalProperties: false
- }
- ]
- },
-
- create(context) {
-
- const sourceCode = context.getSourceCode(),
- configuration = context.options[0] || {},
- warningTerms = configuration.terms || ["todo", "fixme", "xxx"],
- location = configuration.location || "start",
- selfConfigRegEx = /\bno-warning-comments\b/;
-
-
-
- function convertToRegExp(term) {
- const escaped = term.replace(/[-/\\$^*+?.()|[\]{}]/g, "\\$&");
- const wordBoundary = "\\b";
- const eitherOrWordBoundary = `|${wordBoundary}`;
- let prefix;
-
-
-
- const suffix = /\w$/.test(term) ? "\\b" : "";
-
- if (location === "start") {
-
-
-
- prefix = "^\\s*";
- } else if (/^\w/.test(term)) {
- prefix = wordBoundary;
- } else {
- prefix = "";
- }
-
- if (location === "start") {
-
-
-
- return new RegExp(prefix + escaped + suffix, "i");
- }
-
-
-
- return new RegExp(prefix + escaped + suffix + eitherOrWordBoundary + term + wordBoundary, "i");
- }
-
- const warningRegExps = warningTerms.map(convertToRegExp);
-
-
-
- function commentContainsWarningTerm(comment) {
- const matches = [];
-
- warningRegExps.forEach((regex, index) => {
- if (regex.test(comment)) {
- matches.push(warningTerms[index]);
- }
- });
-
- return matches;
- }
-
-
-
- function checkComment(node) {
- if (astUtils.isDirectiveComment(node) && selfConfigRegEx.test(node.value)) {
- return;
- }
-
- const matches = commentContainsWarningTerm(node.value);
-
- matches.forEach(matchedTerm => {
- context.report({
- node,
- message: "Unexpected '{{matchedTerm}}' comment.",
- data: {
- matchedTerm
- }
- });
- });
- }
-
- return {
- Program() {
- const comments = sourceCode.getAllComments();
-
- comments.filter(token => token.type !== "Shebang").forEach(checkComment);
- }
- };
- }
- };
|