blob: bae88c3611152e8aa7c0dedb0d92789addb4a4ae [file] [log] [blame]
{"version":3,"sources":["../../src/rules/requireReturns.js"],"names":["canSkip","utils","hasATag","isConstructor","isSetter","avoidDocs","report","context","options","forceRequireReturn","forceReturnsWithAsync","tagName","getPreferredTagName","tags","getTags","length","iteratingFunction","isIteratingFunction","tag","missingReturnTag","shouldReport","isVirtualFunction","isAsync","hasTag","hasReturnValue","contextDefaults","meta","schema","additionalProperties","properties","contexts","items","type","exemptedBy","default"],"mappings":";;;;;;;AAAA;;AACA;;;;;;;;;;;;AAEA;;;;;;;;;;;AAWA,MAAMA,OAAO,GAAIC,KAAD,IAAW;AACzB,SAAOA,KAAK,CAACC,OAAN,CAAc,CACnB;AACA;AACA;AACA;AACA;AACA,YANmB,EAOnB,SAPmB,EASnB;AACA;AACA,SAXmB,EAYnB,aAZmB,EAcnB;AACA,QAfmB,EAiBnB;AACA,aAlBmB,CAAd,KAoBLD,KAAK,CAACE,aAAN,EApBK,IAsBL;AACA;AACAF,EAAAA,KAAK,CAACG,QAAN,EAxBK,IAyBLH,KAAK,CAACI,SAAN,EAzBF;AA0BD,CA3BD;;eA6Be,2BAAa,CAAC;AAC3BC,EAAAA,MAD2B;AAE3BL,EAAAA,KAF2B;AAG3BM,EAAAA;AAH2B,CAAD,KAItB;AACJ,oCAAoBA,OAApB,EAA6B,iBAA7B,EADI,CAGJ;AACA;;AACA,MAAIP,OAAO,CAACC,KAAD,CAAX,EAAoB;AAClB;AACD;;AAPG,eAYAM,OAAO,CAACC,OAAR,CAAgB,CAAhB,KAAsB,EAZtB;AAAA,qCAUFC,kBAVE;AAAA,QAUFA,kBAVE,sCAUmB,KAVnB;AAAA,qCAWFC,qBAXE;AAAA,QAWFA,qBAXE,sCAWsB,KAXtB;;AAcJ,QAAMC,OAAO,GAAGV,KAAK,CAACW,mBAAN,CAA0B;AAACD,IAAAA,OAAO,EAAE;AAAV,GAA1B,CAAhB;;AACA,MAAI,CAACA,OAAL,EAAc;AACZ;AACD;;AACD,QAAME,IAAI,GAAGZ,KAAK,CAACa,OAAN,CAAcH,OAAd,CAAb;;AAEA,MAAIE,IAAI,CAACE,MAAL,GAAc,CAAlB,EAAqB;AACnBT,IAAAA,MAAM,CAAE,wBAAuBK,OAAQ,eAAjC,CAAN;AACD;;AAED,QAAMK,iBAAiB,GAAGf,KAAK,CAACgB,mBAAN,EAA1B,CAxBI,CA0BJ;;AA1BI,+BA2BUJ,IA3BV;AAAA,QA2BGK,GA3BH;;AA4BJ,QAAMC,gBAAgB,GAAG,OAAOD,GAAP,KAAe,WAAf,IAA8BA,GAAG,KAAK,IAA/D;;AAEA,QAAME,YAAY,GAAG,MAAM;AACzB,QAAI,CAACD,gBAAL,EAAuB;AACrB,aAAO,KAAP;AACD;;AAED,QAAIV,kBAAkB,KACpBO,iBAAiB,IAAIf,KAAK,CAACoB,iBAAN,EADD,CAAtB,EAEG;AACD,aAAO,IAAP;AACD;;AAED,UAAMC,OAAO,GAAG,CAACN,iBAAD,IAAsBf,KAAK,CAACsB,MAAN,CAAa,OAAb,CAAtB,IACdP,iBAAiB,IAAIf,KAAK,CAACqB,OAAN,EADvB;;AAGA,QAAIZ,qBAAqB,IAAIY,OAA7B,EAAsC;AACpC,aAAO,IAAP;AACD;;AAED,WAAO,CAACA,OAAD,IAAYN,iBAAZ,IAAiCf,KAAK,CAACuB,cAAN,EAAxC;AACD,GAnBD;;AAqBA,MAAIJ,YAAY,EAAhB,EAAoB;AAClBd,IAAAA,MAAM,CAAE,kBAAiBK,OAAQ,eAA3B,CAAN;AACD;AACF,CA1Dc,EA0DZ;AACDc,EAAAA,eAAe,EAAE,IADhB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,oBAAoB,EAAE,KADxB;AAEEC,MAAAA,UAAU,EAAE;AACVC,QAAAA,QAAQ,EAAE;AACRC,UAAAA,KAAK,EAAE;AACLC,YAAAA,IAAI,EAAE;AADD,WADC;AAIRA,UAAAA,IAAI,EAAE;AAJE,SADA;AAOVC,QAAAA,UAAU,EAAE;AACVF,UAAAA,KAAK,EAAE;AACLC,YAAAA,IAAI,EAAE;AADD,WADG;AAIVA,UAAAA,IAAI,EAAE;AAJI,SAPF;AAaVvB,QAAAA,kBAAkB,EAAE;AAClByB,UAAAA,OAAO,EAAE,KADS;AAElBF,UAAAA,IAAI,EAAE;AAFY,SAbV;AAiBVtB,QAAAA,qBAAqB,EAAE;AACrBwB,UAAAA,OAAO,EAAE,KADY;AAErBF,UAAAA,IAAI,EAAE;AAFe;AAjBb,OAFd;AAwBEA,MAAAA,IAAI,EAAE;AAxBR,KADM,CADJ;AA6BJA,IAAAA,IAAI,EAAE;AA7BF;AAFL,CA1DY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\nimport warnRemovedSettings from '../warnRemovedSettings';\n\n/**\n * We can skip checking for a return value, in case the documentation is inherited\n * or the method is either a constructor or an abstract method.\n *\n * In either of these cases the return value is optional or not defined.\n *\n * @param {*} utils\n * a reference to the utils which are used to probe if a tag is present or not.\n * @returns {boolean}\n * true in case deep checking can be skipped; otherwise false.\n */\nconst canSkip = (utils) => {\n return utils.hasATag([\n // inheritdoc implies that all documentation is inherited\n // see https://jsdoc.app/tags-inheritdoc.html\n //\n // Abstract methods are by definition incomplete,\n // so it is not an error if it declares a return value but does not implement it.\n 'abstract',\n 'virtual',\n\n // Constructors do not have a return value by definition (https://jsdoc.app/tags-class.html)\n // So we can bail out here, too.\n 'class',\n 'constructor',\n\n // Return type is specified by type in @type\n 'type',\n\n // This seems to imply a class as well\n 'interface',\n ]) ||\n utils.isConstructor() ||\n\n // Though ESLint avoided getters: https://github.com/eslint/eslint/blob/master/lib/rules/valid-jsdoc.js#L435\n // ... getters seem that they should, unlike setters, always return:\n utils.isSetter() ||\n utils.avoidDocs();\n};\n\nexport default iterateJsdoc(({\n report,\n utils,\n context,\n}) => {\n warnRemovedSettings(context, 'require-returns');\n\n // A preflight check. We do not need to run a deep check\n // in case the @returns comment is optional or undefined.\n if (canSkip(utils)) {\n return;\n }\n\n const {\n forceRequireReturn = false,\n forceReturnsWithAsync = false,\n } = context.options[0] || {};\n\n const tagName = utils.getPreferredTagName({tagName: 'returns'});\n if (!tagName) {\n return;\n }\n const tags = utils.getTags(tagName);\n\n if (tags.length > 1) {\n report(`Found more than one @${tagName} declaration.`);\n }\n\n const iteratingFunction = utils.isIteratingFunction();\n\n // In case the code returns something, we expect a return value in JSDoc.\n const [tag] = tags;\n const missingReturnTag = typeof tag === 'undefined' || tag === null;\n\n const shouldReport = () => {\n if (!missingReturnTag) {\n return false;\n }\n\n if (forceRequireReturn && (\n iteratingFunction || utils.isVirtualFunction()\n )) {\n return true;\n }\n\n const isAsync = !iteratingFunction && utils.hasTag('async') ||\n iteratingFunction && utils.isAsync();\n\n if (forceReturnsWithAsync && isAsync) {\n return true;\n }\n\n return !isAsync && iteratingFunction && utils.hasReturnValue();\n };\n\n if (shouldReport()) {\n report(`Missing JSDoc @${tagName} declaration.`);\n }\n}, {\n contextDefaults: true,\n meta: {\n schema: [\n {\n additionalProperties: false,\n properties: {\n contexts: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n exemptedBy: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n forceRequireReturn: {\n default: false,\n type: 'boolean',\n },\n forceReturnsWithAsync: {\n default: false,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"file":"requireReturns.js"}