eslint-plugin-jsdoc 37.5.0 → 37.5.1

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.
package/README.md CHANGED
@@ -9896,12 +9896,64 @@ function quux(foo) {
9896
9896
 
9897
9897
  }
9898
9898
 
9899
+ /**
9900
+ * @template T
9901
+ * @param {T} arg
9902
+ * @returns {[T]}
9903
+ */
9904
+ function genericFunctionExample(arg) {
9905
+ const result = /** @type {[T]} */ (new Array());
9906
+ result[0] = arg;
9907
+ return result;
9908
+ }
9909
+ // Settings: {"jsdoc":{"mode":"closure"}}
9910
+
9911
+ /** @typedef QDigestNode */
9912
+ class A {
9913
+ /**
9914
+ * @template {object} T
9915
+ * @param {(node: QDigestNode) => T} callback
9916
+ * @returns {T[]}
9917
+ */
9918
+ map(callback) {
9919
+ /** @type {T[]} */
9920
+ let vals;
9921
+ return vals;
9922
+ }
9923
+ }
9924
+ // Settings: {"jsdoc":{"mode":"typescript"}}
9925
+
9926
+ /**
9927
+ * @template T
9928
+ * @param {T} arg
9929
+ */
9930
+ function example(arg) {
9931
+
9932
+ /** @param {T} */
9933
+ function inner(x) {
9934
+ }
9935
+ }
9936
+ // Settings: {"jsdoc":{"mode":"typescript"}}
9937
+
9899
9938
  /**
9900
9939
  * @suppress {visibility}
9901
9940
  */
9902
9941
  function foo () {
9903
9942
  }
9904
9943
  // Settings: {"jsdoc":{"mode":"closure"}}
9944
+
9945
+ /**
9946
+ * @template T
9947
+ */
9948
+ export class Foo {
9949
+ // cast to T
9950
+ getType() {
9951
+ const x = "hello";
9952
+ const y = /** @type {T} */ (x);
9953
+ return y;
9954
+ }
9955
+ }
9956
+ // Settings: {"jsdoc":{"mode":"typescript"}}
9905
9957
  ````
9906
9958
 
9907
9959
 
@@ -86,16 +86,16 @@ var _default = (0, _iterateJsdoc.default)(({
86
86
  return tag.name;
87
87
  });
88
88
  const ancestorNodes = [];
89
- let currentScope = scopeManager.acquire(node);
89
+ let currentNode = node; // No need for Program node?
90
90
 
91
- while (currentScope && currentScope.block.type !== 'Program') {
92
- ancestorNodes.push(currentScope.block);
93
- currentScope = currentScope.upper;
94
- } // `currentScope` may be `null` or `Program`, so in such a case,
95
- // we look to present tags instead
91
+ while ((_currentNode = currentNode) !== null && _currentNode !== void 0 && _currentNode.parent) {
92
+ var _currentNode;
96
93
 
94
+ ancestorNodes.push(currentNode);
95
+ currentNode = currentNode.parent;
96
+ }
97
97
 
98
- let templateTags = ancestorNodes.length ? ancestorNodes.flatMap(ancestorNode => {
98
+ const getTemplateTags = function (ancestorNode) {
99
99
  const commentNode = (0, _jsdoccomment.getJSDocComment)(sourceCode, ancestorNode, settings);
100
100
 
101
101
  if (!commentNode) {
@@ -106,17 +106,13 @@ var _default = (0, _iterateJsdoc.default)(({
106
106
  return _jsdocUtils.default.filterTags(jsdoc.tags, tag => {
107
107
  return tag.tag === 'template';
108
108
  });
109
- }) : utils.getPresentTags('template');
110
- const classJsdoc = utils.getClassJsdoc();
109
+ }; // `currentScope` may be `null` or `Program`, so in such a case,
110
+ // we look to present tags instead
111
111
 
112
- if (classJsdoc !== null && classJsdoc !== void 0 && classJsdoc.tags) {
113
- templateTags = templateTags.concat(classJsdoc.tags.filter(({
114
- tag
115
- }) => {
116
- return tag === 'template';
117
- }));
118
- }
119
112
 
113
+ const templateTags = ancestorNodes.length ? ancestorNodes.flatMap(ancestorNode => {
114
+ return getTemplateTags(ancestorNode);
115
+ }) : utils.getPresentTags('template');
120
116
  const closureGenericTypes = templateTags.flatMap(tag => {
121
117
  return utils.parseClosureTemplateTag(tag);
122
118
  }); // In modules, including Node, there is a global scope at top with the
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/rules/noUndefinedTypes.js"],"names":["extraTypes","stripPseudoTypes","str","replace","context","node","report","settings","sourceCode","utils","scopeManager","globalScope","definedTypes","options","definedPreferredTypes","preferredTypes","structuredTags","mode","Object","keys","length","values","map","preferredType","undefined","reportSettings","replacement","filter","typedefDeclarations","getAllComments","comment","value","startsWith","commentNode","flatMap","doc","tags","tag","isNamepathDefiningTag","name","ancestorNodes","currentScope","acquire","block","type","push","upper","templateTags","ancestorNode","jsdoc","jsdocUtils","filterTags","getPresentTags","classJsdoc","getClassJsdoc","concat","closureGenericTypes","parseClosureTemplateTag","cjsOrESMScope","childScopes","allDefinedTypes","Set","variables","jsdocTagsWithPossibleType","tagMightHaveTypePosition","parsedType","structuredTypes","has","Array","isArray","includes","markVariableAsUsed","iterateAllJsdocs","meta","docs","description","url","schema","additionalProperties","properties","items"],"mappings":"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","sourcesContent":["import {\n getJSDocComment,\n} from '@es-joy/jsdoccomment';\nimport {\n traverse,\n parse as parseType,\n tryParse as tryParseType,\n} from 'jsdoc-type-pratt-parser';\nimport iterateJsdoc, {\n parseComment,\n} from '../iterateJsdoc';\nimport jsdocUtils from '../jsdocUtils';\n\nconst extraTypes = [\n 'null', 'undefined', 'void', 'string', 'boolean', 'object',\n 'function', 'symbol',\n 'number', 'bigint', 'NaN', 'Infinity',\n 'any', '*', 'never',\n 'this', 'true', 'false',\n 'Array', 'Object', 'RegExp', 'Date', 'Function',\n];\n\nconst stripPseudoTypes = (str) => {\n return str && str.replace(/(?:\\.|<>|\\.<>|\\[\\])$/u, '');\n};\n\nexport default iterateJsdoc(({\n context,\n node,\n report,\n settings,\n sourceCode,\n utils,\n}) => {\n const {\n scopeManager,\n } = sourceCode;\n const {\n globalScope,\n } = scopeManager;\n\n const {\n definedTypes = [],\n } = context.options[0] || {};\n\n let definedPreferredTypes = [];\n const {\n preferredTypes,\n structuredTags,\n mode,\n } = settings;\n if (Object.keys(preferredTypes).length) {\n definedPreferredTypes = 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((preferredType) => {\n return preferredType;\n });\n }\n\n const typedefDeclarations = context.getAllComments()\n .filter((comment) => {\n return comment.value.startsWith('*');\n })\n .map((commentNode) => {\n return parseComment(commentNode, '');\n })\n .flatMap((doc) => {\n return doc.tags.filter(({\n tag,\n }) => {\n return utils.isNamepathDefiningTag(tag);\n });\n })\n .map((tag) => {\n return tag.name;\n });\n\n const ancestorNodes = [];\n let currentScope = scopeManager.acquire(node);\n\n while (currentScope && currentScope.block.type !== 'Program') {\n ancestorNodes.push(currentScope.block);\n currentScope = currentScope.upper;\n }\n\n // `currentScope` may be `null` or `Program`, so in such a case,\n // we look to present tags instead\n let templateTags = ancestorNodes.length ?\n ancestorNodes.flatMap((ancestorNode) => {\n const commentNode = getJSDocComment(sourceCode, ancestorNode, settings);\n if (!commentNode) {\n return [];\n }\n\n const jsdoc = parseComment(commentNode, '');\n\n return jsdocUtils.filterTags(jsdoc.tags, (tag) => {\n return tag.tag === 'template';\n });\n }) :\n utils.getPresentTags('template');\n\n const classJsdoc = utils.getClassJsdoc();\n if (classJsdoc?.tags) {\n templateTags = templateTags.concat(\n classJsdoc.tags\n .filter(({\n tag,\n }) => {\n return tag === 'template';\n }),\n );\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 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 }).map(({\n name,\n }) => {\n return name;\n }) : [],\n )\n .concat(extraTypes)\n .concat(typedefDeclarations)\n .concat(definedTypes)\n .concat(definedPreferredTypes)\n .concat(settings.mode === 'jsdoc' ? [] : closureGenericTypes));\n\n const jsdocTagsWithPossibleType = utils.filterTags(({\n tag,\n }) => {\n return utils.tagMightHaveTypePosition(tag) && (tag !== 'suppress' || settings.mode !== 'closure');\n });\n\n for (const tag of jsdocTagsWithPossibleType) {\n let parsedType;\n\n try {\n parsedType = mode === 'permissive' ? tryParseType(tag.type) : parseType(tag.type, mode);\n } catch {\n // On syntax error, will be handled by valid-types.\n continue;\n }\n\n traverse(parsedType, ({\n type,\n value,\n }) => {\n if (type === 'JsdocTypeName') {\n const structuredTypes = structuredTags[tag.tag]?.type;\n if (!allDefinedTypes.has(value) &&\n (!Array.isArray(structuredTypes) || !structuredTypes.includes(value))\n ) {\n report(`The type '${value}' is undefined.`, null, tag);\n } else if (!extraTypes.includes(value)) {\n context.markVariableAsUsed(value);\n }\n }\n });\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Checks that types in jsdoc comments are defined.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-no-undefined-types',\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n definedTypes: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"file":"noUndefinedTypes.js"}
1
+ {"version":3,"sources":["../../src/rules/noUndefinedTypes.js"],"names":["extraTypes","stripPseudoTypes","str","replace","context","node","report","settings","sourceCode","utils","scopeManager","globalScope","definedTypes","options","definedPreferredTypes","preferredTypes","structuredTags","mode","Object","keys","length","values","map","preferredType","undefined","reportSettings","replacement","filter","typedefDeclarations","getAllComments","comment","value","startsWith","commentNode","flatMap","doc","tags","tag","isNamepathDefiningTag","name","ancestorNodes","currentNode","parent","push","getTemplateTags","ancestorNode","jsdoc","jsdocUtils","filterTags","templateTags","getPresentTags","closureGenericTypes","parseClosureTemplateTag","cjsOrESMScope","childScopes","block","type","allDefinedTypes","Set","variables","concat","jsdocTagsWithPossibleType","tagMightHaveTypePosition","parsedType","structuredTypes","has","Array","isArray","includes","markVariableAsUsed","iterateAllJsdocs","meta","docs","description","url","schema","additionalProperties","properties","items"],"mappings":"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","sourcesContent":["import {\n getJSDocComment,\n} from '@es-joy/jsdoccomment';\nimport {\n traverse,\n parse as parseType,\n tryParse as tryParseType,\n} from 'jsdoc-type-pratt-parser';\nimport iterateJsdoc, {\n parseComment,\n} from '../iterateJsdoc';\nimport jsdocUtils from '../jsdocUtils';\n\nconst extraTypes = [\n 'null', 'undefined', 'void', 'string', 'boolean', 'object',\n 'function', 'symbol',\n 'number', 'bigint', 'NaN', 'Infinity',\n 'any', '*', 'never',\n 'this', 'true', 'false',\n 'Array', 'Object', 'RegExp', 'Date', 'Function',\n];\n\nconst stripPseudoTypes = (str) => {\n return str && str.replace(/(?:\\.|<>|\\.<>|\\[\\])$/u, '');\n};\n\nexport default iterateJsdoc(({\n context,\n node,\n report,\n settings,\n sourceCode,\n utils,\n}) => {\n const {\n scopeManager,\n } = sourceCode;\n const {\n globalScope,\n } = scopeManager;\n\n const {\n definedTypes = [],\n } = context.options[0] || {};\n\n let definedPreferredTypes = [];\n const {\n preferredTypes,\n structuredTags,\n mode,\n } = settings;\n if (Object.keys(preferredTypes).length) {\n definedPreferredTypes = 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((preferredType) => {\n return preferredType;\n });\n }\n\n const typedefDeclarations = context.getAllComments()\n .filter((comment) => {\n return comment.value.startsWith('*');\n })\n .map((commentNode) => {\n return parseComment(commentNode, '');\n })\n .flatMap((doc) => {\n return doc.tags.filter(({\n tag,\n }) => {\n return utils.isNamepathDefiningTag(tag);\n });\n })\n .map((tag) => {\n return tag.name;\n });\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 const getTemplateTags = function (ancestorNode) {\n const commentNode = getJSDocComment(sourceCode, ancestorNode, settings);\n if (!commentNode) {\n return [];\n }\n\n const jsdoc = parseComment(commentNode, '');\n\n return jsdocUtils.filterTags(jsdoc.tags, (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('template');\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 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 }).map(({\n name,\n }) => {\n return name;\n }) : [],\n )\n .concat(extraTypes)\n .concat(typedefDeclarations)\n .concat(definedTypes)\n .concat(definedPreferredTypes)\n .concat(settings.mode === 'jsdoc' ? [] : closureGenericTypes));\n\n const jsdocTagsWithPossibleType = utils.filterTags(({\n tag,\n }) => {\n return utils.tagMightHaveTypePosition(tag) && (tag !== 'suppress' || settings.mode !== 'closure');\n });\n\n for (const tag of jsdocTagsWithPossibleType) {\n let parsedType;\n\n try {\n parsedType = mode === 'permissive' ? tryParseType(tag.type) : parseType(tag.type, mode);\n } catch {\n // On syntax error, will be handled by valid-types.\n continue;\n }\n\n traverse(parsedType, ({\n type,\n value,\n }) => {\n if (type === 'JsdocTypeName') {\n const structuredTypes = structuredTags[tag.tag]?.type;\n if (!allDefinedTypes.has(value) &&\n (!Array.isArray(structuredTypes) || !structuredTypes.includes(value))\n ) {\n report(`The type '${value}' is undefined.`, null, tag);\n } else if (!extraTypes.includes(value)) {\n context.markVariableAsUsed(value);\n }\n }\n });\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Checks that types in jsdoc comments are defined.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-no-undefined-types',\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n definedTypes: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"file":"noUndefinedTypes.js"}
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "url": "http://gajus.com"
6
6
  },
7
7
  "dependencies": {
8
- "@es-joy/jsdoccomment": "0.14.1",
8
+ "@es-joy/jsdoccomment": "0.14.2",
9
9
  "comment-parser": "1.3.0",
10
10
  "debug": "^4.3.3",
11
11
  "escape-string-regexp": "^4.0.0",
@@ -17,28 +17,28 @@
17
17
  },
18
18
  "description": "JSDoc linting rules for ESLint.",
19
19
  "devDependencies": {
20
- "@babel/cli": "^7.16.0",
21
- "@babel/core": "^7.16.5",
20
+ "@babel/cli": "^7.16.7",
21
+ "@babel/core": "^7.16.7",
22
22
  "@babel/eslint-parser": "^7.16.5",
23
- "@babel/node": "^7.16.5",
23
+ "@babel/node": "^7.16.7",
24
24
  "@babel/plugin-syntax-class-properties": "^7.12.13",
25
- "@babel/plugin-transform-flow-strip-types": "^7.16.5",
26
- "@babel/preset-env": "^7.16.5",
27
- "@babel/register": "^7.16.5",
25
+ "@babel/plugin-transform-flow-strip-types": "^7.16.7",
26
+ "@babel/preset-env": "^7.16.7",
27
+ "@babel/register": "^7.16.7",
28
28
  "@hkdobrev/run-if-changed": "^0.3.1",
29
29
  "@typescript-eslint/parser": "^5.8.1",
30
30
  "babel-plugin-add-module-exports": "^1.0.4",
31
31
  "babel-plugin-istanbul": "^6.1.1",
32
- "camelcase": "^6.2.1",
32
+ "camelcase": "^6.3.0",
33
33
  "chai": "^4.3.4",
34
34
  "cross-env": "^7.0.3",
35
35
  "decamelize": "^5.0.1",
36
- "eslint": "^8.5.0",
36
+ "eslint": "^8.6.0",
37
37
  "eslint-config-canonical": "^33.0.0",
38
38
  "gitdown": "^3.1.4",
39
39
  "glob": "^7.2.0",
40
40
  "husky": "^7.0.4",
41
- "lint-staged": "^12.1.4",
41
+ "lint-staged": "^12.1.5",
42
42
  "lodash.defaultsdeep": "^4.6.1",
43
43
  "mocha": "^9.1.3",
44
44
  "nyc": "^15.1.0",
@@ -104,9 +104,9 @@
104
104
  "lint-fix": "npm run lint-arg -- --fix .",
105
105
  "prepare": "husky install",
106
106
  "test": "cross-env BABEL_ENV=test nyc --reporter text-summary mocha --reporter dot --recursive --require @babel/register --timeout 12000",
107
- "test-cov": "cross-env BABEL_ENV=test nyc mocha --reporter dot --recursive --require @babel/register --timeout 12000",
107
+ "test-cov": "cross-env BABEL_ENV=test TIMING=1 nyc mocha --reporter dot --recursive --require @babel/register --timeout 12000",
108
108
  "test-index": "cross-env BABEL_ENV=test mocha --recursive --require @babel/register --reporter progress --timeout 12000 test/rules/index.js",
109
109
  "test-no-cov": "cross-env BABEL_ENV=test mocha --reporter dot --recursive --require @babel/register --timeout 12000"
110
110
  },
111
- "version": "37.5.0"
111
+ "version": "37.5.1"
112
112
  }