mirror of
https://github.com/zebrajr/react.git
synced 2025-12-07 12:20:38 +01:00
With #34176 we now have granular lint rules created for each compiler ErrorCategory. However, we had remnants of our old error severities still in use which makes reporting errors quite clunky. Previously you would need to specify both a category and severity which often ended up being the same. This PR moves severity definition into our rules which are generated from our categories. For now I decided to defer "upgrading" categories from a simple string to a sum type since we are only using severities to map errors to eslint severity. --- [//]: # (BEGIN SAPLING FOOTER) Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34401). * #34409 * #34404 * #34403 * #34402 * __->__ #34401
101 lines
2.4 KiB
TypeScript
101 lines
2.4 KiB
TypeScript
/**
|
|
* 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.
|
|
*/
|
|
|
|
import {
|
|
ErrorCategory,
|
|
getRuleForCategory,
|
|
} from 'babel-plugin-react-compiler/src/CompilerError';
|
|
import {normalizeIndent, makeTestCaseError, testRule} from './shared-utils';
|
|
import {allRules} from '../src/rules/ReactCompilerRule';
|
|
|
|
testRule(
|
|
'rules-of-hooks',
|
|
allRules[getRuleForCategory(ErrorCategory.Hooks).name].rule,
|
|
{
|
|
valid: [
|
|
{
|
|
name: 'Basic example',
|
|
code: normalizeIndent`
|
|
function Component() {
|
|
useHook();
|
|
return <div>Hello world</div>;
|
|
}
|
|
`,
|
|
},
|
|
{
|
|
name: 'Violation with Flow suppression',
|
|
code: `
|
|
// Valid since error already suppressed with flow.
|
|
function useHook() {
|
|
if (cond) {
|
|
// $FlowFixMe[react-rule-hook]
|
|
useConditionalHook();
|
|
}
|
|
}
|
|
`,
|
|
},
|
|
{
|
|
// OK because invariants are only meant for the compiler team's consumption
|
|
name: '[Invariant] Defined after use',
|
|
code: normalizeIndent`
|
|
function Component(props) {
|
|
let y = function () {
|
|
m(x);
|
|
};
|
|
|
|
let x = { a };
|
|
m(x);
|
|
return y;
|
|
}
|
|
`,
|
|
},
|
|
{
|
|
name: "Classes don't throw",
|
|
code: normalizeIndent`
|
|
class Foo {
|
|
#bar() {}
|
|
}
|
|
`,
|
|
},
|
|
],
|
|
invalid: [
|
|
{
|
|
name: 'Simple violation',
|
|
code: normalizeIndent`
|
|
function useConditional() {
|
|
if (cond) {
|
|
useConditionalHook();
|
|
}
|
|
}
|
|
`,
|
|
errors: [
|
|
makeTestCaseError(
|
|
'Hooks must always be called in a consistent order',
|
|
),
|
|
],
|
|
},
|
|
{
|
|
name: 'Multiple diagnostics within the same function are surfaced',
|
|
code: normalizeIndent`
|
|
function useConditional() {
|
|
cond ?? useConditionalHook();
|
|
props.cond && useConditionalHook();
|
|
return <div>Hello world</div>;
|
|
}`,
|
|
errors: [
|
|
makeTestCaseError(
|
|
'Hooks must always be called in a consistent order',
|
|
),
|
|
makeTestCaseError(
|
|
'Hooks must always be called in a consistent order',
|
|
),
|
|
],
|
|
},
|
|
],
|
|
},
|
|
);
|