eslint-plugin-jsdoc 37.4.2 → 37.6.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.
package/README.md CHANGED
@@ -8170,7 +8170,8 @@ Defaults to `['ts-check', 'ts-expect-error', 'ts-ignore', 'ts-nocheck']`
8170
8170
  ##### <code>preventAllMultiAsteriskBlocks</code>
8171
8171
 
8172
8172
  A boolean (defaulting to `false`) which if `true` will prevent all
8173
- multi-asterisked blocks even those without apparent tag content.
8173
+ JSDoc-like blocks with more than two initial asterisks even those without
8174
+ apparent tag content.
8174
8175
 
8175
8176
  |||
8176
8177
  |---|---|
@@ -8711,6 +8712,17 @@ and that rule is for catching blocks which only seem like jsdoc).
8711
8712
  <a name="eslint-plugin-jsdoc-rules-no-multi-asterisks-options-18"></a>
8712
8713
  #### Options
8713
8714
 
8715
+ <a name="eslint-plugin-jsdoc-rules-no-multi-asterisks-options-18-allowwhitespace-defaults-to-false"></a>
8716
+ ##### <code>allowWhitespace</code> (defaults to <code>false</code>)
8717
+
8718
+ Set to `true` if you wish to allow asterisks after a space (as with Markdown):
8719
+
8720
+ ```js
8721
+ /**
8722
+ * *bold* text
8723
+ */
8724
+ ```
8725
+
8714
8726
  <a name="eslint-plugin-jsdoc-rules-no-multi-asterisks-options-18-preventatmiddlelines-defaults-to-true"></a>
8715
8727
  ##### <code>preventAtMiddleLines</code> (defaults to <code>true</code>)
8716
8728
 
@@ -8822,6 +8834,25 @@ The following patterns are considered problems:
8822
8834
  * */
8823
8835
  // "jsdoc/no-multi-asterisks": ["error"|"warn", {"preventAtEnd":true}]
8824
8836
  // Message: Should be no multiple asterisks on end lines.
8837
+
8838
+ /**
8839
+ * The method does 2 things:
8840
+ * * Thing 1
8841
+ * * Thing 2
8842
+ */
8843
+ // "jsdoc/no-multi-asterisks": ["error"|"warn", {"allowWhitespace":false}]
8844
+ // Message: Should be no multiple asterisks on middle lines.
8845
+
8846
+ /**
8847
+ * This muti-line comment contains some
8848
+ * *non-standard bold* syntax
8849
+ */
8850
+ // "jsdoc/no-multi-asterisks": ["error"|"warn", {"allowWhitespace":false}]
8851
+ // Message: Should be no multiple asterisks on middle lines.
8852
+
8853
+ /** Desc. **/
8854
+ // "jsdoc/no-multi-asterisks": ["error"|"warn", {"allowWhitespace":true}]
8855
+ // Message: Should be no multiple asterisks on end lines.
8825
8856
  ````
8826
8857
 
8827
8858
  The following patterns are not considered problems:
@@ -8899,6 +8930,25 @@ function foo() {
8899
8930
  *
8900
8931
  * **Bold example:** Hi there.
8901
8932
  */
8933
+
8934
+ /**
8935
+ * The method does 2 things:
8936
+ * * Thing 1
8937
+ * * Thing 2
8938
+ */
8939
+ // "jsdoc/no-multi-asterisks": ["error"|"warn", {"allowWhitespace":true}]
8940
+
8941
+ /**
8942
+ * This muti-line comment contains some
8943
+ * *non-standard bold* syntax
8944
+ */
8945
+ // "jsdoc/no-multi-asterisks": ["error"|"warn", {"allowWhitespace":true}]
8946
+
8947
+ /** abc */
8948
+ function foo() {
8949
+ //
8950
+ }
8951
+ // "jsdoc/no-multi-asterisks": ["error"|"warn", {"allowWhitespace":true}]
8902
8952
  ````
8903
8953
 
8904
8954
 
@@ -9846,12 +9896,64 @@ function quux(foo) {
9846
9896
 
9847
9897
  }
9848
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
+
9849
9938
  /**
9850
9939
  * @suppress {visibility}
9851
9940
  */
9852
9941
  function foo () {
9853
9942
  }
9854
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"}}
9855
9957
  ````
9856
9958
 
9857
9959
 
@@ -9,7 +9,12 @@ var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
9
9
 
10
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
11
 
12
- const middleAsterisks = /^([\t ]|\*(?!\*))+/u;
12
+ const middleAsterisksBlockWS = /^([\t ]|\*(?!\*))+/u;
13
+ const middleAsterisksNoBlockWS = /^\*+/u;
14
+ const endAsterisksSingleLineBlockWS = /\*((?:\*|(?: |\t))*)\*$/u;
15
+ const endAsterisksMultipleLineBlockWS = /((?:\*|(?: |\t))*)\*$/u;
16
+ const endAsterisksSingleLineNoBlockWS = /\*(\**)\*$/u;
17
+ const endAsterisksMultipleLineNoBlockWS = /(\**)\*$/u;
13
18
 
14
19
  var _default = (0, _iterateJsdoc.default)(({
15
20
  context,
@@ -17,9 +22,12 @@ var _default = (0, _iterateJsdoc.default)(({
17
22
  utils
18
23
  }) => {
19
24
  const {
25
+ allowWhitespace = false,
20
26
  preventAtEnd = true,
21
27
  preventAtMiddleLines = true
22
28
  } = context.options[0] || {};
29
+ const middleAsterisks = allowWhitespace ? middleAsterisksNoBlockWS : middleAsterisksBlockWS; // eslint-disable-next-line complexity -- Todo
30
+
23
31
  jsdoc.source.some(({
24
32
  tokens,
25
33
  number
@@ -30,10 +38,12 @@ var _default = (0, _iterateJsdoc.default)(({
30
38
  name,
31
39
  type,
32
40
  description,
33
- end
41
+ end,
42
+ postDelimiter
34
43
  } = tokens;
35
44
 
36
- if (preventAtMiddleLines && !end && !tag && !type && !name && middleAsterisks.test(description)) {
45
+ if (preventAtMiddleLines && !end && !tag && !type && !name && (!allowWhitespace && middleAsterisks.test(description) || allowWhitespace && middleAsterisks.test(postDelimiter + description))) {
46
+ // console.log('description', JSON.stringify(description));
37
47
  const fix = () => {
38
48
  tokens.description = description.replace(middleAsterisks, '');
39
49
  };
@@ -50,8 +60,15 @@ var _default = (0, _iterateJsdoc.default)(({
50
60
 
51
61
  const isSingleLineBlock = delimiter === '/**';
52
62
  const delim = isSingleLineBlock ? '*' : delimiter;
53
- const endAsterisks = isSingleLineBlock ? /\*((?:\*|(?: |\t))*)\*$/u : /((?:\*|(?: |\t))*)\*$/u;
54
- const endingAsterisksAndSpaces = (description + delim).match(endAsterisks);
63
+ let endAsterisks;
64
+
65
+ if (allowWhitespace) {
66
+ endAsterisks = isSingleLineBlock ? endAsterisksSingleLineNoBlockWS : endAsterisksMultipleLineNoBlockWS;
67
+ } else {
68
+ endAsterisks = isSingleLineBlock ? endAsterisksSingleLineBlockWS : endAsterisksMultipleLineBlockWS;
69
+ }
70
+
71
+ const endingAsterisksAndSpaces = (allowWhitespace ? postDelimiter + description + delim : description + delim).match(endAsterisks);
55
72
 
56
73
  if (!endingAsterisksAndSpaces || !isSingleLineBlock && endingAsterisksAndSpaces[1] && !endingAsterisksAndSpaces[1].trim()) {
57
74
  return false;
@@ -81,6 +98,9 @@ var _default = (0, _iterateJsdoc.default)(({
81
98
  schema: [{
82
99
  additionalProperies: false,
83
100
  properties: {
101
+ allowWhitespace: {
102
+ type: 'boolean'
103
+ },
84
104
  preventAtEnd: {
85
105
  type: 'boolean'
86
106
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/rules/noMultiAsterisks.js"],"names":["middleAsterisks","context","jsdoc","utils","preventAtEnd","preventAtMiddleLines","options","source","some","tokens","number","delimiter","tag","name","type","description","end","test","fix","replace","reportJSDoc","line","isSingleLineBlock","delim","endAsterisks","endingAsterisksAndSpaces","match","trim","endFix","iterateAllJsdocs","meta","docs","url","fixable","schema","additionalProperies","properties"],"mappings":"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","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nconst middleAsterisks = /^([\\t ]|\\*(?!\\*))+/u;\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n utils,\n}) => {\n const {\n preventAtEnd = true,\n preventAtMiddleLines = true,\n } = context.options[0] || {};\n\n jsdoc.source.some(({\n tokens,\n number,\n }) => {\n const {\n delimiter,\n tag,\n name,\n type,\n description,\n end,\n } = tokens;\n if (\n preventAtMiddleLines &&\n !end && !tag && !type && !name && middleAsterisks.test(description)\n ) {\n const fix = () => {\n tokens.description = description.replace(middleAsterisks, '');\n };\n\n utils.reportJSDoc(\n 'Should be no multiple asterisks on middle lines.',\n {\n line: number,\n },\n fix,\n true,\n );\n\n return true;\n }\n\n if (!preventAtEnd || !end) {\n return false;\n }\n\n const isSingleLineBlock = delimiter === '/**';\n const delim = isSingleLineBlock ? '*' : delimiter;\n const endAsterisks = isSingleLineBlock ?\n /\\*((?:\\*|(?: |\\t))*)\\*$/u :\n /((?:\\*|(?: |\\t))*)\\*$/u;\n\n const endingAsterisksAndSpaces = (description + delim).match(\n endAsterisks,\n );\n\n if (\n !endingAsterisksAndSpaces ||\n !isSingleLineBlock && endingAsterisksAndSpaces[1] && !endingAsterisksAndSpaces[1].trim()\n ) {\n return false;\n }\n\n const endFix = () => {\n if (!isSingleLineBlock) {\n tokens.delimiter = '';\n }\n\n tokens.description = (description + delim).replace(endAsterisks, '');\n };\n\n utils.reportJSDoc(\n 'Should be no multiple asterisks on end lines.',\n {\n line: number,\n },\n endFix,\n true,\n );\n\n return true;\n });\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: '',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-no-multi-asterisks',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperies: false,\n properties: {\n preventAtEnd: {\n type: 'boolean',\n },\n preventAtMiddleLines: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"file":"noMultiAsterisks.js"}
1
+ {"version":3,"sources":["../../src/rules/noMultiAsterisks.js"],"names":["middleAsterisksBlockWS","middleAsterisksNoBlockWS","endAsterisksSingleLineBlockWS","endAsterisksMultipleLineBlockWS","endAsterisksSingleLineNoBlockWS","endAsterisksMultipleLineNoBlockWS","context","jsdoc","utils","allowWhitespace","preventAtEnd","preventAtMiddleLines","options","middleAsterisks","source","some","tokens","number","delimiter","tag","name","type","description","end","postDelimiter","test","fix","replace","reportJSDoc","line","isSingleLineBlock","delim","endAsterisks","endingAsterisksAndSpaces","match","trim","endFix","iterateAllJsdocs","meta","docs","url","fixable","schema","additionalProperies","properties"],"mappings":"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","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nconst middleAsterisksBlockWS = /^([\\t ]|\\*(?!\\*))+/u;\nconst middleAsterisksNoBlockWS = /^\\*+/u;\n\nconst endAsterisksSingleLineBlockWS = /\\*((?:\\*|(?: |\\t))*)\\*$/u;\nconst endAsterisksMultipleLineBlockWS = /((?:\\*|(?: |\\t))*)\\*$/u;\n\nconst endAsterisksSingleLineNoBlockWS = /\\*(\\**)\\*$/u;\nconst endAsterisksMultipleLineNoBlockWS = /(\\**)\\*$/u;\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n utils,\n}) => {\n const {\n allowWhitespace = false,\n preventAtEnd = true,\n preventAtMiddleLines = true,\n } = context.options[0] || {};\n\n const middleAsterisks = allowWhitespace ? middleAsterisksNoBlockWS : middleAsterisksBlockWS;\n\n // eslint-disable-next-line complexity -- Todo\n jsdoc.source.some(({\n tokens,\n number,\n }) => {\n const {\n delimiter,\n tag,\n name,\n type,\n description,\n end,\n postDelimiter,\n } = tokens;\n\n if (\n preventAtMiddleLines &&\n !end && !tag && !type && !name &&\n (\n !allowWhitespace && middleAsterisks.test(description) ||\n allowWhitespace && middleAsterisks.test(postDelimiter + description)\n )\n ) {\n // console.log('description', JSON.stringify(description));\n const fix = () => {\n tokens.description = description.replace(middleAsterisks, '');\n };\n\n utils.reportJSDoc(\n 'Should be no multiple asterisks on middle lines.',\n {\n line: number,\n },\n fix,\n true,\n );\n\n return true;\n }\n\n if (!preventAtEnd || !end) {\n return false;\n }\n\n const isSingleLineBlock = delimiter === '/**';\n const delim = isSingleLineBlock ? '*' : delimiter;\n let endAsterisks;\n if (allowWhitespace) {\n endAsterisks = isSingleLineBlock ? endAsterisksSingleLineNoBlockWS : endAsterisksMultipleLineNoBlockWS;\n } else {\n endAsterisks = isSingleLineBlock ? endAsterisksSingleLineBlockWS : endAsterisksMultipleLineBlockWS;\n }\n\n const endingAsterisksAndSpaces = (\n allowWhitespace ? postDelimiter + description + delim : description + delim\n ).match(\n endAsterisks,\n );\n\n if (\n !endingAsterisksAndSpaces ||\n !isSingleLineBlock && endingAsterisksAndSpaces[1] && !endingAsterisksAndSpaces[1].trim()\n ) {\n return false;\n }\n\n const endFix = () => {\n if (!isSingleLineBlock) {\n tokens.delimiter = '';\n }\n\n tokens.description = (description + delim).replace(endAsterisks, '');\n };\n\n utils.reportJSDoc(\n 'Should be no multiple asterisks on end lines.',\n {\n line: number,\n },\n endFix,\n true,\n );\n\n return true;\n });\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: '',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-no-multi-asterisks',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperies: false,\n properties: {\n allowWhitespace: {\n type: 'boolean',\n },\n preventAtEnd: {\n type: 'boolean',\n },\n preventAtMiddleLines: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"file":"noMultiAsterisks.js"}
@@ -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,40 +5,40 @@
5
5
  "url": "http://gajus.com"
6
6
  },
7
7
  "dependencies": {
8
- "@es-joy/jsdoccomment": "0.14.1",
8
+ "@es-joy/jsdoccomment": "0.16.0",
9
9
  "comment-parser": "1.3.0",
10
10
  "debug": "^4.3.3",
11
11
  "escape-string-regexp": "^4.0.0",
12
12
  "esquery": "^1.4.0",
13
- "jsdoc-type-pratt-parser": "^2.0.2",
13
+ "jsdoc-type-pratt-parser": "^2.2.0",
14
14
  "regextras": "^0.8.0",
15
15
  "semver": "^7.3.5",
16
16
  "spdx-expression-parse": "^3.0.1"
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
- "@typescript-eslint/parser": "^5.8.1",
29
+ "@typescript-eslint/parser": "^5.9.0",
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",
37
- "eslint-config-canonical": "^33.0.0",
36
+ "eslint": "^8.6.0",
37
+ "eslint-config-canonical": "^33.0.1",
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.7",
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.4.2"
111
+ "version": "37.6.0"
112
112
  }