{"version":3,"file":"textEscaping.cjs","names":["iterateJsdoc"],"sources":["../../src/rules/textEscaping.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\n// We could disallow raw gt, quot, and apos, but allow for parity; but we do\n//  not allow hex or decimal character references\nconst htmlRegex = /(<|&(?!(?:amp|lt|gt|quot|apos);))(?=\\S)/v;\nconst markdownRegex = /(?<!\\\\)(`+)([^`]+)\\1(?!`)/v;\n\n/**\n * @param {string} desc\n * @returns {string}\n */\nconst htmlReplacer = (desc) => {\n  return desc.replaceAll(new RegExp(htmlRegex, 'gv'), (_) => {\n    if (_ === '<') {\n      return '&lt;';\n    }\n\n    return '&amp;';\n  });\n};\n\n/**\n * @param {string} desc\n * @returns {string}\n */\nconst markdownReplacer = (desc) => {\n  return desc.replaceAll(new RegExp(markdownRegex, 'gv'), (_, backticks, encapsed) => {\n    const bookend = '`'.repeat(backticks.length);\n    return `\\\\${bookend}${encapsed}${bookend}`;\n  });\n};\n\nexport default iterateJsdoc(({\n  context,\n  jsdoc,\n  utils,\n}) => {\n  const {\n    escapeHTML,\n    escapeMarkdown,\n  } = context.options[0] || {};\n\n  if (!escapeHTML && !escapeMarkdown) {\n    context.report({\n      loc: {\n        end: {\n          column: 1,\n          line: 1,\n        },\n        start: {\n          column: 1,\n          line: 1,\n        },\n      },\n      message: 'You must include either `escapeHTML` or `escapeMarkdown`',\n    });\n    return;\n  }\n\n  const {\n    descriptions,\n  } = utils.getDescription();\n\n  if (escapeHTML) {\n    if (descriptions.some((desc) => {\n      return htmlRegex.test(desc);\n    })) {\n      const line = utils.setDescriptionLines(htmlRegex, htmlReplacer);\n      utils.reportJSDoc('You have unescaped HTML characters < or &', {\n        line,\n      }, () => {}, true);\n      return;\n    }\n\n    for (const tag of jsdoc.tags) {\n      if (tag.tag === 'example') {\n        continue;\n      }\n\n      if (/** @type {string[]} */ (\n        utils.getTagDescription(tag, true)\n      ).some((desc) => {\n        return htmlRegex.test(desc);\n      })) {\n        const line = utils.setTagDescription(tag, htmlRegex, htmlReplacer) +\n          tag.source[0].number;\n        utils.reportJSDoc('You have unescaped HTML characters < or & in a tag', {\n          line,\n        }, () => {}, true);\n      }\n    }\n\n    return;\n  }\n\n  if (descriptions.some((desc) => {\n    return markdownRegex.test(desc);\n  })) {\n    const line = utils.setDescriptionLines(markdownRegex, markdownReplacer);\n    utils.reportJSDoc('You have unescaped Markdown backtick sequences', {\n      line,\n    }, () => {}, true);\n    return;\n  }\n\n  for (const tag of jsdoc.tags) {\n    if (tag.tag === 'example') {\n      continue;\n    }\n\n    if (/** @type {string[]} */ (\n      utils.getTagDescription(tag, true)\n    ).some((desc) => {\n      return markdownRegex.test(desc);\n    })) {\n      const line = utils.setTagDescription(\n        tag, markdownRegex, markdownReplacer,\n      ) + tag.source[0].number;\n      utils.reportJSDoc(\n        'You have unescaped Markdown backtick sequences in a tag',\n        {\n          line,\n        },\n        () => {},\n        true,\n      );\n    }\n  }\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    docs: {\n      description: 'Auto-escape certain characters that are input within block and tag descriptions.',\n      url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/text-escaping.md#repos-sticky-header',\n    },\n    fixable: 'code',\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          escapeHTML: {\n            description: `This option escapes all \\`<\\` and \\`&\\` characters (except those followed by\nwhitespace which are treated as literals by Visual Studio Code). Defaults to\n\\`false\\`.`,\n            type: 'boolean',\n          },\n          escapeMarkdown: {\n            description: `This option escapes the first backtick (\\`\\` \\` \\`\\`) in a paired sequence.\nDefaults to \\`false\\`.`,\n            type: 'boolean',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"mappings":"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","ignoreList":[]}