diff --git a/.changeset/upset-cobras-cross.md b/.changeset/upset-cobras-cross.md new file mode 100644 index 00000000..9015f418 --- /dev/null +++ b/.changeset/upset-cobras-cross.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-primer-react': minor +--- + +Add spread-props-first rule to ensure spread props come before other props diff --git a/docs/rules/spread-props-first.md b/docs/rules/spread-props-first.md new file mode 100644 index 00000000..c549ada4 --- /dev/null +++ b/docs/rules/spread-props-first.md @@ -0,0 +1,66 @@ +# Ensure spread props come before other props (spread-props-first) + +Spread props should come before other named props to avoid unintentionally overriding props. When spread props are placed after named props, they can override the named props, which is often unintended and can lead to UI bugs. + +## Rule details + +This rule enforces that all spread props (`{...rest}`, `{...props}`, etc.) come before any named props in JSX elements. + +👎 Examples of **incorrect** code for this rule: + +```jsx +/* eslint primer-react/spread-props-first: "error" */ + +// ❌ Spread after named prop + + +// ❌ Spread in the middle + + +// ❌ Multiple spreads after named props + +``` + +👍 Examples of **correct** code for this rule: + +```jsx +/* eslint primer-react/spread-props-first: "error" */ + +// ✅ Spread before named props + + +// ✅ Multiple spreads before named props + + +// ✅ Only spread props + + +// ✅ Only named props + +``` + +## Why this matters + +Placing spread props after named props can cause unexpected behavior: + +```jsx +// ❌ Bad: className might get overridden by rest +