UNPKG

eslint-plugin-jsdoc

Version:
1 lines 17 kB
{"version":3,"file":"tsMethodSignatureStyle.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","_jsdocUtils","_jsdoccomment","e","__esModule","default","_default","exports","iterateJsdoc","context","indent","jsdoc","utils","functionType","options","enableFixer","checkType","tag","potentialType","type","parsedType","parseType","traverse","nde","parentNode","property","idx","key","reportJSDoc","objectField","obj","index","elements","indexOf","meta","quote","name","parameters","returnType","typeParameters","rewireByParsedType","intersection","object","convertToMethod","func","methods","methodIndexes","element","entries","push","methodIndex","toReversed","splice","convertToFunction","node","arrow","constructor","parenthesis","Error","funcs","removals","length","optional","readonly","right","removal","map","tags","filterTags","Boolean","tagMightHaveTypePosition","iterateAllJsdocs","docs","description","url","fixable","schema","enum","additionalProperties","properties","module"],"sources":["../../src/rules/tsMethodSignatureStyle.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\nimport {\n rewireByParsedType,\n} from '../jsdocUtils.js';\nimport {\n parse as parseType,\n traverse,\n} from '@es-joy/jsdoccomment';\n\nexport default iterateJsdoc(({\n context,\n indent,\n jsdoc,\n utils,\n}) => {\n const functionType = context.options[0] ?? 'property';\n const {\n enableFixer = true,\n } = context.options[1] ?? {};\n\n /**\n * @param {import('@es-joy/jsdoccomment').JsdocTagWithInline} tag\n */\n const checkType = (tag) => {\n const potentialType = tag.type;\n let parsedType;\n try {\n parsedType = parseType(\n /** @type {string} */ (potentialType), 'typescript',\n );\n } catch {\n return;\n }\n\n traverse(parsedType, (nde, parentNode) => {\n // @ts-expect-error Adding our own property for use below\n nde.parentNode = parentNode;\n });\n\n traverse(parsedType, (nde, parentNode, property, idx) => {\n switch (nde.type) {\n case 'JsdocTypeFunction': {\n if (functionType !== 'method') {\n break;\n }\n\n if (parentNode?.type === 'JsdocTypeObjectField' &&\n typeof parentNode.key === 'string'\n ) {\n utils.reportJSDoc(\n 'Found function property; prefer method signature.',\n tag,\n enableFixer ? () => {\n const objectField = parentNode;\n const obj =\n /**\n * @type {import('jsdoc-type-pratt-parser').ObjectFieldResult & {\n * parentNode: import('jsdoc-type-pratt-parser').ObjectResult\n * }}\n */\n (objectField).parentNode;\n\n const index = obj.elements.indexOf(parentNode);\n\n obj.elements[index] = {\n /* c8 ignore next 5 -- Guard */\n meta: nde.meta ?\n {\n quote: objectField.meta.quote,\n ...nde.meta,\n } :\n {\n quote: objectField.meta.quote,\n },\n name: /** @type {string} */ (objectField.key),\n parameters: nde.parameters,\n returnType: /** @type {import('jsdoc-type-pratt-parser').RootResult} */ (\n nde.returnType\n ),\n type: 'JsdocTypeMethodSignature',\n typeParameters: nde.typeParameters,\n };\n\n rewireByParsedType(jsdoc, tag, parsedType, indent);\n } : null,\n );\n break;\n }\n\n if (parentNode?.type === 'JsdocTypeParenthesis' &&\n // @ts-expect-error Our own added API\n parentNode.parentNode?.type === 'JsdocTypeIntersection' &&\n // @ts-expect-error Our own added API\n parentNode.parentNode.parentNode.type === 'JsdocTypeObjectField' &&\n // @ts-expect-error Our own added API\n typeof parentNode.parentNode.parentNode.key === 'string'\n ) {\n // @ts-expect-error Our own added API\n const intersection = parentNode.parentNode;\n const objectField = intersection.parentNode;\n const object = objectField.parentNode;\n // const objFieldIndex = object.elements.indexOf(objectField);\n\n /**\n * @param {import('jsdoc-type-pratt-parser').FunctionResult} func\n */\n const convertToMethod = (func) => {\n return /** @type {import('jsdoc-type-pratt-parser').MethodSignatureResult} */ ({\n /* c8 ignore next 5 -- Guard */\n meta: func.meta ?\n {\n quote: objectField.meta.quote,\n ...func.meta,\n } :\n {\n quote: objectField.meta.quote,\n },\n name: /** @type {string} */ (objectField.key),\n parameters: func.parameters,\n returnType: /** @type {import('jsdoc-type-pratt-parser').RootResult} */ (\n func.returnType\n ),\n type: 'JsdocTypeMethodSignature',\n typeParameters: func.typeParameters,\n });\n };\n\n /** @type {import('jsdoc-type-pratt-parser').MethodSignatureResult[]} */\n const methods = [];\n /** @type {number[]} */\n const methodIndexes = [];\n for (const [\n index,\n element,\n ] of intersection.elements.entries()) {\n if (\n element.type !== 'JsdocTypeParenthesis' ||\n element.element.type !== 'JsdocTypeFunction'\n ) {\n return;\n }\n\n methods.push(convertToMethod(element.element));\n methodIndexes.push(index);\n }\n\n utils.reportJSDoc(\n 'Found function property; prefer method signature.',\n tag,\n enableFixer ? () => {\n for (const methodIndex of methodIndexes.toReversed()) {\n object.elements.splice(methodIndex, 1);\n }\n\n object.elements.splice(methodIndexes[0], 0, ...methods);\n\n rewireByParsedType(jsdoc, tag, parsedType, indent);\n } : null,\n );\n }\n\n break;\n }\n\n case 'JsdocTypeMethodSignature': {\n if (functionType !== 'property') {\n break;\n }\n\n /**\n * @param {import('jsdoc-type-pratt-parser').MethodSignatureResult} node\n */\n const convertToFunction = (node) => {\n return {\n arrow: true,\n constructor: false,\n meta: /** @type {Required<import('jsdoc-type-pratt-parser').MethodSignatureResult['meta']>} */ (\n node.meta\n ),\n parameters: node.parameters,\n parenthesis: true,\n returnType: node.returnType,\n type: 'JsdocTypeFunction',\n typeParameters: node.typeParameters,\n };\n };\n\n utils.reportJSDoc(\n 'Found method signature; prefer function property.',\n tag,\n enableFixer ? () => {\n /* c8 ignore next 3 -- TS guard */\n if (!parentNode || !property || typeof idx !== 'number') {\n throw new Error('Unexpected lack of parent or property');\n }\n\n const object = /** @type {import('jsdoc-type-pratt-parser').ObjectResult} */ (\n parentNode\n );\n\n const funcs = [];\n const removals = [];\n\n for (const [\n index,\n element,\n ] of object.elements.entries()) {\n if (element.type === 'JsdocTypeMethodSignature' &&\n element.name === nde.name\n ) {\n funcs.push(convertToFunction(element));\n if (index !== idx) {\n removals.push(index);\n }\n }\n }\n\n if (funcs.length === 1) {\n object.elements[idx] = /** @type {import('jsdoc-type-pratt-parser').ObjectFieldResult} */ ({\n key: nde.name,\n meta: nde.meta,\n optional: false,\n readonly: false,\n right: funcs[0],\n type: 'JsdocTypeObjectField',\n });\n } else {\n for (const removal of removals.toReversed()) {\n object.elements.splice(removal, 1);\n }\n\n object.elements[idx] = {\n key: nde.name,\n meta: nde.meta,\n optional: false,\n readonly: false,\n right: {\n elements: funcs.map((func) => {\n return /** @type {import('jsdoc-type-pratt-parser').ParenthesisResult} */ ({\n element: func,\n type: 'JsdocTypeParenthesis',\n });\n }),\n type: 'JsdocTypeIntersection',\n },\n type: 'JsdocTypeObjectField',\n };\n }\n\n rewireByParsedType(jsdoc, tag, parsedType, indent);\n } : null,\n );\n }\n\n break;\n }\n });\n };\n\n const tags = utils.filterTags(({\n tag,\n }) => {\n return Boolean(tag !== 'import' && utils.tagMightHaveTypePosition(tag));\n });\n\n for (const tag of tags) {\n if (tag.type) {\n checkType(tag);\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Prefers either function properties or method signatures',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/ts-method-signature-style.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n enum: [\n 'method',\n 'property',\n ],\n type: 'string',\n },\n {\n additionalProperties: false,\n properties: {\n enableFixer: {\n description: 'Whether to enable the fixer. Defaults to `true`.',\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAGA,IAAAE,aAAA,GAAAF,OAAA;AAG8B,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,IAAAG,QAAA,GAAAC,OAAA,CAAAF,OAAA,GAEf,IAAAG,qBAAY,EAAC,CAAC;EAC3BC,OAAO;EACPC,MAAM;EACNC,KAAK;EACLC;AACF,CAAC,KAAK;EACJ,MAAMC,YAAY,GAAGJ,OAAO,CAACK,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU;EACrD,MAAM;IACJC,WAAW,GAAG;EAChB,CAAC,GAAGN,OAAO,CAACK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;;EAE5B;AACF;AACA;EACE,MAAME,SAAS,GAAIC,GAAG,IAAK;IACzB,MAAMC,aAAa,GAAGD,GAAG,CAACE,IAAI;IAC9B,IAAIC,UAAU;IACd,IAAI;MACFA,UAAU,GAAG,IAAAC,mBAAS,EACpB,qBAAuBH,aAAa,EAAG,YACzC,CAAC;IACH,CAAC,CAAC,MAAM;MACN;IACF;IAEA,IAAAI,sBAAQ,EAACF,UAAU,EAAE,CAACG,GAAG,EAAEC,UAAU,KAAK;MACxC;MACAD,GAAG,CAACC,UAAU,GAAGA,UAAU;IAC7B,CAAC,CAAC;IAEF,IAAAF,sBAAQ,EAACF,UAAU,EAAE,CAACG,GAAG,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,GAAG,KAAK;MACvD,QAAQH,GAAG,CAACJ,IAAI;QACd,KAAK,mBAAmB;UAAE;YACxB,IAAIN,YAAY,KAAK,QAAQ,EAAE;cAC7B;YACF;YAEA,IAAIW,UAAU,EAAEL,IAAI,KAAK,sBAAsB,IAC7C,OAAOK,UAAU,CAACG,GAAG,KAAK,QAAQ,EAClC;cACAf,KAAK,CAACgB,WAAW,CACf,mDAAmD,EACnDX,GAAG,EACHF,WAAW,GAAG,MAAM;gBAClB,MAAMc,WAAW,GAAGL,UAAU;gBAC9B,MAAMM,GAAG;gBACP;AAClB;AACA;AACA;AACA;gBACmBD,WAAW,CAAEL,UAAU;gBAE1B,MAAMO,KAAK,GAAGD,GAAG,CAACE,QAAQ,CAACC,OAAO,CAACT,UAAU,CAAC;gBAE9CM,GAAG,CAACE,QAAQ,CAACD,KAAK,CAAC,GAAG;kBACpB;kBACAG,IAAI,EAAEX,GAAG,CAACW,IAAI,GACZ;oBACEC,KAAK,EAAEN,WAAW,CAACK,IAAI,CAACC,KAAK;oBAC7B,GAAGZ,GAAG,CAACW;kBACT,CAAC,GACD;oBACEC,KAAK,EAAEN,WAAW,CAACK,IAAI,CAACC;kBAC1B,CAAC;kBACHC,IAAI,GAAE,qBAAuBP,WAAW,CAACF,GAAG,CAAC;kBAC7CU,UAAU,EAAEd,GAAG,CAACc,UAAU;kBAC1BC,UAAU,GAAE;kBACVf,GAAG,CAACe,UAAU,CACf;kBACDnB,IAAI,EAAE,0BAA0B;kBAChCoB,cAAc,EAAEhB,GAAG,CAACgB;gBACtB,CAAC;gBAED,IAAAC,8BAAkB,EAAC7B,KAAK,EAAEM,GAAG,EAAEG,UAAU,EAAEV,MAAM,CAAC;cACpD,CAAC,GAAG,IACN,CAAC;cACD;YACF;YAEA,IAAIc,UAAU,EAAEL,IAAI,KAAK,sBAAsB;YAC7C;YACAK,UAAU,CAACA,UAAU,EAAEL,IAAI,KAAK,uBAAuB;YACvD;YACAK,UAAU,CAACA,UAAU,CAACA,UAAU,CAACL,IAAI,KAAK,sBAAsB;YAChE;YACA,OAAOK,UAAU,CAACA,UAAU,CAACA,UAAU,CAACG,GAAG,KAAK,QAAQ,EACxD;cACA;cACA,MAAMc,YAAY,GAAGjB,UAAU,CAACA,UAAU;cAC1C,MAAMK,WAAW,GAAGY,YAAY,CAACjB,UAAU;cAC3C,MAAMkB,MAAM,GAAGb,WAAW,CAACL,UAAU;cACrC;;cAEA;AACZ;AACA;cACY,MAAMmB,eAAe,GAAIC,IAAI,IAAK;gBAChC,OAAO,sEAAwE;kBAC7E;kBACAV,IAAI,EAAEU,IAAI,CAACV,IAAI,GACb;oBACEC,KAAK,EAAEN,WAAW,CAACK,IAAI,CAACC,KAAK;oBAC7B,GAAGS,IAAI,CAACV;kBACV,CAAC,GACD;oBACEC,KAAK,EAAEN,WAAW,CAACK,IAAI,CAACC;kBAC1B,CAAC;kBACHC,IAAI,GAAE,qBAAuBP,WAAW,CAACF,GAAG,CAAC;kBAC7CU,UAAU,EAAEO,IAAI,CAACP,UAAU;kBAC3BC,UAAU,GAAE;kBACVM,IAAI,CAACN,UAAU,CAChB;kBACDnB,IAAI,EAAE,0BAA0B;kBAChCoB,cAAc,EAAEK,IAAI,CAACL;gBACvB,CAAC;cACH,CAAC;;cAED;cACA,MAAMM,OAAO,GAAG,EAAE;cAClB;cACA,MAAMC,aAAa,GAAG,EAAE;cACxB,KAAK,MAAM,CACTf,KAAK,EACLgB,OAAO,CACR,IAAIN,YAAY,CAACT,QAAQ,CAACgB,OAAO,CAAC,CAAC,EAAE;gBACpC,IACED,OAAO,CAAC5B,IAAI,KAAK,sBAAsB,IACvC4B,OAAO,CAACA,OAAO,CAAC5B,IAAI,KAAK,mBAAmB,EAC5C;kBACA;gBACF;gBAEA0B,OAAO,CAACI,IAAI,CAACN,eAAe,CAACI,OAAO,CAACA,OAAO,CAAC,CAAC;gBAC9CD,aAAa,CAACG,IAAI,CAAClB,KAAK,CAAC;cAC3B;cAEAnB,KAAK,CAACgB,WAAW,CACf,mDAAmD,EACnDX,GAAG,EACHF,WAAW,GAAG,MAAM;gBAClB,KAAK,MAAMmC,WAAW,IAAIJ,aAAa,CAACK,UAAU,CAAC,CAAC,EAAE;kBACpDT,MAAM,CAACV,QAAQ,CAACoB,MAAM,CAACF,WAAW,EAAE,CAAC,CAAC;gBACxC;gBAEAR,MAAM,CAACV,QAAQ,CAACoB,MAAM,CAACN,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAGD,OAAO,CAAC;gBAEvD,IAAAL,8BAAkB,EAAC7B,KAAK,EAAEM,GAAG,EAAEG,UAAU,EAAEV,MAAM,CAAC;cACpD,CAAC,GAAG,IACN,CAAC;YACH;YAEA;UACF;QAEA,KAAK,0BAA0B;UAAE;YAC/B,IAAIG,YAAY,KAAK,UAAU,EAAE;cAC/B;YACF;;YAEA;AACV;AACA;YACU,MAAMwC,iBAAiB,GAAIC,IAAI,IAAK;cAClC,OAAO;gBACLC,KAAK,EAAE,IAAI;gBACXC,WAAW,EAAE,KAAK;gBAClBtB,IAAI,GAAE;gBACJoB,IAAI,CAACpB,IAAI,CACV;gBACDG,UAAU,EAAEiB,IAAI,CAACjB,UAAU;gBAC3BoB,WAAW,EAAE,IAAI;gBACjBnB,UAAU,EAAEgB,IAAI,CAAChB,UAAU;gBAC3BnB,IAAI,EAAE,mBAAmB;gBACzBoB,cAAc,EAAEe,IAAI,CAACf;cACvB,CAAC;YACH,CAAC;YAED3B,KAAK,CAACgB,WAAW,CACf,mDAAmD,EACnDX,GAAG,EACHF,WAAW,GAAG,MAAM;cAClB;cACA,IAAI,CAACS,UAAU,IAAI,CAACC,QAAQ,IAAI,OAAOC,GAAG,KAAK,QAAQ,EAAE;gBACvD,MAAM,IAAIgC,KAAK,CAAC,uCAAuC,CAAC;cAC1D;cAEA,MAAMhB,MAAM,GAAG;cACblB,UACD;cAED,MAAMmC,KAAK,GAAG,EAAE;cAChB,MAAMC,QAAQ,GAAG,EAAE;cAEnB,KAAK,MAAM,CACT7B,KAAK,EACLgB,OAAO,CACR,IAAIL,MAAM,CAACV,QAAQ,CAACgB,OAAO,CAAC,CAAC,EAAE;gBAC9B,IAAID,OAAO,CAAC5B,IAAI,KAAK,0BAA0B,IAC7C4B,OAAO,CAACX,IAAI,KAAKb,GAAG,CAACa,IAAI,EACzB;kBACAuB,KAAK,CAACV,IAAI,CAACI,iBAAiB,CAACN,OAAO,CAAC,CAAC;kBACtC,IAAIhB,KAAK,KAAKL,GAAG,EAAE;oBACjBkC,QAAQ,CAACX,IAAI,CAAClB,KAAK,CAAC;kBACtB;gBACF;cACF;cAEA,IAAI4B,KAAK,CAACE,MAAM,KAAK,CAAC,EAAE;gBACtBnB,MAAM,CAACV,QAAQ,CAACN,GAAG,CAAC,GAAG,kEAAoE;kBACzFC,GAAG,EAAEJ,GAAG,CAACa,IAAI;kBACbF,IAAI,EAAEX,GAAG,CAACW,IAAI;kBACd4B,QAAQ,EAAE,KAAK;kBACfC,QAAQ,EAAE,KAAK;kBACfC,KAAK,EAAEL,KAAK,CAAC,CAAC,CAAC;kBACfxC,IAAI,EAAE;gBACR,CAAE;cACJ,CAAC,MAAM;gBACL,KAAK,MAAM8C,OAAO,IAAIL,QAAQ,CAACT,UAAU,CAAC,CAAC,EAAE;kBAC3CT,MAAM,CAACV,QAAQ,CAACoB,MAAM,CAACa,OAAO,EAAE,CAAC,CAAC;gBACpC;gBAEAvB,MAAM,CAACV,QAAQ,CAACN,GAAG,CAAC,GAAG;kBACrBC,GAAG,EAAEJ,GAAG,CAACa,IAAI;kBACbF,IAAI,EAAEX,GAAG,CAACW,IAAI;kBACd4B,QAAQ,EAAE,KAAK;kBACfC,QAAQ,EAAE,KAAK;kBACfC,KAAK,EAAE;oBACLhC,QAAQ,EAAE2B,KAAK,CAACO,GAAG,CAAEtB,IAAI,IAAK;sBAC5B,OAAO,kEAAoE;wBACzEG,OAAO,EAAEH,IAAI;wBACbzB,IAAI,EAAE;sBACR,CAAC;oBACH,CAAC,CAAC;oBACFA,IAAI,EAAE;kBACR,CAAC;kBACDA,IAAI,EAAE;gBACR,CAAC;cACH;cAEA,IAAAqB,8BAAkB,EAAC7B,KAAK,EAAEM,GAAG,EAAEG,UAAU,EAAEV,MAAM,CAAC;YACpD,CAAC,GAAG,IACN,CAAC;UACH;UAEE;MACJ;IACF,CAAC,CAAC;EACJ,CAAC;EAED,MAAMyD,IAAI,GAAGvD,KAAK,CAACwD,UAAU,CAAC,CAAC;IAC7BnD;EACF,CAAC,KAAK;IACJ,OAAOoD,OAAO,CAACpD,GAAG,KAAK,QAAQ,IAAIL,KAAK,CAAC0D,wBAAwB,CAACrD,GAAG,CAAC,CAAC;EACzE,CAAC,CAAC;EAEF,KAAK,MAAMA,GAAG,IAAIkD,IAAI,EAAE;IACtB,IAAIlD,GAAG,CAACE,IAAI,EAAE;MACZH,SAAS,CAACC,GAAG,CAAC;IAChB;EACF;AACF,CAAC,EAAE;EACDsD,gBAAgB,EAAE,IAAI;EACtBrC,IAAI,EAAE;IACJsC,IAAI,EAAE;MACJC,WAAW,EAAE,yDAAyD;MACtEC,GAAG,EAAE;IACP,CAAC;IACDC,OAAO,EAAE,MAAM;IACfC,MAAM,EAAE,CACN;MACEC,IAAI,EAAE,CACJ,QAAQ,EACR,UAAU,CACX;MACD1D,IAAI,EAAE;IACR,CAAC,EACD;MACE2D,oBAAoB,EAAE,KAAK;MAC3BC,UAAU,EAAE;QACVhE,WAAW,EAAE;UACX0D,WAAW,EAAE,kDAAkD;UAC/DtD,IAAI,EAAE;QACR;MACF,CAAC;MACDA,IAAI,EAAE;IACR,CAAC,CACF;IACDA,IAAI,EAAE;EACR;AACF,CAAC,CAAC;AAAA6D,MAAA,CAAAzE,OAAA,GAAAA,OAAA,CAAAF,OAAA","ignoreList":[]}