1 | "use strict";
|
2 | var __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 | }));
|
9 | var __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 | });
|
14 | var __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 | };
|
21 | Object.defineProperty(exports, "__esModule", { value: true });
|
22 | const util = __importStar(require("../util"));
|
23 | exports.default = util.createRule({
|
24 | name: 'no-empty-interface',
|
25 | meta: {
|
26 | type: 'suggestion',
|
27 | docs: {
|
28 | description: 'Disallow the declaration of empty interfaces',
|
29 | recommended: 'error',
|
30 | suggestion: true,
|
31 | },
|
32 | fixable: 'code',
|
33 | hasSuggestions: true,
|
34 | messages: {
|
35 | noEmpty: 'An empty interface is equivalent to `{}`.',
|
36 | noEmptyWithSuper: 'An interface declaring no members is equivalent to its supertype.',
|
37 | },
|
38 | schema: [
|
39 | {
|
40 | type: 'object',
|
41 | additionalProperties: false,
|
42 | properties: {
|
43 | allowSingleExtends: {
|
44 | type: 'boolean',
|
45 | },
|
46 | },
|
47 | },
|
48 | ],
|
49 | },
|
50 | defaultOptions: [
|
51 | {
|
52 | allowSingleExtends: false,
|
53 | },
|
54 | ],
|
55 | create(context, [{ allowSingleExtends }]) {
|
56 | return {
|
57 | TSInterfaceDeclaration(node) {
|
58 | const sourceCode = context.getSourceCode();
|
59 | const filename = context.getFilename();
|
60 | if (node.body.body.length !== 0) {
|
61 |
|
62 | return;
|
63 | }
|
64 | const extend = node.extends;
|
65 | if (!extend || extend.length === 0) {
|
66 | context.report({
|
67 | node: node.id,
|
68 | messageId: 'noEmpty',
|
69 | });
|
70 | }
|
71 | else if (extend.length === 1) {
|
72 |
|
73 | if (!allowSingleExtends) {
|
74 | const fix = (fixer) => {
|
75 | let typeParam = '';
|
76 | if (node.typeParameters) {
|
77 | typeParam = sourceCode.getText(node.typeParameters);
|
78 | }
|
79 | return fixer.replaceText(node, `type ${sourceCode.getText(node.id)}${typeParam} = ${sourceCode.getText(extend[0])}`);
|
80 | };
|
81 |
|
82 | let useAutoFix = true;
|
83 | if (util.isDefinitionFile(filename)) {
|
84 | const scope = context.getScope();
|
85 | if (scope.type === 'tsModule' && scope.block.declare) {
|
86 | useAutoFix = false;
|
87 | }
|
88 | }
|
89 | context.report(Object.assign({ node: node.id, messageId: 'noEmptyWithSuper' }, (useAutoFix
|
90 | ? { fix }
|
91 | : {
|
92 | suggest: [
|
93 | {
|
94 | messageId: 'noEmptyWithSuper',
|
95 | fix,
|
96 | },
|
97 | ],
|
98 | })));
|
99 | }
|
100 | }
|
101 | },
|
102 | };
|
103 | },
|
104 | });
|
105 |
|
\ | No newline at end of file |