From ee62b0b18afb85fe901a48f816bda5802acc907a Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Thu, 24 Nov 2022 14:39:19 -0500 Subject: [PATCH] chore: use no-restricted-syntax to enforce created options in rules (#6074) * fix(eslint-plugin): [keyword-spacing] prevent crash on no options * chore: add internal lint rule to always prefer created options * All right base rules, you do you --- .eslintrc.js | 10 ++++++++++ packages/eslint-plugin/src/rules/brace-style.ts | 1 + packages/eslint-plugin/src/rules/no-unused-vars.ts | 4 +--- .../eslint-plugin/src/rules/object-curly-spacing.ts | 1 + .../src/rules/padding-line-between-statements.ts | 1 + .../eslint-plugin/src/rules/space-before-blocks.ts | 3 +-- 6 files changed, 15 insertions(+), 5 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 6dfb0c35362..81f745d3824 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -264,6 +264,16 @@ module.exports = { // specifically for rules - default exports makes the tooling easier 'import/no-default-export': 'off', + + 'no-restricted-syntax': [ + 'error', + { + selector: + 'ExportDefaultDeclaration Property[key.name="create"] MemberExpression[object.name="context"][property.name="options"]', + message: + "Retrieve options from create's second parameter so that defaultOptions are applied.", + }, + ], }, }, // plugin rule tests diff --git a/packages/eslint-plugin/src/rules/brace-style.ts b/packages/eslint-plugin/src/rules/brace-style.ts index c4b052beadd..43d4ba63c3c 100644 --- a/packages/eslint-plugin/src/rules/brace-style.ts +++ b/packages/eslint-plugin/src/rules/brace-style.ts @@ -29,6 +29,7 @@ export default createRule({ defaultOptions: ['1tbs'], create(context) { const [style, { allowSingleLine } = { allowSingleLine: false }] = + // eslint-disable-next-line no-restricted-syntax -- Use raw options for extended rules. context.options; const isAllmanStyle = style === 'allman'; diff --git a/packages/eslint-plugin/src/rules/no-unused-vars.ts b/packages/eslint-plugin/src/rules/no-unused-vars.ts index 5fcde198667..77da885048d 100644 --- a/packages/eslint-plugin/src/rules/no-unused-vars.ts +++ b/packages/eslint-plugin/src/rules/no-unused-vars.ts @@ -84,7 +84,7 @@ export default util.createRule({ }, }, defaultOptions: [{}], - create(context) { + create(context, [firstOption]) { const filename = context.getFilename(); const sourceCode = context.getSourceCode(); const MODULE_DECL_CACHE = new Map(); @@ -97,8 +97,6 @@ export default util.createRule({ caughtErrors: 'none', }; - const [firstOption] = context.options; - if (firstOption) { if (typeof firstOption === 'string') { options.vars = firstOption; diff --git a/packages/eslint-plugin/src/rules/object-curly-spacing.ts b/packages/eslint-plugin/src/rules/object-curly-spacing.ts index 5c188bb2c07..1c1c737c842 100644 --- a/packages/eslint-plugin/src/rules/object-curly-spacing.ts +++ b/packages/eslint-plugin/src/rules/object-curly-spacing.ts @@ -31,6 +31,7 @@ export default createRule({ }, defaultOptions: ['never'], create(context) { + // eslint-disable-next-line no-restricted-syntax -- Use raw options for extended rules. const [firstOption, secondOption] = context.options; const spaced = firstOption === 'always'; const sourceCode = context.getSourceCode(); diff --git a/packages/eslint-plugin/src/rules/padding-line-between-statements.ts b/packages/eslint-plugin/src/rules/padding-line-between-statements.ts index a3c354ea737..f9b97096afc 100644 --- a/packages/eslint-plugin/src/rules/padding-line-between-statements.ts +++ b/packages/eslint-plugin/src/rules/padding-line-between-statements.ts @@ -634,6 +634,7 @@ export default util.createRule({ defaultOptions: [], create(context) { const sourceCode = context.getSourceCode(); + // eslint-disable-next-line no-restricted-syntax -- We need all raw options. const configureList = context.options || []; type Scope = null | { diff --git a/packages/eslint-plugin/src/rules/space-before-blocks.ts b/packages/eslint-plugin/src/rules/space-before-blocks.ts index 569be350cd7..5f16929aa52 100644 --- a/packages/eslint-plugin/src/rules/space-before-blocks.ts +++ b/packages/eslint-plugin/src/rules/space-before-blocks.ts @@ -29,9 +29,8 @@ export default util.createRule({ }, }, defaultOptions: ['always'], - create(context) { + create(context, [config]) { const rules = baseRule.create(context); - const config = context.options[0]; const sourceCode = context.getSourceCode(); let requireSpace = true;