"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _iterateJsdoc = _interopRequireWildcard(require("../iterateJsdoc.cjs")); var _jsdocUtils = require("../jsdocUtils.cjs"); var _jsdoccomment = require("@es-joy/jsdoccomment"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /** @type {import('eslint').Rule.RuleModule} */ var _default = exports.default = { create(context) { /** * @typedef {import('eslint').AST.Token | import('estree').Comment | { * type: import('eslint').AST.TokenType|"Line"|"Block"|"Shebang", * range: [number, number], * value: string * }} Token */ /** * @callback AddComment * @param {boolean|undefined} inlineCommentBlock * @param {Token} comment * @param {string} indent * @param {number} lines * @param {import('eslint').Rule.RuleFixer} fixer */ /* c8 ignore next -- Fallback to deprecated method */ const { sourceCode = context.getSourceCode() } = context; const settings = (0, _iterateJsdoc.getSettings)(context); if (!settings) { return {}; } const { contexts = settings.contexts || [], contextsAfter = ( /** @type {string[]} */[]), contextsBeforeAndAfter = ['VariableDeclarator', 'TSPropertySignature', 'PropertyDefinition'], enableFixer = true, enforceJsdocLineStyle = 'multi', lineOrBlockStyle = 'both', allowedPrefixes = ['@ts-', 'istanbul ', 'c8 ', 'v8 ', 'eslint', 'prettier-'] } = context.options[0] ?? {}; let reportingNonJsdoc = false; /** * @param {string} messageId * @param {import('estree').Comment|Token} comment * @param {import('eslint').Rule.Node} node * @param {import('eslint').Rule.ReportFixer} fixer */ const report = (messageId, comment, node, fixer) => { var _comment$loc, _comment$loc2; const loc = { end: { column: 0, /* c8 ignore next 2 -- Guard */ // @ts-expect-error Ok line: ((_comment$loc = comment.loc) === null || _comment$loc === void 0 || (_comment$loc = _comment$loc.start) === null || _comment$loc === void 0 ? void 0 : _comment$loc.line) ?? 1 }, start: { column: 0, /* c8 ignore next 2 -- Guard */ // @ts-expect-error Ok line: ((_comment$loc2 = comment.loc) === null || _comment$loc2 === void 0 || (_comment$loc2 = _comment$loc2.start) === null || _comment$loc2 === void 0 ? void 0 : _comment$loc2.line) ?? 1 } }; context.report({ fix: enableFixer ? fixer : null, loc, messageId, node }); }; /** * @param {import('eslint').Rule.Node} node * @param {import('eslint').AST.Token | import('estree').Comment | { * type: import('eslint').AST.TokenType|"Line"|"Block"|"Shebang", * range: [number, number], * value: string * }} comment * @param {AddComment} addComment * @param {import('../iterateJsdoc.js').Context[]} ctxts */ const getFixer = (node, comment, addComment, ctxts) => { return /** @type {import('eslint').Rule.ReportFixer} */fixer => { // Default to one line break if the `minLines`/`maxLines` settings allow const lines = settings.minLines === 0 && settings.maxLines >= 1 ? 1 : settings.minLines; let baseNode = /** * @type {import('@typescript-eslint/types').TSESTree.Node|import('eslint').Rule.Node} */ (0, _jsdoccomment.getReducedASTNode)(node, sourceCode); const decorator = (0, _jsdoccomment.getDecorator)( /** @type {import('eslint').Rule.Node} */ baseNode); if (decorator) { baseNode = /** @type {import('@typescript-eslint/types').TSESTree.Decorator} */ decorator; } const indent = (0, _jsdocUtils.getIndent)({ text: sourceCode.getText( /** @type {import('eslint').Rule.Node} */baseNode, /** @type {import('eslint').AST.SourceLocation} */ ( /** @type {import('eslint').Rule.Node} */baseNode.loc).start.column) }); const { inlineCommentBlock } = /** * @type {{ * context: string, * inlineCommentBlock: boolean, * minLineCount: import('../iterateJsdoc.js').Integer * }[]} */ ctxts.find(contxt => { if (typeof contxt === 'string') { return false; } const { context: ctxt } = contxt; return ctxt === node.type; }) || {}; return addComment(inlineCommentBlock, comment, indent, lines, fixer); }; }; /** * @param {import('eslint').AST.Token | import('estree').Comment | { * type: import('eslint').AST.TokenType|"Line"|"Block"|"Shebang", * range: [number, number], * value: string * }} comment * @param {import('eslint').Rule.Node} node * @param {AddComment} addComment * @param {import('../iterateJsdoc.js').Context[]} ctxts */ const reportings = (comment, node, addComment, ctxts) => { const fixer = getFixer(node, comment, addComment, ctxts); if (comment.type === 'Block') { if (lineOrBlockStyle === 'line') { return; } report('blockCommentsJsdocStyle', comment, node, fixer); return; } if (comment.type === 'Line') { if (lineOrBlockStyle === 'block') { return; } report('lineCommentsJsdocStyle', comment, node, fixer); } }; /** * @type {import('../iterateJsdoc.js').CheckJsdoc} */ const checkNonJsdoc = (_info, _handler, node) => { const comment = (0, _jsdoccomment.getNonJsdocComment)(sourceCode, node, settings); if (!comment || /** @type {string[]} */ allowedPrefixes.some(prefix => { return comment.value.trimStart().startsWith(prefix); })) { return; } reportingNonJsdoc = true; /** @type {AddComment} */ const addComment = (inlineCommentBlock, comment, indent, lines, fixer) => { const insertion = (inlineCommentBlock || enforceJsdocLineStyle === 'single' ? `/** ${comment.value.trim()} ` : `/**\n${indent}*${comment.value.trimEnd()}\n${indent}`) + `*/${'\n'.repeat((lines || 1) - 1)}`; return fixer.replaceText( /** @type {import('eslint').AST.Token} */ comment, insertion); }; reportings(comment, node, addComment, contexts); }; /** * @param {import('eslint').Rule.Node} node * @param {import('../iterateJsdoc.js').Context[]} ctxts */ const checkNonJsdocAfter = (node, ctxts) => { const comment = (0, _jsdoccomment.getFollowingComment)(sourceCode, node); if (!comment || comment.value.startsWith('*') || /** @type {string[]} */ allowedPrefixes.some(prefix => { return comment.value.trimStart().startsWith(prefix); })) { return; } /** @type {AddComment} */ const addComment = (inlineCommentBlock, comment, indent, lines, fixer) => { const insertion = (inlineCommentBlock || enforceJsdocLineStyle === 'single' ? `/** ${comment.value.trim()} ` : `/**\n${indent}*${comment.value.trimEnd()}\n${indent}`) + `*/${'\n'.repeat((lines || 1) - 1)}${lines ? `\n${indent.slice(1)}` : ' '}`; return [fixer.remove( /** @type {import('eslint').AST.Token} */ comment), fixer.insertTextBefore(node.type === 'VariableDeclarator' ? node.parent : node, insertion)]; }; reportings(comment, node, addComment, ctxts); }; // Todo: add contexts to check after (and handle if want both before and after) return { ...(0, _jsdocUtils.getContextObject)((0, _jsdocUtils.enforcedContexts)(context, true, settings), checkNonJsdoc), ...(0, _jsdocUtils.getContextObject)(contextsAfter, (_info, _handler, node) => { checkNonJsdocAfter(node, contextsAfter); }), ...(0, _jsdocUtils.getContextObject)(contextsBeforeAndAfter, (_info, _handler, node) => { checkNonJsdoc({}, null, node); if (!reportingNonJsdoc) { checkNonJsdocAfter(node, contextsBeforeAndAfter); } }) }; }, meta: { fixable: 'code', messages: { blockCommentsJsdocStyle: 'Block comments should be JSDoc-style.', lineCommentsJsdocStyle: 'Line comments should be JSDoc-style.' }, docs: { description: 'Converts non-JSDoc comments preceding or following nodes into JSDoc ones', url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/convert-to-jsdoc-comments.md#repos-sticky-header' }, schema: [{ additionalProperties: false, properties: { allowedPrefixes: { type: 'array', items: { type: 'string' } }, contexts: { items: { anyOf: [{ type: 'string' }, { additionalProperties: false, properties: { context: { type: 'string' }, inlineCommentBlock: { type: 'boolean' } }, type: 'object' }] }, type: 'array' }, contextsAfter: { items: { anyOf: [{ type: 'string' }, { additionalProperties: false, properties: { context: { type: 'string' }, inlineCommentBlock: { type: 'boolean' } }, type: 'object' }] }, type: 'array' }, contextsBeforeAndAfter: { items: { anyOf: [{ type: 'string' }, { additionalProperties: false, properties: { context: { type: 'string' }, inlineCommentBlock: { type: 'boolean' } }, type: 'object' }] }, type: 'array' }, enableFixer: { type: 'boolean' }, enforceJsdocLineStyle: { type: 'string', enum: ['multi', 'single'] }, lineOrBlockStyle: { type: 'string', enum: ['block', 'line', 'both'] } }, type: 'object' }], type: 'suggestion' } }; module.exports = exports.default; //# sourceMappingURL=convertToJsdocComments.cjs.map