blob: ccce04557326de5313681d45863478fad129ed4e [file] [log] [blame]
{"version":3,"sources":["../../src/rules/noUndefinedTypes.js"],"names":["extraTypes","stripPseudoTypes","str","replace","context","report","settings","sourceCode","scopeManager","utils","globalScope","options","definedTypes","definedPreferredTypes","preferredTypes","Object","keys","length","_","values","map","preferredType","undefined","reportSettings","replacement","filter","typedefDeclarations","getAllComments","comment","value","startsWith","parseComment","flatMap","doc","tags","tag","isNamepathDefiningTag","name","templateTags","getPresentTags","classJsdoc","getClassJsdoc","concat","closureGenericTypes","jsdocUtils","parseClosureTemplateTag","allDefinedTypes","variables","variable","__options","nodejsScope","isModule","childScopes","reduce","arr","push","mode","jsdocTagsWithPossibleType","filterTags","tagMightHaveTypePosition","forEach","parsedType","type","error","includes","markVariableAsUsed","iterateAllJsdocs","meta","schema","additionalProperties","properties","items"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport {parse as parseType, traverse} from 'jsdoctypeparser';\nimport iterateJsdoc, {parseComment} 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', '*',\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 report,\n settings,\n sourceCode: {scopeManager},\n utils,\n}) => {\n const {globalScope} = scopeManager;\n\n const {definedTypes = []} = context.options[0] || {};\n\n let definedPreferredTypes = [];\n const {preferredTypes} = settings;\n if (Object.keys(preferredTypes).length) {\n // Replace `_.values` with `Object.values` when we may start requiring Node 7+\n definedPreferredTypes = _.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 if (!preferredType) {\n return undefined;\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 }).filter((preferredType) => {\n return preferredType;\n });\n }\n\n const typedefDeclarations = _(context.getAllComments())\n .filter((comment) => {\n return comment.value.startsWith('*');\n })\n .map(parseComment)\n .flatMap((doc) => {\n return (doc.tags || []).filter(({tag}) => {\n return utils.isNamepathDefiningTag(tag);\n });\n })\n .map((tag) => {\n return tag.name;\n })\n .value();\n\n let templateTags = utils.getPresentTags('template');\n const classJsdoc = utils.getClassJsdoc();\n if (classJsdoc && classJsdoc.tags) {\n templateTags = templateTags.concat(\n classJsdoc.tags\n .filter((tag) => {\n return tag.tag === 'template';\n }),\n );\n }\n\n const closureGenericTypes = _.flatMap(templateTags, (tag) => {\n return jsdocUtils.parseClosureTemplateTag(tag);\n });\n\n const allDefinedTypes = globalScope.variables.map((variable) => {\n return variable.name;\n })\n\n // If the file is a module, concat the variables from the module scope.\n .concat(\n\n // This covers `commonjs` as well as `node`\n scopeManager.__options.nodejsScope ||\n scopeManager.isModule() ?\n globalScope.childScopes.reduce((arr, {variables}) => {\n // Flatten\n arr.push(...variables);\n\n return arr;\n }, []).map(({name}) => {\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((tag) => {\n return utils.tagMightHaveTypePosition(tag.tag);\n });\n\n jsdocTagsWithPossibleType.forEach((tag) => {\n let parsedType;\n\n try {\n parsedType = parseType(tag.type);\n } catch (error) {\n // On syntax error, will be handled by valid-types.\n return;\n }\n\n traverse(parsedType, ({type, name}) => {\n if (type === 'NAME') {\n if (!allDefinedTypes.includes(name)) {\n report(`The type '${name}' is undefined.`, null, tag);\n } else if (!_.includes(extraTypes, name)) {\n context.markVariableAsUsed(name);\n }\n }\n });\n });\n}, {\n iterateAllJsdocs: true,\n meta: {\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"}