eslint-plugin-jsdoc 62.0.1 → 62.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -188,11 +188,71 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
188
188
  return result;
189
189
  };
190
190
 
191
+ /**
192
+ * Recursively extracts types from a namespace declaration.
193
+ * @param {string} prefix - The namespace prefix (e.g., "MyNamespace" or "Outer.Inner").
194
+ * @param {import('@typescript-eslint/types').TSESTree.TSModuleDeclaration} moduleDeclaration - The module declaration node.
195
+ * @returns {string[]} Array of fully qualified type names.
196
+ */
197
+ const getNamespaceTypes = (prefix, moduleDeclaration) => {
198
+ /* c8 ignore next 3 -- Guard for ambient modules without body. */
199
+ if (!moduleDeclaration.body || moduleDeclaration.body.type !== 'TSModuleBlock') {
200
+ return [];
201
+ }
202
+ return moduleDeclaration.body.body.flatMap(item => {
203
+ /** @type {import('@typescript-eslint/types').TSESTree.ProgramStatement | import('@typescript-eslint/types').TSESTree.NamedExportDeclarations | null} */
204
+ let declaration = item;
205
+ if (item.type === 'ExportNamedDeclaration' && item.declaration) {
206
+ declaration = item.declaration;
207
+ }
208
+ if (declaration.type === 'TSTypeAliasDeclaration' || declaration.type === 'ClassDeclaration') {
209
+ /* c8 ignore next 4 -- Guard for anonymous class declarations. */
210
+ if (!declaration.id) {
211
+ return [];
212
+ }
213
+ return [`${prefix}.${declaration.id.name}`];
214
+ }
215
+ if (declaration.type === 'TSInterfaceDeclaration') {
216
+ return [`${prefix}.${declaration.id.name}`, ...declaration.body.body.map(prop => {
217
+ // Only `TSPropertySignature` and `TSMethodSignature` have 'key'.
218
+ if (prop.type !== 'TSPropertySignature' && prop.type !== 'TSMethodSignature') {
219
+ return '';
220
+ }
221
+
222
+ // Key can be computed or a literal, only handle Identifier.
223
+ if (prop.key.type !== 'Identifier') {
224
+ return '';
225
+ }
226
+ const propName = prop.key.name;
227
+ /* c8 ignore next -- `propName` is always truthy for Identifiers. */
228
+ return propName ? `${prefix}.${declaration.id.name}.${propName}` : '';
229
+ }).filter(Boolean)];
230
+ }
231
+
232
+ // Handle nested namespaces.
233
+ if (declaration.type === 'TSModuleDeclaration') {
234
+ /* c8 ignore next -- Nested string-literal modules aren't valid TS syntax. */
235
+ const nestedName = declaration.id?.type === 'Identifier' ? declaration.id.name : '';
236
+ /* c8 ignore next 3 -- Guard. */
237
+ if (!nestedName) {
238
+ return [];
239
+ }
240
+ return [`${prefix}.${nestedName}`, ...getNamespaceTypes(`${prefix}.${nestedName}`, declaration)];
241
+ }
242
+
243
+ // Fallback for unhandled declaration types (e.g., TSEnumDeclaration, FunctionDeclaration, etc.).
244
+ return [];
245
+ });
246
+ };
247
+
191
248
  /**
192
249
  * We treat imports differently as we can't introspect their children.
193
250
  * @type {string[]}
194
251
  */
195
252
  const imports = [];
253
+
254
+ /** @type {Set<string>} */
255
+ const closedTypes = new Set();
196
256
  const allDefinedTypes = new Set(globalScope.variables.map(({
197
257
  name
198
258
  }) => {
@@ -211,6 +271,7 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
211
271
  const globalItem = /** @type {import('estree').Identifier & {parent: import('@typescript-eslint/types').TSESTree.Node}} */identifiers?.[0]?.parent;
212
272
  switch (globalItem?.type) {
213
273
  case 'ClassDeclaration':
274
+ closedTypes.add(name);
214
275
  return [name, ...globalItem.body.body.map(item => {
215
276
  const property = /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */(/** @type {import('@typescript-eslint/types').TSESTree.PropertyDefinition} */item?.key)?.name;
216
277
  /* c8 ignore next 3 -- Guard */
@@ -233,6 +294,9 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
233
294
  }
234
295
  return `${name}.${property}`;
235
296
  }).filter(Boolean)];
297
+ case 'TSModuleDeclaration':
298
+ closedTypes.add(name);
299
+ return [name, ...getNamespaceTypes(name, globalItem)];
236
300
  case 'VariableDeclarator':
237
301
  if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */(/** @type {import('@typescript-eslint/types').TSESTree.CallExpression} */globalItem?.init?.callee)?.name === 'require') {
238
302
  imports.push(/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */globalItem.id.name);
@@ -266,6 +330,15 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
266
330
  }).filter(Boolean);
267
331
  }
268
332
  return [];
333
+ })()).concat((() => {
334
+ // Detect static property assignments like `MyClass.Prop = ...`
335
+ const programBody = /** @type {import('@typescript-eslint/types').TSESTree.Program} */sourceCode.ast.body;
336
+ return programBody.flatMap(statement => {
337
+ if (statement.type === 'ExpressionStatement' && statement.expression.type === 'AssignmentExpression' && statement.expression.left.type === 'MemberExpression' && statement.expression.left.object.type === 'Identifier' && statement.expression.left.property.type === 'Identifier' && closedTypes.has(statement.expression.left.object.name)) {
338
+ return [`${statement.expression.left.object.name}.${statement.expression.left.property.name}`];
339
+ }
340
+ return [];
341
+ });
269
342
  })()).concat(...getValidRuntimeIdentifiers(node && (sourceCode.getScope && /* c8 ignore next 3 */
270
343
  sourceCode.getScope(node) ||
271
344
  // @ts-expect-error ESLint 8
@@ -369,7 +442,9 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
369
442
  } while (currNode?.type === 'JsdocTypeNamePath');
370
443
  if (type === 'JsdocTypeName') {
371
444
  const structuredTypes = structuredTags[tag.tag]?.type;
372
- if (!allDefinedTypes.has(val) && !definedNamesAndNamepaths.has(val) && (!Array.isArray(structuredTypes) || !structuredTypes.includes(val))) {
445
+ const rootNamespace = val.split('.')[0];
446
+ const isNamespaceValid = (definedTypes.includes(rootNamespace) || allDefinedTypes.has(rootNamespace)) && !closedTypes.has(rootNamespace);
447
+ if (!allDefinedTypes.has(val) && !definedNamesAndNamepaths.has(val) && (!Array.isArray(structuredTypes) || !structuredTypes.includes(val)) && !isNamespaceValid) {
373
448
  const parent =
374
449
  /**
375
450
  * @type {import('jsdoc-type-pratt-parser').RootResult & {
@@ -1 +1 @@
1
- {"version":3,"file":"noUndefinedTypes.cjs","names":["_iterateJsdoc","_interopRequireWildcard","require","_jsdoccomment","_parseImportsExports","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","extraTypes","globalTypes","typescriptGlobals","stripPseudoTypes","str","replace","_default","exports","iterateJsdoc","context","node","report","settings","sourceCode","state","utils","foundTypedefValues","scopeManager","globalScope","checkUsedTypedefs","definedTypes","disableReporting","markVariablesAsUsed","options","definedPreferredTypes","mode","preferredTypes","structuredTags","keys","length","values","map","preferredType","undefined","reportSettings","replacement","filter","Boolean","allComments","getAllComments","comments","comment","test","value","commentNode","parseComment","globals","flatMap","trim","split","concat","languageOptions","typedefs","doc","tags","tag","isNameOrNamepathDefiningTag","includes","typedefDeclarations","name","importTags","description","type","typePart","imprt","importsExports","parseImportsExports","types","namedImports","push","names","namespaceImports","namespace","ancestorNodes","currentNode","parent","getTemplateTags","ancestorNode","getJSDocComment","jsdc","templateTags","getPresentTags","closureGenericTypes","parseClosureTemplateTag","cjsOrESMScope","childScopes","block","getValidRuntimeIdentifiers","scope","result","Set","scp","variables","add","upper","imports","allDefinedTypes","identifiers","globalItem","body","item","property","key","init","callee","id","methodOrProp","getScope","tagToParsedType","propertyName","potentialType","parsedType","tryParseType","parseType","typeTags","filterTags","tagMightHaveTypePosition","namepathReferencingTags","isNamepathReferencingTag","namepathOrUrlReferencingTags","filterAllTags","isNamepathOrUrlReferencingTag","definedNamesAndNamepaths","tagsWithTypes","traverse","nde","parentNode","_parent","val","currNode","right","structuredTypes","Array","isArray","typeParameters","some","typeParam","markVariableAsUsed","exit","loc","typedef","message","iterateAllJsdocs","meta","docs","url","schema","additionalProperties","properties","items","module"],"sources":["../../src/rules/noUndefinedTypes.js"],"sourcesContent":["import iterateJsdoc, {\n parseComment,\n} from '../iterateJsdoc.js';\nimport {\n getJSDocComment,\n parse as parseType,\n traverse,\n tryParse as tryParseType,\n} from '@es-joy/jsdoccomment';\nimport {\n parseImportsExports,\n} from 'parse-imports-exports';\n\nconst extraTypes = [\n 'null', 'undefined', 'void', 'string', 'boolean', 'object',\n 'function', 'symbol',\n 'number', 'bigint', 'NaN', 'Infinity',\n 'any', '*', 'never', 'unknown', 'const',\n 'this', 'true', 'false',\n 'Array', 'Object', 'RegExp', 'Date', 'Function', 'Intl',\n];\n\nconst globalTypes = [\n 'globalThis', 'global', 'window', 'self',\n];\n\nconst typescriptGlobals = [\n // https://www.typescriptlang.org/docs/handbook/utility-types.html\n 'Awaited',\n 'Partial',\n 'Required',\n 'Readonly',\n 'Record',\n 'Pick',\n 'Omit',\n 'Exclude',\n 'Extract',\n 'NonNullable',\n 'Parameters',\n 'ConstructorParameters',\n 'ReturnType',\n 'InstanceType',\n 'ThisParameterType',\n 'OmitThisParameter',\n 'ThisType',\n 'Uppercase',\n 'Lowercase',\n 'Capitalize',\n 'Uncapitalize',\n];\n\n/**\n * @param {string|false|undefined} [str]\n * @returns {undefined|string|false}\n */\nconst stripPseudoTypes = (str) => {\n return str && str.replace(/(?:\\.|<>|\\.<>|\\[\\])$/v, '');\n};\n\nexport default iterateJsdoc(({\n context,\n node,\n report,\n settings,\n sourceCode,\n state,\n utils,\n}) => {\n /** @type {string[]} */\n const foundTypedefValues = [];\n\n const {\n scopeManager,\n } = sourceCode;\n\n // When is this ever `null`?\n const globalScope = /** @type {import('eslint').Scope.Scope} */ (\n scopeManager.globalScope\n );\n\n const\n /**\n * @type {{\n * checkUsedTypedefs: boolean\n * definedTypes: string[],\n * disableReporting: boolean,\n * markVariablesAsUsed: boolean,\n * }}\n */ {\n checkUsedTypedefs = false,\n definedTypes = [],\n disableReporting = false,\n markVariablesAsUsed = true,\n } = context.options[0] || {};\n\n /** @type {(string|undefined)[]} */\n let definedPreferredTypes = [];\n const {\n mode,\n preferredTypes,\n structuredTags,\n } = settings;\n if (Object.keys(preferredTypes).length) {\n definedPreferredTypes = /** @type {string[]} */ (Object.values(preferredTypes).map((preferredType) => {\n if (typeof preferredType === 'string') {\n // May become an empty string but will be filtered out below\n return stripPseudoTypes(preferredType);\n }\n\n if (!preferredType) {\n return undefined;\n }\n\n if (typeof preferredType !== 'object') {\n utils.reportSettings(\n 'Invalid `settings.jsdoc.preferredTypes`. Values must be falsy, a string, or an object.',\n );\n }\n\n return stripPseudoTypes(preferredType.replacement);\n })\n .filter(Boolean));\n }\n\n const allComments = sourceCode.getAllComments();\n const comments = allComments\n .filter((comment) => {\n return (/^\\*(?!\\*)/v).test(comment.value);\n })\n .map((commentNode) => {\n return parseComment(commentNode, '');\n });\n\n const globals = allComments\n .filter((comment) => {\n return (/^\\s*globals/v).test(comment.value);\n }).flatMap((commentNode) => {\n return commentNode.value.replace(/^\\s*globals/v, '').trim().split(/,\\s*/v);\n }).concat(Object.keys(context.languageOptions.globals ?? []));\n\n const typedefs = comments\n .flatMap((doc) => {\n return doc.tags.filter(({\n tag,\n }) => {\n return utils.isNameOrNamepathDefiningTag(tag) && ![\n 'arg',\n 'argument',\n 'param',\n 'prop',\n 'property',\n ].includes(tag);\n });\n });\n\n const typedefDeclarations = typedefs\n .map((tag) => {\n return tag.name;\n });\n\n const importTags = settings.mode === 'typescript' ? /** @type {string[]} */ (comments.flatMap((doc) => {\n return doc.tags.filter(({\n tag,\n }) => {\n return tag === 'import';\n });\n }).flatMap((tag) => {\n const {\n description,\n name,\n type,\n } = tag;\n const typePart = type ? `{${type}} ` : '';\n const imprt = 'import ' + (description ?\n `${typePart}${name} ${description}` :\n `${typePart}${name}`);\n\n const importsExports = parseImportsExports(imprt.trim());\n\n const types = [];\n const namedImports = Object.values(importsExports.namedImports || {})[0]?.[0];\n if (namedImports) {\n if (namedImports.default) {\n types.push(namedImports.default);\n }\n\n if (namedImports.names) {\n types.push(...Object.keys(namedImports.names));\n }\n }\n\n const namespaceImports = Object.values(importsExports.namespaceImports || {})[0]?.[0];\n if (namespaceImports) {\n if (namespaceImports.namespace) {\n types.push(namespaceImports.namespace);\n }\n\n if (namespaceImports.default) {\n types.push(namespaceImports.default);\n }\n }\n\n return types;\n }).filter(Boolean)) : [];\n\n const ancestorNodes = [];\n\n let currentNode = node;\n // No need for Program node?\n while (currentNode?.parent) {\n ancestorNodes.push(currentNode);\n currentNode = currentNode.parent;\n }\n\n /**\n * @param {import('eslint').Rule.Node} ancestorNode\n * @returns {import('comment-parser').Spec[]}\n */\n const getTemplateTags = function (ancestorNode) {\n const commentNode = getJSDocComment(sourceCode, ancestorNode, settings);\n if (!commentNode) {\n return [];\n }\n\n const jsdc = parseComment(commentNode, '');\n\n return jsdc.tags.filter((tag) => {\n return tag.tag === 'template';\n });\n };\n\n // `currentScope` may be `null` or `Program`, so in such a case,\n // we look to present tags instead\n const templateTags = ancestorNodes.length ?\n ancestorNodes.flatMap((ancestorNode) => {\n return getTemplateTags(ancestorNode);\n }) :\n utils.getPresentTags([\n 'template',\n ]);\n\n const closureGenericTypes = templateTags.flatMap((tag) => {\n return utils.parseClosureTemplateTag(tag);\n });\n\n // In modules, including Node, there is a global scope at top with the\n // Program scope inside\n const cjsOrESMScope = globalScope.childScopes[0]?.block?.type === 'Program';\n\n /**\n * @param {import(\"eslint\").Scope.Scope | null} scope\n * @returns {Set<string>}\n */\n const getValidRuntimeIdentifiers = (scope) => {\n const result = new Set();\n\n let scp = scope;\n while (scp) {\n for (const {\n name,\n } of scp.variables) {\n result.add(name);\n }\n\n scp = scp.upper;\n }\n\n return result;\n };\n\n /**\n * We treat imports differently as we can't introspect their children.\n * @type {string[]}\n */\n const imports = [];\n\n const allDefinedTypes = new Set(globalScope.variables.map(({\n name,\n }) => {\n return name;\n })\n\n // If the file is a module, concat the variables from the module scope.\n .concat(\n cjsOrESMScope ?\n globalScope.childScopes.flatMap(({\n variables,\n }) => {\n return variables;\n }).flatMap(({\n identifiers,\n name,\n }) => {\n const globalItem = /** @type {import('estree').Identifier & {parent: import('@typescript-eslint/types').TSESTree.Node}} */ (\n identifiers?.[0]\n )?.parent;\n switch (globalItem?.type) {\n case 'ClassDeclaration':\n return [\n name,\n ...globalItem.body.body.map((item) => {\n const property = /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n /** @type {import('@typescript-eslint/types').TSESTree.PropertyDefinition} */ (\n item)?.key)?.name;\n /* c8 ignore next 3 -- Guard */\n if (!property) {\n return '';\n }\n\n return `${name}.${property}`;\n }).filter(Boolean),\n ];\n case 'ImportDefaultSpecifier':\n case 'ImportNamespaceSpecifier':\n case 'ImportSpecifier':\n imports.push(name);\n break;\n case 'TSInterfaceDeclaration':\n return [\n name,\n ...globalItem.body.body.map((item) => {\n const property = /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n /** @type {import('@typescript-eslint/types').TSESTree.TSPropertySignature} */ (\n item)?.key)?.name;\n /* c8 ignore next 3 -- Guard */\n if (!property) {\n return '';\n }\n\n return `${name}.${property}`;\n }).filter(Boolean),\n ];\n case 'VariableDeclarator':\n if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n /** @type {import('@typescript-eslint/types').TSESTree.CallExpression} */ (\n globalItem?.init\n )?.callee)?.name === 'require'\n ) {\n imports.push(/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n globalItem.id\n ).name);\n break;\n }\n\n // Module scope names are also defined\n return [\n name,\n ];\n }\n\n return [\n name,\n ];\n /* c8 ignore next */\n }) : [],\n )\n .concat(extraTypes)\n .concat(typedefDeclarations)\n .concat(importTags)\n .concat(definedTypes)\n .concat(/** @type {string[]} */ (definedPreferredTypes))\n .concat((() => {\n // Other methods are not in scope, but we need them, and we grab them here\n if (node?.type === 'MethodDefinition') {\n return /** @type {import('estree').ClassBody} */ (node.parent).body.flatMap((methodOrProp) => {\n if (methodOrProp.type === 'MethodDefinition') {\n // eslint-disable-next-line unicorn/no-lonely-if -- Pattern\n if (methodOrProp.key.type === 'Identifier') {\n return [\n methodOrProp.key.name,\n `${/** @type {import('estree').ClassDeclaration} */ (\n node.parent?.parent\n )?.id?.name}.${methodOrProp.key.name}`,\n ];\n }\n }\n\n if (methodOrProp.type === 'PropertyDefinition') {\n // eslint-disable-next-line unicorn/no-lonely-if -- Pattern\n if (methodOrProp.key.type === 'Identifier') {\n return [\n methodOrProp.key.name,\n `${/** @type {import('estree').ClassDeclaration} */ (\n node.parent?.parent\n )?.id?.name}.${methodOrProp.key.name}`,\n ];\n }\n }\n /* c8 ignore next 2 -- Not yet built */\n\n return '';\n }).filter(Boolean);\n }\n\n return [];\n })())\n .concat(...getValidRuntimeIdentifiers(node && (\n (sourceCode.getScope &&\n /* c8 ignore next 3 */\n sourceCode.getScope(node)) ||\n // @ts-expect-error ESLint 8\n context.getScope()\n )))\n .concat(\n settings.mode === 'jsdoc' ?\n [] :\n [\n ...settings.mode === 'typescript' ? typescriptGlobals : [],\n ...closureGenericTypes,\n ],\n ));\n\n /**\n * @typedef {{\n * parsedType: import('jsdoc-type-pratt-parser').RootResult;\n * tag: import('comment-parser').Spec|import('@es-joy/jsdoccomment').JsdocInlineTagNoType & {\n * line?: import('../iterateJsdoc.js').Integer\n * }\n * }} TypeAndTagInfo\n */\n\n /**\n * @param {string} propertyName\n * @returns {(tag: (import('@es-joy/jsdoccomment').JsdocInlineTagNoType & {\n * name?: string,\n * type?: string,\n * line?: import('../iterateJsdoc.js').Integer\n * })|import('comment-parser').Spec & {\n * namepathOrURL?: string\n * }\n * ) => undefined|TypeAndTagInfo}\n */\n const tagToParsedType = (propertyName) => {\n return (tag) => {\n try {\n const potentialType = tag[\n /** @type {\"type\"|\"name\"|\"namepathOrURL\"} */ (propertyName)\n ];\n return {\n parsedType: mode === 'permissive' ?\n tryParseType(/** @type {string} */ (potentialType)) :\n parseType(/** @type {string} */ (potentialType), mode),\n tag,\n };\n } catch {\n return undefined;\n }\n };\n };\n\n const typeTags = utils.filterTags(({\n tag,\n }) => {\n return tag !== 'import' && utils.tagMightHaveTypePosition(tag) && (tag !== 'suppress' || settings.mode !== 'closure');\n }).map(tagToParsedType('type'));\n\n const namepathReferencingTags = utils.filterTags(({\n tag,\n }) => {\n return utils.isNamepathReferencingTag(tag);\n }).map(tagToParsedType('name'));\n\n const namepathOrUrlReferencingTags = utils.filterAllTags(({\n tag,\n }) => {\n return utils.isNamepathOrUrlReferencingTag(tag);\n }).map(tagToParsedType('namepathOrURL'));\n\n const definedNamesAndNamepaths = new Set(utils.filterTags(({\n tag,\n }) => {\n return utils.isNameOrNamepathDefiningTag(tag);\n }).map(({\n name,\n }) => {\n return name;\n }));\n\n const tagsWithTypes = /** @type {TypeAndTagInfo[]} */ ([\n ...typeTags,\n ...namepathReferencingTags,\n ...namepathOrUrlReferencingTags,\n // Remove types which failed to parse\n ].filter(Boolean));\n\n for (const {\n parsedType,\n tag,\n } of tagsWithTypes) {\n // eslint-disable-next-line complexity -- Refactor\n traverse(parsedType, (nde, parentNode) => {\n /**\n * @type {import('jsdoc-type-pratt-parser').NameResult & {\n * _parent?: import('jsdoc-type-pratt-parser').NonRootResult\n * }}\n */\n // eslint-disable-next-line canonical/id-match -- Avoid clashes\n (nde)._parent = parentNode;\n const {\n type,\n value,\n } = /** @type {import('jsdoc-type-pratt-parser').NameResult} */ (nde);\n\n let val = value;\n\n /** @type {import('jsdoc-type-pratt-parser').NonRootResult|undefined} */\n let currNode = nde;\n do {\n currNode =\n /**\n * @type {import('jsdoc-type-pratt-parser').NameResult & {\n * _parent?: import('jsdoc-type-pratt-parser').NonRootResult\n * }}\n */ (currNode)._parent;\n if (\n // Avoid appending for imports and globals since we don't want to\n // check their properties which may or may not exist\n !imports.includes(val) && !globals.includes(val) &&\n !importTags.includes(val) &&\n !extraTypes.includes(val) &&\n !typedefDeclarations.includes(val) &&\n !globalTypes.includes(val) &&\n currNode && 'right' in currNode &&\n currNode.right?.type === 'JsdocTypeProperty'\n ) {\n val = val + '.' + currNode.right.value;\n }\n } while (currNode?.type === 'JsdocTypeNamePath');\n\n if (type === 'JsdocTypeName') {\n const structuredTypes = structuredTags[tag.tag]?.type;\n if (!allDefinedTypes.has(val) &&\n !definedNamesAndNamepaths.has(val) &&\n (!Array.isArray(structuredTypes) || !structuredTypes.includes(val))\n ) {\n const parent =\n /**\n * @type {import('jsdoc-type-pratt-parser').RootResult & {\n * _parent?: import('jsdoc-type-pratt-parser').NonRootResult\n * }}\n */ (nde)._parent;\n if (parent?.type === 'JsdocTypeTypeParameter') {\n return;\n }\n\n if (parent?.type === 'JsdocTypeFunction' &&\n /** @type {import('jsdoc-type-pratt-parser').FunctionResult} */\n (parent)?.typeParameters?.some((typeParam) => {\n return value === typeParam.name.value;\n })\n ) {\n return;\n }\n\n if (!disableReporting) {\n report(`The type '${val}' is undefined.`, null, tag);\n }\n } else if (markVariablesAsUsed && !extraTypes.includes(val)) {\n if (sourceCode.markVariableAsUsed) {\n sourceCode.markVariableAsUsed(val);\n /* c8 ignore next 4 */\n } else {\n // @ts-expect-error ESLint 8\n context.markVariableAsUsed(val);\n }\n }\n\n if (checkUsedTypedefs && typedefDeclarations.includes(val)) {\n foundTypedefValues.push(val);\n }\n }\n });\n }\n\n state.foundTypedefValues = foundTypedefValues;\n}, {\n // We use this method rather than checking at end of handler above because\n // in that case, it is invoked too many times and would thus report errors\n // too many times.\n exit ({\n context,\n state,\n utils,\n }) {\n const {\n checkUsedTypedefs = false,\n } = context.options[0] || {};\n\n if (!checkUsedTypedefs) {\n return;\n }\n\n const allComments = context.sourceCode.getAllComments();\n const comments = allComments\n .filter((comment) => {\n return (/^\\*(?!\\*)/v).test(comment.value);\n })\n .map((commentNode) => {\n return {\n doc: parseComment(commentNode, ''),\n loc: commentNode.loc,\n };\n });\n const typedefs = comments\n .flatMap(({\n doc,\n loc,\n }) => {\n const tags = doc.tags.filter(({\n tag,\n }) => {\n return utils.isNameOrNamepathDefiningTag(tag);\n });\n if (!tags.length) {\n return [];\n }\n\n return {\n loc,\n tags,\n };\n });\n\n for (const typedef of typedefs) {\n if (\n !state.foundTypedefValues.includes(typedef.tags[0].name)\n ) {\n context.report({\n loc: /** @type {import('@eslint/core').SourceLocation} */ (typedef.loc),\n message: 'This typedef was not used within the file',\n });\n }\n }\n },\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Besides some expected built-in types, prohibits any types not specified as globals or within `@typedef`.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/no-undefined-types.md#repos-sticky-header',\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n checkUsedTypedefs: {\n description: 'Whether to check typedefs for use within the file',\n type: 'boolean',\n },\n definedTypes: {\n description: `This array can be populated to indicate other types which\nare automatically considered as defined (in addition to globals, etc.).\nDefaults to an empty array.`,\n items: {\n type: 'string',\n },\n type: 'array',\n },\n disableReporting: {\n description: `Whether to disable reporting of errors. Defaults to\n\\`false\\`. This may be set to \\`true\\` in order to take advantage of only\nmarking defined variables as used or checking used typedefs.`,\n type: 'boolean',\n },\n markVariablesAsUsed: {\n description: `Whether to mark variables as used for the purposes\nof the \\`no-unused-vars\\` rule when they are not found to be undefined.\nDefaults to \\`true\\`. May be set to \\`false\\` to enforce a practice of not\nimporting types unless used in code.`,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"noUndefinedTypes.cjs","names":["_iterateJsdoc","_interopRequireWildcard","require","_jsdoccomment","_parseImportsExports","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","extraTypes","globalTypes","typescriptGlobals","stripPseudoTypes","str","replace","_default","exports","iterateJsdoc","context","node","report","settings","sourceCode","state","utils","foundTypedefValues","scopeManager","globalScope","checkUsedTypedefs","definedTypes","disableReporting","markVariablesAsUsed","options","definedPreferredTypes","mode","preferredTypes","structuredTags","keys","length","values","map","preferredType","undefined","reportSettings","replacement","filter","Boolean","allComments","getAllComments","comments","comment","test","value","commentNode","parseComment","globals","flatMap","trim","split","concat","languageOptions","typedefs","doc","tags","tag","isNameOrNamepathDefiningTag","includes","typedefDeclarations","name","importTags","description","type","typePart","imprt","importsExports","parseImportsExports","types","namedImports","push","names","namespaceImports","namespace","ancestorNodes","currentNode","parent","getTemplateTags","ancestorNode","getJSDocComment","jsdc","templateTags","getPresentTags","closureGenericTypes","parseClosureTemplateTag","cjsOrESMScope","childScopes","block","getValidRuntimeIdentifiers","scope","result","Set","scp","variables","add","upper","getNamespaceTypes","prefix","moduleDeclaration","body","item","declaration","id","prop","key","propName","nestedName","imports","closedTypes","allDefinedTypes","identifiers","globalItem","property","init","callee","methodOrProp","programBody","ast","statement","expression","left","object","getScope","tagToParsedType","propertyName","potentialType","parsedType","tryParseType","parseType","typeTags","filterTags","tagMightHaveTypePosition","namepathReferencingTags","isNamepathReferencingTag","namepathOrUrlReferencingTags","filterAllTags","isNamepathOrUrlReferencingTag","definedNamesAndNamepaths","tagsWithTypes","traverse","nde","parentNode","_parent","val","currNode","right","structuredTypes","rootNamespace","isNamespaceValid","Array","isArray","typeParameters","some","typeParam","markVariableAsUsed","exit","loc","typedef","message","iterateAllJsdocs","meta","docs","url","schema","additionalProperties","properties","items","module"],"sources":["../../src/rules/noUndefinedTypes.js"],"sourcesContent":["import iterateJsdoc, {\n parseComment,\n} from '../iterateJsdoc.js';\nimport {\n getJSDocComment,\n parse as parseType,\n traverse,\n tryParse as tryParseType,\n} from '@es-joy/jsdoccomment';\nimport {\n parseImportsExports,\n} from 'parse-imports-exports';\n\nconst extraTypes = [\n 'null', 'undefined', 'void', 'string', 'boolean', 'object',\n 'function', 'symbol',\n 'number', 'bigint', 'NaN', 'Infinity',\n 'any', '*', 'never', 'unknown', 'const',\n 'this', 'true', 'false',\n 'Array', 'Object', 'RegExp', 'Date', 'Function', 'Intl',\n];\n\nconst globalTypes = [\n 'globalThis', 'global', 'window', 'self',\n];\n\nconst typescriptGlobals = [\n // https://www.typescriptlang.org/docs/handbook/utility-types.html\n 'Awaited',\n 'Partial',\n 'Required',\n 'Readonly',\n 'Record',\n 'Pick',\n 'Omit',\n 'Exclude',\n 'Extract',\n 'NonNullable',\n 'Parameters',\n 'ConstructorParameters',\n 'ReturnType',\n 'InstanceType',\n 'ThisParameterType',\n 'OmitThisParameter',\n 'ThisType',\n 'Uppercase',\n 'Lowercase',\n 'Capitalize',\n 'Uncapitalize',\n];\n\n/**\n * @param {string|false|undefined} [str]\n * @returns {undefined|string|false}\n */\nconst stripPseudoTypes = (str) => {\n return str && str.replace(/(?:\\.|<>|\\.<>|\\[\\])$/v, '');\n};\n\nexport default iterateJsdoc(({\n context,\n node,\n report,\n settings,\n sourceCode,\n state,\n utils,\n}) => {\n /** @type {string[]} */\n const foundTypedefValues = [];\n\n const {\n scopeManager,\n } = sourceCode;\n\n // When is this ever `null`?\n const globalScope = /** @type {import('eslint').Scope.Scope} */ (\n scopeManager.globalScope\n );\n\n const\n /**\n * @type {{\n * checkUsedTypedefs: boolean\n * definedTypes: string[],\n * disableReporting: boolean,\n * markVariablesAsUsed: boolean,\n * }}\n */ {\n checkUsedTypedefs = false,\n definedTypes = [],\n disableReporting = false,\n markVariablesAsUsed = true,\n } = context.options[0] || {};\n\n /** @type {(string|undefined)[]} */\n let definedPreferredTypes = [];\n const {\n mode,\n preferredTypes,\n structuredTags,\n } = settings;\n if (Object.keys(preferredTypes).length) {\n definedPreferredTypes = /** @type {string[]} */ (Object.values(preferredTypes).map((preferredType) => {\n if (typeof preferredType === 'string') {\n // May become an empty string but will be filtered out below\n return stripPseudoTypes(preferredType);\n }\n\n if (!preferredType) {\n return undefined;\n }\n\n if (typeof preferredType !== 'object') {\n utils.reportSettings(\n 'Invalid `settings.jsdoc.preferredTypes`. Values must be falsy, a string, or an object.',\n );\n }\n\n return stripPseudoTypes(preferredType.replacement);\n })\n .filter(Boolean));\n }\n\n const allComments = sourceCode.getAllComments();\n const comments = allComments\n .filter((comment) => {\n return (/^\\*(?!\\*)/v).test(comment.value);\n })\n .map((commentNode) => {\n return parseComment(commentNode, '');\n });\n\n const globals = allComments\n .filter((comment) => {\n return (/^\\s*globals/v).test(comment.value);\n }).flatMap((commentNode) => {\n return commentNode.value.replace(/^\\s*globals/v, '').trim().split(/,\\s*/v);\n }).concat(Object.keys(context.languageOptions.globals ?? []));\n\n const typedefs = comments\n .flatMap((doc) => {\n return doc.tags.filter(({\n tag,\n }) => {\n return utils.isNameOrNamepathDefiningTag(tag) && ![\n 'arg',\n 'argument',\n 'param',\n 'prop',\n 'property',\n ].includes(tag);\n });\n });\n\n const typedefDeclarations = typedefs\n .map((tag) => {\n return tag.name;\n });\n\n const importTags = settings.mode === 'typescript' ? /** @type {string[]} */ (comments.flatMap((doc) => {\n return doc.tags.filter(({\n tag,\n }) => {\n return tag === 'import';\n });\n }).flatMap((tag) => {\n const {\n description,\n name,\n type,\n } = tag;\n const typePart = type ? `{${type}} ` : '';\n const imprt = 'import ' + (description ?\n `${typePart}${name} ${description}` :\n `${typePart}${name}`);\n\n const importsExports = parseImportsExports(imprt.trim());\n\n const types = [];\n const namedImports = Object.values(importsExports.namedImports || {})[0]?.[0];\n if (namedImports) {\n if (namedImports.default) {\n types.push(namedImports.default);\n }\n\n if (namedImports.names) {\n types.push(...Object.keys(namedImports.names));\n }\n }\n\n const namespaceImports = Object.values(importsExports.namespaceImports || {})[0]?.[0];\n if (namespaceImports) {\n if (namespaceImports.namespace) {\n types.push(namespaceImports.namespace);\n }\n\n if (namespaceImports.default) {\n types.push(namespaceImports.default);\n }\n }\n\n return types;\n }).filter(Boolean)) : [];\n\n const ancestorNodes = [];\n\n let currentNode = node;\n // No need for Program node?\n while (currentNode?.parent) {\n ancestorNodes.push(currentNode);\n currentNode = currentNode.parent;\n }\n\n /**\n * @param {import('eslint').Rule.Node} ancestorNode\n * @returns {import('comment-parser').Spec[]}\n */\n const getTemplateTags = function (ancestorNode) {\n const commentNode = getJSDocComment(sourceCode, ancestorNode, settings);\n if (!commentNode) {\n return [];\n }\n\n const jsdc = parseComment(commentNode, '');\n\n return jsdc.tags.filter((tag) => {\n return tag.tag === 'template';\n });\n };\n\n // `currentScope` may be `null` or `Program`, so in such a case,\n // we look to present tags instead\n const templateTags = ancestorNodes.length ?\n ancestorNodes.flatMap((ancestorNode) => {\n return getTemplateTags(ancestorNode);\n }) :\n utils.getPresentTags([\n 'template',\n ]);\n\n const closureGenericTypes = templateTags.flatMap((tag) => {\n return utils.parseClosureTemplateTag(tag);\n });\n\n // In modules, including Node, there is a global scope at top with the\n // Program scope inside\n const cjsOrESMScope = globalScope.childScopes[0]?.block?.type === 'Program';\n\n /**\n * @param {import(\"eslint\").Scope.Scope | null} scope\n * @returns {Set<string>}\n */\n const getValidRuntimeIdentifiers = (scope) => {\n const result = new Set();\n\n let scp = scope;\n while (scp) {\n for (const {\n name,\n } of scp.variables) {\n result.add(name);\n }\n\n scp = scp.upper;\n }\n\n return result;\n };\n\n /**\n * Recursively extracts types from a namespace declaration.\n * @param {string} prefix - The namespace prefix (e.g., \"MyNamespace\" or \"Outer.Inner\").\n * @param {import('@typescript-eslint/types').TSESTree.TSModuleDeclaration} moduleDeclaration - The module declaration node.\n * @returns {string[]} Array of fully qualified type names.\n */\n const getNamespaceTypes = (prefix, moduleDeclaration) => {\n /* c8 ignore next 3 -- Guard for ambient modules without body. */\n if (!moduleDeclaration.body || moduleDeclaration.body.type !== 'TSModuleBlock') {\n return [];\n }\n\n return moduleDeclaration.body.body.flatMap((item) => {\n /** @type {import('@typescript-eslint/types').TSESTree.ProgramStatement | import('@typescript-eslint/types').TSESTree.NamedExportDeclarations | null} */\n let declaration = item;\n\n if (item.type === 'ExportNamedDeclaration' && item.declaration) {\n declaration = item.declaration;\n }\n\n if (declaration.type === 'TSTypeAliasDeclaration' || declaration.type === 'ClassDeclaration') {\n /* c8 ignore next 4 -- Guard for anonymous class declarations. */\n if (!declaration.id) {\n return [];\n }\n\n return [\n `${prefix}.${declaration.id.name}`,\n ];\n }\n\n if (declaration.type === 'TSInterfaceDeclaration') {\n return [\n `${prefix}.${declaration.id.name}`,\n ...declaration.body.body.map((prop) => {\n // Only `TSPropertySignature` and `TSMethodSignature` have 'key'.\n if (prop.type !== 'TSPropertySignature' && prop.type !== 'TSMethodSignature') {\n return '';\n }\n\n // Key can be computed or a literal, only handle Identifier.\n if (prop.key.type !== 'Identifier') {\n return '';\n }\n\n const propName = prop.key.name;\n /* c8 ignore next -- `propName` is always truthy for Identifiers. */\n return propName ? `${prefix}.${declaration.id.name}.${propName}` : '';\n }).filter(Boolean),\n ];\n }\n\n // Handle nested namespaces.\n if (declaration.type === 'TSModuleDeclaration') {\n /* c8 ignore next -- Nested string-literal modules aren't valid TS syntax. */\n const nestedName = declaration.id?.type === 'Identifier' ? declaration.id.name : '';\n /* c8 ignore next 3 -- Guard. */\n if (!nestedName) {\n return [];\n }\n\n return [\n `${prefix}.${nestedName}`,\n ...getNamespaceTypes(`${prefix}.${nestedName}`, declaration),\n ];\n }\n\n // Fallback for unhandled declaration types (e.g., TSEnumDeclaration, FunctionDeclaration, etc.).\n return [];\n });\n };\n\n /**\n * We treat imports differently as we can't introspect their children.\n * @type {string[]}\n */\n const imports = [];\n\n /** @type {Set<string>} */\n const closedTypes = new Set();\n\n const allDefinedTypes = new Set(globalScope.variables.map(({\n name,\n }) => {\n return name;\n })\n\n // If the file is a module, concat the variables from the module scope.\n .concat(\n cjsOrESMScope ?\n globalScope.childScopes.flatMap(({\n variables,\n }) => {\n return variables;\n }).flatMap(({\n identifiers,\n name,\n }) => {\n const globalItem = /** @type {import('estree').Identifier & {parent: import('@typescript-eslint/types').TSESTree.Node}} */ (\n identifiers?.[0]\n )?.parent;\n switch (globalItem?.type) {\n case 'ClassDeclaration':\n closedTypes.add(name);\n return [\n name,\n ...globalItem.body.body.map((item) => {\n const property = /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n /** @type {import('@typescript-eslint/types').TSESTree.PropertyDefinition} */ (\n item)?.key)?.name;\n /* c8 ignore next 3 -- Guard */\n if (!property) {\n return '';\n }\n\n return `${name}.${property}`;\n }).filter(Boolean),\n ];\n case 'ImportDefaultSpecifier':\n case 'ImportNamespaceSpecifier':\n case 'ImportSpecifier':\n imports.push(name);\n break;\n case 'TSInterfaceDeclaration':\n return [\n name,\n ...globalItem.body.body.map((item) => {\n const property = /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n /** @type {import('@typescript-eslint/types').TSESTree.TSPropertySignature} */ (\n item)?.key)?.name;\n /* c8 ignore next 3 -- Guard */\n if (!property) {\n return '';\n }\n\n return `${name}.${property}`;\n }).filter(Boolean),\n ];\n case 'TSModuleDeclaration':\n closedTypes.add(name);\n return [\n name,\n ...getNamespaceTypes(name, globalItem),\n ];\n case 'VariableDeclarator':\n if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n /** @type {import('@typescript-eslint/types').TSESTree.CallExpression} */ (\n globalItem?.init\n )?.callee)?.name === 'require'\n ) {\n imports.push(/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n globalItem.id\n ).name);\n break;\n }\n\n // Module scope names are also defined\n return [\n name,\n ];\n }\n\n return [\n name,\n ];\n /* c8 ignore next */\n }) : [],\n )\n .concat(extraTypes)\n .concat(typedefDeclarations)\n .concat(importTags)\n .concat(definedTypes)\n .concat(/** @type {string[]} */ (definedPreferredTypes))\n .concat((() => {\n // Other methods are not in scope, but we need them, and we grab them here\n if (node?.type === 'MethodDefinition') {\n return /** @type {import('estree').ClassBody} */ (node.parent).body.flatMap((methodOrProp) => {\n if (methodOrProp.type === 'MethodDefinition') {\n // eslint-disable-next-line unicorn/no-lonely-if -- Pattern\n if (methodOrProp.key.type === 'Identifier') {\n return [\n methodOrProp.key.name,\n `${/** @type {import('estree').ClassDeclaration} */ (\n node.parent?.parent\n )?.id?.name}.${methodOrProp.key.name}`,\n ];\n }\n }\n\n if (methodOrProp.type === 'PropertyDefinition') {\n // eslint-disable-next-line unicorn/no-lonely-if -- Pattern\n if (methodOrProp.key.type === 'Identifier') {\n return [\n methodOrProp.key.name,\n `${/** @type {import('estree').ClassDeclaration} */ (\n node.parent?.parent\n )?.id?.name}.${methodOrProp.key.name}`,\n ];\n }\n }\n /* c8 ignore next 2 -- Not yet built */\n\n return '';\n }).filter(Boolean);\n }\n\n return [];\n })())\n .concat((() => {\n // Detect static property assignments like `MyClass.Prop = ...`\n const programBody = /** @type {import('@typescript-eslint/types').TSESTree.Program} */ (\n sourceCode.ast\n ).body;\n\n return programBody.flatMap((statement) => {\n if (\n statement.type === 'ExpressionStatement' &&\n statement.expression.type === 'AssignmentExpression' &&\n statement.expression.left.type === 'MemberExpression' &&\n statement.expression.left.object.type === 'Identifier' &&\n statement.expression.left.property.type === 'Identifier' &&\n closedTypes.has(statement.expression.left.object.name)\n ) {\n return [\n `${statement.expression.left.object.name}.${statement.expression.left.property.name}`,\n ];\n }\n\n return [];\n });\n })())\n .concat(...getValidRuntimeIdentifiers(node && (\n (sourceCode.getScope &&\n /* c8 ignore next 3 */\n sourceCode.getScope(node)) ||\n // @ts-expect-error ESLint 8\n context.getScope()\n )))\n .concat(\n settings.mode === 'jsdoc' ?\n [] :\n [\n ...settings.mode === 'typescript' ? typescriptGlobals : [],\n ...closureGenericTypes,\n ],\n ));\n\n /**\n * @typedef {{\n * parsedType: import('jsdoc-type-pratt-parser').RootResult;\n * tag: import('comment-parser').Spec|import('@es-joy/jsdoccomment').JsdocInlineTagNoType & {\n * line?: import('../iterateJsdoc.js').Integer\n * }\n * }} TypeAndTagInfo\n */\n\n /**\n * @param {string} propertyName\n * @returns {(tag: (import('@es-joy/jsdoccomment').JsdocInlineTagNoType & {\n * name?: string,\n * type?: string,\n * line?: import('../iterateJsdoc.js').Integer\n * })|import('comment-parser').Spec & {\n * namepathOrURL?: string\n * }\n * ) => undefined|TypeAndTagInfo}\n */\n const tagToParsedType = (propertyName) => {\n return (tag) => {\n try {\n const potentialType = tag[\n /** @type {\"type\"|\"name\"|\"namepathOrURL\"} */ (propertyName)\n ];\n return {\n parsedType: mode === 'permissive' ?\n tryParseType(/** @type {string} */ (potentialType)) :\n parseType(/** @type {string} */ (potentialType), mode),\n tag,\n };\n } catch {\n return undefined;\n }\n };\n };\n\n const typeTags = utils.filterTags(({\n tag,\n }) => {\n return tag !== 'import' && utils.tagMightHaveTypePosition(tag) && (tag !== 'suppress' || settings.mode !== 'closure');\n }).map(tagToParsedType('type'));\n\n const namepathReferencingTags = utils.filterTags(({\n tag,\n }) => {\n return utils.isNamepathReferencingTag(tag);\n }).map(tagToParsedType('name'));\n\n const namepathOrUrlReferencingTags = utils.filterAllTags(({\n tag,\n }) => {\n return utils.isNamepathOrUrlReferencingTag(tag);\n }).map(tagToParsedType('namepathOrURL'));\n\n const definedNamesAndNamepaths = new Set(utils.filterTags(({\n tag,\n }) => {\n return utils.isNameOrNamepathDefiningTag(tag);\n }).map(({\n name,\n }) => {\n return name;\n }));\n\n const tagsWithTypes = /** @type {TypeAndTagInfo[]} */ ([\n ...typeTags,\n ...namepathReferencingTags,\n ...namepathOrUrlReferencingTags,\n // Remove types which failed to parse\n ].filter(Boolean));\n\n for (const {\n parsedType,\n tag,\n } of tagsWithTypes) {\n // eslint-disable-next-line complexity -- Refactor\n traverse(parsedType, (nde, parentNode) => {\n /**\n * @type {import('jsdoc-type-pratt-parser').NameResult & {\n * _parent?: import('jsdoc-type-pratt-parser').NonRootResult\n * }}\n */\n // eslint-disable-next-line canonical/id-match -- Avoid clashes\n (nde)._parent = parentNode;\n const {\n type,\n value,\n } = /** @type {import('jsdoc-type-pratt-parser').NameResult} */ (nde);\n\n let val = value;\n\n /** @type {import('jsdoc-type-pratt-parser').NonRootResult|undefined} */\n let currNode = nde;\n do {\n currNode =\n /**\n * @type {import('jsdoc-type-pratt-parser').NameResult & {\n * _parent?: import('jsdoc-type-pratt-parser').NonRootResult\n * }}\n */ (currNode)._parent;\n if (\n // Avoid appending for imports and globals since we don't want to\n // check their properties which may or may not exist\n !imports.includes(val) && !globals.includes(val) &&\n !importTags.includes(val) &&\n !extraTypes.includes(val) &&\n !typedefDeclarations.includes(val) &&\n !globalTypes.includes(val) &&\n currNode && 'right' in currNode &&\n currNode.right?.type === 'JsdocTypeProperty'\n ) {\n val = val + '.' + currNode.right.value;\n }\n } while (currNode?.type === 'JsdocTypeNamePath');\n\n if (type === 'JsdocTypeName') {\n const structuredTypes = structuredTags[tag.tag]?.type;\n const rootNamespace = val.split('.')[0];\n const isNamespaceValid = (definedTypes.includes(rootNamespace) || allDefinedTypes.has(rootNamespace)) &&\n !closedTypes.has(rootNamespace);\n\n if (!allDefinedTypes.has(val) &&\n !definedNamesAndNamepaths.has(val) &&\n (!Array.isArray(structuredTypes) || !structuredTypes.includes(val)) && !isNamespaceValid\n ) {\n const parent =\n /**\n * @type {import('jsdoc-type-pratt-parser').RootResult & {\n * _parent?: import('jsdoc-type-pratt-parser').NonRootResult\n * }}\n */ (nde)._parent;\n if (parent?.type === 'JsdocTypeTypeParameter') {\n return;\n }\n\n if (parent?.type === 'JsdocTypeFunction' &&\n /** @type {import('jsdoc-type-pratt-parser').FunctionResult} */\n (parent)?.typeParameters?.some((typeParam) => {\n return value === typeParam.name.value;\n })\n ) {\n return;\n }\n\n if (!disableReporting) {\n report(`The type '${val}' is undefined.`, null, tag);\n }\n } else if (markVariablesAsUsed && !extraTypes.includes(val)) {\n if (sourceCode.markVariableAsUsed) {\n sourceCode.markVariableAsUsed(val);\n /* c8 ignore next 4 */\n } else {\n // @ts-expect-error ESLint 8\n context.markVariableAsUsed(val);\n }\n }\n\n if (checkUsedTypedefs && typedefDeclarations.includes(val)) {\n foundTypedefValues.push(val);\n }\n }\n });\n }\n\n state.foundTypedefValues = foundTypedefValues;\n}, {\n // We use this method rather than checking at end of handler above because\n // in that case, it is invoked too many times and would thus report errors\n // too many times.\n exit ({\n context,\n state,\n utils,\n }) {\n const {\n checkUsedTypedefs = false,\n } = context.options[0] || {};\n\n if (!checkUsedTypedefs) {\n return;\n }\n\n const allComments = context.sourceCode.getAllComments();\n const comments = allComments\n .filter((comment) => {\n return (/^\\*(?!\\*)/v).test(comment.value);\n })\n .map((commentNode) => {\n return {\n doc: parseComment(commentNode, ''),\n loc: commentNode.loc,\n };\n });\n const typedefs = comments\n .flatMap(({\n doc,\n loc,\n }) => {\n const tags = doc.tags.filter(({\n tag,\n }) => {\n return utils.isNameOrNamepathDefiningTag(tag);\n });\n if (!tags.length) {\n return [];\n }\n\n return {\n loc,\n tags,\n };\n });\n\n for (const typedef of typedefs) {\n if (\n !state.foundTypedefValues.includes(typedef.tags[0].name)\n ) {\n context.report({\n loc: /** @type {import('@eslint/core').SourceLocation} */ (typedef.loc),\n message: 'This typedef was not used within the file',\n });\n }\n }\n },\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Besides some expected built-in types, prohibits any types not specified as globals or within `@typedef`.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/no-undefined-types.md#repos-sticky-header',\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n checkUsedTypedefs: {\n description: 'Whether to check typedefs for use within the file',\n type: 'boolean',\n },\n definedTypes: {\n description: `This array can be populated to indicate other types which\nare automatically considered as defined (in addition to globals, etc.).\nDefaults to an empty array.`,\n items: {\n type: 'string',\n },\n type: 'array',\n },\n disableReporting: {\n description: `Whether to disable reporting of errors. Defaults to\n\\`false\\`. This may be set to \\`true\\` in order to take advantage of only\nmarking defined variables as used or checking used typedefs.`,\n type: 'boolean',\n },\n markVariablesAsUsed: {\n description: `Whether to mark variables as used for the purposes\nof the \\`no-unused-vars\\` rule when they are not found to be undefined.\nDefaults to \\`true\\`. May be set to \\`false\\` to enforce a practice of not\nimporting types unless used in code.`,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -5,10 +5,10 @@
5
5
  "url": "http://gajus.com"
6
6
  },
7
7
  "dependencies": {
8
- "@es-joy/jsdoccomment": "~0.79.0",
8
+ "@es-joy/jsdoccomment": "~0.81.0",
9
9
  "@es-joy/resolve.exports": "1.2.0",
10
10
  "are-docs-informative": "^0.0.2",
11
- "comment-parser": "1.4.1",
11
+ "comment-parser": "1.4.4",
12
12
  "debug": "^4.4.3",
13
13
  "escape-string-regexp": "^4.0.0",
14
14
  "espree": "^11.0.0",
@@ -23,15 +23,15 @@
23
23
  "description": "JSDoc linting rules for ESLint.",
24
24
  "devDependencies": {
25
25
  "@arethetypeswrong/cli": "^0.18.2",
26
- "@babel/cli": "^7.28.3",
27
- "@babel/core": "^7.28.5",
28
- "@babel/eslint-parser": "^7.28.5",
26
+ "@babel/cli": "^7.28.6",
27
+ "@babel/core": "^7.28.6",
28
+ "@babel/eslint-parser": "^7.28.6",
29
29
  "@babel/plugin-syntax-class-properties": "^7.12.13",
30
30
  "@babel/plugin-transform-flow-strip-types": "^7.27.1",
31
- "@babel/preset-env": "^7.28.5",
31
+ "@babel/preset-env": "^7.28.6",
32
32
  "@es-joy/escodegen": "^4.2.0",
33
33
  "@es-joy/jsdoc-eslint-parser": "^0.27.0",
34
- "@eslint/core": "^1.0.0",
34
+ "@eslint/core": "^1.0.1",
35
35
  "@hkdobrev/run-if-changed": "^0.6.3",
36
36
  "@rollup/plugin-node-resolve": "^16.0.3",
37
37
  "@semantic-release/commit-analyzer": "^13.0.1",
@@ -44,10 +44,10 @@
44
44
  "@types/estree": "^1.0.8",
45
45
  "@types/json-schema": "^7.0.15",
46
46
  "@types/mocha": "^10.0.10",
47
- "@types/node": "^25.0.3",
47
+ "@types/node": "^25.0.9",
48
48
  "@types/semver": "^7.7.1",
49
49
  "@types/spdx-expression-parse": "^3.0.5",
50
- "@typescript-eslint/types": "^8.52.0",
50
+ "@typescript-eslint/types": "^8.53.0",
51
51
  "babel-plugin-add-module-exports": "^1.0.4",
52
52
  "babel-plugin-istanbul": "^7.0.1",
53
53
  "babel-plugin-transform-import-meta": "^2.3.3",
@@ -56,7 +56,7 @@
56
56
  "chai": "^6.2.2",
57
57
  "decamelize": "^6.0.1",
58
58
  "eslint": "9.39.2",
59
- "eslint-config-canonical": "^47.3.7",
59
+ "eslint-config-canonical": "^47.3.8",
60
60
  "gitdown": "^4.1.1",
61
61
  "glob": "^13.0.0",
62
62
  "globals": "^17.0.0",
@@ -75,7 +75,7 @@
75
75
  "sinon": "^21.0.1",
76
76
  "ts-api-utils": "^2.4.0",
77
77
  "typescript": "5.9.3",
78
- "typescript-eslint": "^8.52.0"
78
+ "typescript-eslint": "^8.53.0"
79
79
  },
80
80
  "engines": {
81
81
  "node": "^20.19.0 || ^22.13.0 || >=24"
@@ -192,5 +192,5 @@
192
192
  "test-cov": "TIMING=1 c8 --reporter text pnpm run test-no-cov",
193
193
  "test-index": "pnpm run test-no-cov test/rules/index.js"
194
194
  },
195
- "version": "62.0.1"
195
+ "version": "62.2.0"
196
196
  }
@@ -268,12 +268,87 @@ export default iterateJsdoc(({
268
268
  return result;
269
269
  };
270
270
 
271
+ /**
272
+ * Recursively extracts types from a namespace declaration.
273
+ * @param {string} prefix - The namespace prefix (e.g., "MyNamespace" or "Outer.Inner").
274
+ * @param {import('@typescript-eslint/types').TSESTree.TSModuleDeclaration} moduleDeclaration - The module declaration node.
275
+ * @returns {string[]} Array of fully qualified type names.
276
+ */
277
+ const getNamespaceTypes = (prefix, moduleDeclaration) => {
278
+ /* c8 ignore next 3 -- Guard for ambient modules without body. */
279
+ if (!moduleDeclaration.body || moduleDeclaration.body.type !== 'TSModuleBlock') {
280
+ return [];
281
+ }
282
+
283
+ return moduleDeclaration.body.body.flatMap((item) => {
284
+ /** @type {import('@typescript-eslint/types').TSESTree.ProgramStatement | import('@typescript-eslint/types').TSESTree.NamedExportDeclarations | null} */
285
+ let declaration = item;
286
+
287
+ if (item.type === 'ExportNamedDeclaration' && item.declaration) {
288
+ declaration = item.declaration;
289
+ }
290
+
291
+ if (declaration.type === 'TSTypeAliasDeclaration' || declaration.type === 'ClassDeclaration') {
292
+ /* c8 ignore next 4 -- Guard for anonymous class declarations. */
293
+ if (!declaration.id) {
294
+ return [];
295
+ }
296
+
297
+ return [
298
+ `${prefix}.${declaration.id.name}`,
299
+ ];
300
+ }
301
+
302
+ if (declaration.type === 'TSInterfaceDeclaration') {
303
+ return [
304
+ `${prefix}.${declaration.id.name}`,
305
+ ...declaration.body.body.map((prop) => {
306
+ // Only `TSPropertySignature` and `TSMethodSignature` have 'key'.
307
+ if (prop.type !== 'TSPropertySignature' && prop.type !== 'TSMethodSignature') {
308
+ return '';
309
+ }
310
+
311
+ // Key can be computed or a literal, only handle Identifier.
312
+ if (prop.key.type !== 'Identifier') {
313
+ return '';
314
+ }
315
+
316
+ const propName = prop.key.name;
317
+ /* c8 ignore next -- `propName` is always truthy for Identifiers. */
318
+ return propName ? `${prefix}.${declaration.id.name}.${propName}` : '';
319
+ }).filter(Boolean),
320
+ ];
321
+ }
322
+
323
+ // Handle nested namespaces.
324
+ if (declaration.type === 'TSModuleDeclaration') {
325
+ /* c8 ignore next -- Nested string-literal modules aren't valid TS syntax. */
326
+ const nestedName = declaration.id?.type === 'Identifier' ? declaration.id.name : '';
327
+ /* c8 ignore next 3 -- Guard. */
328
+ if (!nestedName) {
329
+ return [];
330
+ }
331
+
332
+ return [
333
+ `${prefix}.${nestedName}`,
334
+ ...getNamespaceTypes(`${prefix}.${nestedName}`, declaration),
335
+ ];
336
+ }
337
+
338
+ // Fallback for unhandled declaration types (e.g., TSEnumDeclaration, FunctionDeclaration, etc.).
339
+ return [];
340
+ });
341
+ };
342
+
271
343
  /**
272
344
  * We treat imports differently as we can't introspect their children.
273
345
  * @type {string[]}
274
346
  */
275
347
  const imports = [];
276
348
 
349
+ /** @type {Set<string>} */
350
+ const closedTypes = new Set();
351
+
277
352
  const allDefinedTypes = new Set(globalScope.variables.map(({
278
353
  name,
279
354
  }) => {
@@ -296,6 +371,7 @@ export default iterateJsdoc(({
296
371
  )?.parent;
297
372
  switch (globalItem?.type) {
298
373
  case 'ClassDeclaration':
374
+ closedTypes.add(name);
299
375
  return [
300
376
  name,
301
377
  ...globalItem.body.body.map((item) => {
@@ -330,6 +406,12 @@ export default iterateJsdoc(({
330
406
  return `${name}.${property}`;
331
407
  }).filter(Boolean),
332
408
  ];
409
+ case 'TSModuleDeclaration':
410
+ closedTypes.add(name);
411
+ return [
412
+ name,
413
+ ...getNamespaceTypes(name, globalItem),
414
+ ];
333
415
  case 'VariableDeclarator':
334
416
  if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (
335
417
  /** @type {import('@typescript-eslint/types').TSESTree.CallExpression} */ (
@@ -394,6 +476,29 @@ export default iterateJsdoc(({
394
476
 
395
477
  return [];
396
478
  })())
479
+ .concat((() => {
480
+ // Detect static property assignments like `MyClass.Prop = ...`
481
+ const programBody = /** @type {import('@typescript-eslint/types').TSESTree.Program} */ (
482
+ sourceCode.ast
483
+ ).body;
484
+
485
+ return programBody.flatMap((statement) => {
486
+ if (
487
+ statement.type === 'ExpressionStatement' &&
488
+ statement.expression.type === 'AssignmentExpression' &&
489
+ statement.expression.left.type === 'MemberExpression' &&
490
+ statement.expression.left.object.type === 'Identifier' &&
491
+ statement.expression.left.property.type === 'Identifier' &&
492
+ closedTypes.has(statement.expression.left.object.name)
493
+ ) {
494
+ return [
495
+ `${statement.expression.left.object.name}.${statement.expression.left.property.name}`,
496
+ ];
497
+ }
498
+
499
+ return [];
500
+ });
501
+ })())
397
502
  .concat(...getValidRuntimeIdentifiers(node && (
398
503
  (sourceCode.getScope &&
399
504
  /* c8 ignore next 3 */
@@ -529,9 +634,13 @@ export default iterateJsdoc(({
529
634
 
530
635
  if (type === 'JsdocTypeName') {
531
636
  const structuredTypes = structuredTags[tag.tag]?.type;
637
+ const rootNamespace = val.split('.')[0];
638
+ const isNamespaceValid = (definedTypes.includes(rootNamespace) || allDefinedTypes.has(rootNamespace)) &&
639
+ !closedTypes.has(rootNamespace);
640
+
532
641
  if (!allDefinedTypes.has(val) &&
533
642
  !definedNamesAndNamepaths.has(val) &&
534
- (!Array.isArray(structuredTypes) || !structuredTypes.includes(val))
643
+ (!Array.isArray(structuredTypes) || !structuredTypes.includes(val)) && !isNamespaceValid
535
644
  ) {
536
645
  const parent =
537
646
  /**