Skip to content

Commit 958b966

Browse files
authored
Add test fixtures demonstrating export statement validation bugs (#75277)
The issues with the current export statement validation for app router pages are documented in the added fixtures, see also the inline comments in the diff.
1 parent 3e7a510 commit 958b966

File tree

155 files changed

+167
-135
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

155 files changed

+167
-135
lines changed

crates/next-custom-transforms/tests/errors.rs

Lines changed: 11 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -89,45 +89,20 @@ fn next_ssg_errors(input: PathBuf) {
8989
);
9090
}
9191

92-
#[fixture("tests/errors/react-server-components/server-graph/**/input.js")]
93-
fn react_server_components_server_graph_errors(input: PathBuf) {
94-
use next_custom_transforms::transforms::react_server_components::{Config, Options};
95-
let output = input.parent().unwrap().join("output.js");
96-
test_fixture(
97-
syntax(),
98-
&|tr| {
99-
server_components(
100-
FileName::Real(PathBuf::from("/some-project/src/layout.js")).into(),
101-
Config::WithOptions(Options {
102-
is_react_server_layer: true,
103-
dynamic_io_enabled: false,
104-
}),
105-
tr.comments.as_ref().clone(),
106-
None,
107-
)
108-
},
109-
&input,
110-
&output,
111-
FixtureTestConfig {
112-
allow_error: true,
113-
module: Some(true),
114-
..Default::default()
115-
},
116-
);
117-
}
118-
119-
#[fixture("tests/errors/react-server-components/client-graph/**/input.js")]
120-
fn react_server_components_client_graph_errors(input: PathBuf) {
92+
#[fixture("tests/errors/react-server-components/**/input.js")]
93+
fn react_server_components_errors(input: PathBuf) {
12194
use next_custom_transforms::transforms::react_server_components::{Config, Options};
95+
let is_react_server_layer = input.iter().any(|s| s.to_str() == Some("server-graph"));
96+
let dynamic_io_enabled = input.iter().any(|s| s.to_str() == Some("dynamic-io"));
12297
let output = input.parent().unwrap().join("output.js");
12398
test_fixture(
12499
syntax(),
125100
&|tr| {
126101
server_components(
127102
FileName::Real(PathBuf::from("/some-project/src/page.js")).into(),
128103
Config::WithOptions(Options {
129-
is_react_server_layer: false,
130-
dynamic_io_enabled: false,
104+
is_react_server_layer,
105+
dynamic_io_enabled,
131106
}),
132107
tr.comments.as_ref().clone(),
133108
None,
@@ -164,50 +139,10 @@ fn next_font_loaders_errors(input: PathBuf) {
164139
);
165140
}
166141

167-
#[fixture("tests/errors/server-actions/server-graph/**/input.js")]
168-
fn react_server_actions_server_errors(input: PathBuf) {
169-
use next_custom_transforms::transforms::react_server_components::{Config, Options};
170-
let output = input.parent().unwrap().join("output.js");
171-
test_fixture(
172-
syntax(),
173-
&|tr| {
174-
(
175-
resolver(Mark::new(), Mark::new(), false),
176-
server_components(
177-
FileName::Real(PathBuf::from("/app/item.js")).into(),
178-
Config::WithOptions(Options {
179-
is_react_server_layer: true,
180-
dynamic_io_enabled: true,
181-
}),
182-
tr.comments.as_ref().clone(),
183-
None,
184-
),
185-
server_actions(
186-
&FileName::Real("/app/item.js".into()),
187-
server_actions::Config {
188-
is_react_server_layer: true,
189-
use_cache_enabled: true,
190-
hash_salt: "".into(),
191-
cache_kinds: FxHashSet::default(),
192-
},
193-
tr.comments.as_ref().clone(),
194-
Default::default(),
195-
),
196-
)
197-
},
198-
&input,
199-
&output,
200-
FixtureTestConfig {
201-
allow_error: true,
202-
module: Some(true),
203-
..Default::default()
204-
},
205-
);
206-
}
207-
208-
#[fixture("tests/errors/server-actions/client-graph/**/input.js")]
209-
fn react_server_actions_client_errors(input: PathBuf) {
142+
#[fixture("tests/errors/server-actions/**/input.js")]
143+
fn react_server_actions_errors(input: PathBuf) {
210144
use next_custom_transforms::transforms::react_server_components::{Config, Options};
145+
let is_react_server_layer = input.iter().any(|s| s.to_str() == Some("server-graph"));
211146
let output = input.parent().unwrap().join("output.js");
212147
test_fixture(
213148
syntax(),
@@ -217,7 +152,7 @@ fn react_server_actions_client_errors(input: PathBuf) {
217152
server_components(
218153
FileName::Real(PathBuf::from("/app/item.js")).into(),
219154
Config::WithOptions(Options {
220-
is_react_server_layer: false,
155+
is_react_server_layer,
221156
dynamic_io_enabled: true,
222157
}),
223158
tr.comments.as_ref().clone(),
@@ -226,7 +161,7 @@ fn react_server_actions_client_errors(input: PathBuf) {
226161
server_actions(
227162
&FileName::Real("/app/item.js".into()),
228163
server_actions::Config {
229-
is_react_server_layer: false,
164+
is_react_server_layer,
230165
use_cache_enabled: true,
231166
hash_salt: "".into(),
232167
cache_kinds: FxHashSet::default(),
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export function generateMetadata() {}
2+
3+
export default function () {
4+
return null
5+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export function generateMetadata() {}
2+
export default function() {
3+
return null;
4+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
x You are attempting to export "generateMetadata" from a component marked with "use client", which is disallowed. Either remove the export, or the "use client" directive. Read more: https://
2+
| nextjs.org/docs/app/api-reference/directives/use-client
3+
|
4+
|
5+
,-[input.js:1:1]
6+
1 | export function generateMetadata() {}
7+
: ^^^^^^^^^^^^^^^^
8+
`----
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export const metadata = {}
2+
3+
export default function () {
4+
return null
5+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export const metadata = {};
2+
export default function() {
3+
return null;
4+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
x You are attempting to export "metadata" from a component marked with "use client", which is disallowed. Either remove the export, or the "use client" directive. Read more: https://nextjs.org/
2+
| docs/app/api-reference/directives/use-client
3+
|
4+
|
5+
,-[input.js:1:1]
6+
1 | export const metadata = {}
7+
: ^^^^^^^^
8+
`----
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export const metadata = {}
2+
3+
export function generateMetadata() {}
4+
5+
export function getServerSideProps() {}
6+
7+
export default function () {
8+
return null
9+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export const metadata = {};
2+
export function generateMetadata() {}
3+
export function getServerSideProps() {}
4+
export default function() {
5+
return null;
6+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
x You are attempting to export "getServerSideProps" from a component marked with "use client", which is disallowed. Either remove the export, or the "use client" directive. Read more: https://
2+
| nextjs.org/docs/app/api-reference/directives/use-client
3+
|
4+
|
5+
,-[input.js:5:1]
6+
4 |
7+
5 | export function getServerSideProps() {}
8+
: ^^^^^^^^^^^^^^^^^^
9+
`----
10+
x "getServerSideProps" is not supported in app/. Read more: https://nextjs.org/docs/app/building-your-application/data-fetching
11+
|
12+
|
13+
,-[input.js:5:1]
14+
4 |
15+
5 | export function getServerSideProps() {}
16+
: ^^^^^^^^^^^^^^^^^^
17+
`----

0 commit comments

Comments
 (0)