eslint-plugin-jsdoc 44.2.3 → 44.2.4
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/dist/alignTransform.js +86 -4
- package/dist/alignTransform.js.map +1 -1
- package/dist/exportParser.js +134 -4
- package/dist/exportParser.js.map +1 -1
- package/dist/iterateJsdoc.js +936 -345
- package/dist/iterateJsdoc.js.map +1 -1
- package/dist/jsdocUtils.js +173 -105
- package/dist/jsdocUtils.js.map +1 -1
- package/dist/rules/checkAlignment.js +6 -0
- package/dist/rules/checkAlignment.js.map +1 -1
- package/dist/rules/checkExamples.js +70 -6
- package/dist/rules/checkExamples.js.map +1 -1
- package/dist/rules/checkIndentation.js +11 -1
- package/dist/rules/checkIndentation.js.map +1 -1
- package/dist/rules/checkLineAlignment.js +68 -4
- package/dist/rules/checkLineAlignment.js.map +1 -1
- package/dist/rules/checkParamNames.js +12 -7
- package/dist/rules/checkParamNames.js.map +1 -1
- package/dist/rules/checkPropertyNames.js +13 -7
- package/dist/rules/checkPropertyNames.js.map +1 -1
- package/dist/rules/checkTagNames.js +45 -5
- package/dist/rules/checkTagNames.js.map +1 -1
- package/dist/rules/checkTypes.js +97 -36
- package/dist/rules/checkTypes.js.map +1 -1
- package/dist/rules/checkValues.js +6 -6
- package/dist/rules/checkValues.js.map +1 -1
- package/dist/rules/emptyTags.js +8 -1
- package/dist/rules/emptyTags.js.map +1 -1
- package/dist/rules/informativeDocs.js +26 -7
- package/dist/rules/informativeDocs.js.map +1 -1
- package/dist/rules/matchDescription.js +18 -1
- package/dist/rules/matchDescription.js.map +1 -1
- package/dist/rules/matchName.js +2 -2
- package/dist/rules/matchName.js.map +1 -1
- package/dist/rules/multilineBlocks.js +12 -1
- package/dist/rules/multilineBlocks.js.map +1 -1
- package/dist/rules/noBadBlocks.js +3 -5
- package/dist/rules/noBadBlocks.js.map +1 -1
- package/dist/rules/noBlankBlockDescriptions.js +2 -0
- package/dist/rules/noBlankBlockDescriptions.js.map +1 -1
- package/dist/rules/noMissingSyntax.js +58 -15
- package/dist/rules/noMissingSyntax.js.map +1 -1
- package/dist/rules/noMultiAsterisks.js +1 -6
- package/dist/rules/noMultiAsterisks.js.map +1 -1
- package/dist/rules/noRestrictedSyntax.js +17 -4
- package/dist/rules/noRestrictedSyntax.js.map +1 -1
- package/dist/rules/noTypes.js +3 -0
- package/dist/rules/noTypes.js.map +1 -1
- package/dist/rules/noUndefinedTypes.js +61 -20
- package/dist/rules/noUndefinedTypes.js.map +1 -1
- package/dist/rules/requireAsteriskPrefix.js +20 -0
- package/dist/rules/requireAsteriskPrefix.js.map +1 -1
- package/dist/rules/requireDescription.js +6 -2
- package/dist/rules/requireDescription.js.map +1 -1
- package/dist/rules/requireDescriptionCompleteSentence.js +72 -9
- package/dist/rules/requireDescriptionCompleteSentence.js.map +1 -1
- package/dist/rules/requireFileOverview.js +9 -4
- package/dist/rules/requireFileOverview.js.map +1 -1
- package/dist/rules/requireHyphenBeforeParamDescription.js +23 -6
- package/dist/rules/requireHyphenBeforeParamDescription.js.map +1 -1
- package/dist/rules/requireJsdoc.js +144 -28
- package/dist/rules/requireJsdoc.js.map +1 -1
- package/dist/rules/requireParam.js +46 -2
- package/dist/rules/requireParam.js.map +1 -1
- package/dist/rules/requireProperty.js +1 -1
- package/dist/rules/requireProperty.js.map +1 -1
- package/dist/rules/requireReturns.js +2 -2
- package/dist/rules/requireReturns.js.map +1 -1
- package/dist/rules/requireReturnsCheck.js +9 -2
- package/dist/rules/requireReturnsCheck.js.map +1 -1
- package/dist/rules/requireThrows.js +2 -2
- package/dist/rules/requireThrows.js.map +1 -1
- package/dist/rules/requireYields.js +9 -2
- package/dist/rules/requireYields.js.map +1 -1
- package/dist/rules/requireYieldsCheck.js +19 -5
- package/dist/rules/requireYieldsCheck.js.map +1 -1
- package/dist/rules/sortTags.js +67 -9
- package/dist/rules/sortTags.js.map +1 -1
- package/dist/rules/tagLines.js +22 -3
- package/dist/rules/tagLines.js.map +1 -1
- package/dist/rules/textEscaping.js +16 -2
- package/dist/rules/textEscaping.js.map +1 -1
- package/dist/rules/validTypes.js +25 -8
- package/dist/rules/validTypes.js.map +1 -1
- package/dist/utils/hasReturnValue.js +77 -43
- package/dist/utils/hasReturnValue.js.map +1 -1
- package/docs/rules/check-tag-names.md +15 -0
- package/docs/rules/no-missing-syntax.md +6 -0
- package/docs/rules/require-description-complete-sentence.md +525 -289
- package/docs/rules/require-description.md +289 -525
- package/docs/rules/require-file-overview.md +7 -0
- package/docs/rules/require-jsdoc.md +1 -1
- package/docs/rules/require-param-description.md +116 -1694
- package/docs/rules/require-param-name.md +58 -133
- package/docs/rules/require-param-type.md +119 -55
- package/docs/rules/require-param.md +1700 -111
- package/docs/rules/require-property-description.md +39 -79
- package/docs/rules/require-property-name.md +21 -30
- package/docs/rules/require-property-type.md +21 -21
- package/docs/rules/require-property.md +82 -33
- package/docs/rules/require-returns-check.md +636 -747
- package/docs/rules/require-returns-description.md +61 -933
- package/docs/rules/require-returns-type.md +42 -79
- package/docs/rules/require-returns.md +1081 -61
- package/docs/rules/require-yields-check.md +238 -517
- package/docs/rules/require-yields.md +517 -238
- package/docs/rules/valid-types.md +1 -1
- package/docs/settings.md +1 -1
- package/package.json +5 -4
- package/tsconfig.json +2 -3
|
@@ -9,8 +9,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
9
9
|
/**
|
|
10
10
|
* @param {string} targetTagName
|
|
11
11
|
* @param {boolean} enableFixer
|
|
12
|
-
* @param jsdoc
|
|
13
|
-
* @param utils
|
|
12
|
+
* @param {import('comment-parser').Block} jsdoc
|
|
13
|
+
* @param {import('../iterateJsdoc.js').Utils} utils
|
|
14
14
|
* @returns {boolean}
|
|
15
15
|
*/
|
|
16
16
|
const validatePropertyNames = (targetTagName, enableFixer, jsdoc, utils) => {
|
|
@@ -18,9 +18,10 @@ const validatePropertyNames = (targetTagName, enableFixer, jsdoc, utils) => {
|
|
|
18
18
|
return tag.tag === targetTagName;
|
|
19
19
|
});
|
|
20
20
|
return propertyTags.some(([, tag], index) => {
|
|
21
|
+
/** @type {import('../iterateJsdoc.js').Integer} */
|
|
21
22
|
let tagsIndex;
|
|
22
23
|
const dupeTagInfo = propertyTags.find(([tgsIndex, tg], idx) => {
|
|
23
|
-
tagsIndex = tgsIndex;
|
|
24
|
+
tagsIndex = Number(tgsIndex);
|
|
24
25
|
return tg.name === tag.name && idx !== index;
|
|
25
26
|
});
|
|
26
27
|
if (dupeTagInfo) {
|
|
@@ -35,11 +36,16 @@ const validatePropertyNames = (targetTagName, enableFixer, jsdoc, utils) => {
|
|
|
35
36
|
|
|
36
37
|
/**
|
|
37
38
|
* @param {string} targetTagName
|
|
38
|
-
* @param {
|
|
39
|
-
*
|
|
39
|
+
* @param {{
|
|
40
|
+
* idx: number;
|
|
41
|
+
* name: string;
|
|
42
|
+
* type: string;
|
|
43
|
+
* }[]} jsdocPropertyNames
|
|
44
|
+
* @param {import('comment-parser').Block} jsdoc
|
|
40
45
|
* @param {Function} report
|
|
41
46
|
*/
|
|
42
47
|
const validatePropertyNamesDeep = (targetTagName, jsdocPropertyNames, jsdoc, report) => {
|
|
48
|
+
/** @type {string} */
|
|
43
49
|
let lastRealProperty;
|
|
44
50
|
return jsdocPropertyNames.some(({
|
|
45
51
|
name: jsdocPropertyName,
|
|
@@ -75,10 +81,10 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
75
81
|
enableFixer = false
|
|
76
82
|
} = context.options[0] || {};
|
|
77
83
|
const jsdocPropertyNamesDeep = utils.getJsdocTagsDeep('property');
|
|
78
|
-
if (!jsdocPropertyNamesDeep.length) {
|
|
84
|
+
if (!jsdocPropertyNamesDeep || !jsdocPropertyNamesDeep.length) {
|
|
79
85
|
return;
|
|
80
86
|
}
|
|
81
|
-
const targetTagName = utils.getPreferredTagName({
|
|
87
|
+
const targetTagName = /** @type {string} */utils.getPreferredTagName({
|
|
82
88
|
tagName: 'property'
|
|
83
89
|
});
|
|
84
90
|
const isError = validatePropertyNames(targetTagName, enableFixer, jsdoc, utils);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkPropertyNames.js","names":["_iterateJsdoc","_interopRequireDefault","require","obj","__esModule","default","validatePropertyNames","targetTagName","enableFixer","jsdoc","utils","propertyTags","Object","entries","tags","filter","tag","some","index","tagsIndex","dupeTagInfo","find","tgsIndex","tg","idx","name","reportJSDoc","removeTag","validatePropertyNamesDeep","jsdocPropertyNames","report","lastRealProperty","jsdocPropertyName","isPropertyPath","includes","pathRootNodeName","slice","indexOf","endsWith","_default","iterateJsdoc","context","options","jsdocPropertyNamesDeep","getJsdocTagsDeep","length","getPreferredTagName","tagName","isError","iterateAllJsdocs","meta","docs","description","url","fixable","schema","additionalProperties","properties","type","exports","module"],"sources":["../../src/rules/checkPropertyNames.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\n/**\n * @param {string} targetTagName\n * @param {boolean} enableFixer\n * @param jsdoc\n * @param utils\n * @returns {boolean}\n */\nconst validatePropertyNames = (\n targetTagName,\n enableFixer,\n jsdoc, utils,\n) => {\n const propertyTags = Object.entries(jsdoc.tags).filter(([\n , tag,\n ]) => {\n return tag.tag === targetTagName;\n });\n\n return propertyTags.some(([\n , tag,\n ], index) => {\n let tagsIndex;\n const dupeTagInfo = propertyTags.find(([\n tgsIndex,\n tg,\n ], idx) => {\n tagsIndex = tgsIndex;\n\n return tg.name === tag.name && idx !== index;\n });\n if (dupeTagInfo) {\n utils.reportJSDoc(`Duplicate @${targetTagName} \"${tag.name}\"`, dupeTagInfo[1], enableFixer ? () => {\n utils.removeTag(tagsIndex);\n } : null);\n\n return true;\n }\n\n return false;\n });\n};\n\n/**\n * @param {string} targetTagName\n * @param {string[]} jsdocPropertyNames\n * @param jsdoc\n * @param {Function} report\n */\nconst validatePropertyNamesDeep = (\n targetTagName,\n jsdocPropertyNames, jsdoc, report,\n) => {\n let lastRealProperty;\n\n return jsdocPropertyNames.some(({\n name: jsdocPropertyName,\n idx,\n }) => {\n const isPropertyPath = jsdocPropertyName.includes('.');\n\n if (isPropertyPath) {\n if (!lastRealProperty) {\n report(`@${targetTagName} path declaration (\"${jsdocPropertyName}\") appears before any real property.`, null, jsdoc.tags[idx]);\n\n return true;\n }\n\n let pathRootNodeName = jsdocPropertyName.slice(0, jsdocPropertyName.indexOf('.'));\n\n if (pathRootNodeName.endsWith('[]')) {\n pathRootNodeName = pathRootNodeName.slice(0, -2);\n }\n\n if (pathRootNodeName !== lastRealProperty) {\n report(\n `@${targetTagName} path declaration (\"${jsdocPropertyName}\") root node name (\"${pathRootNodeName}\") ` +\n `does not match previous real property name (\"${lastRealProperty}\").`,\n null,\n jsdoc.tags[idx],\n );\n\n return true;\n }\n } else {\n lastRealProperty = jsdocPropertyName;\n }\n\n return false;\n });\n};\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n report,\n utils,\n}) => {\n const {\n enableFixer = false,\n } = context.options[0] || {};\n const jsdocPropertyNamesDeep = utils.getJsdocTagsDeep('property');\n if (!jsdocPropertyNamesDeep.length) {\n return;\n }\n\n const targetTagName = utils.getPreferredTagName({\n tagName: 'property',\n });\n const isError = validatePropertyNames(\n targetTagName,\n enableFixer,\n jsdoc,\n utils,\n );\n\n if (isError) {\n return;\n }\n\n validatePropertyNamesDeep(\n targetTagName, jsdocPropertyNamesDeep, jsdoc, report,\n );\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Ensures that property names in JSDoc are not duplicated on the same block and that nested properties have defined roots.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-property-names',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n enableFixer: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA2C,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMG,qBAAqB,GAAGA,CAC5BC,aAAa,EACbC,WAAW,EACXC,KAAK,EAAEC,KAAK,KACT;EACH,MAAMC,YAAY,GAAGC,MAAM,CAACC,OAAO,CAACJ,KAAK,CAACK,IAAI,CAAC,CAACC,MAAM,CAAC,CAAC,GACpDC,GAAG,CACN,KAAK;IACJ,OAAOA,GAAG,CAACA,GAAG,KAAKT,aAAa;EAClC,CAAC,CAAC;EAEF,OAAOI,YAAY,CAACM,IAAI,CAAC,CAAC,GACtBD,GAAG,CACN,EAAEE,KAAK,KAAK;IACX,IAAIC,SAAS;IACb,MAAMC,WAAW,GAAGT,YAAY,CAACU,IAAI,CAAC,CAAC,CACrCC,QAAQ,EACRC,EAAE,CACH,EAAEC,GAAG,KAAK;MACTL,SAAS,
|
|
1
|
+
{"version":3,"file":"checkPropertyNames.js","names":["_iterateJsdoc","_interopRequireDefault","require","obj","__esModule","default","validatePropertyNames","targetTagName","enableFixer","jsdoc","utils","propertyTags","Object","entries","tags","filter","tag","some","index","tagsIndex","dupeTagInfo","find","tgsIndex","tg","idx","Number","name","reportJSDoc","removeTag","validatePropertyNamesDeep","jsdocPropertyNames","report","lastRealProperty","jsdocPropertyName","isPropertyPath","includes","pathRootNodeName","slice","indexOf","endsWith","_default","iterateJsdoc","context","options","jsdocPropertyNamesDeep","getJsdocTagsDeep","length","getPreferredTagName","tagName","isError","iterateAllJsdocs","meta","docs","description","url","fixable","schema","additionalProperties","properties","type","exports","module"],"sources":["../../src/rules/checkPropertyNames.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\n/**\n * @param {string} targetTagName\n * @param {boolean} enableFixer\n * @param {import('comment-parser').Block} jsdoc\n * @param {import('../iterateJsdoc.js').Utils} utils\n * @returns {boolean}\n */\nconst validatePropertyNames = (\n targetTagName,\n enableFixer,\n jsdoc, utils,\n) => {\n const propertyTags = Object.entries(jsdoc.tags).filter(([\n , tag,\n ]) => {\n return tag.tag === targetTagName;\n });\n\n return propertyTags.some(([\n , tag,\n ], index) => {\n /** @type {import('../iterateJsdoc.js').Integer} */\n let tagsIndex;\n const dupeTagInfo = propertyTags.find(([\n tgsIndex,\n tg,\n ], idx) => {\n tagsIndex = Number(tgsIndex);\n\n return tg.name === tag.name && idx !== index;\n });\n if (dupeTagInfo) {\n utils.reportJSDoc(`Duplicate @${targetTagName} \"${tag.name}\"`, dupeTagInfo[1], enableFixer ? () => {\n utils.removeTag(tagsIndex);\n } : null);\n\n return true;\n }\n\n return false;\n });\n};\n\n/**\n * @param {string} targetTagName\n * @param {{\n * idx: number;\n * name: string;\n * type: string;\n * }[]} jsdocPropertyNames\n * @param {import('comment-parser').Block} jsdoc\n * @param {Function} report\n */\nconst validatePropertyNamesDeep = (\n targetTagName,\n jsdocPropertyNames, jsdoc, report,\n) => {\n /** @type {string} */\n let lastRealProperty;\n\n return jsdocPropertyNames.some(({\n name: jsdocPropertyName,\n idx,\n }) => {\n const isPropertyPath = jsdocPropertyName.includes('.');\n\n if (isPropertyPath) {\n if (!lastRealProperty) {\n report(`@${targetTagName} path declaration (\"${jsdocPropertyName}\") appears before any real property.`, null, jsdoc.tags[idx]);\n\n return true;\n }\n\n let pathRootNodeName = jsdocPropertyName.slice(0, jsdocPropertyName.indexOf('.'));\n\n if (pathRootNodeName.endsWith('[]')) {\n pathRootNodeName = pathRootNodeName.slice(0, -2);\n }\n\n if (pathRootNodeName !== lastRealProperty) {\n report(\n `@${targetTagName} path declaration (\"${jsdocPropertyName}\") root node name (\"${pathRootNodeName}\") ` +\n `does not match previous real property name (\"${lastRealProperty}\").`,\n null,\n jsdoc.tags[idx],\n );\n\n return true;\n }\n } else {\n lastRealProperty = jsdocPropertyName;\n }\n\n return false;\n });\n};\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n report,\n utils,\n}) => {\n const {\n enableFixer = false,\n } = context.options[0] || {};\n const jsdocPropertyNamesDeep = utils.getJsdocTagsDeep('property');\n if (!jsdocPropertyNamesDeep || !jsdocPropertyNamesDeep.length) {\n return;\n }\n\n const targetTagName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'property',\n }));\n const isError = validatePropertyNames(\n targetTagName,\n enableFixer,\n jsdoc,\n utils,\n );\n\n if (isError) {\n return;\n }\n\n validatePropertyNamesDeep(\n targetTagName, jsdocPropertyNamesDeep, jsdoc, report,\n );\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Ensures that property names in JSDoc are not duplicated on the same block and that nested properties have defined roots.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-property-names',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n enableFixer: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
|
|
@@ -22,12 +22,22 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
22
22
|
settings,
|
|
23
23
|
jsdocNode
|
|
24
24
|
}) => {
|
|
25
|
-
const
|
|
25
|
+
const
|
|
26
|
+
/**
|
|
27
|
+
* @type {{
|
|
28
|
+
* definedTags: string[],
|
|
29
|
+
* enableFixer: boolean,
|
|
30
|
+
* jsxTags: boolean,
|
|
31
|
+
* typed: boolean
|
|
32
|
+
}} */
|
|
33
|
+
{
|
|
26
34
|
definedTags = [],
|
|
27
35
|
enableFixer = true,
|
|
28
36
|
jsxTags,
|
|
29
37
|
typed
|
|
30
38
|
} = context.options[0] || {};
|
|
39
|
+
|
|
40
|
+
/** @type {(string|undefined)[]} */
|
|
31
41
|
let definedPreferredTags = [];
|
|
32
42
|
const {
|
|
33
43
|
tagNamePreference,
|
|
@@ -52,9 +62,19 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
52
62
|
return preferredType;
|
|
53
63
|
});
|
|
54
64
|
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* @param {import('eslint').Rule.Node} subNode
|
|
68
|
+
* @returns {boolean}
|
|
69
|
+
*/
|
|
55
70
|
const isInAmbientContext = subNode => {
|
|
56
|
-
return subNode.type === 'Program' ? context.getFilename().endsWith('.d.ts') : Boolean(subNode.declare) || isInAmbientContext(subNode.parent);
|
|
71
|
+
return subNode.type === 'Program' ? context.getFilename().endsWith('.d.ts') : Boolean( /** @type {import('@typescript-eslint/types').TSESTree.VariableDeclaration} */subNode.declare) || isInAmbientContext(subNode.parent);
|
|
57
72
|
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @param {import('comment-parser').Spec} jsdocTag
|
|
76
|
+
* @returns {boolean}
|
|
77
|
+
*/
|
|
58
78
|
const tagIsRedundantWhenTyped = jsdocTag => {
|
|
59
79
|
var _node$parent;
|
|
60
80
|
if (!typedTagsUnnecessaryOutsideDeclare.has(jsdocTag.tag)) {
|
|
@@ -63,15 +83,28 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
63
83
|
if (jsdocTag.tag === 'default') {
|
|
64
84
|
return false;
|
|
65
85
|
}
|
|
86
|
+
if (node === null) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
66
89
|
if (context.getFilename().endsWith('.d.ts') && ['Program', null, undefined].includes(node === null || node === void 0 ? void 0 : (_node$parent = node.parent) === null || _node$parent === void 0 ? void 0 : _node$parent.type)) {
|
|
67
90
|
return false;
|
|
68
91
|
}
|
|
69
|
-
if (isInAmbientContext(node)) {
|
|
92
|
+
if (isInAmbientContext( /** @type {import('eslint').Rule.Node} */node)) {
|
|
70
93
|
return false;
|
|
71
94
|
}
|
|
72
95
|
return true;
|
|
73
96
|
};
|
|
97
|
+
|
|
98
|
+
/* eslint-disable jsdoc/no-undefined-types -- TS */
|
|
99
|
+
/**
|
|
100
|
+
* @param {string} message
|
|
101
|
+
* @param {import('comment-parser').Spec} jsdocTag
|
|
102
|
+
* @param {import('../iterateJsdoc.js').Integer} tagIndex
|
|
103
|
+
* @param {Partial<import('comment-parser').Tokens>} [additionalTagChanges]
|
|
104
|
+
* @returns {void}
|
|
105
|
+
*/
|
|
74
106
|
const reportWithTagRemovalFixer = (message, jsdocTag, tagIndex, additionalTagChanges) => {
|
|
107
|
+
/* eslint-enable jsdoc/no-undefined-types -- TS */
|
|
75
108
|
utils.reportJSDoc(message, jsdocTag, enableFixer ? () => {
|
|
76
109
|
if (jsdocTag.description.trim()) {
|
|
77
110
|
utils.changeTag(jsdocTag, {
|
|
@@ -86,6 +119,12 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
86
119
|
}
|
|
87
120
|
} : null, true);
|
|
88
121
|
};
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @param {import('comment-parser').Spec} jsdocTag
|
|
125
|
+
* @param {import('../iterateJsdoc.js').Integer} tagIndex
|
|
126
|
+
* @returns {boolean}
|
|
127
|
+
*/
|
|
89
128
|
const checkTagForTypedValidity = (jsdocTag, tagIndex) => {
|
|
90
129
|
if (typedTagsAlwaysUnnecessary.has(jsdocTag.tag)) {
|
|
91
130
|
reportWithTagRemovalFixer(`'@${jsdocTag.tag}' is redundant when using a type system.`, jsdocTag, tagIndex, {
|
|
@@ -113,7 +152,7 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
113
152
|
if (typed && checkTagForTypedValidity(jsdocTag, tagIndex)) {
|
|
114
153
|
continue;
|
|
115
154
|
}
|
|
116
|
-
const validTags = [...definedTags, ...definedPreferredTags, ...definedNonPreferredTags, ...definedStructuredTags, ...(typed ? typedTagsNeedingName : [])];
|
|
155
|
+
const validTags = [...definedTags, ... /** @type {string[]} */definedPreferredTags, ...definedNonPreferredTags, ...definedStructuredTags, ...(typed ? typedTagsNeedingName : [])];
|
|
117
156
|
if (utils.isValidTag(tagName, validTags)) {
|
|
118
157
|
let preferredTagName = utils.getPreferredTagName({
|
|
119
158
|
allowObjectReturn: true,
|
|
@@ -128,7 +167,8 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
128
167
|
({
|
|
129
168
|
message,
|
|
130
169
|
replacement: preferredTagName
|
|
131
|
-
} =
|
|
170
|
+
} = /** @type {{message: string; replacement?: string | undefined;}} */
|
|
171
|
+
preferredTagName);
|
|
132
172
|
}
|
|
133
173
|
if (!message) {
|
|
134
174
|
message = `Invalid JSDoc tag (preference). Replace "${tagName}" JSDoc tag with "${preferredTagName}".`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkTagNames.js","names":["_escapeStringRegexp","_interopRequireDefault","require","_iterateJsdoc","obj","__esModule","default","jsxTagNames","Set","typedTagsAlwaysUnnecessary","typedTagsNeedingName","typedTagsUnnecessaryOutsideDeclare","_default","iterateJsdoc","sourceCode","jsdoc","report","utils","context","node","settings","jsdocNode","definedTags","enableFixer","jsxTags","typed","options","definedPreferredTags","tagNamePreference","structuredTags","definedStructuredTags","Object","keys","definedNonPreferredTags","length","values","map","preferredTag","undefined","reportSettings","replacement","filter","preferredType","isInAmbientContext","subNode","type","getFilename","endsWith","Boolean","declare","parent","tagIsRedundantWhenTyped","jsdocTag","_node$parent","has","tag","includes","reportWithTagRemovalFixer","message","tagIndex","additionalTagChanges","reportJSDoc","description","trim","changeTag","postType","removeTag","removeEmptyBlock","checkTagForTypedValidity","postTag","name","tags","tagName","validTags","isValidTag","preferredTagName","getPreferredTagName","allowObjectReturn","defaultMessage","fixer","getText","replace","RegExp","escapeStringRegexp","replaceText","iterateAllJsdocs","meta","docs","url","fixable","schema","additionalProperties","properties","items","exports","module"],"sources":["../../src/rules/checkTagNames.js"],"sourcesContent":["import escapeStringRegexp from 'escape-string-regexp';\nimport iterateJsdoc from '../iterateJsdoc';\n\n// https://babeljs.io/docs/en/babel-plugin-transform-react-jsx/\nconst jsxTagNames = new Set([\n 'jsx',\n 'jsxFrag',\n 'jsxImportSource',\n 'jsxRuntime',\n]);\n\nconst typedTagsAlwaysUnnecessary = new Set([\n 'augments',\n 'callback',\n 'class',\n 'enum',\n 'implements',\n 'private',\n 'property',\n 'protected',\n 'public',\n 'readonly',\n 'this',\n 'type',\n 'typedef',\n]);\n\nconst typedTagsNeedingName = new Set([\n 'template',\n]);\n\nconst typedTagsUnnecessaryOutsideDeclare = new Set([\n 'abstract',\n 'access',\n 'class',\n 'constant',\n 'constructs',\n 'default',\n 'enum',\n 'export',\n 'exports',\n 'function',\n 'global',\n 'inherits',\n 'instance',\n 'interface',\n 'member',\n 'memberof',\n 'memberOf',\n 'method',\n 'mixes',\n 'mixin',\n 'module',\n 'name',\n 'namespace',\n 'override',\n 'property',\n 'requires',\n 'static',\n 'this',\n]);\n\nexport default iterateJsdoc(({\n sourceCode,\n jsdoc,\n report,\n utils,\n context,\n node,\n settings,\n jsdocNode,\n}) => {\n const {\n definedTags = [],\n enableFixer = true,\n jsxTags,\n typed,\n } = context.options[0] || {};\n\n let definedPreferredTags = [];\n const {\n tagNamePreference,\n structuredTags,\n } = settings;\n const definedStructuredTags = Object.keys(structuredTags);\n const definedNonPreferredTags = Object.keys(tagNamePreference);\n if (definedNonPreferredTags.length) {\n definedPreferredTags = Object.values(tagNamePreference).map((preferredTag) => {\n if (typeof preferredTag === 'string') {\n // May become an empty string but will be filtered out below\n return preferredTag;\n }\n\n if (!preferredTag) {\n return undefined;\n }\n\n if (typeof preferredTag !== 'object') {\n utils.reportSettings(\n 'Invalid `settings.jsdoc.tagNamePreference`. Values must be falsy, a string, or an object.',\n );\n }\n\n return preferredTag.replacement;\n })\n .filter((preferredType) => {\n return preferredType;\n });\n }\n\n const isInAmbientContext = (subNode) => {\n return subNode.type === 'Program' ?\n context.getFilename().endsWith('.d.ts') :\n Boolean(subNode.declare) || isInAmbientContext(subNode.parent);\n };\n\n const tagIsRedundantWhenTyped = (jsdocTag) => {\n if (!typedTagsUnnecessaryOutsideDeclare.has(jsdocTag.tag)) {\n return false;\n }\n\n if (jsdocTag.tag === 'default') {\n return false;\n }\n\n if (context.getFilename().endsWith('.d.ts') && [\n 'Program', null, undefined,\n ].includes(node?.parent?.type)) {\n return false;\n }\n\n if (isInAmbientContext(node)) {\n return false;\n }\n\n return true;\n };\n\n const reportWithTagRemovalFixer = (message, jsdocTag, tagIndex, additionalTagChanges) => {\n utils.reportJSDoc(message, jsdocTag, enableFixer ? () => {\n if (jsdocTag.description.trim()) {\n utils.changeTag(jsdocTag, {\n postType: '',\n type: '',\n ...additionalTagChanges,\n });\n } else {\n utils.removeTag(tagIndex, {\n removeEmptyBlock: true,\n });\n }\n } : null, true);\n };\n\n const checkTagForTypedValidity = (jsdocTag, tagIndex) => {\n if (typedTagsAlwaysUnnecessary.has(jsdocTag.tag)) {\n reportWithTagRemovalFixer(`'@${jsdocTag.tag}' is redundant when using a type system.`, jsdocTag, tagIndex, {\n postTag: '',\n tag: '',\n });\n return true;\n }\n\n if (tagIsRedundantWhenTyped(jsdocTag)) {\n reportWithTagRemovalFixer(`'@${jsdocTag.tag}' is redundant outside of ambient (\\`declare\\`/\\`.d.ts\\`) contexts when using a type system.`, jsdocTag, tagIndex);\n return true;\n }\n\n if (typedTagsNeedingName.has(jsdocTag.tag) && !jsdocTag.name) {\n reportWithTagRemovalFixer(`'@${jsdocTag.tag}' without a name is redundant when using a type system.`, jsdocTag, tagIndex);\n return true;\n }\n\n return false;\n };\n\n for (let tagIndex = 0; tagIndex < jsdoc.tags.length; tagIndex += 1) {\n const jsdocTag = jsdoc.tags[tagIndex];\n const tagName = jsdocTag.tag;\n if (jsxTags && jsxTagNames.has(tagName)) {\n continue;\n }\n\n if (typed && checkTagForTypedValidity(jsdocTag, tagIndex)) {\n continue;\n }\n\n const validTags = [\n ...definedTags,\n ...definedPreferredTags,\n ...definedNonPreferredTags,\n ...definedStructuredTags,\n ...typed ? typedTagsNeedingName : [],\n ];\n\n if (utils.isValidTag(tagName, validTags)) {\n let preferredTagName = utils.getPreferredTagName({\n allowObjectReturn: true,\n defaultMessage: `Blacklisted tag found (\\`@${tagName}\\`)`,\n tagName,\n });\n if (!preferredTagName) {\n continue;\n }\n\n let message;\n if (typeof preferredTagName === 'object') {\n ({\n message,\n replacement: preferredTagName,\n } = preferredTagName);\n }\n\n if (!message) {\n message = `Invalid JSDoc tag (preference). Replace \"${tagName}\" JSDoc tag with \"${preferredTagName}\".`;\n }\n\n if (preferredTagName !== tagName) {\n report(message, (fixer) => {\n const replacement = sourceCode.getText(jsdocNode).replace(\n new RegExp(`@${escapeStringRegexp(tagName)}\\\\b`, 'u'),\n `@${preferredTagName}`,\n );\n\n return fixer.replaceText(jsdocNode, replacement);\n }, jsdocTag);\n }\n } else {\n report(`Invalid JSDoc tag name \"${tagName}\".`, null, jsdocTag);\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Reports invalid block tag names.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-tag-names',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n definedTags: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n enableFixer: {\n type: 'boolean',\n },\n jsxTags: {\n type: 'boolean',\n },\n typed: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"checkTagNames.js","names":["_escapeStringRegexp","_interopRequireDefault","require","_iterateJsdoc","obj","__esModule","default","jsxTagNames","Set","typedTagsAlwaysUnnecessary","typedTagsNeedingName","typedTagsUnnecessaryOutsideDeclare","_default","iterateJsdoc","sourceCode","jsdoc","report","utils","context","node","settings","jsdocNode","definedTags","enableFixer","jsxTags","typed","options","definedPreferredTags","tagNamePreference","structuredTags","definedStructuredTags","Object","keys","definedNonPreferredTags","length","values","map","preferredTag","undefined","reportSettings","replacement","filter","preferredType","isInAmbientContext","subNode","type","getFilename","endsWith","Boolean","declare","parent","tagIsRedundantWhenTyped","jsdocTag","_node$parent","has","tag","includes","reportWithTagRemovalFixer","message","tagIndex","additionalTagChanges","reportJSDoc","description","trim","changeTag","postType","removeTag","removeEmptyBlock","checkTagForTypedValidity","postTag","name","tags","tagName","validTags","isValidTag","preferredTagName","getPreferredTagName","allowObjectReturn","defaultMessage","fixer","getText","replace","RegExp","escapeStringRegexp","replaceText","iterateAllJsdocs","meta","docs","url","fixable","schema","additionalProperties","properties","items","exports","module"],"sources":["../../src/rules/checkTagNames.js"],"sourcesContent":["import escapeStringRegexp from 'escape-string-regexp';\nimport iterateJsdoc from '../iterateJsdoc';\n\n// https://babeljs.io/docs/en/babel-plugin-transform-react-jsx/\nconst jsxTagNames = new Set([\n 'jsx',\n 'jsxFrag',\n 'jsxImportSource',\n 'jsxRuntime',\n]);\n\nconst typedTagsAlwaysUnnecessary = new Set([\n 'augments',\n 'callback',\n 'class',\n 'enum',\n 'implements',\n 'private',\n 'property',\n 'protected',\n 'public',\n 'readonly',\n 'this',\n 'type',\n 'typedef',\n]);\n\nconst typedTagsNeedingName = new Set([\n 'template',\n]);\n\nconst typedTagsUnnecessaryOutsideDeclare = new Set([\n 'abstract',\n 'access',\n 'class',\n 'constant',\n 'constructs',\n 'default',\n 'enum',\n 'export',\n 'exports',\n 'function',\n 'global',\n 'inherits',\n 'instance',\n 'interface',\n 'member',\n 'memberof',\n 'memberOf',\n 'method',\n 'mixes',\n 'mixin',\n 'module',\n 'name',\n 'namespace',\n 'override',\n 'property',\n 'requires',\n 'static',\n 'this',\n]);\n\nexport default iterateJsdoc(({\n sourceCode,\n jsdoc,\n report,\n utils,\n context,\n node,\n settings,\n jsdocNode,\n}) => {\n const\n /**\n * @type {{\n * definedTags: string[],\n * enableFixer: boolean,\n * jsxTags: boolean,\n * typed: boolean\n }} */ {\n definedTags = [],\n enableFixer = true,\n jsxTags,\n typed,\n } = context.options[0] || {};\n\n /** @type {(string|undefined)[]} */\n let definedPreferredTags = [];\n const {\n tagNamePreference,\n structuredTags,\n } = settings;\n const definedStructuredTags = Object.keys(structuredTags);\n const definedNonPreferredTags = Object.keys(tagNamePreference);\n if (definedNonPreferredTags.length) {\n definedPreferredTags = Object.values(tagNamePreference).map((preferredTag) => {\n if (typeof preferredTag === 'string') {\n // May become an empty string but will be filtered out below\n return preferredTag;\n }\n\n if (!preferredTag) {\n return undefined;\n }\n\n if (typeof preferredTag !== 'object') {\n utils.reportSettings(\n 'Invalid `settings.jsdoc.tagNamePreference`. Values must be falsy, a string, or an object.',\n );\n }\n\n return preferredTag.replacement;\n })\n .filter((preferredType) => {\n return preferredType;\n });\n }\n\n /**\n * @param {import('eslint').Rule.Node} subNode\n * @returns {boolean}\n */\n const isInAmbientContext = (subNode) => {\n return subNode.type === 'Program' ?\n context.getFilename().endsWith('.d.ts') :\n Boolean(\n /** @type {import('@typescript-eslint/types').TSESTree.VariableDeclaration} */ (\n subNode\n ).declare,\n ) || isInAmbientContext(subNode.parent);\n };\n\n /**\n * @param {import('comment-parser').Spec} jsdocTag\n * @returns {boolean}\n */\n const tagIsRedundantWhenTyped = (jsdocTag) => {\n if (!typedTagsUnnecessaryOutsideDeclare.has(jsdocTag.tag)) {\n return false;\n }\n\n if (jsdocTag.tag === 'default') {\n return false;\n }\n\n if (node === null) {\n return false;\n }\n\n if (context.getFilename().endsWith('.d.ts') && [\n 'Program', null, undefined,\n ].includes(node?.parent?.type)) {\n return false;\n }\n\n if (isInAmbientContext(/** @type {import('eslint').Rule.Node} */ (node))) {\n return false;\n }\n\n return true;\n };\n\n /* eslint-disable jsdoc/no-undefined-types -- TS */\n /**\n * @param {string} message\n * @param {import('comment-parser').Spec} jsdocTag\n * @param {import('../iterateJsdoc.js').Integer} tagIndex\n * @param {Partial<import('comment-parser').Tokens>} [additionalTagChanges]\n * @returns {void}\n */\n const reportWithTagRemovalFixer = (message, jsdocTag, tagIndex, additionalTagChanges) => {\n /* eslint-enable jsdoc/no-undefined-types -- TS */\n utils.reportJSDoc(message, jsdocTag, enableFixer ? () => {\n if (jsdocTag.description.trim()) {\n utils.changeTag(jsdocTag, {\n postType: '',\n type: '',\n ...additionalTagChanges,\n });\n } else {\n utils.removeTag(tagIndex, {\n removeEmptyBlock: true,\n });\n }\n } : null, true);\n };\n\n /**\n * @param {import('comment-parser').Spec} jsdocTag\n * @param {import('../iterateJsdoc.js').Integer} tagIndex\n * @returns {boolean}\n */\n const checkTagForTypedValidity = (jsdocTag, tagIndex) => {\n if (typedTagsAlwaysUnnecessary.has(jsdocTag.tag)) {\n reportWithTagRemovalFixer(\n `'@${jsdocTag.tag}' is redundant when using a type system.`,\n jsdocTag,\n tagIndex,\n {\n postTag: '',\n tag: '',\n },\n );\n return true;\n }\n\n if (tagIsRedundantWhenTyped(jsdocTag)) {\n reportWithTagRemovalFixer(\n `'@${jsdocTag.tag}' is redundant outside of ambient (\\`declare\\`/\\`.d.ts\\`) contexts when using a type system.`,\n jsdocTag,\n tagIndex,\n );\n return true;\n }\n\n if (typedTagsNeedingName.has(jsdocTag.tag) && !jsdocTag.name) {\n reportWithTagRemovalFixer(\n `'@${jsdocTag.tag}' without a name is redundant when using a type system.`,\n jsdocTag,\n tagIndex,\n );\n return true;\n }\n\n return false;\n };\n\n for (let tagIndex = 0; tagIndex < jsdoc.tags.length; tagIndex += 1) {\n const jsdocTag = jsdoc.tags[tagIndex];\n const tagName = jsdocTag.tag;\n if (jsxTags && jsxTagNames.has(tagName)) {\n continue;\n }\n\n if (typed && checkTagForTypedValidity(jsdocTag, tagIndex)) {\n continue;\n }\n\n const validTags = [\n ...definedTags,\n ...(/** @type {string[]} */ (definedPreferredTags)),\n ...definedNonPreferredTags,\n ...definedStructuredTags,\n ...typed ? typedTagsNeedingName : [],\n ];\n\n if (utils.isValidTag(tagName, validTags)) {\n let preferredTagName = utils.getPreferredTagName({\n allowObjectReturn: true,\n defaultMessage: `Blacklisted tag found (\\`@${tagName}\\`)`,\n tagName,\n });\n if (!preferredTagName) {\n continue;\n }\n\n let message;\n if (typeof preferredTagName === 'object') {\n ({\n message,\n replacement: preferredTagName,\n } = /** @type {{message: string; replacement?: string | undefined;}} */ (\n preferredTagName\n ));\n }\n\n if (!message) {\n message = `Invalid JSDoc tag (preference). Replace \"${tagName}\" JSDoc tag with \"${preferredTagName}\".`;\n }\n\n if (preferredTagName !== tagName) {\n report(message, (fixer) => {\n const replacement = sourceCode.getText(jsdocNode).replace(\n new RegExp(`@${escapeStringRegexp(tagName)}\\\\b`, 'u'),\n `@${preferredTagName}`,\n );\n\n return fixer.replaceText(jsdocNode, replacement);\n }, jsdocTag);\n }\n } else {\n report(`Invalid JSDoc tag name \"${tagName}\".`, null, jsdocTag);\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Reports invalid block tag names.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-tag-names',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n definedTags: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n enableFixer: {\n type: 'boolean',\n },\n jsxTags: {\n type: 'boolean',\n },\n typed: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
|
package/dist/rules/checkTypes.js
CHANGED
|
@@ -17,46 +17,53 @@ const strictNativeTypes = ['undefined', 'null', 'boolean', 'number', 'bigint', '
|
|
|
17
17
|
* @param {string} preferred The preferred type
|
|
18
18
|
* @param {boolean} isGenericMatch
|
|
19
19
|
* @param {string} typeNodeName
|
|
20
|
-
* @param {import('jsdoc-type-pratt-parser
|
|
21
|
-
* @param {import('jsdoc-type-pratt-parser
|
|
20
|
+
* @param {import('jsdoc-type-pratt-parser').NonRootResult} node
|
|
21
|
+
* @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode
|
|
22
22
|
* @returns {void}
|
|
23
23
|
*/
|
|
24
24
|
const adjustNames = (type, preferred, isGenericMatch, typeNodeName, node, parentNode) => {
|
|
25
25
|
let ret = preferred;
|
|
26
26
|
if (isGenericMatch) {
|
|
27
|
+
const parentMeta = /** @type {import('jsdoc-type-pratt-parser').GenericResult} */parentNode.meta;
|
|
27
28
|
if (preferred === '[]') {
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
parentMeta.brackets = 'square';
|
|
30
|
+
parentMeta.dot = false;
|
|
30
31
|
ret = 'Array';
|
|
31
32
|
} else {
|
|
32
33
|
const dotBracketEnd = preferred.match(/\.(?:<>)?$/u);
|
|
33
34
|
if (dotBracketEnd) {
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
parentMeta.brackets = 'angle';
|
|
36
|
+
parentMeta.dot = true;
|
|
36
37
|
ret = preferred.slice(0, -dotBracketEnd[0].length);
|
|
37
38
|
} else {
|
|
38
|
-
var _parentNode$meta;
|
|
39
39
|
const bracketEnd = preferred.endsWith('<>');
|
|
40
40
|
if (bracketEnd) {
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
parentMeta.brackets = 'angle';
|
|
42
|
+
parentMeta.dot = false;
|
|
43
43
|
ret = preferred.slice(0, -2);
|
|
44
|
-
} else if ((
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
} else if ((parentMeta === null || parentMeta === void 0 ? void 0 : parentMeta.brackets) === 'square' && (typeNodeName === '[]' || typeNodeName === 'Array')) {
|
|
45
|
+
parentMeta.brackets = 'angle';
|
|
46
|
+
parentMeta.dot = false;
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
} else if (type === 'JsdocTypeAny') {
|
|
51
51
|
node.type = 'JsdocTypeName';
|
|
52
52
|
}
|
|
53
|
+
|
|
54
|
+
/** @type {import('jsdoc-type-pratt-parser').NameResult} */
|
|
53
55
|
node.value = ret.replace(/(?:\.|<>|\.<>|\[\])$/u, '');
|
|
54
56
|
|
|
55
57
|
// For bare pseudo-types like `<>`
|
|
56
58
|
if (!ret) {
|
|
57
|
-
node.value = typeNodeName;
|
|
59
|
+
/** @type {import('jsdoc-type-pratt-parser').NameResult} */node.value = typeNodeName;
|
|
58
60
|
}
|
|
59
61
|
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @param {boolean} [upperCase]
|
|
65
|
+
* @returns {string}
|
|
66
|
+
*/
|
|
60
67
|
const getMessage = upperCase => {
|
|
61
68
|
return 'Use object shorthand or index signatures instead of ' + '`' + (upperCase ? 'O' : 'o') + 'bject`, e.g., `{[key: string]: string}`';
|
|
62
69
|
};
|
|
@@ -69,22 +76,48 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
69
76
|
context
|
|
70
77
|
}) => {
|
|
71
78
|
const jsdocTagsWithPossibleType = utils.filterTags(tag => {
|
|
72
|
-
return utils.tagMightHaveTypePosition(tag.tag);
|
|
79
|
+
return Boolean(utils.tagMightHaveTypePosition(tag.tag));
|
|
73
80
|
});
|
|
74
|
-
const
|
|
81
|
+
const
|
|
82
|
+
/**
|
|
83
|
+
* @type {{
|
|
84
|
+
* preferredTypes: import('../iterateJsdoc.js').PreferredTypes,
|
|
85
|
+
* structuredTags: import('../iterateJsdoc.js').StructuredTags,
|
|
86
|
+
* mode: import('../jsdocUtils.js').ParserMode
|
|
87
|
+
* }}
|
|
88
|
+
*/
|
|
89
|
+
{
|
|
75
90
|
preferredTypes: preferredTypesOriginal,
|
|
76
91
|
structuredTags,
|
|
77
92
|
mode
|
|
78
93
|
} = settings;
|
|
94
|
+
/* eslint-enable jsdoc/valid-types -- Old version */
|
|
95
|
+
|
|
79
96
|
const injectObjectPreferredTypes = !('Object' in preferredTypesOriginal || 'object' in preferredTypesOriginal || 'object.<>' in preferredTypesOriginal || 'Object.<>' in preferredTypesOriginal || 'object<>' in preferredTypesOriginal);
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @type {{
|
|
100
|
+
* message: string,
|
|
101
|
+
* replacement: false
|
|
102
|
+
* }}
|
|
103
|
+
*/
|
|
80
104
|
const info = {
|
|
81
105
|
message: getMessage(),
|
|
82
106
|
replacement: false
|
|
83
107
|
};
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @type {{
|
|
111
|
+
* message: string,
|
|
112
|
+
* replacement: false
|
|
113
|
+
* }}
|
|
114
|
+
*/
|
|
84
115
|
const infoUC = {
|
|
85
116
|
message: getMessage(true),
|
|
86
117
|
replacement: false
|
|
87
118
|
};
|
|
119
|
+
|
|
120
|
+
/** @type {import('../iterateJsdoc.js').PreferredTypes} */
|
|
88
121
|
const typeToInject = mode === 'typescript' ? {
|
|
89
122
|
Object: 'object',
|
|
90
123
|
'object.<>': info,
|
|
@@ -97,11 +130,24 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
97
130
|
'Object.<>': 'Object<>',
|
|
98
131
|
'object<>': 'Object<>'
|
|
99
132
|
};
|
|
133
|
+
|
|
134
|
+
/** @type {import('../iterateJsdoc.js').PreferredTypes} */
|
|
100
135
|
const preferredTypes = {
|
|
101
136
|
...(injectObjectPreferredTypes ? typeToInject : {}),
|
|
102
137
|
...preferredTypesOriginal
|
|
103
138
|
};
|
|
104
|
-
const
|
|
139
|
+
const
|
|
140
|
+
/**
|
|
141
|
+
* @type {{
|
|
142
|
+
* noDefaults: boolean,
|
|
143
|
+
* unifyParentAndChildTypeChecks: boolean,
|
|
144
|
+
* exemptTagContexts: ({
|
|
145
|
+
* tag: string,
|
|
146
|
+
* types: true|string[]
|
|
147
|
+
* })[]
|
|
148
|
+
* }}
|
|
149
|
+
*/
|
|
150
|
+
{
|
|
105
151
|
noDefaults,
|
|
106
152
|
unifyParentAndChildTypeChecks,
|
|
107
153
|
exemptTagContexts = []
|
|
@@ -113,8 +159,8 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
113
159
|
*
|
|
114
160
|
* @param {string} _type Not currently in use
|
|
115
161
|
* @param {string} typeNodeName
|
|
116
|
-
* @param {import('jsdoc-type-pratt-parser
|
|
117
|
-
* @param {string} property
|
|
162
|
+
* @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode
|
|
163
|
+
* @param {string|undefined} property
|
|
118
164
|
* @returns {[hasMatchingPreferredType: boolean, typeName: string, isGenericMatch: boolean]}
|
|
119
165
|
*/
|
|
120
166
|
const getPreferredTypeInfo = (_type, typeNodeName, parentNode, property) => {
|
|
@@ -123,9 +169,9 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
123
169
|
let typeName = typeNodeName;
|
|
124
170
|
const isNameOfGeneric = parentNode !== undefined && parentNode.type === 'JsdocTypeGeneric' && property === 'left';
|
|
125
171
|
if (unifyParentAndChildTypeChecks || isNameOfGeneric) {
|
|
126
|
-
var _parentNode$
|
|
127
|
-
const brackets = parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$
|
|
128
|
-
const dot = parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$
|
|
172
|
+
var _parentNode$meta, _parentNode$meta2;
|
|
173
|
+
const brackets = /** @type {import('jsdoc-type-pratt-parser').GenericResult} */parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$meta = parentNode.meta) === null || _parentNode$meta === void 0 ? void 0 : _parentNode$meta.brackets;
|
|
174
|
+
const dot = /** @type {import('jsdoc-type-pratt-parser').GenericResult} */parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$meta2 = parentNode.meta) === null || _parentNode$meta2 === void 0 ? void 0 : _parentNode$meta2.dot;
|
|
129
175
|
if (brackets === 'angle') {
|
|
130
176
|
const checkPostFixes = dot ? ['.', '.<>'] : ['<>'];
|
|
131
177
|
isGenericMatch = checkPostFixes.some(checkPostFix => {
|
|
@@ -136,7 +182,7 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
136
182
|
return false;
|
|
137
183
|
});
|
|
138
184
|
}
|
|
139
|
-
if (!isGenericMatch && property && parentNode.type === 'JsdocTypeGeneric') {
|
|
185
|
+
if (!isGenericMatch && property && /** @type {import('jsdoc-type-pratt-parser').NonRootResult} */parentNode.type === 'JsdocTypeGeneric') {
|
|
140
186
|
const checkPostFixes = dot ? ['.', '.<>'] : [brackets === 'angle' ? '<>' : '[]'];
|
|
141
187
|
isGenericMatch = checkPostFixes.some(checkPostFix => {
|
|
142
188
|
if ((preferredTypes === null || preferredTypes === void 0 ? void 0 : preferredTypes[checkPostFix]) !== undefined) {
|
|
@@ -149,7 +195,7 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
149
195
|
}
|
|
150
196
|
const directNameMatch = (preferredTypes === null || preferredTypes === void 0 ? void 0 : preferredTypes[typeNodeName]) !== undefined && !Object.values(preferredTypes).includes(typeNodeName);
|
|
151
197
|
const unifiedSyntaxParentMatch = property && directNameMatch && unifyParentAndChildTypeChecks;
|
|
152
|
-
isGenericMatch = isGenericMatch || unifiedSyntaxParentMatch;
|
|
198
|
+
isGenericMatch = isGenericMatch || Boolean(unifiedSyntaxParentMatch);
|
|
153
199
|
hasMatchingPreferredType = isGenericMatch || directNameMatch && !property;
|
|
154
200
|
return [hasMatchingPreferredType, typeName, isGenericMatch];
|
|
155
201
|
};
|
|
@@ -159,10 +205,10 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
159
205
|
* the the relevant strict type returned as the new preferred type).
|
|
160
206
|
*
|
|
161
207
|
* @param {string} typeNodeName
|
|
162
|
-
* @param {string} preferred
|
|
163
|
-
* @param {import('jsdoc-type-pratt-parser
|
|
164
|
-
* @param {string[]} invalidTypes
|
|
165
|
-
* @returns {string} The `preferred` type string, optionally changed
|
|
208
|
+
* @param {string|undefined} preferred
|
|
209
|
+
* @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode
|
|
210
|
+
* @param {(string|false|undefined)[][]} invalidTypes
|
|
211
|
+
* @returns {string|undefined} The `preferred` type string, optionally changed
|
|
166
212
|
*/
|
|
167
213
|
const checkNativeTypes = (typeNodeName, preferred, parentNode, invalidTypes) => {
|
|
168
214
|
let changedPreferred = preferred;
|
|
@@ -176,7 +222,18 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
176
222
|
// parent object without a parent match (and not
|
|
177
223
|
// `unifyParentAndChildTypeChecks`) and we don't want
|
|
178
224
|
// `object<>` given TypeScript issue https://github.com/microsoft/TypeScript/issues/20555
|
|
179
|
-
|
|
225
|
+
/**
|
|
226
|
+
* @type {import('jsdoc-type-pratt-parser').GenericResult}
|
|
227
|
+
*/
|
|
228
|
+
parentNode !== null && parentNode !== void 0 && (_parentNode$elements = parentNode.elements) !== null && _parentNode$elements !== void 0 && _parentNode$elements.length &&
|
|
229
|
+
/**
|
|
230
|
+
* @type {import('jsdoc-type-pratt-parser').GenericResult}
|
|
231
|
+
*/
|
|
232
|
+
(parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$left = parentNode.left) === null || _parentNode$left === void 0 ? void 0 : _parentNode$left.type) === 'JsdocTypeName' &&
|
|
233
|
+
/**
|
|
234
|
+
* @type {import('jsdoc-type-pratt-parser').GenericResult}
|
|
235
|
+
*/
|
|
236
|
+
(parentNode === null || parentNode === void 0 ? void 0 : (_parentNode$left2 = parentNode.left) === null || _parentNode$left2 === void 0 ? void 0 : _parentNode$left2.value) === 'Object')) {
|
|
180
237
|
continue;
|
|
181
238
|
}
|
|
182
239
|
if (strictNativeType !== typeNodeName && strictNativeType.toLowerCase() === typeNodeName.toLowerCase() && (
|
|
@@ -198,10 +255,10 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
198
255
|
* @param {string} tagName
|
|
199
256
|
* @param {string} nameInTag
|
|
200
257
|
* @param {number} idx
|
|
201
|
-
* @param {string} property
|
|
202
|
-
* @param {import('jsdoc-type-pratt-parser
|
|
203
|
-
* @param {import('jsdoc-type-pratt-parser
|
|
204
|
-
* @param {string[]} invalidTypes
|
|
258
|
+
* @param {string|undefined} property
|
|
259
|
+
* @param {import('jsdoc-type-pratt-parser').NonRootResult} node
|
|
260
|
+
* @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode
|
|
261
|
+
* @param {(string|false|undefined)[][]} invalidTypes
|
|
205
262
|
* @returns {void}
|
|
206
263
|
*/
|
|
207
264
|
const getInvalidTypes = (type, value, tagName, nameInTag, idx, property, node, parentNode, invalidTypes) => {
|
|
@@ -244,6 +301,7 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
244
301
|
}
|
|
245
302
|
};
|
|
246
303
|
for (const [idx, jsdocTag] of jsdocTagsWithPossibleType.entries()) {
|
|
304
|
+
/** @type {(string|false|undefined)[][]} */
|
|
247
305
|
const invalidTypes = [];
|
|
248
306
|
let typeAst;
|
|
249
307
|
try {
|
|
@@ -259,7 +317,11 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
259
317
|
const {
|
|
260
318
|
type,
|
|
261
319
|
value
|
|
262
|
-
} =
|
|
320
|
+
} =
|
|
321
|
+
/**
|
|
322
|
+
* @type {import('jsdoc-type-pratt-parser').NameResult}
|
|
323
|
+
*/
|
|
324
|
+
node;
|
|
263
325
|
if (!['JsdocTypeName', 'JsdocTypeAny'].includes(type)) {
|
|
264
326
|
return;
|
|
265
327
|
}
|
|
@@ -269,8 +331,7 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
269
331
|
const fixedType = (0, _jsdoccomment.stringify)(typeAst);
|
|
270
332
|
|
|
271
333
|
/**
|
|
272
|
-
* @
|
|
273
|
-
* @returns {string}
|
|
334
|
+
* @type {import('eslint').Rule.ReportFixer}
|
|
274
335
|
*/
|
|
275
336
|
const fix = fixer => {
|
|
276
337
|
return fixer.replaceText(jsdocNode, sourceCode.getText(jsdocNode).replace(`{${jsdocTag.type}}`, `{${fixedType}}`));
|
|
@@ -288,7 +349,7 @@ var _default = (0, _iterateJsdoc.default)(({
|
|
|
288
349
|
report(msg || `Invalid JSDoc @${tagName}${tagValue} type "${badType}"` + (preferredType ? '; ' : '.') + (preferredType ? `prefer: ${JSON.stringify(preferredType)}.` : ''), preferredType ? fix : null, jsdocTag, msg ? {
|
|
289
350
|
tagName,
|
|
290
351
|
tagValue
|
|
291
|
-
} :
|
|
352
|
+
} : undefined);
|
|
292
353
|
}
|
|
293
354
|
}
|
|
294
355
|
}
|