eslint-plugin-jsdoc 57.2.1 → 58.0.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.
@@ -0,0 +1,349 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.buildRejectOrPreferRuleDefinition = void 0;
7
+ var _iterateJsdoc = _interopRequireDefault(require("./iterateJsdoc.cjs"));
8
+ var _jsdoccomment = require("@es-joy/jsdoccomment");
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ /**
11
+ * Adjusts the parent type node `meta` for generic matches (or type node
12
+ * `type` for `JsdocTypeAny`) and sets the type node `value`.
13
+ * @param {string} type The actual type
14
+ * @param {string} preferred The preferred type
15
+ * @param {boolean} isGenericMatch
16
+ * @param {string} typeNodeName
17
+ * @param {import('jsdoc-type-pratt-parser').NonRootResult} node
18
+ * @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode
19
+ * @returns {void}
20
+ */
21
+ const adjustNames = (type, preferred, isGenericMatch, typeNodeName, node, parentNode) => {
22
+ let ret = preferred;
23
+ if (isGenericMatch) {
24
+ const parentMeta = /** @type {import('jsdoc-type-pratt-parser').GenericResult} */parentNode.meta;
25
+ if (preferred === '[]') {
26
+ parentMeta.brackets = 'square';
27
+ parentMeta.dot = false;
28
+ ret = 'Array';
29
+ } else {
30
+ const dotBracketEnd = preferred.match(/\.(?:<>)?$/v);
31
+ if (dotBracketEnd) {
32
+ parentMeta.brackets = 'angle';
33
+ parentMeta.dot = true;
34
+ ret = preferred.slice(0, -dotBracketEnd[0].length);
35
+ } else {
36
+ const bracketEnd = preferred.endsWith('<>');
37
+ if (bracketEnd) {
38
+ parentMeta.brackets = 'angle';
39
+ parentMeta.dot = false;
40
+ ret = preferred.slice(0, -2);
41
+ } else if (parentMeta?.brackets === 'square' && (typeNodeName === '[]' || typeNodeName === 'Array')) {
42
+ parentMeta.brackets = 'angle';
43
+ parentMeta.dot = false;
44
+ }
45
+ }
46
+ }
47
+ } else if (type === 'JsdocTypeAny') {
48
+ node.type = 'JsdocTypeName';
49
+ }
50
+
51
+ /** @type {import('jsdoc-type-pratt-parser').NameResult} */
52
+ node.value = ret.replace(/(?:\.|<>|\.<>|\[\])$/v, '');
53
+
54
+ // For bare pseudo-types like `<>`
55
+ if (!ret) {
56
+ /** @type {import('jsdoc-type-pratt-parser').NameResult} */node.value = typeNodeName;
57
+ }
58
+ };
59
+
60
+ /**
61
+ * @param {boolean} [upperCase]
62
+ * @returns {string}
63
+ */
64
+ const getMessage = upperCase => {
65
+ return 'Use object shorthand or index signatures instead of ' + '`' + (upperCase ? 'O' : 'o') + 'bject`, e.g., `{[key: string]: string}`';
66
+ };
67
+
68
+ /**
69
+ * @type {{
70
+ * message: string,
71
+ * replacement: false
72
+ * }}
73
+ */
74
+ const info = {
75
+ message: getMessage(),
76
+ replacement: false
77
+ };
78
+
79
+ /**
80
+ * @type {{
81
+ * message: string,
82
+ * replacement: false
83
+ * }}
84
+ */
85
+ const infoUC = {
86
+ message: getMessage(true),
87
+ replacement: false
88
+ };
89
+
90
+ /**
91
+ * @param {{
92
+ * checkNativeTypes?: import('./rules/checkTypes.js').CheckNativeTypes|null
93
+ * overrideSettings?: import('./iterateJsdoc.js').Settings['preferredTypes']|null,
94
+ * description?: string,
95
+ * schema?: import('eslint').Rule.RuleMetaData['schema'],
96
+ * typeName?: string,
97
+ * url?: string,
98
+ * }} cfg
99
+ * @returns {import('@eslint/core').RuleDefinition<
100
+ * import('@eslint/core').RuleDefinitionTypeOptions
101
+ * >}
102
+ */
103
+ const buildRejectOrPreferRuleDefinition = ({
104
+ checkNativeTypes = null,
105
+ typeName,
106
+ description = typeName ?? 'Reports invalid types.',
107
+ overrideSettings = null,
108
+ schema = [],
109
+ url = 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-types.md#repos-sticky-header'
110
+ }) => {
111
+ return (0, _iterateJsdoc.default)(({
112
+ context,
113
+ jsdocNode,
114
+ report,
115
+ settings,
116
+ sourceCode,
117
+ utils
118
+ }) => {
119
+ const jsdocTagsWithPossibleType = utils.filterTags(tag => {
120
+ return Boolean(utils.tagMightHaveTypePosition(tag.tag));
121
+ });
122
+ const
123
+ /**
124
+ * @type {{
125
+ * preferredTypes: import('./iterateJsdoc.js').PreferredTypes,
126
+ * structuredTags: import('./iterateJsdoc.js').StructuredTags,
127
+ * mode: import('./jsdocUtils.js').ParserMode
128
+ * }}
129
+ */
130
+ {
131
+ mode,
132
+ preferredTypes: preferredTypesOriginal,
133
+ structuredTags
134
+ } = overrideSettings ? {
135
+ mode: settings.mode,
136
+ preferredTypes: overrideSettings,
137
+ structuredTags: {}
138
+ } : settings;
139
+ const injectObjectPreferredTypes = !('Object' in preferredTypesOriginal || 'object' in preferredTypesOriginal || 'object.<>' in preferredTypesOriginal || 'Object.<>' in preferredTypesOriginal || 'object<>' in preferredTypesOriginal);
140
+
141
+ /** @type {import('./iterateJsdoc.js').PreferredTypes} */
142
+ const typeToInject = mode === 'typescript' ? {
143
+ Object: 'object',
144
+ 'object.<>': info,
145
+ 'Object.<>': infoUC,
146
+ 'object<>': info,
147
+ 'Object<>': infoUC
148
+ } : {
149
+ Object: 'object',
150
+ 'object.<>': 'Object<>',
151
+ 'Object.<>': 'Object<>',
152
+ 'object<>': 'Object<>'
153
+ };
154
+
155
+ /** @type {import('./iterateJsdoc.js').PreferredTypes} */
156
+ const preferredTypes = {
157
+ ...(injectObjectPreferredTypes ? typeToInject : {}),
158
+ ...preferredTypesOriginal
159
+ };
160
+ const
161
+ /**
162
+ * @type {{
163
+ * noDefaults: boolean,
164
+ * unifyParentAndChildTypeChecks: boolean,
165
+ * exemptTagContexts: ({
166
+ * tag: string,
167
+ * types: true|string[]
168
+ * })[]
169
+ * }}
170
+ */
171
+ {
172
+ exemptTagContexts = [],
173
+ noDefaults,
174
+ unifyParentAndChildTypeChecks
175
+ } = context.options[0] || {};
176
+
177
+ /**
178
+ * Gets information about the preferred type: whether there is a matching
179
+ * preferred type, what the type is, and whether it is a match to a generic.
180
+ * @param {string} _type Not currently in use
181
+ * @param {string} typeNodeName
182
+ * @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode
183
+ * @param {string|undefined} property
184
+ * @returns {[hasMatchingPreferredType: boolean, typeName: string, isGenericMatch: boolean]}
185
+ */
186
+ const getPreferredTypeInfo = (_type, typeNodeName, parentNode, property) => {
187
+ let hasMatchingPreferredType = false;
188
+ let isGenericMatch = false;
189
+ let typName = typeNodeName;
190
+ const isNameOfGeneric = parentNode !== undefined && parentNode.type === 'JsdocTypeGeneric' && property === 'left';
191
+ const brackets = /** @type {import('jsdoc-type-pratt-parser').GenericResult} */parentNode?.meta?.brackets;
192
+ const dot = /** @type {import('jsdoc-type-pratt-parser').GenericResult} */parentNode?.meta?.dot;
193
+ if (brackets === 'angle') {
194
+ const checkPostFixes = dot ? ['.', '.<>'] : ['<>'];
195
+ isGenericMatch = checkPostFixes.some(checkPostFix => {
196
+ const preferredType = preferredTypes?.[typeNodeName + checkPostFix];
197
+
198
+ // Does `unifyParentAndChildTypeChecks` need to be checked here?
199
+ if ((unifyParentAndChildTypeChecks || isNameOfGeneric || (/* c8 ignore next 2 -- If checking `unifyParentAndChildTypeChecks` */
200
+ typeof preferredType === 'object' && preferredType?.unifyParentAndChildTypeChecks)) && preferredType !== undefined) {
201
+ typName += checkPostFix;
202
+ return true;
203
+ }
204
+ return false;
205
+ });
206
+ }
207
+ if (!isGenericMatch && property && /** @type {import('jsdoc-type-pratt-parser').NonRootResult} */parentNode.type === 'JsdocTypeGeneric') {
208
+ const checkPostFixes = dot ? ['.', '.<>'] : [brackets === 'angle' ? '<>' : '[]'];
209
+ isGenericMatch = checkPostFixes.some(checkPostFix => {
210
+ const preferredType = preferredTypes?.[checkPostFix];
211
+ if (
212
+ // Does `unifyParentAndChildTypeChecks` need to be checked here?
213
+ (unifyParentAndChildTypeChecks || isNameOfGeneric || (/* c8 ignore next 2 -- If checking `unifyParentAndChildTypeChecks` */
214
+ typeof preferredType === 'object' && preferredType?.unifyParentAndChildTypeChecks)) && preferredType !== undefined) {
215
+ typName = checkPostFix;
216
+ return true;
217
+ }
218
+ return false;
219
+ });
220
+ }
221
+ const prefType = preferredTypes?.[typeNodeName];
222
+ const directNameMatch = prefType !== undefined && !Object.values(preferredTypes).includes(typeNodeName);
223
+ const specificUnify = typeof prefType === 'object' && prefType?.unifyParentAndChildTypeChecks;
224
+ const unifiedSyntaxParentMatch = property && directNameMatch && (unifyParentAndChildTypeChecks || specificUnify);
225
+ isGenericMatch = isGenericMatch || Boolean(unifiedSyntaxParentMatch);
226
+ hasMatchingPreferredType = isGenericMatch || directNameMatch && !property;
227
+ return [hasMatchingPreferredType, typName, isGenericMatch];
228
+ };
229
+
230
+ /**
231
+ * Collect invalid type info.
232
+ * @param {string} type
233
+ * @param {string} value
234
+ * @param {string} tagName
235
+ * @param {string} nameInTag
236
+ * @param {number} idx
237
+ * @param {string|undefined} property
238
+ * @param {import('jsdoc-type-pratt-parser').NonRootResult} node
239
+ * @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode
240
+ * @param {(string|false|undefined)[][]} invalidTypes
241
+ * @returns {void}
242
+ */
243
+ const getInvalidTypes = (type, value, tagName, nameInTag, idx, property, node, parentNode, invalidTypes) => {
244
+ let typeNodeName = type === 'JsdocTypeAny' ? '*' : value;
245
+ const [hasMatchingPreferredType, typName, isGenericMatch] = getPreferredTypeInfo(type, typeNodeName, parentNode, property);
246
+ let preferred;
247
+ let types;
248
+ if (hasMatchingPreferredType) {
249
+ const preferredSetting = preferredTypes[typName];
250
+ typeNodeName = typName === '[]' ? typName : typeNodeName;
251
+ if (!preferredSetting) {
252
+ invalidTypes.push([typeNodeName]);
253
+ } else if (typeof preferredSetting === 'string') {
254
+ preferred = preferredSetting;
255
+ invalidTypes.push([typeNodeName, preferred]);
256
+ } else if (preferredSetting && typeof preferredSetting === 'object') {
257
+ const nextItem = preferredSetting.skipRootChecking && jsdocTagsWithPossibleType[idx + 1];
258
+ if (!nextItem || !nextItem.name.startsWith(`${nameInTag}.`)) {
259
+ preferred = preferredSetting.replacement;
260
+ invalidTypes.push([typeNodeName, preferred, preferredSetting.message]);
261
+ }
262
+ } else {
263
+ utils.reportSettings('Invalid `settings.jsdoc.preferredTypes`. Values must be falsy, a string, or an object.');
264
+ return;
265
+ }
266
+ } else if (Object.entries(structuredTags).some(([tag, {
267
+ type: typs
268
+ }]) => {
269
+ types = typs;
270
+ return tag === tagName && Array.isArray(types) && !types.includes(typeNodeName);
271
+ })) {
272
+ invalidTypes.push([typeNodeName, types]);
273
+ } else if (checkNativeTypes && !noDefaults && type === 'JsdocTypeName') {
274
+ preferred = checkNativeTypes(preferredTypes, typeNodeName, preferred, parentNode, invalidTypes);
275
+ }
276
+
277
+ // For fixer
278
+ if (preferred) {
279
+ adjustNames(type, preferred, isGenericMatch, typeNodeName, node, parentNode);
280
+ }
281
+ };
282
+ for (const [idx, jsdocTag] of jsdocTagsWithPossibleType.entries()) {
283
+ /** @type {(string|false|undefined)[][]} */
284
+ const invalidTypes = [];
285
+ let typeAst;
286
+ try {
287
+ typeAst = mode === 'permissive' ? (0, _jsdoccomment.tryParse)(jsdocTag.type) : (0, _jsdoccomment.parse)(jsdocTag.type, mode);
288
+ } catch {
289
+ continue;
290
+ }
291
+ const {
292
+ name: nameInTag,
293
+ tag: tagName
294
+ } = jsdocTag;
295
+ (0, _jsdoccomment.traverse)(typeAst, (node, parentNode, property) => {
296
+ const {
297
+ type,
298
+ value
299
+ } =
300
+ /**
301
+ * @type {import('jsdoc-type-pratt-parser').NameResult}
302
+ */
303
+ node;
304
+ if (!['JsdocTypeAny', 'JsdocTypeName'].includes(type)) {
305
+ return;
306
+ }
307
+ getInvalidTypes(type, value, tagName, nameInTag, idx, property, node, parentNode, invalidTypes);
308
+ });
309
+ if (invalidTypes.length) {
310
+ const fixedType = (0, _jsdoccomment.stringify)(typeAst);
311
+
312
+ /**
313
+ * @type {import('eslint').Rule.ReportFixer}
314
+ */
315
+ const fix = fixer => {
316
+ return fixer.replaceText(jsdocNode, sourceCode.getText(jsdocNode).replace(`{${jsdocTag.type}}`, `{${fixedType}}`));
317
+ };
318
+ for (const [badType, preferredType = '', msg] of invalidTypes) {
319
+ const tagValue = jsdocTag.name ? ` "${jsdocTag.name}"` : '';
320
+ if (exemptTagContexts.some(({
321
+ tag,
322
+ types
323
+ }) => {
324
+ return tag === tagName && (types === true || types.includes(jsdocTag.type));
325
+ })) {
326
+ continue;
327
+ }
328
+ report(msg || `Invalid JSDoc @${tagName}${tagValue} type "${badType}"` + (preferredType ? '; ' : '.') + (preferredType ? `prefer: ${JSON.stringify(preferredType)}.` : ''), preferredType ? fix : null, jsdocTag, msg ? {
329
+ tagName,
330
+ tagValue
331
+ } : undefined);
332
+ }
333
+ }
334
+ }
335
+ }, {
336
+ iterateAllJsdocs: true,
337
+ meta: {
338
+ docs: {
339
+ description,
340
+ url
341
+ },
342
+ fixable: 'code',
343
+ schema,
344
+ type: 'suggestion'
345
+ }
346
+ });
347
+ };
348
+ exports.buildRejectOrPreferRuleDefinition = buildRejectOrPreferRuleDefinition;
349
+ //# sourceMappingURL=buildRejectOrPreferRuleDefinition.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildRejectOrPreferRuleDefinition.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdoccomment","e","__esModule","default","adjustNames","type","preferred","isGenericMatch","typeNodeName","node","parentNode","ret","parentMeta","meta","brackets","dot","dotBracketEnd","match","slice","length","bracketEnd","endsWith","value","replace","getMessage","upperCase","info","message","replacement","infoUC","buildRejectOrPreferRuleDefinition","checkNativeTypes","typeName","description","overrideSettings","schema","url","iterateJsdoc","context","jsdocNode","report","settings","sourceCode","utils","jsdocTagsWithPossibleType","filterTags","tag","Boolean","tagMightHaveTypePosition","mode","preferredTypes","preferredTypesOriginal","structuredTags","injectObjectPreferredTypes","typeToInject","Object","exemptTagContexts","noDefaults","unifyParentAndChildTypeChecks","options","getPreferredTypeInfo","_type","property","hasMatchingPreferredType","typName","isNameOfGeneric","undefined","checkPostFixes","some","checkPostFix","preferredType","prefType","directNameMatch","values","includes","specificUnify","unifiedSyntaxParentMatch","getInvalidTypes","tagName","nameInTag","idx","invalidTypes","types","preferredSetting","push","nextItem","skipRootChecking","name","startsWith","reportSettings","entries","typs","Array","isArray","jsdocTag","typeAst","tryParse","parse","traverse","fixedType","stringify","fix","fixer","replaceText","getText","badType","msg","tagValue","JSON","iterateAllJsdocs","docs","fixable","exports"],"sources":["../src/buildRejectOrPreferRuleDefinition.js"],"sourcesContent":["import iterateJsdoc from './iterateJsdoc.js';\nimport {\n parse,\n stringify,\n traverse,\n tryParse,\n} from '@es-joy/jsdoccomment';\n\n/**\n * Adjusts the parent type node `meta` for generic matches (or type node\n * `type` for `JsdocTypeAny`) and sets the type node `value`.\n * @param {string} type The actual type\n * @param {string} preferred The preferred type\n * @param {boolean} isGenericMatch\n * @param {string} typeNodeName\n * @param {import('jsdoc-type-pratt-parser').NonRootResult} node\n * @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode\n * @returns {void}\n */\nconst adjustNames = (type, preferred, isGenericMatch, typeNodeName, node, parentNode) => {\n let ret = preferred;\n if (isGenericMatch) {\n const parentMeta = /** @type {import('jsdoc-type-pratt-parser').GenericResult} */ (\n parentNode\n ).meta;\n if (preferred === '[]') {\n parentMeta.brackets = 'square';\n parentMeta.dot = false;\n ret = 'Array';\n } else {\n const dotBracketEnd = preferred.match(/\\.(?:<>)?$/v);\n if (dotBracketEnd) {\n parentMeta.brackets = 'angle';\n parentMeta.dot = true;\n ret = preferred.slice(0, -dotBracketEnd[0].length);\n } else {\n const bracketEnd = preferred.endsWith('<>');\n if (bracketEnd) {\n parentMeta.brackets = 'angle';\n parentMeta.dot = false;\n ret = preferred.slice(0, -2);\n } else if (\n parentMeta?.brackets === 'square' &&\n (typeNodeName === '[]' || typeNodeName === 'Array')\n ) {\n parentMeta.brackets = 'angle';\n parentMeta.dot = false;\n }\n }\n }\n } else if (type === 'JsdocTypeAny') {\n node.type = 'JsdocTypeName';\n }\n\n /** @type {import('jsdoc-type-pratt-parser').NameResult} */ (\n node\n ).value = ret.replace(/(?:\\.|<>|\\.<>|\\[\\])$/v, '');\n\n // For bare pseudo-types like `<>`\n if (!ret) {\n /** @type {import('jsdoc-type-pratt-parser').NameResult} */ (\n node\n ).value = typeNodeName;\n }\n};\n\n/**\n * @param {boolean} [upperCase]\n * @returns {string}\n */\nconst getMessage = (upperCase) => {\n return 'Use object shorthand or index signatures instead of ' +\n '`' + (upperCase ? 'O' : 'o') + 'bject`, e.g., `{[key: string]: string}`';\n};\n\n/**\n * @type {{\n * message: string,\n * replacement: false\n * }}\n */\nconst info = {\n message: getMessage(),\n replacement: false,\n};\n\n/**\n * @type {{\n * message: string,\n * replacement: false\n * }}\n */\nconst infoUC = {\n message: getMessage(true),\n replacement: false,\n};\n\n/**\n * @param {{\n * checkNativeTypes?: import('./rules/checkTypes.js').CheckNativeTypes|null\n * overrideSettings?: import('./iterateJsdoc.js').Settings['preferredTypes']|null,\n * description?: string,\n * schema?: import('eslint').Rule.RuleMetaData['schema'],\n * typeName?: string,\n * url?: string,\n * }} cfg\n * @returns {import('@eslint/core').RuleDefinition<\n * import('@eslint/core').RuleDefinitionTypeOptions\n * >}\n */\nexport const buildRejectOrPreferRuleDefinition = ({\n checkNativeTypes = null,\n typeName,\n description = typeName ?? 'Reports invalid types.',\n overrideSettings = null,\n schema = [],\n url = 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-types.md#repos-sticky-header',\n}) => {\n return iterateJsdoc(\n ({\n context,\n jsdocNode,\n report,\n settings,\n sourceCode,\n utils,\n }) => {\n const jsdocTagsWithPossibleType = utils.filterTags((tag) => {\n return Boolean(utils.tagMightHaveTypePosition(tag.tag));\n });\n\n const\n /**\n * @type {{\n * preferredTypes: import('./iterateJsdoc.js').PreferredTypes,\n * structuredTags: import('./iterateJsdoc.js').StructuredTags,\n * mode: import('./jsdocUtils.js').ParserMode\n * }}\n */\n {\n mode,\n preferredTypes: preferredTypesOriginal,\n structuredTags,\n } = overrideSettings ? {\n mode: settings.mode,\n preferredTypes: overrideSettings,\n structuredTags: {},\n } : settings;\n\n const injectObjectPreferredTypes = !('Object' in preferredTypesOriginal ||\n 'object' in preferredTypesOriginal ||\n 'object.<>' in preferredTypesOriginal ||\n 'Object.<>' in preferredTypesOriginal ||\n 'object<>' in preferredTypesOriginal);\n\n /** @type {import('./iterateJsdoc.js').PreferredTypes} */\n const typeToInject = mode === 'typescript' ?\n {\n Object: 'object',\n 'object.<>': info,\n 'Object.<>': infoUC,\n 'object<>': info,\n 'Object<>': infoUC,\n } :\n {\n Object: 'object',\n 'object.<>': 'Object<>',\n 'Object.<>': 'Object<>',\n 'object<>': 'Object<>',\n };\n\n /** @type {import('./iterateJsdoc.js').PreferredTypes} */\n const preferredTypes = {\n ...injectObjectPreferredTypes ?\n typeToInject :\n {},\n ...preferredTypesOriginal,\n };\n\n const\n /**\n * @type {{\n * noDefaults: boolean,\n * unifyParentAndChildTypeChecks: boolean,\n * exemptTagContexts: ({\n * tag: string,\n * types: true|string[]\n * })[]\n * }}\n */ {\n exemptTagContexts = [],\n noDefaults,\n unifyParentAndChildTypeChecks,\n } = context.options[0] || {};\n\n /**\n * Gets information about the preferred type: whether there is a matching\n * preferred type, what the type is, and whether it is a match to a generic.\n * @param {string} _type Not currently in use\n * @param {string} typeNodeName\n * @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode\n * @param {string|undefined} property\n * @returns {[hasMatchingPreferredType: boolean, typeName: string, isGenericMatch: boolean]}\n */\n const getPreferredTypeInfo = (_type, typeNodeName, parentNode, property) => {\n let hasMatchingPreferredType = false;\n let isGenericMatch = false;\n let typName = typeNodeName;\n\n const isNameOfGeneric = parentNode !== undefined && parentNode.type === 'JsdocTypeGeneric' && property === 'left';\n\n const brackets = /** @type {import('jsdoc-type-pratt-parser').GenericResult} */ (\n parentNode\n )?.meta?.brackets;\n const dot = /** @type {import('jsdoc-type-pratt-parser').GenericResult} */ (\n parentNode\n )?.meta?.dot;\n\n if (brackets === 'angle') {\n const checkPostFixes = dot ? [\n '.', '.<>',\n ] : [\n '<>',\n ];\n isGenericMatch = checkPostFixes.some((checkPostFix) => {\n const preferredType = preferredTypes?.[typeNodeName + checkPostFix];\n\n // Does `unifyParentAndChildTypeChecks` need to be checked here?\n if (\n (unifyParentAndChildTypeChecks || isNameOfGeneric ||\n /* c8 ignore next 2 -- If checking `unifyParentAndChildTypeChecks` */\n (typeof preferredType === 'object' &&\n preferredType?.unifyParentAndChildTypeChecks)\n ) &&\n preferredType !== undefined\n ) {\n typName += checkPostFix;\n\n return true;\n }\n\n return false;\n });\n }\n\n if (\n !isGenericMatch && property &&\n /** @type {import('jsdoc-type-pratt-parser').NonRootResult} */ (\n parentNode\n ).type === 'JsdocTypeGeneric'\n ) {\n const checkPostFixes = dot ? [\n '.', '.<>',\n ] : [\n brackets === 'angle' ? '<>' : '[]',\n ];\n\n isGenericMatch = checkPostFixes.some((checkPostFix) => {\n const preferredType = preferredTypes?.[checkPostFix];\n if (\n // Does `unifyParentAndChildTypeChecks` need to be checked here?\n (unifyParentAndChildTypeChecks || isNameOfGeneric ||\n /* c8 ignore next 2 -- If checking `unifyParentAndChildTypeChecks` */\n (typeof preferredType === 'object' &&\n preferredType?.unifyParentAndChildTypeChecks)) &&\n preferredType !== undefined\n ) {\n typName = checkPostFix;\n\n return true;\n }\n\n return false;\n });\n }\n\n const prefType = preferredTypes?.[typeNodeName];\n const directNameMatch = prefType !== undefined &&\n !Object.values(preferredTypes).includes(typeNodeName);\n const specificUnify = typeof prefType === 'object' &&\n prefType?.unifyParentAndChildTypeChecks;\n const unifiedSyntaxParentMatch = property && directNameMatch && (unifyParentAndChildTypeChecks || specificUnify);\n isGenericMatch = isGenericMatch || Boolean(unifiedSyntaxParentMatch);\n\n hasMatchingPreferredType = isGenericMatch ||\n directNameMatch && !property;\n\n return [\n hasMatchingPreferredType, typName, isGenericMatch,\n ];\n };\n\n /**\n * Collect invalid type info.\n * @param {string} type\n * @param {string} value\n * @param {string} tagName\n * @param {string} nameInTag\n * @param {number} idx\n * @param {string|undefined} property\n * @param {import('jsdoc-type-pratt-parser').NonRootResult} node\n * @param {import('jsdoc-type-pratt-parser').NonRootResult|undefined} parentNode\n * @param {(string|false|undefined)[][]} invalidTypes\n * @returns {void}\n */\n const getInvalidTypes = (type, value, tagName, nameInTag, idx, property, node, parentNode, invalidTypes) => {\n let typeNodeName = type === 'JsdocTypeAny' ? '*' : value;\n\n const [\n hasMatchingPreferredType,\n typName,\n isGenericMatch,\n ] = getPreferredTypeInfo(type, typeNodeName, parentNode, property);\n\n let preferred;\n let types;\n if (hasMatchingPreferredType) {\n const preferredSetting = preferredTypes[typName];\n typeNodeName = typName === '[]' ? typName : typeNodeName;\n\n if (!preferredSetting) {\n invalidTypes.push([\n typeNodeName,\n ]);\n } else if (typeof preferredSetting === 'string') {\n preferred = preferredSetting;\n invalidTypes.push([\n typeNodeName, preferred,\n ]);\n } else if (preferredSetting && typeof preferredSetting === 'object') {\n const nextItem = preferredSetting.skipRootChecking && jsdocTagsWithPossibleType[idx + 1];\n\n if (!nextItem || !nextItem.name.startsWith(`${nameInTag}.`)) {\n preferred = preferredSetting.replacement;\n invalidTypes.push([\n typeNodeName,\n preferred,\n preferredSetting.message,\n ]);\n }\n } else {\n utils.reportSettings(\n 'Invalid `settings.jsdoc.preferredTypes`. Values must be falsy, a string, or an object.',\n );\n\n return;\n }\n } else if (Object.entries(structuredTags).some(([\n tag,\n {\n type: typs,\n },\n ]) => {\n types = typs;\n\n return tag === tagName &&\n Array.isArray(types) &&\n !types.includes(typeNodeName);\n })) {\n invalidTypes.push([\n typeNodeName, types,\n ]);\n } else if (checkNativeTypes && !noDefaults && type === 'JsdocTypeName') {\n preferred = checkNativeTypes(\n preferredTypes, typeNodeName, preferred, parentNode, invalidTypes,\n );\n }\n\n // For fixer\n if (preferred) {\n adjustNames(type, preferred, isGenericMatch, typeNodeName, node, parentNode);\n }\n };\n\n for (const [\n idx,\n jsdocTag,\n ] of jsdocTagsWithPossibleType.entries()) {\n /** @type {(string|false|undefined)[][]} */\n const invalidTypes = [];\n let typeAst;\n\n try {\n typeAst = mode === 'permissive' ? tryParse(jsdocTag.type) : parse(jsdocTag.type, mode);\n } catch {\n continue;\n }\n\n const {\n name: nameInTag,\n tag: tagName,\n } = jsdocTag;\n\n traverse(typeAst, (node, parentNode, property) => {\n const {\n type,\n value,\n } =\n /**\n * @type {import('jsdoc-type-pratt-parser').NameResult}\n */ (node);\n if (![\n 'JsdocTypeAny', 'JsdocTypeName',\n ].includes(type)) {\n return;\n }\n\n getInvalidTypes(type, value, tagName, nameInTag, idx, property, node, parentNode, invalidTypes);\n });\n\n if (invalidTypes.length) {\n const fixedType = stringify(typeAst);\n\n /**\n * @type {import('eslint').Rule.ReportFixer}\n */\n const fix = (fixer) => {\n return fixer.replaceText(\n jsdocNode,\n sourceCode.getText(jsdocNode).replace(\n `{${jsdocTag.type}}`,\n `{${fixedType}}`,\n ),\n );\n };\n\n for (const [\n badType,\n preferredType = '',\n msg,\n ] of invalidTypes) {\n const tagValue = jsdocTag.name ? ` \"${jsdocTag.name}\"` : '';\n if (exemptTagContexts.some(({\n tag,\n types,\n }) => {\n return tag === tagName &&\n (types === true || types.includes(jsdocTag.type));\n })) {\n continue;\n }\n\n report(\n msg ||\n `Invalid JSDoc @${tagName}${tagValue} type \"${badType}\"` +\n (preferredType ? '; ' : '.') +\n (preferredType ? `prefer: ${JSON.stringify(preferredType)}.` : ''),\n preferredType ? fix : null,\n jsdocTag,\n msg ? {\n tagName,\n tagValue,\n } : undefined,\n );\n }\n }\n }\n },\n {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description,\n url,\n },\n fixable: 'code',\n schema,\n type: 'suggestion',\n },\n },\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,9 @@
1
+ export function buildRejectOrPreferRuleDefinition({ checkNativeTypes, typeName, description, overrideSettings, schema, url, }: {
2
+ checkNativeTypes?: import("./rules/checkTypes.js").CheckNativeTypes | null;
3
+ overrideSettings?: import("./iterateJsdoc.js").Settings["preferredTypes"] | null;
4
+ description?: string;
5
+ schema?: import("eslint").Rule.RuleMetaData["schema"];
6
+ typeName?: string;
7
+ url?: string;
8
+ }): import("@eslint/core").RuleDefinition<import("@eslint/core").RuleDefinitionTypeOptions>;
9
+ //# sourceMappingURL=buildRejectOrPreferRuleDefinition.d.ts.map
@@ -0,0 +1,8 @@
1
+ export function buildRejectOrPreferRuleDefinition({ checkNativeTypes, typeName, description, overrideSettings, schema, url, }: {
2
+ checkNativeTypes?: import("./rules/checkTypes.js").CheckNativeTypes | null;
3
+ overrideSettings?: import("./iterateJsdoc.js").Settings["preferredTypes"] | null;
4
+ description?: string;
5
+ schema?: import("eslint").Rule.RuleMetaData["schema"];
6
+ typeName?: string;
7
+ url?: string;
8
+ }): import("@eslint/core").RuleDefinition<import("@eslint/core").RuleDefinitionTypeOptions>;
@@ -1,2 +1,7 @@
1
- declare const _default: import("eslint").Rule.RuleModule;
1
+ declare const _default: import("@eslint/core").RuleDefinition<import("@eslint/core").RuleDefinitionTypeOptions>;
2
2
  export default _default;
3
+ /**
4
+ * Iterates strict types to see if any should be added to `invalidTypes` (and
5
+ * the the relevant strict type returned as the new preferred type).
6
+ */
7
+ export type CheckNativeTypes = (preferredTypes: import("../iterateJsdoc.js").PreferredTypes, typeNodeName: string, preferred: string | undefined, parentNode: import("jsdoc-type-pratt-parser").NonRootResult | undefined, invalidTypes: (string | false | undefined)[][]) => string | undefined;
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _buildForbidRuleDefinition = require("./buildForbidRuleDefinition.cjs");
8
+ var _buildRejectOrPreferRuleDefinition = require("./buildRejectOrPreferRuleDefinition.cjs");
8
9
  var _getJsdocProcessorPlugin = require("./getJsdocProcessorPlugin.cjs");
9
10
  var _checkAccess = _interopRequireDefault(require("./rules/checkAccess.cjs"));
10
11
  var _checkAlignment = _interopRequireDefault(require("./rules/checkAlignment.cjs"));
@@ -109,6 +110,33 @@ index.rules = {
109
110
  'no-restricted-syntax': _noRestrictedSyntax.default,
110
111
  'no-types': _noTypes.default,
111
112
  'no-undefined-types': _noUndefinedTypes.default,
113
+ 'reject-any-type': (0, _buildRejectOrPreferRuleDefinition.buildRejectOrPreferRuleDefinition)({
114
+ description: 'Reports use of `any` or `*` type',
115
+ overrideSettings: {
116
+ '*': {
117
+ message: 'Prefer a more specific type to `*`',
118
+ replacement: false,
119
+ unifyParentAndChildTypeChecks: true
120
+ },
121
+ any: {
122
+ message: 'Prefer a more specific type to `any`',
123
+ replacement: false,
124
+ unifyParentAndChildTypeChecks: true
125
+ }
126
+ },
127
+ url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/reject-any-type.md#repos-sticky-header'
128
+ }),
129
+ 'reject-function-type': (0, _buildRejectOrPreferRuleDefinition.buildRejectOrPreferRuleDefinition)({
130
+ description: 'Reports use of `Function` type',
131
+ overrideSettings: {
132
+ Function: {
133
+ message: 'Prefer a more specific type to `Function`',
134
+ replacement: false,
135
+ unifyParentAndChildTypeChecks: true
136
+ }
137
+ },
138
+ url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/reject-function-type.md#repos-sticky-header'
139
+ }),
112
140
  'require-asterisk-prefix': _requireAsteriskPrefix.default,
113
141
  'require-description': _requireDescription.default,
114
142
  'require-description-complete-sentence': _requireDescriptionCompleteSentence.default,
@@ -122,7 +150,7 @@ index.rules = {
122
150
  context: 'any',
123
151
  message: '@next should have a type'
124
152
  }],
125
- description: 'Requires a type for @next tags',
153
+ description: 'Requires a type for `@next` tags',
126
154
  url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-next-type.md#repos-sticky-header'
127
155
  }),
128
156
  'require-param': _requireParam.default,
@@ -145,7 +173,7 @@ index.rules = {
145
173
  context: 'any',
146
174
  message: '@throws should have a type'
147
175
  }],
148
- description: 'Requires a type for @throws tags',
176
+ description: 'Requires a type for `@throws` tags',
149
177
  url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-throws-type.md#repos-sticky-header'
150
178
  }),
151
179
  'require-yields': _requireYields.default,
@@ -156,7 +184,7 @@ index.rules = {
156
184
  context: 'any',
157
185
  message: '@yields should have a type'
158
186
  }],
159
- description: 'Requires a type for @yields tags',
187
+ description: 'Requires a type for `@yields` tags',
160
188
  url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-yields-type.md#repos-sticky-header'
161
189
  }),
162
190
  'sort-tags': _sortTags.default,
@@ -211,6 +239,8 @@ const createRecommendedRuleset = (warnOrError, flatName) => {
211
239
  'jsdoc/no-restricted-syntax': 'off',
212
240
  'jsdoc/no-types': 'off',
213
241
  'jsdoc/no-undefined-types': warnOrError,
242
+ 'jsdoc/reject-any-type': warnOrError,
243
+ 'jsdoc/reject-function-type': warnOrError,
214
244
  'jsdoc/require-asterisk-prefix': 'off',
215
245
  'jsdoc/require-description': 'off',
216
246
  'jsdoc/require-description-complete-sentence': 'off',