# tag-lines * [Fixer](#user-content-tag-lines-fixer) * [Options](#user-content-tag-lines-options) * [`applyToEndTag`](#user-content-tag-lines-options-applytoendtag) * [`count`](#user-content-tag-lines-options-count) * [`endLines`](#user-content-tag-lines-options-endlines) * [`maxBlockLines`](#user-content-tag-lines-options-maxblocklines) * [`startLines`](#user-content-tag-lines-options-startlines) * [`startLinesWithNoTags`](#user-content-tag-lines-options-startlineswithnotags) * [`tags`](#user-content-tag-lines-options-tags) * [Context and settings](#user-content-tag-lines-context-and-settings) * [Failing examples](#user-content-tag-lines-failing-examples) * [Passing examples](#user-content-tag-lines-passing-examples) 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: 1. `lines` - Set to `always`, `never`, or `any` to override. 2. `count` - Overrides main `count` (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: ````ts /** * 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: ````ts /** * 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}] ````