Skip to content

Commit 7101b09

Browse files
authored
Supports React.forwardRef and React.memo [publish] (#46)
1 parent 897a11d commit 7101b09

6 files changed

+47
-8
lines changed

.github/workflows/ci.yml

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
name: CI
2+
on:
3+
pull_request:
4+
branches:
5+
- main
6+
jobs:
7+
ci:
8+
runs-on: ubuntu-latest
9+
steps:
10+
- uses: actions/checkout@v4
11+
- uses: oven-sh/setup-bun@v2
12+
- run: bun install
13+
- run: bun ci

.github/workflows/publish.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ jobs:
88
runs-on: ubuntu-latest
99
if: ${{ contains(github.event.head_commit.message, '[publish]') }}
1010
steps:
11-
- uses: actions/checkout@v3
12-
- uses: oven-sh/setup-bun@v1
11+
- uses: actions/checkout@v4
12+
- uses: oven-sh/setup-bun@v2
1313
- run: bun install
1414
- run: bun ci
1515
- uses: ArnaudBarre/npm-publish@v1

CHANGELOG.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
# Changelog
22

3+
## 0.4.10
4+
5+
- Support `function Foo() {}; export default React.memo(Foo)` (#46) (thanks @SukkaW!)
6+
37
## 0.4.9
48

5-
- Support `function Foo() {}; export default memo(Foo)` (fixes #44)
9+
- Support `function Foo() {}; export default memo(Foo)` (fixes #44) (thanks @SukkaW!)
610

711
## 0.4.8
812

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "eslint-plugin-react-refresh",
3-
"version": "0.4.9",
3+
"version": "0.4.10",
44
"type": "module",
55
"license": "MIT",
66
"scripts": {

src/only-export-components.test.ts

+12
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,26 @@ const valid = [
8989
name: "export default memo function",
9090
code: "export default memo(function Foo () {});",
9191
},
92+
{
93+
name: "export default React.memo function",
94+
code: "export default React.memo(function Foo () {});",
95+
},
9296
{
9397
name: "export default memo function assignment",
9498
code: "const Foo = () => {}; export default memo(Foo);",
9599
},
100+
{
101+
name: "export default React.memo function assignment",
102+
code: "const Foo = () => {}; export default React.memo(Foo);",
103+
},
96104
{
97105
name: "export default memo function declaration",
98106
code: "function Foo() {}; export default memo(Foo);",
99107
},
108+
{
109+
name: "export default React.memo function declaration",
110+
code: "function Foo() {}; export default React.memo(Foo);",
111+
},
100112
{
101113
name: "export type *",
102114
code: "export type * from './module';",

src/only-export-components.ts

+14-4
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,20 @@ export const onlyExportComponents: TSESLint.RuleModule<
157157
handleExportIdentifier(node.id, true);
158158
}
159159
} else if (node.type === "CallExpression") {
160-
if (
161-
node.callee.type !== "Identifier" ||
162-
!reactHOCs.has(node.callee.name)
163-
) {
160+
// we rule out non HoC first
161+
if (node.callee.type !== "Identifier") {
162+
// export default React.memo(function Foo() {})
163+
// export default Preact.memo(function Foo() {})
164+
if (
165+
node.callee.type === "MemberExpression" &&
166+
node.callee.property.type === "Identifier" &&
167+
reactHOCs.has(node.callee.property.name)
168+
) {
169+
mayHaveReactExport = true;
170+
} else {
171+
context.report({ messageId: "anonymousExport", node });
172+
}
173+
} else if (!reactHOCs.has(node.callee.name)) {
164174
// we rule out non HoC first
165175
context.report({ messageId: "anonymousExport", node });
166176
} else if (

0 commit comments

Comments
 (0)