From 5bf695fd8216c9e58036387937f145ea679c81a8 Mon Sep 17 00:00:00 2001 From: Armano Date: Sun, 20 Jan 2019 07:19:17 +0100 Subject: [PATCH 1/3] feat(eslint-plugin): add option to no-object-literal-type-assertion rule --- .../rules/no-object-literal-type-assertion.md | 6 ++-- .../rules/no-object-literal-type-assertion.js | 31 ++++++++++++++++++- .../rules/no-object-literal-type-assertion.js | 20 +++++++++++- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/packages/eslint-plugin/docs/rules/no-object-literal-type-assertion.md b/packages/eslint-plugin/docs/rules/no-object-literal-type-assertion.md index c833fe9fbbbd..20d603c67a83 100644 --- a/packages/eslint-plugin/docs/rules/no-object-literal-type-assertion.md +++ b/packages/eslint-plugin/docs/rules/no-object-literal-type-assertion.md @@ -20,9 +20,11 @@ const z = { ... } as unknown; ## Options -```json +```cjson { - "typescript/no-object-literal-type-assertion": "error" + "typescript/no-object-literal-type-assertion": ["error", { + allowInCallExpression: false // Allow type assertion in call and new expression + }] } ``` diff --git a/packages/eslint-plugin/lib/rules/no-object-literal-type-assertion.js b/packages/eslint-plugin/lib/rules/no-object-literal-type-assertion.js index f98a28a38f0c..e651389103cf 100644 --- a/packages/eslint-plugin/lib/rules/no-object-literal-type-assertion.js +++ b/packages/eslint-plugin/lib/rules/no-object-literal-type-assertion.js @@ -10,6 +10,12 @@ const util = require('../util'); // Rule Definition //------------------------------------------------------------------------------ +const defaultOptions = [ + { + allowInCallExpression: false + } +]; + module.exports = { meta: { type: 'problem', @@ -25,9 +31,24 @@ module.exports = { unexpectedTypeAssertion: 'Type assertion on object literals is forbidden, use a type annotation instead.' }, - schema: [] + schema: [ + { + type: 'object', + additionalProperties: false, + properties: { + allowInCallExpression: { + type: 'boolean' + } + } + } + ] }, create(context) { + const { allowInCallExpression } = util.applyDefault( + defaultOptions, + context.options + )[0]; + //---------------------------------------------------------------------- // Public //---------------------------------------------------------------------- @@ -52,6 +73,14 @@ module.exports = { return { 'TSTypeAssertion, TSAsExpression'(node) { + if ( + allowInCallExpression && + (node.parent.type === 'NewExpression' || + node.parent.type === 'CallExpression') + ) { + return; + } + if ( checkType(node.typeAnnotation) && node.expression.type === 'ObjectExpression' diff --git a/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js b/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js index 2a037390e0b5..33c59573c83d 100644 --- a/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js +++ b/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js @@ -39,7 +39,15 @@ ruleTester.run('no-object-literal-type-assertion', rule, { `const foo = {};`, // Allow cast to 'unknown' `const foo = {} as unknown;`, - `const foo = {};` + `const foo = {};`, + { + code: `print({ bar: 5 } as Foo)`, + options: [ + { + allowInCallExpression: true + } + ] + } ], invalid: [ { @@ -71,6 +79,16 @@ ruleTester.run('no-object-literal-type-assertion', rule, { column: 11 } ] + }, + { + code: `print({ bar: 5 } as Foo)`, + errors: [ + { + messageId: 'unexpectedTypeAssertion', + line: 1, + column: 7 + } + ] } ] }); From fc64c8e2d6ace59118e1ffe4460ccd60f6ba970c Mon Sep 17 00:00:00 2001 From: Armano Date: Sun, 20 Jan 2019 07:24:51 +0100 Subject: [PATCH 2/3] test(eslint-plugin): add missing test case for new expression --- .../rules/no-object-literal-type-assertion.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js b/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js index 33c59573c83d..47b36ad4d1e5 100644 --- a/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js +++ b/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js @@ -47,6 +47,14 @@ ruleTester.run('no-object-literal-type-assertion', rule, { allowInCallExpression: true } ] + }, + { + code: `new print({ bar: 5 } as Foo)`, + options: [ + { + allowInCallExpression: true + } + ] } ], invalid: [ @@ -89,6 +97,16 @@ ruleTester.run('no-object-literal-type-assertion', rule, { column: 7 } ] + }, + { + code: `new print({ bar: 5 } as Foo)`, + errors: [ + { + messageId: 'unexpectedTypeAssertion', + line: 1, + column: 11 + } + ] } ] }); From 952b0671443e38ff2b397ae403e38ba1aa3c988e Mon Sep 17 00:00:00 2001 From: Armano Date: Sun, 20 Jan 2019 20:29:53 +0100 Subject: [PATCH 3/3] fix(eslint-plugin): update option to allowAsParameter --- .../docs/rules/no-object-literal-type-assertion.md | 2 +- .../lib/rules/no-object-literal-type-assertion.js | 8 ++++---- .../tests/lib/rules/no-object-literal-type-assertion.js | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/eslint-plugin/docs/rules/no-object-literal-type-assertion.md b/packages/eslint-plugin/docs/rules/no-object-literal-type-assertion.md index 8282606a317a..b81ae0d87b69 100644 --- a/packages/eslint-plugin/docs/rules/no-object-literal-type-assertion.md +++ b/packages/eslint-plugin/docs/rules/no-object-literal-type-assertion.md @@ -23,7 +23,7 @@ const z = { ... } as unknown; ```cjson { "@typescript-eslint/no-object-literal-type-assertion": ["error", { - allowInCallExpression: false // Allow type assertion in call and new expression, default false + allowAsParameter: false // Allow type assertion in call and new expression, default false }] } ``` diff --git a/packages/eslint-plugin/lib/rules/no-object-literal-type-assertion.js b/packages/eslint-plugin/lib/rules/no-object-literal-type-assertion.js index e651389103cf..11258a99315f 100644 --- a/packages/eslint-plugin/lib/rules/no-object-literal-type-assertion.js +++ b/packages/eslint-plugin/lib/rules/no-object-literal-type-assertion.js @@ -12,7 +12,7 @@ const util = require('../util'); const defaultOptions = [ { - allowInCallExpression: false + allowAsParameter: false } ]; @@ -36,7 +36,7 @@ module.exports = { type: 'object', additionalProperties: false, properties: { - allowInCallExpression: { + allowAsParameter: { type: 'boolean' } } @@ -44,7 +44,7 @@ module.exports = { ] }, create(context) { - const { allowInCallExpression } = util.applyDefault( + const { allowAsParameter } = util.applyDefault( defaultOptions, context.options )[0]; @@ -74,7 +74,7 @@ module.exports = { return { 'TSTypeAssertion, TSAsExpression'(node) { if ( - allowInCallExpression && + allowAsParameter && (node.parent.type === 'NewExpression' || node.parent.type === 'CallExpression') ) { diff --git a/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js b/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js index 47b36ad4d1e5..aa19b09e8601 100644 --- a/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js +++ b/packages/eslint-plugin/tests/lib/rules/no-object-literal-type-assertion.js @@ -44,7 +44,7 @@ ruleTester.run('no-object-literal-type-assertion', rule, { code: `print({ bar: 5 } as Foo)`, options: [ { - allowInCallExpression: true + allowAsParameter: true } ] }, @@ -52,7 +52,7 @@ ruleTester.run('no-object-literal-type-assertion', rule, { code: `new print({ bar: 5 } as Foo)`, options: [ { - allowInCallExpression: true + allowAsParameter: true } ] }