{"version":3,"file":"tsMethodSignatureStyle.cjs","names":["iterateJsdoc","parseType","traverse","rewireByParsedType"],"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":"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","ignoreList":[]}