gajus/eslint-plugin-jsdoc
On GitHub, gajus/eslint-plugin-jsdoc has picked up 1.2k stars, JavaScript. JSDoc specific linting rules for ESLint.
Snapshot summary built from the project's own GitHub metadata — there's no written TopGit review yet. The page will update automatically when a full review is published.
TopGit writes full reviews for the most-starred, most-requested repositories. This page is a snapshot until then — see the READ ME tab for the original README in full.
Snapshot
Top contributors
Show top contributors
eslint-plugin-jsdoc
JSDoc linting rules for ESLint.
- eslint-plugin-jsdoc
- Installation
- Configuration
- Flat config (procedural)
- Flat config (declarative)
eslintrc
- Options
- Settings
- Advanced
- Processors
- Rules
Installation
Install ESLint either locally or globally.
npm install --save-dev eslint
If you have installed ESLint globally, you have to install JSDoc plugin
globally too. Otherwise, install it locally.
npm install --save-dev eslint-plugin-jsdoc
Configuration
Flat config (procedural)
This is the currently recommended approach for all flat configs (besides the
array-based examples, default-expressions, and
examples-and-default-expressions configs).
import {jsdoc} from 'eslint-plugin-jsdoc';
export default [
jsdoc({
config: 'flat/recommended',
})
];
Or with TypeScript-aware extra rules and/or settings supplied:
import {jsdoc} from 'eslint-plugin-jsdoc';
export default [
jsdoc({
config: 'flat/recommended',
rules: {
'jsdoc/check-values': [
'error',
{
allowedLicenses: [
'MIT', 'ISC',
],
},
],
},
// Uncomment this if you wish your `settings` to overwrite the config's own settings;
// otherwise, the default behavior is to merge recursively
// mergeSettings: false,
settings: {
// Do not add a `jsdoc` child object here as you would for regular ESLint `settings`
structuredTags: {
see: {
name: 'namepath-referencing',
required: [
'name',
],
},
},
/*
// Since the recommended config has been chosen, the above settings will
// be merged by default with the following (which are tags that are
// being allowed and requiring a type):
structuredTags: {
next: {
required: [
'type',
],
},
rejects: {
required: [
'type',
],
},
},
*/
}
})
];
A plugins property can also be supplied to merge with the resulting jsdoc plugin.
Other config properties such as files, ignores, etc. are also copied over,
though noting that if the specified config produces an array, they will not
currently function.
There is also a extraRuleDefinitions.forbid option, the details of which are
explained in the Advanced docs
(under creating your own rules and forbidding structures).
Flat config (declarative)
import jsdoc from 'eslint-plugin-jsdoc';
const config = [
// configuration included in plugin
jsdoc.configs['flat/recommended'],
// other configuration objects...
{
files: ['**/*.js'],
// `plugins` here is not necessary if including the above config
plugins: {
jsdoc,
},
rules: {
'jsdoc/require-description': 'warn'
}
}
];
export default config;
If you are using defineConfig, you can build as follows:
import jsdoc from 'eslint-plugin-jsdoc';
import {defineConfig} from 'eslint/config';
export default defineConfig([
{
name: 'jsdoc-js', // Useful with `eslint --inspect-config`
files: ['**/*.{js,mjs,cjs}'],
plugins: {
jsdoc
},
rules: {
...jsdoc.configs['flat/recommended'].rules
}
}
]);
The general starting rulesets you can extend from in flat config are:
jsdoc.configs['flat/recommended']: Recommended starting rules for enforcing proper tag values, that common tags exist, and that tags are formatted and styled consistentlyjsdoc.configs['flat/recommended-error']: The same, reporting with failing errors instead of mere warnings
jsdoc.configs['flat/recommended-typescript']: A similar recommended starting list, adjusted for projects using TypeScript syntax (and not just the "typescript"modesetting)jsdoc.configs['flat/recommended-typescript-error']: The same, reporting with failing errors instead of mere warnings
jsdoc.configs['flat/recommended-typescript-flavor']: A similar recommended starting list, adjusted for projects using JavaScript syntax (source files that are still.js) but using TypeScript flavor within JSDoc (i.e., the default "typescript"modeineslint-plugin-jsdoc)jsdoc.configs['flat/recommended-typescript-flavor-error']: The same, reporting with failing errors instead of mere warnings
jsdoc.configs['flat/recommended-tsdoc']: Likeflat/recommended-typescriptbut withrequire-throws-type,require-yields-type, andrequire-next-typeturned off, for use with TSDoc (e.g., TypeDoc)jsdoc.configs['flat/recommended-tsdoc-error']: The same, reporting with failing errors instead of mere warnings
jsdoc.configs['flat/recommended-mixed']: A combination offlat/recommended-typescript-flavorandflat/recommended-typescriptwith automatic assignment of subconfig based on file extension (**/*.{js,jsx,cjs,mjs}and**/*.{ts,tsx,cts,mts}, respectively)
Granular Flat Configs
There also exist several more granular, standalone TypeScript rulesets you can extend from. These each only enable mostly or only rules from the recommended starting rules:
- Contents: rules that check names and descriptions
jsdoc.configs['flat/contents-typescript']: for TypeScript files, with reports set to warnjsdoc.configs['flat/contents-typescript-error']: for TypeScript files, with reports set to errorjsdoc.configs['flat/contents-typescript-flavor']: for files using JavaScript syntax and JSDoc types, with reports set to warnjsdoc.configs['flat/contents-typescript-flavor-error']: for files using JavaScript syntax and JSDoc types, with reports set to error
- Logical: rules that enforce proper tag values
jsdoc.configs['flat/logical-typescript']: for TypeScript files, with reports set to warnjsdoc.configs['flat/logical-typescript-error']: for TypeScript files, with reports set to errorjsdoc.configs['flat/logical-typescript-flavor']: for files using JavaScript syntax and JSDoc types, with reports set to warnjsdoc.configs['flat/logical-typescript-flavor-error']: for files using JavaScript syntax and JSDoc types, with reports set to error
- Requirements: rules that enforce tags exist or have or don't have types
jsdoc.configs['flat/requirements-typescript']: for TypeScript files, with reports set to warnjsdoc.configs['flat/requirements-typescript-error']: for TypeScript files, with reports set to errorjsdoc.configs['flat/requirements-typescript-flavor']: for files using JavaScript syntax and JSDoc types, with reports set to warnjsdoc.configs['flat/requirements-typescript-flavor-error']: for files using JavaScript syntax and JSDoc types, with reports set to error
- Stylistic: rules that enforce clear, consistent tag formatting and styles
jsdoc.configs['flat/stylistic-typescript']: for TypeScript files, with reports set to warnjsdoc.configs['flat/stylistic-typescript-error']: for TypeScript files, with reports set to errorjsdoc.configs['flat/stylistic-typescript-flavor']: for files using JavaScript syntax and JSDoc types, with reports set to warnjsdoc.configs['flat/stylistic-typescript-flavor-error']: for files using JavaScript syntax and JSDoc types, with reports set to error
For example, to enforce only that any JSDoc tags and their contents are valid and styled consistently in TypeScript files, without enforcing that tags must always exist:
import jsdoc from 'eslint-plugin-jsdoc';
export default [
jsdoc.configs['flat/contents-typescript-error'],
jsdoc.configs['flat/logical-typescript-error'],
jsdoc.configs['flat/stylistic-typescript-error'],
];
Why certain rules were excluded from the granular configs
A few rules were left out of the granular configs. Here is why:
Rules which might have been added to required:
require-throws- Since this can't enforce all cases, some may not wish this rule enforced.require-file-overview- Too demanding for all projectsconvert-to-jsdoc-comments- Overly aggressive for some projects
Rules which might have been added to logical:
no-missing-syntax- Has no default options.no-restricted-syntax- Has no default options.
Rules which might have been added to contents:
match-name- Has no default options.require-description- Too demanding for all projectsrequire-description-complete-sentence- Too demanding for all projects
Rules which might have been added to stylistic:
check-indentation- May not be desired by all projectssort-tags- Too project-specific
eslintrc
Add plugins section to .eslintrc.*
and specify eslint-plugin-jsdoc as a plugin.
{
"plugins": [
"jsdoc"
]
}
Finally, enable all of the rules that you would like to use.
{
"rules": {
"jsdoc/check-access": 1, // Recommended
"jsdoc/check-alignment": 1, // Recommended
// "jsdoc/check-examples": 1, // Deprecated and not for ESLint >= 8
"jsdoc/check-indentation": 1,
"jsdoc/check-line-alignment": 1,
"jsdoc/check-param-names": 1, // Recommended
"jsdoc/check-property-names": 1, // Recommended
"jsdoc/check-syntax": 1,
"jsdoc/check-tag-names": 1, // Recommended
"jsdoc/check-template-names": 1,
"jsdoc/check-types": 1, // Recommended
"jsdoc/check-values": 1, // Recommended
"jsdoc/convert-to-jsdoc-comments": 1,
"jsdoc/empty-tags": 1, // Recommended
"jsdoc/escape-inline-tags": 1, // Recommended for TS configs
"jsdoc/implements-on-classes": 1, // Recommended
"jsdoc/imports-as-dependencies": 1,
"jsdoc/informative-docs": 1,
"jsdoc/lines-before-block": 1,
"jsdoc/match-description": 1,
"jsdoc/match-name": 1,
"jsdoc/multiline-blocks": 1, // Recommended
"jsdoc/no-bad-blocks": 1,
"jsdoc/no-blank-block-descriptions": 1,
"jsdoc/no-defaults": 1, // Recommended
"jsdoc/no-missing-syntax": 1,
"jsdoc/no-multi-asterisks": 1, // Recommended
"jsdoc/no-restricted-syntax": 1,
"jsdoc/no-types": 1, // Recommended for TS configs
"jsdoc/no-undefined-types": 1, // Recommended for non-TS configs
"jsdoc/reject-any-type": 1, // Recommended
"jsdoc/reject-function-type": 1, // Recommended
"jsdoc/require-asterisk-prefix": 1,
"jsdoc/require-description": 1,
"jsdoc/require-description-complete-sentence": 1,
"jsdoc/require-example": 1,
"jsdoc/require-file-overview": 1,
"jsdoc/require-hyphen-before-param-description": 1,
"jsdoc/require-jsdoc": 1, // Recommended
"jsdoc/require-next-description": 1,
"jsdoc/require-next-type": 1, // Recommended
"jsdoc/require-param-description": 1, // Recommended
"jsdoc/require-param-name": 1, // Recommended
"jsdoc/require-param-type": 1, // Recommended in non-TS configs
"jsdoc/require-param": 1, // Recommended
"jsdoc/require-property-description": 1, // Recommended
"jsdoc/require-property-name": 1, // Recommended
"jsdoc/require-property-type": 1, // Recommended in non-TS configs
"jsdoc/require-property": 1, // Recommended
"jsdoc/require-rejects": 1, // Recommended
"jsdoc/require-returns-check": 1, // Recommended
"jsdoc/require-returns-description": 1, // Recommended
"jsdoc/require-returns-type": 1, // Recommended in non-TS configs
"jsdoc/require-returns": 1, // Recommended
"jsdoc/require-template": 1,
"jsdoc/require-template-description": 1,
"jsdoc/require-throws": 1,
"jsdoc/require-throws-description": 1,
"jsdoc/require-throws-type": 1, // Recommended
"jsdoc/require-yields-check": 1, // Recommended
"jsdoc/require-yields-description": 1,
"jsdoc/require-yields-type": 1, // Recommended
"jsdoc/require-yields": 1, // Recommended
"jsdoc/sort-tags": 1,
"jsdoc/tag-lines": 1, // Recommended
"jsdoc/text-escaping": 1,
"jsdoc/ts-method-signature-style": 1,
"jsdoc/ts-prefer-function-type": 1,
"jsdoc/ts-no-unnecessary-template-expression": 1,
"jsdoc/type-formatting": 1,
"jsdoc/valid-types": 1 // Recommended
}
}
Or you can simply add the following to .eslintrc.*, which enables the rules commented above as "recommended":
{
"extends": ["plugin:jsdoc/recommended"]
}
You can then selectively add to or override the recommended rules.
Alternatively, if you wish to have all linting issues reported as failing errors, you may use the "recommended-error" config:
{
"extends": ["plugin:jsdoc/recommended-error"]
}
If you plan to use TypeScript syntax (and not just "typescript"
mode to indicate the JSDoc flavor is TypeScript), you can use:
{
"extends": ["plugin:jsdoc/recommended-typescript"]
}
...or to report with failing errors instead of mere warnings:
{
"extends": ["plugin:jsdoc/recommended-typescript-error"]
}
If you are not using TypeScript syntax (your source files are still .js files)
but you are using the TypeScript flavor within JSDoc (i.e., the default
"typescript" mode in eslint-plugin-jsdoc) and you are perhaps using
allowJs and checkJs options of TypeScript's tsconfig.json), you may
use:
{
"extends": ["plugin:jsdoc/recommended-typescript-flavor"]
}
...or to report with failing errors instead of mere warnings:
{
"extends": ["plugin:jsdoc/recommended-typescript-flavor-error"]
}
If you are using TSDoc (e.g., with TSDoc or
TypeDoc), you may use the tsdoc config, which is like
recommended-typescript but additionally turns off require-throws-type,
require-yields-type, and require-next-type (since TSDoc does not support
{Type} annotations on those tags):
{
"extends": ["plugin:jsdoc/recommended-tsdoc"]
}
...or to report with failing errors instead of mere warnings:
{
"extends": ["plugin:jsdoc/recommended-tsdoc-error"]
}
Options
Rules may, as per the ESLint user guide, have their own individual options. In eslint-plugin-jsdoc, a few options,
such as, exemptedBy and contexts, may be used across different rules.
eslint-plugin-jsdoc options, if present, are generally in the form of an
object supplied as the second argument in an array after the error level
(any exceptions to this format are explained within that rule's docs).
// `.eslintrc.js`
{
rules: {
'jsdoc/require-example': [
// The Error level should be `error`, `warn`, or `off` (or 2, 1, or 0)
'error',
// The options vary by rule, but are generally added to an options
// object as follows:
{
checkConstructors: true,
exemptedBy: ['type']
}
]
}
}
Settings
See Settings.
Advanced
See Advanced.
Processors
See our @example and other item processors.
Rules
Problems reported by rules which have a wrench :wrench: below can be fixed automatically by running ESLint on the command line with --fix option.
Note that a number of fixable rules have an enableFixer option which can
be set to false to disable the fixer (or in the case of check-param-names,
check-property-names, and no-blank-blocks, set to true to enable a
non-default-recommended fixer).
| recommended | fixable | rule | description |
|---|---|---|---|
| :heavy_check_mark: | check-access | Checks that @access tags have a valid value. | |
| :heavy_check_mark: | :wrench: | check-alignment | Reports invalid alignment of JSDoc block asterisks. |
| check-examples | @deprecated - Use getJsdocProcessorPlugin processor; ensures that (JavaScript) samples within @example tags adhere to ESLint rules. | ||
| check-indentation | Reports invalid padding inside JSDoc blocks. | ||
| :wrench: | check-line-alignment | Reports invalid alignment of JSDoc block lines. | |
| :heavy_check_mark: | :wrench: | check-param-names | Checks for dupe @param names, that nested param names have roots, and that parameter names in function declarations match JSDoc param names. |
| :heavy_check_mark: | :wrench: | check-property-names | Ensures that property names in JSDoc are not duplicated on the same block and that nested properties have defined roots. |
| check-syntax | Reports against syntax not valid for the mode (e.g., Google Closure Compiler in non-Closure mode). | ||
| :heavy_check_mark: | :wrench: | check-tag-names | Reports invalid block tag names. |
| check-template-names | Checks that any @template names are actually used in the connected @typedef or type alias. | ||
| :heavy_check_mark: | :wrench: | check-types | Reports types deemed invalid (customizable and with defaults, for preventing and/or recommending replacements). |
| :heavy_check_mark: | check-values | This rule checks the values for a handful of tags: @version, @since, @license and @author. | |
| :wrench: | convert-to-jsdoc-comments | Converts non-JSDoc comments preceding or following nodes into JSDoc ones | |
| :heavy_check_mark: | :wrench: | empty-tags | Checks tags that are expected to be empty (e.g., @abstract or @async), reporting if they have content |
| :heavy_check_mark: | :wrench: | escape-inline-tags | Reports use of JSDoc tags in non-tag positions (in the default "typescript" mode). |
| :heavy_check_mark: | implements-on-classes | Prohibits use of @implements on non-constructor functions (to enforce the tag only being used on classes/constructors). | |
| imports-as-dependencies | Reports if JSDoc import() statements point to a package which is not listed in dependencies or devDependencies | ||
| informative-docs | This rule reports doc comments that only restate their attached name. | ||
| :wrench: | lines-before-block | Enforces minimum number of newlines before JSDoc comment blocks | |
| match-description | Enforces a regular expression pattern on descriptions. | ||
| :wrench: | match-name | Reports the name portion of a JSDoc tag if matching or not matching a given regular expression. | |
| :heavy_check_mark: | :wrench: | multiline-blocks | Controls how and whether JSDoc blocks can be expressed as single or multiple line blocks. |
| :wrench: | no-bad-blocks | This rule checks for multi-line-style comments which fail to meet the criteria of a JSDoc block. | |
| :wrench: | no-blank-block-descriptions | If tags are present, this rule will prevent empty lines in the block description. If no tags are present, this rule will prevent extra empty lines in the block description. | |
| :wrench: | no-blank-blocks | Removes empty blocks with nothing but possibly line breaks | |
| :heavy_check_mark: | :wrench: | no-defaults | This rule reports defaults being used on the relevant portion of @param or @default. |
| no-missing-syntax | Reports when certain comment structures are always expected. | ||
| :heavy_check_mark: | :wrench: | no-multi-asterisks | Prevents use of multiple asterisks at the beginning of lines. |
| no-restricted-syntax | Reports when certain comment structures are present. | ||
| On in TS; Off in TS flavor | :wrench: | no-types | This rule reports types being used on @param or @returns (redundant with TypeScript). |
| :heavy_check_mark: (Off in TS; Off in TS flavor) | no-undefined-types | Besides some expected built-in types, prohibits any types not specified as globals or within @typedef. | |
| :wrench: | normalize-see-links | Normalizes labeled links in @see tags to a canonical {@link} form. | |
| :wrench: | prefer-import-tag | Prefer @import tags to inline import() statements. | |
| :heavy_check_mark: | reject-any-type | Reports use of any or * type | |
| :heavy_check_mark: | reject-function-type | Reports use of Function type | |
| :wrench: | require-asterisk-prefix | Requires that each JSDoc line starts with an *. | |
| require-description | Requires that all functions (and potentially other contexts) have a description. | ||
| :wrench: | require-description-complete-sentence | Requires that block description, explicit @description, and @param/@returns tag descriptions are written in complete sentences. | |
| :wrench: | require-example | Requires that all functions (and potentially other contexts) have examples. | |
| require-file-overview | Checks that all files have one @file, @fileoverview, or @overview tag at the beginning of the file. | ||
| :wrench: | require-hyphen-before-param-description | Requires a hyphen before the @param description (and optionally before @property descriptions). | |
| :heavy_check_mark: | :wrench: | require-jsdoc | Checks for presence of JSDoc comments, on functions and potentially other contexts (optionally limited to exports). |
| require-next-description | Requires a description for @next tags | ||
| :heavy_check_mark: | require-next-type | Requires a type for @next tags | |
| :heavy_check_mark: | :wrench: | require-param | Requires that all function parameters are documented with a @param tag. |
| :heavy_check_mark: | :wrench: | require-param-description | Requires that each @param tag has a description value. |
| :heavy_check_mark: | require-param-name | Requires that all @param tags have names. | |
| :heavy_check_mark: (Off in TS; On in TS flavor) | :wrench: | require-param-type | Requires that each @param tag has a type value (in curly brackets). |
| :heavy_check_mark: | :wrench: | require-property | Requires that all @typedef and @namespace tags have @property when their type is a plain object, Object, or PlainObject. |
| :heavy_check_mark: | require-property-description | Requires that each @property tag has a description value. | |
| :heavy_check_mark: | require-property-name | Requires that all @property tags have names. | |
| :heavy_check_mark: (Off in TS; On in TS flavor) | require-property-type | Requires that each @property tag has a type value (in curly brackets). | |
| require-rejects | Requires that Promise rejections are documented with @rejects tags. | ||
| :heavy_check_mark: | :wrench: | require-returns | Requires that returns are documented with @returns. |
| :heavy_check_mark: | require-returns-check | Requires a return statement in function body if a @returns tag is specified in JSDoc comment(and reports if multiple @returns tags are present). | |
| :heavy_check_mark: | require-returns-description | Requires that the @returns tag has a description value (not including void/undefined type returns). | |
| :heavy_check_mark: (Off in TS; On in TS flavor) | require-returns-type | Requires that @returns tag has type value (in curly brackets). | |
| require-tags | Requires tags be present, optionally for specific contexts | ||
| require-template | Requires @template tags be present when type parameters are used. | ||
| require-template-description | Requires a description for @template tags | ||
| require-throws | Requires that throw statements are documented with @throws tags. | ||
| require-throws-description | Requires a description for @throws tags | ||
| :heavy_check_mark: | require-throws-type | Requires a type for @throws tags | |
| :heavy_check_mark: | require-yields | Requires yields are documented with @yields tags. | |
| :heavy_check_mark: | require-yields-check | Ensures that if a @yields is present that a yield (or yield with a value) is present in the function body (or that if a @next is present that there is a yield with a return value present). | |
| require-yields-description | Requires a description for @yields tags | ||
| :heavy_check_mark: | require-yields-type | Requires a type for @yields tags | |
| :wrench: | sort-tags | Sorts tags by a specified sequence according to tag name, optionally adding line breaks between tag groups. | |
| :heavy_check_mark: | :wrench: | tag-lines | Enforces lines (or no lines) before, after, or between tags. |
| :wrench: | text-escaping | Auto-escape certain characters that are input within block and tag descriptions. | |
| :wrench: | ts-method-signature-style | Prefers either function properties or method signatures | |
| :heavy_check_mark: | ts-no-empty-object-type | Warns against use of the empty object type | |
| :wrench: | ts-no-unnecessary-template-expression | Catches unnecessary template expressions such as string expressions within a template literal. | |
| :wrench: | ts-prefer-function-type | Prefers function types over call signatures when there are no other properties. | |
| :wrench: | type-formatting | Formats JSDoc type values. | |
| :heavy_check_mark: | valid-types | Requires all types/namepaths to be valid JSDoc, Closure compiler, or TypeScript types (configurable in settings). |
Related repositories
Master programming by recreating your favorite technologies from scratch.
A curated meta-list of curated lists organized by technology domain. The repository acts as a directory pointing to hundreds of specialized awesome lists covering programming languages, platforms, frameworks, and tooling. All content is community-contributed under the CC0 public domain dedication.
Public APIs is a community-curated GitHub repository listing free, publicly accessible APIs across a wide range of categories, with auth type, HTTPS, and CORS noted for each entry. It's a browsable reference, not a library to install.
freeCodeCamp is a free, self-paced curriculum for learning to code, published as open source at freeCodeCamp/freeCodeCamp. It's a 501(c)(3) nonprofit funded by donor support, structured around six certifications in its Full-Stack Developer Curriculum, each gated by required projects instead of open-book quizzes. The repository also carries beta language certifications for developers, interview-prep resources, and the code that runs the live freecodecamp.org platform.
Quick answers
How active is development on gajus/eslint-plugin-jsdoc?
The most recent commit recorded on gajus/eslint-plugin-jsdoc was 2 days ago, based on the GitHub push timestamp. The repository has 176 forks — one of the better signals of community interest.
How many stars does gajus/eslint-plugin-jsdoc have?
gajus/eslint-plugin-jsdoc has 1.2k GitHub stars — refresh the page for the live number, or check github.com/gajus/eslint-plugin-jsdoc. TopGit mirrors GitHub's count but does not claim minute-by-minute accuracy.
Is gajus/eslint-plugin-jsdoc open source?
TopGit's metadata for gajus/eslint-plugin-jsdoc does not record a license. Most public repositories on GitHub ARE open source, but the exact terms vary — verify by opening the LICENSE file directly.
What is gajus/eslint-plugin-jsdoc?
gajus/eslint-plugin-jsdoc (gajus/eslint-plugin-jsdoc) is a JavaScript project on GitHub. From the project's own README: JSDoc specific linting rules for ESLint.
Where do I read more about gajus/eslint-plugin-jsdoc?
This TopGit page is a snapshot — the READ ME tab shows the project's own README content (links stripped, images preserved). The GitHub repository at github.com/gajus/eslint-plugin-jsdoc is the definitive source.
Read full README in the tab above.
Curious whether eslint-plugin-jsdoc is right for you?
Let ChatGPT, Claude, or Perplexity look into it — click below and see what AI actually says about eslint-plugin-jsdoc.