Skip to content

Commit a68e45c

Browse files
authoredMar 18, 2025··
refactor(linter): improve unicorn/no-anonymous-default-export (#9847)
I ported the test cases from `unicorn` again, as it seems that the initial implementation did not align with the original tests. - Better code style - Improve the documentation - Fix issues exposed after testing alignment
1 parent 56d44f5 commit a68e45c

File tree

2 files changed

+400
-99
lines changed

2 files changed

+400
-99
lines changed
 

‎crates/oxc_linter/src/rules/unicorn/no_anonymous_default_export.rs

+135-78
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::fmt;
2-
31
use oxc_ast::{
42
AstKind,
53
ast::{AssignmentExpression, AssignmentTarget, ExportDefaultDeclarationKind, Expression},
@@ -8,9 +6,14 @@ use oxc_diagnostics::OxcDiagnostic;
86
use oxc_macros::declare_oxc_lint;
97
use oxc_span::Span;
108

11-
use crate::{AstNode, context::LintContext, rule::Rule};
9+
use crate::{AstNode, ast_util, context::LintContext, rule::Rule};
1210

1311
fn no_anonymous_default_export_diagnostic(span: Span, kind: ErrorNodeKind) -> OxcDiagnostic {
12+
let kind = match kind {
13+
ErrorNodeKind::Function => "function",
14+
ErrorNodeKind::Class => "class",
15+
};
16+
1417
OxcDiagnostic::warn(format!("This {kind} default export is missing a name"))
1518
// TODO: suggest a name. https://github.com/sindresorhus/eslint-plugin-unicorn/blob/d3e4b805da31c6ed7275e2e2e770b6b0fbcf11c2/rules/no-anonymous-default-export.js#L41
1619
.with_label(span)
@@ -21,14 +24,15 @@ pub struct NoAnonymousDefaultExport;
2124

2225
declare_oxc_lint!(
2326
/// ### What it does
24-
/// Disallow anonymous functions and classes as the default export
27+
///
28+
/// Disallows anonymous functions and classes as default exports.
2529
///
2630
/// ### Why is this bad?
27-
/// Naming default exports improves codebase searchability by ensuring
28-
/// consistent identifier use for a module's default export, both where it's
29-
/// declared and where it's imported.
3031
///
31-
/// ### Example
32+
/// Naming default exports improves searchability and ensures consistent
33+
/// identifiers for a module’s default export in both declaration and import.
34+
///
35+
/// ### Examples
3236
///
3337
/// Examples of **incorrect** code for this rule:
3438
/// ```javascript
@@ -61,73 +65,66 @@ declare_oxc_lint!(
6165

6266
impl Rule for NoAnonymousDefaultExport {
6367
fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) {
64-
let problem_node = match node.kind() {
68+
let result = match node.kind() {
6569
// ESM: export default
6670
AstKind::ExportDefaultDeclaration(export_decl) => match &export_decl.declaration {
67-
ExportDefaultDeclarationKind::ClassDeclaration(class_decl) => class_decl
68-
.id
69-
.as_ref()
70-
.map_or(Some((export_decl.span, ErrorNodeKind::Class)), |_| None),
71-
ExportDefaultDeclarationKind::FunctionDeclaration(function_decl) => function_decl
72-
.id
73-
.as_ref()
74-
.map_or(Some((export_decl.span, ErrorNodeKind::Function)), |_| None),
75-
ExportDefaultDeclarationKind::ArrowFunctionExpression(_) => {
76-
Some((export_decl.span, ErrorNodeKind::Function))
77-
}
78-
ExportDefaultDeclarationKind::ParenthesizedExpression(expr) => {
79-
let expr = expr.expression.get_inner_expression();
80-
match expr {
81-
Expression::ClassExpression(class_expr) => class_expr
82-
.id
83-
.as_ref()
84-
.map_or(Some((class_expr.span, ErrorNodeKind::Class)), |_| None),
85-
Expression::FunctionExpression(func_expr) => func_expr
86-
.id
87-
.as_ref()
88-
.map_or(Some((func_expr.span, ErrorNodeKind::Function)), |_| None),
89-
_ => None,
90-
}
71+
ExportDefaultDeclarationKind::ClassDeclaration(class_decl)
72+
if class_decl.id.is_none() =>
73+
{
74+
Some((class_decl.span, ErrorNodeKind::Class))
9175
}
92-
_ => None,
93-
},
94-
// CommonJS: module.exports
95-
AstKind::AssignmentExpression(expr) if is_common_js_export(expr) => match &expr.right {
96-
Expression::ClassExpression(class_expr) => {
97-
class_expr.id.as_ref().map_or(Some((expr.span, ErrorNodeKind::Class)), |_| None)
76+
ExportDefaultDeclarationKind::FunctionDeclaration(function_decl)
77+
if function_decl.id.is_none() =>
78+
{
79+
Some((function_decl.span, ErrorNodeKind::Function))
9880
}
99-
Expression::FunctionExpression(function_expr) => function_expr
100-
.id
101-
.as_ref()
102-
.map_or(Some((expr.span, ErrorNodeKind::Function)), |_| None),
103-
Expression::ArrowFunctionExpression(_) => {
104-
Some((expr.span, ErrorNodeKind::Function))
81+
_ => {
82+
export_decl.declaration.as_expression().and_then(is_anonymous_class_or_function)
10583
}
106-
_ => None,
10784
},
108-
_ => None,
85+
// CommonJS: module.exports
86+
AstKind::AssignmentExpression(expr)
87+
if is_top_expr(ctx, node) && is_common_js_export(expr) =>
88+
{
89+
is_anonymous_class_or_function(&expr.right)
90+
}
91+
_ => return,
10992
};
11093

111-
if let Some((span, error_kind)) = problem_node {
94+
if let Some((span, error_kind)) = result {
11295
ctx.diagnostic(no_anonymous_default_export_diagnostic(span, error_kind));
11396
};
11497
}
11598
}
11699

117-
fn is_common_js_export(expr: &AssignmentExpression) -> bool {
118-
if let AssignmentTarget::StaticMemberExpression(member_expr) = &expr.left {
119-
if let Expression::Identifier(object_ident) = &member_expr.object {
120-
if object_ident.name != "module" {
121-
return false;
122-
}
100+
fn is_anonymous_class_or_function(expr: &Expression) -> Option<(Span, ErrorNodeKind)> {
101+
Some(match expr.get_inner_expression() {
102+
Expression::ClassExpression(expr) if expr.id.is_none() => (expr.span, ErrorNodeKind::Class),
103+
Expression::FunctionExpression(expr) if expr.id.is_none() => {
104+
(expr.span, ErrorNodeKind::Function)
123105
}
106+
Expression::ArrowFunctionExpression(expr) => (expr.span, ErrorNodeKind::Function),
107+
_ => return None,
108+
})
109+
}
124110

125-
if member_expr.property.name != "exports" {
126-
return false;
111+
fn is_common_js_export(expr: &AssignmentExpression) -> bool {
112+
match &expr.left {
113+
AssignmentTarget::AssignmentTargetIdentifier(id) => id.name == "exports",
114+
AssignmentTarget::StaticMemberExpression(mem_expr) if !mem_expr.optional => {
115+
mem_expr.object.is_specific_id("module") && mem_expr.property.name == "exports"
127116
}
117+
_ => false,
128118
}
119+
}
120+
121+
fn is_top_expr(ctx: &LintContext, node: &AstNode) -> bool {
122+
if !ctx.scoping().scope_flags(node.scope_id()).is_top() {
123+
return false;
124+
};
129125

130-
true
126+
let parent = ast_util::iter_outer_expressions(ctx, node.id()).next();
127+
matches!(parent, Some(AstKind::ExpressionStatement(_)))
131128
}
132129

133130
#[derive(Clone, Copy)]
@@ -136,39 +133,99 @@ enum ErrorNodeKind {
136133
Class,
137134
}
138135

139-
impl fmt::Display for ErrorNodeKind {
140-
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
141-
match self {
142-
Self::Function => "function".fmt(f),
143-
Self::Class => "class".fmt(f),
144-
}
145-
}
146-
}
147-
148136
#[test]
149137
fn test() {
150138
use crate::tester::Tester;
151139

152140
let pass = vec![
153-
r"export default class Foo {}",
154-
r"export default function foo () {}",
155141
r"const foo = () => {}; export default foo;",
156142
r"module.exports = class Foo {};",
157143
r"module.exports = function foo () {};",
158144
r"const foo = () => {}; module.exports = foo;",
159-
// TODO: need handle this situation?
160-
// r"module['exports'] = function foo () {};",
145+
("export default function named() {}"),
146+
("export default class named {}"),
147+
("export default []"),
148+
("export default {}"),
149+
("export default 1"),
150+
("export default false"),
151+
("export default 0n"),
152+
("notExports = class {}"),
153+
("notModule.exports = class {}"),
154+
("module.notExports = class {}"),
155+
("module.exports.foo = class {}"),
156+
("alert(exports = class {})"),
157+
("foo = module.exports = class {}"),
161158
];
162159

163160
let fail = vec![
164-
r"export default class {}",
165-
r"export default function () {}",
166-
r"export default () => {};",
167-
r"module.exports = class {}",
168-
r"module.exports = function () {}",
169-
r"module.exports = () => {}",
170-
"export default (async function * () {})",
171-
"export default (class extends class {} {})",
161+
("export default function () {}"),
162+
("export default class {}"),
163+
("export default () => {}"),
164+
("export default function * () {}"),
165+
("export default async function () {}"),
166+
("export default async function * () {}"),
167+
("export default async () => {}"),
168+
("export default class {}"),
169+
("export default class extends class {} {}"),
170+
("export default class{}"),
171+
("export default class {}"),
172+
("let Foo, Foo_, foo, foo_
173+
export default class {}"),
174+
("let Foo, Foo_, foo, foo_
175+
export default (class{})"),
176+
("export default (class extends class {} {})"),
177+
("let Exports, Exports_, exports, exports_
178+
exports = class {}"),
179+
("module.exports = class {}"),
180+
("export default function () {}"),
181+
("export default function* () {}"),
182+
("export default async function* () {}"),
183+
("export default async function*() {}"),
184+
("export default async function *() {}"),
185+
("export default async function * () {}"),
186+
("export default async function * /* comment */ () {}"),
187+
("export default async function * // comment
188+
() {}"),
189+
("let Foo, Foo_, foo, foo_
190+
export default async function * () {}"),
191+
("let Foo, Foo_, foo, foo_
192+
export default (async function * () {})"),
193+
("let Exports, Exports_, exports, exports_
194+
exports = function() {}"),
195+
("module.exports = function() {}"),
196+
("export default () => {}"),
197+
("export default async () => {}"),
198+
("export default () => {};"),
199+
("export default() => {}"),
200+
("export default foo => {}"),
201+
("export default (( () => {} ))"),
202+
("/* comment 1 */ export /* comment 2 */ default /* comment 3 */ () => {}"),
203+
("// comment 1
204+
export
205+
// comment 2
206+
default
207+
// comment 3
208+
() => {}"),
209+
("let Foo, Foo_, foo, foo_
210+
export default async () => {}"),
211+
("let Exports, Exports_, exports, exports_
212+
exports = (( () => {} ))"),
213+
("// comment 1
214+
module
215+
// comment 2
216+
.exports
217+
// comment 3
218+
=
219+
// comment 4
220+
() => {};"),
221+
("(( exports = (( () => {} )) ))"),
222+
("(( module.exports = (( () => {} )) ))"),
223+
("(( exports = (( () => {} )) ));"),
224+
("(( module.exports = (( () => {} )) ));"),
225+
("@decorator export default class {}"),
226+
("export default @decorator(class {}) class extends class {} {}"),
227+
("module.exports = @decorator(class {}) class extends class {} {}"),
228+
("@decorator @decorator(class {}) export default class {}"),
172229
];
173230

174231
Tester::new(NoAnonymousDefaultExport::NAME, NoAnonymousDefaultExport::PLUGIN, pass, fail)
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,294 @@
11
---
22
source: crates/oxc_linter/src/tester.rs
33
---
4+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
5+
╭─[no_anonymous_default_export.tsx:1:16]
6+
1 │ export default function () {}
7+
· ──────────────
8+
╰────
9+
410
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
5-
╭─[no_anonymous_default_export.tsx:1:1]
11+
╭─[no_anonymous_default_export.tsx:1:16]
612
1 │ export default class {}
7-
· ───────────────────────
13+
· ────────
814
╰────
915

1016
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
11-
╭─[no_anonymous_default_export.tsx:1:1]
12-
1 │ export default function () {}
13-
· ─────────────────────────────
17+
╭─[no_anonymous_default_export.tsx:1:16]
18+
1 │ export default () => {}
19+
· ────────
1420
╰────
1521

1622
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
17-
╭─[no_anonymous_default_export.tsx:1:1]
18-
1 │ export default () => {};
19-
· ────────────────────────
23+
╭─[no_anonymous_default_export.tsx:1:16]
24+
1 │ export default function * () {}
25+
· ────────────────
26+
╰────
27+
28+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
29+
╭─[no_anonymous_default_export.tsx:1:16]
30+
1 │ export default async function () {}
31+
· ────────────────────
32+
╰────
33+
34+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
35+
╭─[no_anonymous_default_export.tsx:1:16]
36+
1 │ export default async function * () {}
37+
· ──────────────────────
38+
╰────
39+
40+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
41+
╭─[no_anonymous_default_export.tsx:1:16]
42+
1 │ export default async () => {}
43+
· ──────────────
2044
╰────
2145

2246
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
23-
╭─[no_anonymous_default_export.tsx:1:1]
47+
╭─[no_anonymous_default_export.tsx:1:16]
48+
1 │ export default class {}
49+
· ────────
50+
╰────
51+
52+
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
53+
╭─[no_anonymous_default_export.tsx:1:16]
54+
1 │ export default class extends class {} {}
55+
· ─────────────────────────
56+
╰────
57+
58+
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
59+
╭─[no_anonymous_default_export.tsx:1:16]
60+
1 │ export default class{}
61+
· ───────
62+
╰────
63+
64+
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
65+
╭─[no_anonymous_default_export.tsx:1:16]
66+
1 │ export default class {}
67+
· ────────
68+
╰────
69+
70+
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
71+
╭─[no_anonymous_default_export.tsx:2:19]
72+
1 │ let Foo, Foo_, foo, foo_
73+
2 │ export default class {}
74+
· ────────
75+
╰────
76+
77+
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
78+
╭─[no_anonymous_default_export.tsx:2:20]
79+
1 │ let Foo, Foo_, foo, foo_
80+
2 │ export default (class{})
81+
· ───────
82+
╰────
83+
84+
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
85+
╭─[no_anonymous_default_export.tsx:1:17]
86+
1 │ export default (class extends class {} {})
87+
· ─────────────────────────
88+
╰────
89+
90+
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
91+
╭─[no_anonymous_default_export.tsx:2:14]
92+
1 │ let Exports, Exports_, exports, exports_
93+
2 │ exports = class {}
94+
· ────────
95+
╰────
96+
97+
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
98+
╭─[no_anonymous_default_export.tsx:1:18]
2499
1 │ module.exports = class {}
25-
· ─────────────────────────
100+
· ────────
26101
╰────
27102

28103
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
29-
╭─[no_anonymous_default_export.tsx:1:1]
30-
1 │ module.exports = function () {}
31-
· ───────────────────────────────
104+
╭─[no_anonymous_default_export.tsx:1:16]
105+
1 │ export default function () {}
106+
· ──────────────
32107
╰────
33108

34109
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
35-
╭─[no_anonymous_default_export.tsx:1:1]
36-
1 │ module.exports = () => {}
37-
· ─────────────────────────
110+
╭─[no_anonymous_default_export.tsx:1:16]
111+
1 │ export default function* () {}
112+
· ───────────────
113+
╰────
114+
115+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
116+
╭─[no_anonymous_default_export.tsx:1:16]
117+
1 │ export default async function* () {}
118+
· ─────────────────────
119+
╰────
120+
121+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
122+
╭─[no_anonymous_default_export.tsx:1:16]
123+
1 │ export default async function*() {}
124+
· ────────────────────
125+
╰────
126+
127+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
128+
╭─[no_anonymous_default_export.tsx:1:16]
129+
1 │ export default async function *() {}
130+
· ─────────────────────
131+
╰────
132+
133+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
134+
╭─[no_anonymous_default_export.tsx:1:16]
135+
1 │ export default async function * () {}
136+
· ──────────────────────────
137+
╰────
138+
139+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
140+
╭─[no_anonymous_default_export.tsx:1:16]
141+
1 │ export default async function * /* comment */ () {}
142+
· ────────────────────────────────────
143+
╰────
144+
145+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
146+
╭─[no_anonymous_default_export.tsx:1:16]
147+
1 │ ╭─▶ export default async function * // comment
148+
2 │ ╰─▶ () {}
149+
╰────
150+
151+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
152+
╭─[no_anonymous_default_export.tsx:2:19]
153+
1 │ let Foo, Foo_, foo, foo_
154+
2 │ export default async function * () {}
155+
· ──────────────────────
156+
╰────
157+
158+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
159+
╭─[no_anonymous_default_export.tsx:2:20]
160+
1 │ let Foo, Foo_, foo, foo_
161+
2 │ export default (async function * () {})
162+
· ──────────────────────
163+
╰────
164+
165+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
166+
╭─[no_anonymous_default_export.tsx:2:14]
167+
1 │ let Exports, Exports_, exports, exports_
168+
2 │ exports = function() {}
169+
· ─────────────
170+
╰────
171+
172+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
173+
╭─[no_anonymous_default_export.tsx:1:18]
174+
1 │ module.exports = function() {}
175+
· ─────────────
176+
╰────
177+
178+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
179+
╭─[no_anonymous_default_export.tsx:1:16]
180+
1 │ export default () => {}
181+
· ────────
182+
╰────
183+
184+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
185+
╭─[no_anonymous_default_export.tsx:1:16]
186+
1 │ export default async () => {}
187+
· ──────────────
188+
╰────
189+
190+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
191+
╭─[no_anonymous_default_export.tsx:1:16]
192+
1 │ export default () => {};
193+
· ────────
194+
╰────
195+
196+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
197+
╭─[no_anonymous_default_export.tsx:1:15]
198+
1 │ export default() => {}
199+
· ────────
200+
╰────
201+
202+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
203+
╭─[no_anonymous_default_export.tsx:1:16]
204+
1 │ export default foo => {}
205+
· ─────────
206+
╰────
207+
208+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
209+
╭─[no_anonymous_default_export.tsx:1:19]
210+
1 │ export default (( () => {} ))
211+
· ────────
212+
╰────
213+
214+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
215+
╭─[no_anonymous_default_export.tsx:1:65]
216+
1 │ /* comment 1 */ export /* comment 2 */ default /* comment 3 */ () => {}
217+
· ────────
218+
╰────
219+
220+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
221+
╭─[no_anonymous_default_export.tsx:6:4]
222+
5 │ // comment 3
223+
6 │ () => {}
224+
· ────────
225+
╰────
226+
227+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
228+
╭─[no_anonymous_default_export.tsx:2:19]
229+
1 │ let Foo, Foo_, foo, foo_
230+
2 │ export default async () => {}
231+
· ──────────────
232+
╰────
233+
234+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
235+
╭─[no_anonymous_default_export.tsx:2:17]
236+
1 │ let Exports, Exports_, exports, exports_
237+
2 │ exports = (( () => {} ))
238+
· ────────
239+
╰────
240+
241+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
242+
╭─[no_anonymous_default_export.tsx:8:4]
243+
7 │ // comment 4
244+
8 │ () => {};
245+
· ────────
38246
╰────
39247

40248
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
41249
╭─[no_anonymous_default_export.tsx:1:17]
42-
1 │ export default (async function * () {})
43-
· ──────────────────────
250+
1 │ (( exports = (( () => {} )) ))
251+
· ────────
44252
╰────
45253

46-
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
254+
⚠ eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
255+
╭─[no_anonymous_default_export.tsx:1:24]
256+
1 │ (( module.exports = (( () => {} )) ))
257+
· ────────
258+
╰────
259+
260+
⚠ eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
47261
╭─[no_anonymous_default_export.tsx:1:17]
48-
1 │ export default (class extends class {} {})
49-
· ─────────────────────────
262+
1 │ (( exports = (( () => {} )) ));
263+
· ────────
264+
╰────
265+
266+
eslint-plugin-unicorn(no-anonymous-default-export): This function default export is missing a name
267+
╭─[no_anonymous_default_export.tsx:1:24]
268+
1 │ (( module.exports = (( () => {} )) ));
269+
· ────────
270+
╰────
271+
272+
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
273+
╭─[no_anonymous_default_export.tsx:1:1]
274+
1 │ @decorator export default class {}
275+
· ──────────────────────────────────
276+
╰────
277+
278+
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
279+
╭─[no_anonymous_default_export.tsx:1:16]
280+
1 │ export default @decorator(class {}) class extends class {} {}
281+
· ──────────────────────────────────────────────
282+
╰────
283+
284+
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
285+
╭─[no_anonymous_default_export.tsx:1:18]
286+
1 │ module.exports = @decorator(class {}) class extends class {} {}
287+
· ──────────────────────────────────────────────
288+
╰────
289+
290+
eslint-plugin-unicorn(no-anonymous-default-export): This class default export is missing a name
291+
╭─[no_anonymous_default_export.tsx:1:1]
292+
1 │ @decorator @decorator(class {}) export default class {}
293+
· ───────────────────────────────────────────────────────
50294
╰────

0 commit comments

Comments
 (0)
Please sign in to comment.