{"version":3,"file":"multilineBlocks.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","e","__esModule","default","_default","exports","iterateJsdoc","context","jsdoc","utils","allowMultipleTags","noFinalLineText","noZeroLineText","noSingleLineBlocks","singleLineTags","noMultilineBlocks","minimumLengthForMultiline","Number","POSITIVE_INFINITY","multilineTags","options","source","tokens","description","tag","sourceLength","length","isInvalidSingleLine","tagName","includes","slice","fixer","makeMultiline","reportJSDoc","lineChecks","line","emptyTokens","delimiter","start","addLine","finalLine","finalLineTokens","trim","trimEnd","prop","end","tags","hasATag","filterTags","tg","number","reduce","obj","desc","type","typ","name","nme","lineEnd","postType","postName","postTag","nameOrDescription","seedTokens","postDelimiter","iterateAllJsdocs","meta","docs","url","fixable","schema","additionalProperties","properties","anyOf","enum","items","module"],"sources":["../../src/rules/multilineBlocks.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\nexport default iterateJsdoc(({\n  context,\n  jsdoc,\n  utils,\n}) => {\n  const {\n    allowMultipleTags = true,\n    noFinalLineText = true,\n    noZeroLineText = true,\n    noSingleLineBlocks = false,\n    singleLineTags = [\n      'lends', 'type',\n    ],\n    noMultilineBlocks = false,\n    minimumLengthForMultiline = Number.POSITIVE_INFINITY,\n    multilineTags = [\n      '*',\n    ],\n  } = context.options[0] || {};\n\n  const {\n    source: [\n      {\n        tokens,\n      },\n    ],\n  } = jsdoc;\n  const {\n    description,\n    tag,\n  } = tokens;\n  const sourceLength = jsdoc.source.length;\n\n  /**\n   * @param {string} tagName\n   * @returns {boolean}\n   */\n  const isInvalidSingleLine = (tagName) => {\n    return noSingleLineBlocks &&\n      (!tagName ||\n      !singleLineTags.includes(tagName) && !singleLineTags.includes('*'));\n  };\n\n  if (sourceLength === 1) {\n    if (!isInvalidSingleLine(tag.slice(1))) {\n      return;\n    }\n\n    const fixer = () => {\n      utils.makeMultiline();\n    };\n\n    utils.reportJSDoc(\n      'Single line blocks are not permitted by your configuration.',\n      null,\n      fixer,\n      true,\n    );\n\n    return;\n  }\n\n  const lineChecks = () => {\n    if (\n      noZeroLineText &&\n      (tag || description)\n    ) {\n      const fixer = () => {\n        const line = {\n          ...tokens,\n        };\n        utils.emptyTokens(tokens);\n        const {\n          tokens: {\n            delimiter,\n            start,\n          },\n        } = jsdoc.source[1];\n        utils.addLine(1, {\n          ...line,\n          delimiter,\n          start,\n        });\n      };\n\n      utils.reportJSDoc(\n        'Should have no text on the \"0th\" line (after the `/**`).',\n        null,\n        fixer,\n      );\n\n      return;\n    }\n\n    const finalLine = jsdoc.source[jsdoc.source.length - 1];\n    const finalLineTokens = finalLine.tokens;\n    if (\n      noFinalLineText &&\n      finalLineTokens.description.trim()\n    ) {\n      const fixer = () => {\n        const line = {\n          ...finalLineTokens,\n        };\n        line.description = line.description.trimEnd();\n\n        const {\n          delimiter,\n        } = line;\n\n        for (const prop of [\n          'delimiter',\n          'postDelimiter',\n          'tag',\n          'type',\n          'lineEnd',\n          'postType',\n          'postTag',\n          'name',\n          'postName',\n          'description',\n        ]) {\n          finalLineTokens[\n            /**\n             * @type {\"delimiter\"|\"postDelimiter\"|\"tag\"|\"type\"|\n             *   \"lineEnd\"|\"postType\"|\"postTag\"|\"name\"|\n             *   \"postName\"|\"description\"}\n             */ (\n              prop\n            )\n          ] = '';\n        }\n\n        utils.addLine(jsdoc.source.length - 1, {\n          ...line,\n          delimiter,\n          end: '',\n        });\n      };\n\n      utils.reportJSDoc(\n        'Should have no text on the final line (before the `*/`).',\n        null,\n        fixer,\n      );\n    }\n  };\n\n  if (noMultilineBlocks) {\n    if (\n      jsdoc.tags.length &&\n      (multilineTags.includes('*') || utils.hasATag(multilineTags))\n    ) {\n      lineChecks();\n\n      return;\n    }\n\n    if (jsdoc.description.length >= minimumLengthForMultiline) {\n      lineChecks();\n\n      return;\n    }\n\n    if (\n      noSingleLineBlocks &&\n      (!jsdoc.tags.length ||\n      !utils.filterTags(({\n        tag: tg,\n      }) => {\n        return !isInvalidSingleLine(tg);\n      }).length)\n    ) {\n      utils.reportJSDoc(\n        'Multiline jsdoc blocks are prohibited by ' +\n          'your configuration but fixing would result in a single ' +\n          'line block which you have prohibited with `noSingleLineBlocks`.',\n      );\n\n      return;\n    }\n\n    if (jsdoc.tags.length > 1) {\n      if (!allowMultipleTags) {\n        utils.reportJSDoc(\n          'Multiline jsdoc blocks are prohibited by ' +\n            'your configuration but the block has multiple tags.',\n        );\n\n        return;\n      }\n    } else if (jsdoc.tags.length === 1 && jsdoc.description.trim()) {\n      if (!allowMultipleTags) {\n        utils.reportJSDoc(\n          'Multiline jsdoc blocks are prohibited by ' +\n            'your configuration but the block has a description with a tag.',\n        );\n\n        return;\n      }\n    } else {\n      const fixer = () => {\n        jsdoc.source = [\n          {\n            number: 1,\n            source: '',\n            tokens: jsdoc.source.reduce((obj, {\n              tokens: {\n                description: desc,\n                tag: tg,\n                type: typ,\n                name: nme,\n                lineEnd,\n                postType,\n                postName,\n                postTag,\n              },\n            }) => {\n              if (typ) {\n                obj.type = typ;\n              }\n\n              if (tg && typ && nme) {\n                obj.postType = postType;\n              }\n\n              if (nme) {\n                obj.name += nme;\n              }\n\n              if (nme && desc) {\n                obj.postName = postName;\n              }\n\n              obj.description += desc;\n\n              const nameOrDescription = obj.description || obj.name;\n              if (\n                nameOrDescription && nameOrDescription.slice(-1) !== ' '\n              ) {\n                obj.description += ' ';\n              }\n\n              obj.lineEnd = lineEnd;\n\n              // Already filtered for multiple tags\n              obj.tag += tg;\n              if (tg) {\n                obj.postTag = postTag || ' ';\n              }\n\n              return obj;\n            }, utils.seedTokens({\n              delimiter: '/**',\n              end: '*/',\n              postDelimiter: ' ',\n            })),\n          },\n        ];\n      };\n\n      utils.reportJSDoc(\n        'Multiline jsdoc blocks are prohibited by ' +\n          'your configuration.',\n        null,\n        fixer,\n      );\n\n      return;\n    }\n  }\n\n  lineChecks();\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    docs: {\n      description: 'Controls how and whether jsdoc blocks can be expressed as single or multiple line blocks.',\n      url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/multiline-blocks.md#repos-sticky-header',\n    },\n    fixable: 'code',\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          allowMultipleTags: {\n            type: 'boolean',\n          },\n          minimumLengthForMultiline: {\n            type: 'integer',\n          },\n          multilineTags: {\n            anyOf: [\n              {\n                enum: [\n                  '*',\n                ],\n                type: 'string',\n              }, {\n                items: {\n                  type: 'string',\n                },\n                type: 'array',\n              },\n            ],\n          },\n          noFinalLineText: {\n            type: 'boolean',\n          },\n          noMultilineBlocks: {\n            type: 'boolean',\n          },\n          noSingleLineBlocks: {\n            type: 'boolean',\n          },\n          noZeroLineText: {\n            type: 'boolean',\n          },\n          singleLineTags: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"mappings":"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","ignoreList":[]}