From 6e7ade58a398a36a9cd1be1e05b6e8e7d1cae4de Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Wed, 23 Nov 2022 10:06:20 -0500 Subject: [PATCH 1/3] fix(eslint-plugin): [keyword-spacing] prevent crash on no options --- packages/eslint-plugin/src/rules/keyword-spacing.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/src/rules/keyword-spacing.ts b/packages/eslint-plugin/src/rules/keyword-spacing.ts index 6af42e5c2fb..32fb2aaeb71 100644 --- a/packages/eslint-plugin/src/rules/keyword-spacing.ts +++ b/packages/eslint-plugin/src/rules/keyword-spacing.ts @@ -25,7 +25,7 @@ export default util.createRule({ }, defaultOptions: [{}], - create(context) { + create(context, [{ after }]) { const sourceCode = context.getSourceCode(); const baseRules = baseRule.create(context); return { @@ -58,7 +58,7 @@ export default util.createRule({ const punctuatorToken = sourceCode.getTokenAfter(typeToken)!; const spacesBetweenTypeAndPunctuator = punctuatorToken.range[0] - typeToken.range[1]; - if (context.options[0].after && spacesBetweenTypeAndPunctuator === 0) { + if (after && spacesBetweenTypeAndPunctuator === 0) { context.report({ loc: punctuatorToken.loc, messageId: 'expectedBefore', @@ -68,7 +68,7 @@ export default util.createRule({ }, }); } - if (!context.options[0].after && spacesBetweenTypeAndPunctuator > 0) { + if (!after && spacesBetweenTypeAndPunctuator > 0) { context.report({ loc: punctuatorToken.loc, messageId: 'unexpectedBefore', From ee43230a87df00ff6ea02ec0de9bde8eb8a28520 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Wed, 23 Nov 2022 10:43:14 -0500 Subject: [PATCH 2/3] chore: add internal lint rule to always prefer created options --- .eslintrc.js | 10 ++++++++++ packages/eslint-plugin/src/rules/brace-style.ts | 5 +---- packages/eslint-plugin/src/rules/no-unused-vars.ts | 4 +--- .../eslint-plugin/src/rules/object-curly-spacing.ts | 3 +-- .../src/rules/padding-line-between-statements.ts | 1 + .../eslint-plugin/src/rules/space-before-blocks.ts | 3 +-- 6 files changed, 15 insertions(+), 11 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..4468ac592b0 100644 --- a/packages/eslint-plugin/src/rules/brace-style.ts +++ b/packages/eslint-plugin/src/rules/brace-style.ts @@ -27,10 +27,7 @@ export default createRule({ schema: baseRule.meta.schema, }, defaultOptions: ['1tbs'], - create(context) { - const [style, { allowSingleLine } = { allowSingleLine: false }] = - context.options; - + create(context, [style, { allowSingleLine } = { allowSingleLine: false }]) { const isAllmanStyle = style === 'allman'; const sourceCode = context.getSourceCode(); const rules = baseRule.create(context); 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..180adf2fb86 100644 --- a/packages/eslint-plugin/src/rules/object-curly-spacing.ts +++ b/packages/eslint-plugin/src/rules/object-curly-spacing.ts @@ -30,8 +30,7 @@ export default createRule({ }, }, defaultOptions: ['never'], - create(context) { - const [firstOption, secondOption] = context.options; + create(context, [firstOption, secondOption]) { 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; From 9be5793750f4731e298ec2f1ccd046853c973fa2 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Thu, 24 Nov 2022 14:13:47 -0500 Subject: [PATCH 3/3] All right base rules, you do you --- packages/eslint-plugin/src/rules/brace-style.ts | 6 +++++- packages/eslint-plugin/src/rules/object-curly-spacing.ts | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/src/rules/brace-style.ts b/packages/eslint-plugin/src/rules/brace-style.ts index 4468ac592b0..43d4ba63c3c 100644 --- a/packages/eslint-plugin/src/rules/brace-style.ts +++ b/packages/eslint-plugin/src/rules/brace-style.ts @@ -27,7 +27,11 @@ export default createRule({ schema: baseRule.meta.schema, }, defaultOptions: ['1tbs'], - create(context, [style, { allowSingleLine } = { allowSingleLine: false }]) { + 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'; const sourceCode = context.getSourceCode(); const rules = baseRule.create(context); diff --git a/packages/eslint-plugin/src/rules/object-curly-spacing.ts b/packages/eslint-plugin/src/rules/object-curly-spacing.ts index 180adf2fb86..1c1c737c842 100644 --- a/packages/eslint-plugin/src/rules/object-curly-spacing.ts +++ b/packages/eslint-plugin/src/rules/object-curly-spacing.ts @@ -30,7 +30,9 @@ export default createRule({ }, }, defaultOptions: ['never'], - create(context, [firstOption, secondOption]) { + 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();