From c95273badb808a3d0e7aaac242798fbf802861ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Eberhardt?= Date: Mon, 9 Sep 2024 22:15:38 +0200 Subject: [PATCH] fix test, add indentation support, bump version --- examples/invalid.js | 10 ++---- examples/package-lock.json | 2 +- lib/rules/require-throws-doc.mjs | 15 ++++++-- package-lock.json | 4 +-- package.json | 2 +- tests/require-throws-doc.test.mjs | 58 +++++++++++++++++++++++++++++++ 6 files changed, 78 insertions(+), 13 deletions(-) diff --git a/examples/invalid.js b/examples/invalid.js index 3f791d0..fa5ff22 100644 --- a/examples/invalid.js +++ b/examples/invalid.js @@ -1,5 +1,6 @@ /** - * + * @param {string} foo + * @returns {string} */ export function quux1(foo) { throw new Error("err"); @@ -8,9 +9,7 @@ export function quux1(foo) { quux1(); -/** - * - */ +/** @param {string} foo */ const quux2 = function (foo) { throw new Error("err"); }; @@ -24,9 +23,6 @@ const quux3 = (foo) => { }; // Message: Missing JSDoc @throws declaration. -/** - * - */ function quux4(foo) { while (true) { throw new Error("err"); diff --git a/examples/package-lock.json b/examples/package-lock.json index 01f8da4..8f7cc8e 100644 --- a/examples/package-lock.json +++ b/examples/package-lock.json @@ -15,7 +15,7 @@ } }, "..": { - "version": "1.0.0-beta.4", + "version": "1.0.0-beta.5", "dev": true, "license": "Unlicense", "devDependencies": { diff --git a/lib/rules/require-throws-doc.mjs b/lib/rules/require-throws-doc.mjs index 0bf6dc2..44d0c83 100644 --- a/lib/rules/require-throws-doc.mjs +++ b/lib/rules/require-throws-doc.mjs @@ -32,13 +32,19 @@ export default { messageId: "missingThrows", data: { type: Array.from(throwTypes).join(", ") }, fix(fixer) { - const jsDoc = `/**\n * @throws {${Array.from(throwTypes).join(", ")}}\n */\n`; const nodeStart = node.range[0]; const tokenBefore = sourceCode.getTokenBefore(node, { filter: (token) => token.type === "Keyword", // "export" keyword }); const isSameLine = tokenBefore && tokenBefore.loc.end.line === node.loc.start.line; const insertPosition = tokenBefore && isSameLine ? tokenBefore.range[0] : nodeStart; + + // Calculate indentation + const line = sourceCode.lines[node.loc.start.line - 1]; + const indentation = line.match(/^\s*/)[0]; + + const jsDoc = `/**\n${indentation} * @throws {${Array.from(throwTypes).join(", ")}}\n${indentation} */\n${indentation}`; + return fixer.insertTextBeforeRange([insertPosition, nodeStart], jsDoc); }, }); @@ -57,10 +63,15 @@ export default { data: { type: Array.from(throwTypes).join(", ") }, fix(fixer) { const jsDoc = `@throws {${Array.from(throwTypes).join(", ")}}`; + + // Calculate indentation + const line = sourceCode.lines[node.loc.start.line - 1]; + const indentation = line.match(/^\s*/)[0]; + const updatedJsDoc = isMultiLine ? `${jsDocValue}* ${jsDoc}` : `*\n ${jsDocValue}\n * ${jsDoc}`; - return fixer.replaceText(jsDocComment, `/*${updatedJsDoc}\n */`); + return fixer.replaceText(jsDocComment, `/*${updatedJsDoc}\n${indentation} */`); }, }); } else { diff --git a/package-lock.json b/package-lock.json index 893da05..e59469c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "eslint-plugin-throw-aware", - "version": "1.0.0-beta.4", + "version": "1.0.0-beta.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "eslint-plugin-throw-aware", - "version": "1.0.0-beta.4", + "version": "1.0.0-beta.5", "license": "Unlicense", "devDependencies": { "@eslint/js": "^9.10.0", diff --git a/package.json b/package.json index f3590fc..cd6e143 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-throw-aware", - "version": "1.0.0-beta.4", + "version": "1.0.0-beta.5", "description": "An ESLint plugin to enforce naming conventions and JSDoc annotations for functions that throw exceptions.", "type": "module", "main": "lib/index.mjs", diff --git a/tests/require-throws-doc.test.mjs b/tests/require-throws-doc.test.mjs index 3fd5044..d71ddde 100644 --- a/tests/require-throws-doc.test.mjs +++ b/tests/require-throws-doc.test.mjs @@ -100,6 +100,14 @@ ruleTester.run("require-throws-doc", rule, { } `, errors: [{ messageId: "missingThrows", data: { type: "Error" } }], + output: ` + /** + * @throws {Error} + */ + function test() { + throw new Error('test'); + } + `, }, { code: ` @@ -111,6 +119,15 @@ ruleTester.run("require-throws-doc", rule, { } `, errors: [{ messageId: "missingThrows", data: { type: "Error" } }], + output: ` + /** + * This function throws an error + * @throws {Error} + */ + function test() { + throw new Error('test'); + } + `, }, { code: ` @@ -119,6 +136,14 @@ ruleTester.run("require-throws-doc", rule, { } `, errors: [{ messageId: "missingThrows", data: { type: "Error" } }], + output: ` + /** + * @throws {Error} + */ + const test = () => { + throw new Error('test'); + } + `, }, { code: ` @@ -131,6 +156,18 @@ ruleTester.run("require-throws-doc", rule, { } `, errors: [{ messageId: "missingThrows", data: { type: "Error" } }], + output: ` + /** + * @throws {Error} + */ + const test = () => { + try { + console.log('test'); + } catch { + throw new Error("Test error"); + } + } + `, }, { code: ` @@ -143,6 +180,18 @@ ruleTester.run("require-throws-doc", rule, { } `, errors: [{ messageId: "missingThrows", data: { type: "Error" } }], + output: ` + /** + * @throws {Error} + */ + const test = () => { + try { + console.log('test'); + } finally { + throw new Error("Test error"); + } + } + `, }, { code: ` @@ -154,6 +203,15 @@ ruleTester.run("require-throws-doc", rule, { } `, errors: [{ messageId: "missingThrows", data: { type: "Error" } }], + output: ` + /** + * This function throws an error + * @throws {Error} + */ + const test = () => { + throw new Error('test'); + } + `, }, { code: `