tag-lines
February 18, 2026 ยท View on GitHub
tag-lines
Enforces lines (or no lines) between tags.
If you only want lines preceding all tags or after all tags, you can use
the "any" option along with startLines and/or endLines.
The "always" or "never" options of this rule should not
be used with the linebreak-setting options of the sort-tags rule as both
may try to impose a conflicting number of lines.
Fixer
Removes or adds lines between tags or trailing tags.
Options
The first option is a string with the following possible values: "always", "any", "never".
Defaults to "never". "any" is only useful with tags (allowing non-enforcement of lines except
for particular tags) or with startLines, startLinesWithNoTags endLines, or maxBlockLines. It is also
necessary if using the linebreak-setting options of the sort-tags rule
so that the two rules won't conflict in both attempting to set lines
between tags.
The next option is an object with the following properties.
applyToEndTag
Set to false and use with "always" to indicate the normal lines to be
added after tags should not be added after the final tag.
Defaults to true.
count
Use with "always" to indicate the number of lines to require be present.
Defaults to 1.
endLines
If not set to null, will enforce end lines to the given count on the
final tag only.
Defaults to 0.
maxBlockLines
If not set to null, will enforce a maximum number of lines to the given count anywhere in the block description.
Note that if non-null, maxBlockLines must be greater than or equal to startLines.
Defaults to null.
startLines
If not set to null, will enforce end lines to the given count before the
first tag only, unless there is only whitespace content, in which case,
a line count will not be enforced.
Defaults to 0.
startLinesWithNoTags
If set to a number, will enforce a starting lines count when there are no tags. Defaults to undefined.
tags
Overrides the default behavior depending on specific tags.
An object whose keys are tag names and whose values are objects with the following keys:
lines- Set toalways,never, oranyto override.count- Overrides maincount(for "always")
Defaults to empty object.
Context and settings
| Context | everywhere |
| Tags | Any |
| Recommended | true |
| Settings | N/A |
| Options | string ("always", "any", "never") followed by object with applyToEndTag, count, endLines, maxBlockLines, startLines, startLinesWithNoTags, tags |
Failing examples
The following patterns are considered problems:
/**
* Some description
* @param {string} a
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "always"]
// Message: Expected 1 line between tags but found 0
/**
* Some description
* @param {string} a
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "always",{"count":2}]
// Message: Expected 2 lines between tags but found 0
/**
* Some description
* @param {string} a
*
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "always",{"count":2}]
// Message: Expected 2 lines between tags but found 1
/**
* Some description
* @param {string} a
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "always",{"applyToEndTag":false}]
// Message: Expected 1 line between tags but found 0
/**
* Some description
* @param {string} a
*
* @param {number} b
*
*/
// "jsdoc/tag-lines": ["error"|"warn", "never"]
// Message: Expected no lines between tags
/**
* Some description
* @param {string} a
*
* @param {number} b
*
*/
// Message: Expected no lines between tags
/**
* Some description
* @param {string} a
*
* @param {number} b
* @param {number} c
*/
// "jsdoc/tag-lines": ["error"|"warn", "always"]
// Message: Expected 1 line between tags but found 0
/**
* Some description
* @param {string} a
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "never",{"tags":{"param":{"lines":"always"}}}]
// Message: Expected 1 line between tags but found 0
/**
* Some description
* @param {string} a
* @param {number} b
*
*/
// "jsdoc/tag-lines": ["error"|"warn", "always",{"tags":{"param":{"lines":"never"}}}]
// Message: Expected no lines between tags
/**
* Some description
* @param {string} a
*
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "never",{"count":2,"tags":{"param":{"lines":"always"}}}]
// Message: Expected 2 lines between tags but found 1
/**
* Some description
* @param {string} a
*
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "never",{"count":5,"tags":{"param":{"count":2,"lines":"always"}}}]
// Message: Expected 2 lines between tags but found 1
/**
* Some description
* @param {string} a
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "always",{"tags":{"anotherTag":{"lines":"never"}}}]
// Message: Expected 1 line between tags but found 0
/**
* Some description
* @param {string} A broken up
*
* tag description.
* @param {number} b
*
*/
// "jsdoc/tag-lines": ["error"|"warn", "always",{"endLines":null}]
// Message: Expected 1 line between tags but found 0
/**
* Some description
* @param {number} b
*
* @returns {string} A broken up
*
* tag description.
*/
// "jsdoc/tag-lines": ["error"|"warn", "always"]
// Message: Expected 1 line between tags but found 0
/**
* Some description
* @param {string} a
* @param {string} b
*
* @returns {SomeType} An extended
* description.
*
* This is still part of `@returns`.
*
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"endLines":0}]
// Message: Expected 0 trailing lines
/**
* Some description
* @param {string} a
* @param {string} b
*
* @returns {SomeType} An extended
* description.
*
* This is still part of `@returns`.
*
*
*
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"endLines":1}]
// Message: Expected 1 trailing lines
/**
* Some description
* @param {string} a
* @param {string} b
*
* @returns {SomeType} An extended
* description.
*
* This is still part of `@returns`.
*
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"endLines":2}]
// Message: Expected 2 trailing lines
/**
* Some description
*
*
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"startLines":1}]
// Message: Expected only 1 line after block description
/**
* Some description
*
*
*
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"startLines":2}]
// Message: Expected only 2 lines after block description
/**
* Some description
*
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"startLines":0}]
// Message: Expected only 0 lines after block description
/**
* Some description
*
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"startLines":2}]
// Message: Expected 2 lines after block description
/**
* Some description
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"startLines":1}]
// Message: Expected 1 lines after block description
/**
*
* Some description
*
* Abc
*
*
*
* Def
*
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"maxBlockLines":2}]
// Message: Expected a maximum of 2 lines within block description
/**
*
* Some description
*
* Abc
*
*
*
* Def
*
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"maxBlockLines":1}]
// Message: Expected a maximum of 1 line within block description
/**
*
* Some description
*
* Abc
*
*
*
* Def
*
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"maxBlockLines":0}]
// Message: Expected a maximum of 0 lines within block description
/**
*
* Some description
*
* Abc
*
*
* Def
*
*
*
*
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"maxBlockLines":2,"startLines":5}]
// Message: If set to a number, `maxBlockLines` must be greater than or equal to `startLines`.
/**
* My Test Function, with some example code.
*
* ```js
* new Foo();
* ```
*
*
* @param {string} bar
*/
function myTestFunction(bar) {
}
// "jsdoc/tag-lines": ["error"|"warn", "any",{"startLines":1}]
// Message: Expected only 1 line after block description
/**
*
* Second Test Case
* @param {number} baz
*
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"startLines":1}]
// Message: Expected 1 lines after block description
/**
* Some text
*/
function quux () {
}
// "jsdoc/tag-lines": ["error"|"warn", "any",{"startLinesWithNoTags":1}]
// Message: Expected 1 lines after block description
export interface SubOptionTypeMap {
/**
* Checkboxes have two states - true (checked) and false (unchecked)
*
*/
checkbox: boolean
}
// "jsdoc/tag-lines": ["error"|"warn", "any",{"startLinesWithNoTags":0}]
// Message: Expected only 0 lines after block description
Passing examples
The following patterns are not considered problems:
/**
* Some description
* @param {string} a
* @param {number} b
*/
/**
* Some description
* @param {string} a
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "never"]
/**
* @param {string} a
*
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "always",{"applyToEndTag":false}]
/**
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "never",{"applyToEndTag":false}]
/** @param {number} b */
// "jsdoc/tag-lines": ["error"|"warn", "never",{"applyToEndTag":false}]
/**
* Some description
* @param {string} a
*
* @param {number} b
*
*/
// "jsdoc/tag-lines": ["error"|"warn", "always",{"endLines":null}]
/**
* Some description
* @param {string} a
*
*
* @param {number} b
*
*
*/
// "jsdoc/tag-lines": ["error"|"warn", "always",{"count":2,"endLines":null}]
/**
* Some description
* @param {string} a
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "never",{"tags":{"param":{"lines":"any"}}}]
/**
* Some description
* @param {string} a
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "always",{"tags":{"param":{"lines":"any"}}}]
/**
* Some description
* @param {string} a
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "always",{"tags":{"param":{"lines":"never"}}}]
/**
* Some description
* @param {number} a
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "never",{"tags":{"param":{"lines":"any"}}}]
/**
* Some description
* @param {number} a
*
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "never",{"tags":{"param":{"lines":"any"}}}]
/**
* Some description
* @param {number} a
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "never",{"tags":{"param":{"lines":"never"}}}]
/**
* Some description
* @param {string} a
*
*
* @param {number} b
*
*
*/
// "jsdoc/tag-lines": ["error"|"warn", "never",{"count":5,"tags":{"param":{"count":2,"lines":"always"}}}]
/**
* Some description
* @param {string} a
* @param {number} b
*/
// "jsdoc/tag-lines": ["error"|"warn", "never",{"tags":{"anotherTag":{"lines":"always"}}}]
/**
* Some description
* @param {string} a
*
* This is still part of `@param`.
* @returns {SomeType} An extended
* description.
*/
// "jsdoc/tag-lines": ["error"|"warn", "never"]
/**
* Some description
* @param {string} a
* @returns {SomeType} An extended
* description.
*
* This is still part of `@returns`.
*/
// "jsdoc/tag-lines": ["error"|"warn", "never"]
/**
* Some description
* @param {string} a
*
* This is still part of `@param`.
*
* @returns {SomeType} An extended
* description.
*
*/
// "jsdoc/tag-lines": ["error"|"warn", "always",{"endLines":null}]
/**
* Some description
* @param {string} a
*
* @returns {SomeType} An extended
* description.
*
* This is still part of `@returns`.
*
*/
// "jsdoc/tag-lines": ["error"|"warn", "always",{"endLines":null}]
/**
* Some description
* @param {string} a
* @param {string} b
*
* @returns {SomeType} An extended
* description.
*
* This is still part of `@returns`.
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"endLines":0}]
/**
* Some description
*
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"startLines":1}]
/**
* Some description
* @param {string} a
*
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"endLines":1}]
/**
* Some description
*
*
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "never",{"startLines":null}]
/**
* Some description
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "never",{"startLines":null}]
/**
* @param {string} input
*/
function processSass (input) {
}
// "jsdoc/tag-lines": ["error"|"warn", "never",{"startLines":1}]
/**
*
* @param {string} input
*/
function processSass (input) {
}
// "jsdoc/tag-lines": ["error"|"warn", "never",{"startLines":1}]
/**
* Toggles the deselect all icon button action
*/
function updateIconButton () {
}
// "jsdoc/tag-lines": ["error"|"warn", "never",{"startLines":1}]
/** A class. */
class _Foo {
/** @param arg Argument. */
conststructor(arg: string) {
console.log(arg);
}
}
// "jsdoc/tag-lines": ["error"|"warn", "any",{"startLines":1}]
/**
*
* Some description
*
* Abc
*
*
* Def
* @param {string} a
*/
// "jsdoc/tag-lines": ["error"|"warn", "any",{"maxBlockLines":2}]
export interface SubOptionTypeMap {
/**
* Checkboxes have two states - true (checked) and false (unchecked)
*
*/
checkbox: boolean
}
// "jsdoc/tag-lines": ["error"|"warn", "any",{"endLines":0,"startLines":0}]