From 6f0dd57fd96a6a68a72db443882fed7c10a66e8f Mon Sep 17 00:00:00 2001 From: Xvezda Date: Thu, 22 May 2025 19:19:58 +0900 Subject: [PATCH] Refactor --- eslint.config.js | 2 ++ src/rules/no-implicit-propagation.js | 16 ++++++++-------- src/rules/no-implicit-propagation.test.js | 2 +- src/rules/no-undocumented-throws.js | 17 +++++++---------- src/rules/no-undocumented-throws.test.js | 1 + src/utils.js | 22 ++++++++++++++++++++++ 6 files changed, 41 insertions(+), 19 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index ff18974..ee56346 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -16,6 +16,8 @@ module.exports = tseslint.config( }, rules: { "@typescript-eslint/no-require-imports": "off", + "@typescript-eslint/no-unsafe-assignment": "off", + "@typescript-eslint/no-unsafe-argument": "off", }, }, ); diff --git a/src/rules/no-implicit-propagation.js b/src/rules/no-implicit-propagation.js index 16b7eaf..8270a22 100644 --- a/src/rules/no-implicit-propagation.js +++ b/src/rules/no-implicit-propagation.js @@ -2,12 +2,12 @@ const { ESLintUtils, AST_NODE_TYPES } = require('@typescript-eslint/utils'); const utils = require('@typescript-eslint/type-utils'); const ts = require('typescript'); -const { hasThrowsTag } = require('../utils'); -const { findParent } = require('../utils'); - -const createRule = ESLintUtils.RuleCreator( - name => `https://github.com/Xvezda/eslint-plugin-explicit-exceptions/blob/master/docs/rules/${name}.md`, -); +const { + createRule, + hasThrowsTag, + findParent, + getOptionsFromContext +} = require('../utils'); module.exports = createRule({ name: 'no-implicit-propagation', @@ -41,7 +41,7 @@ module.exports = createRule({ ], }, create(context) { - const [{ tabLength }] = context.options; + const options = getOptionsFromContext(context); const sourceCode = context.sourceCode; const services = ESLintUtils.getParserServices(context); @@ -151,7 +151,7 @@ module.exports = createRule({ const currentLine = lines[node.loc.start.line - 1]; const prevLine = lines[node.loc.start.line - 2]; const indent = currentLine.match(/^\s*/)?.[0] ?? ''; - const newIndent = indent + ' '.repeat(tabLength); + const newIndent = indent + ' '.repeat(options.tabLength); // TODO: Better way to handle this? if (/^\s*try\s*\{/.test(prevLine)) return; diff --git a/src/rules/no-implicit-propagation.test.js b/src/rules/no-implicit-propagation.test.js index 32ad54a..cd43fca 100644 --- a/src/rules/no-implicit-propagation.test.js +++ b/src/rules/no-implicit-propagation.test.js @@ -1,8 +1,8 @@ +// @ts-check const { RuleTester } = require('@typescript-eslint/rule-tester'); const rule = require('./no-implicit-propagation'); // https://github.com/typescript-eslint/typescript-eslint/blob/main/docs/packages/Rule_Tester.mdx#type-aware-testing -/** @type {import('@typescript-eslint/rule-tester').RuleTester} */ const ruleTester = new RuleTester({ languageOptions: { parserOptions: { diff --git a/src/rules/no-undocumented-throws.js b/src/rules/no-undocumented-throws.js index fcc483f..5237fdf 100644 --- a/src/rules/no-undocumented-throws.js +++ b/src/rules/no-undocumented-throws.js @@ -1,13 +1,13 @@ // @ts-check const { ESLintUtils, AST_NODE_TYPES } = require('@typescript-eslint/utils'); -/** @type {import('@typescript-eslint/type-utils')} */ const utils = require('@typescript-eslint/type-utils'); -const { hasThrowsTag, findParent } = require('../utils'); const ts = require('typescript'); - -const createRule = ESLintUtils.RuleCreator( - name => `https://github.com/Xvezda/eslint-plugin-explicit-exceptions/blob/master/docs/rules/${name}.md`, -); +const { + createRule, + hasThrowsTag, + findParent, + getOptionsFromContext +} = require('../utils'); module.exports = createRule({ name: 'no-undocumented-throws', @@ -44,10 +44,7 @@ module.exports = createRule({ const services = ESLintUtils.getParserServices(context); const checker = services.program.getTypeChecker(); - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const options = - /** @type {Record} */ - (Object.assign(Object.create(null), ...context.options)); + const options = getOptionsFromContext(context); /** @type {Map} */ const throwStatements = new Map(); diff --git a/src/rules/no-undocumented-throws.test.js b/src/rules/no-undocumented-throws.test.js index 0fab3a2..625c5e3 100644 --- a/src/rules/no-undocumented-throws.test.js +++ b/src/rules/no-undocumented-throws.test.js @@ -1,3 +1,4 @@ +// @ts-check const { RuleTester } = require('@typescript-eslint/rule-tester'); const rule = require('./no-undocumented-throws'); diff --git a/src/utils.js b/src/utils.js index d0b2155..1751e94 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,3 +1,9 @@ +const { ESLintUtils } = require('@typescript-eslint/utils'); + +const createRule = ESLintUtils.RuleCreator( + name => `https://github.com/Xvezda/eslint-plugin-explicit-exceptions/blob/master/docs/rules/${name}.md`, +); + /** @param {string} comment */ const hasThrowsTag = comment => comment.includes('@throws') || @@ -22,7 +28,23 @@ const findParent = (node, callback) => { return null; }; +/** + * @template {string} T + * @template {readonly unknown[]} U + * @param {import('@typescript-eslint/utils').TSESLint.RuleContext} context + * @returns {{ [K in keyof U[number]]: U[number][K] }} + */ +const getOptionsFromContext = (context) => { + const options = + /** @type {{ [K in keyof U[number]]: U[number][K] }} */ + (Object.assign(Object.create(null), ...context.options)); + + return options; +}; + module.exports = { + createRule, hasThrowsTag, findParent, + getOptionsFromContext, };