ban interface usage for component props and state

Summary: another eslint rule for flipper codebase

Reviewed By: passy

Differential Revision: D33917213

fbshipit-source-id: e60b867d359ef5b94a481edf0eda318ecff17eee
This commit is contained in:
Anton Kastritskiy
2022-02-02 05:08:48 -08:00
committed by Facebook GitHub Bot
parent 59b11c5f12
commit f2abbf63db
8 changed files with 61 additions and 9 deletions

View File

@@ -22,6 +22,9 @@ import noTsFileExtension, {
import noIPrefixInterfaces, {
RULE_NAME as noIPrefixInterfacesRuleName,
} from './rules/noIPrefixInterfaces';
import noInterfaceProps, {
RULE_NAME as noInterfacePropsRuleName,
} from './rules/noInterfacePropsOrState';
module.exports = {
rules: {
@@ -30,5 +33,6 @@ module.exports = {
[noConsoleErrorWithoutContextRuleName]: noConsoleErrorWithoutContext,
[noTsFileExtensionRuleName]: noTsFileExtension,
[noIPrefixInterfacesRuleName]: noIPrefixInterfaces,
[noInterfacePropsRuleName]: noInterfaceProps,
},
};

View File

@@ -0,0 +1,48 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import {createESLintRule} from '../utils/createEslintRule';
type Options = [];
export type MessageIds = 'noInterfacePropsOrState';
export const RULE_NAME = 'no-interface-props-or-state';
export default createESLintRule<Options, MessageIds>({
name: RULE_NAME,
meta: {
type: 'problem',
docs: {
description: 'Use type aliases for component props instead of interfaces',
recommended: 'error',
},
schema: [],
messages: {
noInterfacePropsOrState:
'Use type aliases for component props and state instead of interfaces',
},
},
defaultOptions: [],
create(context) {
return {
TSInterfaceDeclaration(node) {
if (
!(node.id.name.endsWith('Props') || node.id.name.endsWith('State'))
) {
return;
}
context.report({
node: node.id,
messageId: 'noInterfacePropsOrState',
});
},
};
},
});