UNPKG

6.08 kBJavaScriptView Raw
1"use strict";
2var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3 if (k2 === undefined) k2 = k;
4 Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5}) : (function(o, m, k, k2) {
6 if (k2 === undefined) k2 = k;
7 o[k2] = m[k];
8}));
9var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10 Object.defineProperty(o, "default", { enumerable: true, value: v });
11}) : function(o, v) {
12 o["default"] = v;
13});
14var __importStar = (this && this.__importStar) || function (mod) {
15 if (mod && mod.__esModule) return mod;
16 var result = {};
17 if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18 __setModuleDefault(result, mod);
19 return result;
20};
21Object.defineProperty(exports, "__esModule", { value: true });
22const util = __importStar(require("../util"));
23const utils_1 = require("@typescript-eslint/utils");
24exports.default = util.createRule({
25 name: 'consistent-type-assertions',
26 meta: {
27 type: 'suggestion',
28 docs: {
29 description: 'Enforces consistent usage of type assertions',
30 recommended: false,
31 },
32 messages: {
33 as: "Use 'as {{cast}}' instead of '<{{cast}}>'.",
34 'angle-bracket': "Use '<{{cast}}>' instead of 'as {{cast}}'.",
35 never: 'Do not use any type assertions.',
36 unexpectedObjectTypeAssertion: 'Always prefer const x: T = { ... }.',
37 },
38 schema: [
39 {
40 oneOf: [
41 {
42 type: 'object',
43 properties: {
44 assertionStyle: {
45 enum: ['never'],
46 },
47 },
48 additionalProperties: false,
49 required: ['assertionStyle'],
50 },
51 {
52 type: 'object',
53 properties: {
54 assertionStyle: {
55 enum: ['as', 'angle-bracket'],
56 },
57 objectLiteralTypeAssertions: {
58 enum: ['allow', 'allow-as-parameter', 'never'],
59 },
60 },
61 additionalProperties: false,
62 required: ['assertionStyle'],
63 },
64 ],
65 },
66 ],
67 },
68 defaultOptions: [
69 {
70 assertionStyle: 'as',
71 objectLiteralTypeAssertions: 'allow',
72 },
73 ],
74 create(context, [options]) {
75 const sourceCode = context.getSourceCode();
76 function isConst(node) {
77 if (node.type !== utils_1.AST_NODE_TYPES.TSTypeReference) {
78 return false;
79 }
80 return (node.typeName.type === utils_1.AST_NODE_TYPES.Identifier &&
81 node.typeName.name === 'const');
82 }
83 function reportIncorrectAssertionType(node) {
84 // If this node is `as const`, then don't report an error.
85 if (isConst(node.typeAnnotation)) {
86 return;
87 }
88 const messageId = options.assertionStyle;
89 context.report({
90 node,
91 messageId,
92 data: messageId !== 'never'
93 ? { cast: sourceCode.getText(node.typeAnnotation) }
94 : {},
95 });
96 }
97 function checkType(node) {
98 switch (node.type) {
99 case utils_1.AST_NODE_TYPES.TSAnyKeyword:
100 case utils_1.AST_NODE_TYPES.TSUnknownKeyword:
101 return false;
102 case utils_1.AST_NODE_TYPES.TSTypeReference:
103 return (
104 // Ignore `as const` and `<const>`
105 !isConst(node) ||
106 // Allow qualified names which have dots between identifiers, `Foo.Bar`
107 node.typeName.type === utils_1.AST_NODE_TYPES.TSQualifiedName);
108 default:
109 return true;
110 }
111 }
112 function checkExpression(node) {
113 if (options.assertionStyle === 'never' ||
114 options.objectLiteralTypeAssertions === 'allow' ||
115 node.expression.type !== utils_1.AST_NODE_TYPES.ObjectExpression) {
116 return;
117 }
118 if (options.objectLiteralTypeAssertions === 'allow-as-parameter' &&
119 node.parent &&
120 (node.parent.type === utils_1.AST_NODE_TYPES.NewExpression ||
121 node.parent.type === utils_1.AST_NODE_TYPES.CallExpression ||
122 node.parent.type === utils_1.AST_NODE_TYPES.ThrowStatement ||
123 node.parent.type === utils_1.AST_NODE_TYPES.AssignmentPattern ||
124 node.parent.type === utils_1.AST_NODE_TYPES.JSXExpressionContainer)) {
125 return;
126 }
127 if (checkType(node.typeAnnotation) &&
128 node.expression.type === utils_1.AST_NODE_TYPES.ObjectExpression) {
129 context.report({
130 node,
131 messageId: 'unexpectedObjectTypeAssertion',
132 });
133 }
134 }
135 return {
136 TSTypeAssertion(node) {
137 if (options.assertionStyle !== 'angle-bracket') {
138 reportIncorrectAssertionType(node);
139 return;
140 }
141 checkExpression(node);
142 },
143 TSAsExpression(node) {
144 if (options.assertionStyle !== 'as') {
145 reportIncorrectAssertionType(node);
146 return;
147 }
148 checkExpression(node);
149 },
150 };
151 },
152});
153//# sourceMappingURL=consistent-type-assertions.js.map
\No newline at end of file