eslint-plugin-jsdoc
Version:
JSDoc linting rules for ESLint.
1 lines • 22.3 kB
Source Map (JSON)
{"version":3,"file":"validTypes.cjs","names":["parseNamePath","parseName","iterateJsdoc","tryParse","parse","traverse"],"sources":["../../src/rules/validTypes.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\nimport {\n parse,\n parseName,\n parseNamePath,\n traverse,\n tryParse,\n} from '@es-joy/jsdoccomment';\n\nconst inlineTags = new Set([\n // Typdoc\n 'include', 'includeCode',\n // TSDoc\n 'inheritDoc',\n 'inheritdoc',\n 'label',\n // JSDoc\n 'link',\n 'linkcode', 'linkplain',\n 'tutorial',\n]);\n\nconst asExpression = /as\\s+/v;\n\nconst suppressTypes = new Set([\n // https://github.com/google/closure-compiler/wiki/@suppress-annotations\n // https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/parsing/ParserConfig.properties#L154\n 'accessControls',\n 'checkDebuggerStatement',\n 'checkEs5InheritanceCorrectnessConditions',\n 'checkPrototypalTypes',\n 'checkRegExp',\n 'checkTypes',\n 'checkVars',\n 'closureClassChecks',\n 'closureDepMethodUsageChecks',\n 'const',\n 'constantProperty',\n 'dangerousUnrecognizedTypeError',\n 'deprecated',\n 'duplicate',\n 'es5Strict',\n 'externsValidation',\n 'extraProvide',\n 'extraRequire',\n 'globalThis',\n 'invalidCasts',\n 'lateProvide',\n 'legacyGoogScopeRequire',\n 'lintChecks',\n 'lintVarDeclarations',\n 'messageConventions',\n 'misplacedTypeAnnotation',\n 'missingOverride',\n 'missingPolyfill',\n 'missingProperties',\n 'missingProvide',\n 'missingRequire',\n 'missingReturn',\n 'missingSourcesWarnings',\n 'moduleLoad',\n 'msgDescriptions',\n 'nonStandardJsDocs',\n 'partialAlias',\n 'polymer',\n 'reportUnknownTypes',\n 'strictCheckTypes',\n 'strictMissingProperties',\n 'strictModuleDepCheck',\n 'strictPrimitiveOperators',\n 'suspiciousCode',\n\n // Not documented in enum\n 'switch',\n 'transitionalSuspiciousCodeWarnings',\n 'undefinedNames',\n 'undefinedVars',\n 'underscore',\n 'unknownDefines',\n 'untranspilableFeatures',\n 'unusedLocalVariables',\n\n // Not documented?\n 'unusedPrivateMembers',\n 'uselessCode',\n 'useOfGoogProvide',\n 'visibility',\n 'with',\n]);\n\n/**\n * @param {string} path\n * @param {import('jsdoc-type-pratt-parser').ParseMode|\"permissive\"} mode\n * @returns {boolean}\n */\nconst tryParsePathIgnoreError = (path, mode) => {\n try {\n parseNamePath(\n path,\n mode === 'permissive' ? 'jsdoc' : mode,\n {\n includeSpecial: true,\n },\n );\n\n return true;\n } catch {\n // Keep the original error for including the whole type\n }\n\n return false;\n};\n\n/**\n * @param {string} name\n * @param {import('jsdoc-type-pratt-parser').ParseMode} mode\n * @returns {boolean}\n */\nconst tryParseNameIgnoreError = (name, mode) => {\n try {\n parseName(name, mode);\n\n return true;\n } catch {\n // Keep the original error for including the whole type\n }\n\n return false;\n};\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n report,\n settings,\n utils,\n// eslint-disable-next-line complexity\n}) => {\n const {\n allowEmptyNamepaths = false,\n } = context.options[0] || {};\n const {\n mode,\n } = settings;\n\n for (const tag of jsdoc.tags) {\n /**\n * @param {string} namepath\n * @param {string} [tagName]\n * @returns {boolean}\n */\n const validNamepathParsing = function (namepath, tagName) {\n if (\n tryParsePathIgnoreError(namepath, mode)\n ) {\n return true;\n }\n\n let handled = false;\n\n if (tagName) {\n switch (tagName) {\n case 'memberof':\n case 'memberof!': {\n const endChar = namepath.slice(-1);\n if ([\n '#', '.', '~',\n ].includes(endChar)) {\n handled = tryParsePathIgnoreError(namepath.slice(0, -1), mode);\n }\n\n break;\n }\n\n case 'module': case 'requires': {\n if (!namepath.startsWith('module:')) {\n handled = tryParsePathIgnoreError(`module:${namepath}`, mode);\n }\n\n break;\n }\n\n case 'prop':\n case 'property': {\n if (mode === 'jsdoc' && (/^\\d+$/v).test(namepath)) {\n handled = true;\n }\n\n break;\n }\n\n case 'borrows': {\n const startChar = namepath.charAt(0);\n if ([\n '#', '.', '~',\n ].includes(startChar)) {\n handled = tryParsePathIgnoreError(namepath.slice(1), mode);\n }\n }\n }\n }\n\n if (!handled) {\n report(`Syntax error in namepath: ${namepath}`, null, tag);\n\n return false;\n }\n\n return true;\n };\n\n /**\n * @param {string} type\n * @returns {boolean}\n */\n const validTypeParsing = function (type) {\n let parsedTypes;\n try {\n if (mode === 'permissive') {\n parsedTypes = tryParse(type, undefined, {\n classContext: true,\n });\n } else {\n parsedTypes = parse(type, mode, {\n classContext: true,\n });\n }\n } catch {\n report(`Syntax error in type: ${type}`, null, tag);\n\n return false;\n }\n\n if (mode === 'closure' || mode === 'typescript') {\n traverse(parsedTypes, (node) => {\n const {\n type: typ,\n } = node;\n\n if (\n (typ === 'JsdocTypeObjectField' || typ === 'JsdocTypeKeyValue') &&\n node.right?.type === 'JsdocTypeNullable' &&\n node.right?.meta?.position === 'suffix'\n ) {\n report(`Syntax error in type: ${node.right.type}`, null, tag);\n }\n });\n }\n\n return true;\n };\n\n if (tag.problems.length) {\n const msg = tag.problems.reduce((str, {\n message,\n }) => {\n return str + '; ' + message;\n }, '').slice(2);\n report(`Invalid name: ${msg}`, null, tag);\n continue;\n }\n\n if (tag.tag === 'import') {\n // A named import will look like a type, but not be valid; we also don't\n // need to check the name/namepath\n continue;\n }\n\n if (tag.tag === 'borrows') {\n const thisNamepath = /** @type {string} */ (\n utils.getTagDescription(tag)\n ).replace(asExpression, '')\n .trim();\n\n if (!asExpression.test(/** @type {string} */ (\n utils.getTagDescription(tag)\n )) || !thisNamepath) {\n report(`@borrows must have an \"as\" expression. Found \"${utils.getTagDescription(tag)}\"`, null, tag);\n\n continue;\n }\n\n if (validNamepathParsing(thisNamepath, 'borrows')) {\n const thatNamepath = tag.name;\n\n validNamepathParsing(thatNamepath);\n }\n\n continue;\n }\n\n if (tag.tag === 'suppress' && mode === 'closure') {\n let parsedTypes;\n\n try {\n parsedTypes = tryParse(tag.type);\n } catch {\n // Ignore\n }\n\n if (parsedTypes) {\n traverse(parsedTypes, (node) => {\n let type;\n if ('value' in node && typeof node.value === 'string') {\n type = node.value;\n }\n\n if (type !== undefined && !suppressTypes.has(type)) {\n report(`Syntax error in suppress type: ${type}`, null, tag);\n }\n });\n }\n }\n\n const otherModeMaps = /** @type {import('../jsdocUtils.js').ParserMode[]} */ ([\n 'jsdoc', 'typescript', 'closure', 'permissive',\n ]).filter(\n (mde) => {\n return mde !== mode;\n },\n ).map((mde) => {\n return utils.getTagStructureForMode(mde);\n });\n\n const tagMightHaveNamePosition = utils.tagMightHaveNamePosition(tag.tag, otherModeMaps);\n if (tagMightHaveNamePosition !== true && tag.name) {\n const modeInfo = tagMightHaveNamePosition === false ? '' : ` in \"${mode}\" mode`;\n report(`@${tag.tag} should not have a name${modeInfo}.`, null, tag);\n\n continue;\n }\n\n // Documentation like `@returns {@link SomeType}` is technically ambiguous. Specifically it\n // could either be intepreted as a type `\"@link SomeType\"` or a description `\"{@link SomeType}\"`.\n // However this is a good heuristic.\n if (tag.type.trim().startsWith('@')) {\n tag.description = `{${tag.type}} ${tag.description}`;\n tag.type = '';\n }\n\n const mightHaveTypePosition = utils.tagMightHaveTypePosition(tag.tag, otherModeMaps);\n if (mightHaveTypePosition !== true && tag.type) {\n const modeInfo = mightHaveTypePosition === false ? '' : ` in \"${mode}\" mode`;\n report(`@${tag.tag} should not have a bracketed type${modeInfo}.`, null, tag);\n\n continue;\n }\n\n // REQUIRED NAME\n const tagMustHaveNamePosition = utils.tagMustHaveNamePosition(tag.tag, otherModeMaps);\n\n // Don't handle `@param` here though it does require name as handled by\n // `require-param-name` (`@property` would similarly seem to require one,\n // but is handled by `require-property-name`)\n if (tagMustHaveNamePosition !== false && !tag.name && !allowEmptyNamepaths && ![\n 'arg', 'argument', 'param',\n 'prop', 'property',\n ].includes(tag.tag) &&\n (tag.tag !== 'see' || !utils.getTagDescription(tag).includes('{@link'))\n ) {\n const modeInfo = tagMustHaveNamePosition === true ? '' : ` in \"${mode}\" mode`;\n report(`Tag @${tag.tag} must have a name/namepath${modeInfo}.`, null, tag);\n\n continue;\n }\n\n // REQUIRED TYPE\n const mustHaveTypePosition = utils.tagMustHaveTypePosition(tag.tag, otherModeMaps);\n if (mustHaveTypePosition !== false && !tag.type &&\n // Auto-added to settings and has own rule already, so don't duplicate\n tag.tag !== 'next'\n ) {\n const modeInfo = mustHaveTypePosition === true ? '' : ` in \"${mode}\" mode`;\n report(`Tag @${tag.tag} must have a type${modeInfo}.`, null, tag);\n\n continue;\n }\n\n // REQUIRED TYPE OR NAME/NAMEPATH\n const tagMissingRequiredTypeOrNamepath = utils.tagMissingRequiredTypeOrNamepath(tag, otherModeMaps);\n if (tagMissingRequiredTypeOrNamepath !== false && !allowEmptyNamepaths) {\n const modeInfo = tagMissingRequiredTypeOrNamepath === true ? '' : ` in \"${mode}\" mode`;\n report(`Tag @${tag.tag} must have either a type or namepath${modeInfo}.`, null, tag);\n\n continue;\n }\n\n // VALID TYPE\n const hasTypePosition = mightHaveTypePosition === true && Boolean(tag.type);\n if (hasTypePosition && (tag.type !== 'const' || tag.tag !== 'type')) {\n validTypeParsing(tag.type);\n }\n\n // VALID NAME/NAMEPATH\n const hasNamepathPosition = (\n tagMustHaveNamePosition !== false ||\n utils.tagMightHaveNamepath(tag.tag)\n ) && Boolean(tag.name);\n\n if (hasNamepathPosition) {\n if (mode !== 'jsdoc' && tag.tag === 'template') {\n if (!tryParsePathIgnoreError(tag.name.trim(), mode)) {\n for (const namepath of utils.parseClosureTemplateTag(tag)) {\n validNamepathParsing(namepath);\n }\n }\n } else {\n validNamepathParsing(tag.name, tag.tag);\n }\n }\n\n const hasNamePosition = utils.tagMightHaveName(tag.tag) &&\n Boolean(tag.name);\n if (\n hasNamePosition &&\n mode === 'typescript' &&\n !tryParseNameIgnoreError(tag.name, mode)\n ) {\n report(`Syntax error in name: ${tag.name}`, null, tag);\n } else if (hasNamePosition && mode !== 'typescript') {\n validNamepathParsing(tag.name, tag.tag);\n }\n\n for (const inlineTag of tag.inlineTags) {\n if (inlineTags.has(inlineTag.tag) && !inlineTag.text && !inlineTag.namepathOrURL) {\n report(`Inline tag \"${inlineTag.tag}\" missing content`, null, tag);\n }\n }\n }\n\n for (const inlineTag of jsdoc.inlineTags) {\n if (inlineTags.has(inlineTag.tag) && !inlineTag.text && !inlineTag.namepathOrURL) {\n report(`Inline tag \"${inlineTag.tag}\" missing content`);\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Requires all types/namepaths to be valid JSDoc, Closure compiler, or TypeScript types (configurable in settings).',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/valid-types.md#repos-sticky-header',\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowEmptyNamepaths: {\n default: false,\n description: `Set to \\`false\\` to bulk disallow\nempty name paths with namepath groups 2 and 4 (these might often be\nexpected to have an accompanying name path, though they have some\nindicative value without one; these may also allow names to be defined\nin another manner elsewhere in the block); you can use\n\\`settings.jsdoc.structuredTags\\` with the \\`required\\` key set to \"name\" if you\nwish to require name paths on a tag-by-tag basis. Defaults to \\`true\\`.`,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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","ignoreList":[]}