Skip to content

Commit cf60561

Browse files
committed
feat: next typegen, automatic route types, PageProps, LayoutProps
1 parent b07bf2a commit cf60561

File tree

257 files changed

+2998
-1054
lines changed

Some content is hidden

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

257 files changed

+2998
-1054
lines changed

crates/napi/src/next_api/project.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,8 @@ pub struct NapiTurboEngineOptions {
253253
pub dependency_tracking: Option<bool>,
254254
/// Whether the project is running in a CI environment.
255255
pub is_ci: Option<bool>,
256+
/// Whether the project is running in a short session.
257+
pub is_short_session: Option<bool>,
256258
}
257259

258260
impl From<NapiWatchOptions> for WatchOptions {
@@ -434,12 +436,14 @@ pub fn project_new(
434436
let persistent_caching = turbo_engine_options.persistent_caching.unwrap_or_default();
435437
let dependency_tracking = turbo_engine_options.dependency_tracking.unwrap_or(true);
436438
let is_ci = turbo_engine_options.is_ci.unwrap_or(false);
439+
let is_short_session = turbo_engine_options.is_short_session.unwrap_or(false);
437440
let turbo_tasks = create_turbo_tasks(
438441
PathBuf::from(&options.dist_dir),
439442
persistent_caching,
440443
memory_limit,
441444
dependency_tracking,
442445
is_ci,
446+
is_short_session,
443447
)?;
444448
let turbopack_ctx = NextTurbopackContext::new(turbo_tasks.clone(), napi_callbacks);
445449

crates/napi/src/next_api/turbopack_ctx.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,15 +185,20 @@ pub fn create_turbo_tasks(
185185
_memory_limit: usize,
186186
dependency_tracking: bool,
187187
is_ci: bool,
188+
is_short_session: bool,
188189
) -> Result<NextTurboTasks> {
189190
Ok(if persistent_caching {
190191
let version_info = GitVersionInfo {
191192
describe: env!("VERGEN_GIT_DESCRIBE"),
192193
dirty: option_env!("CI").is_none_or(|value| value.is_empty())
193194
&& env!("VERGEN_GIT_DIRTY") == "true",
194195
};
195-
let (backing_storage, cache_state) =
196-
default_backing_storage(&output_path.join("cache/turbopack"), &version_info, is_ci)?;
196+
let (backing_storage, cache_state) = default_backing_storage(
197+
&output_path.join("cache/turbopack"),
198+
&version_info,
199+
is_ci,
200+
is_short_session,
201+
)?;
197202
let tt = TurboTasks::new(TurboTasksBackend::new(
198203
BackendOptions {
199204
storage_mode: Some(if std::env::var("TURBO_ENGINE_READ_ONLY").is_ok() {

crates/next-api/src/module_graph.rs

Lines changed: 69 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,21 @@ use std::{borrow::Cow, collections::hash_map::Entry};
22

33
use anyhow::{Ok, Result};
44
use either::Either;
5+
use futures::join;
56
use next_core::{
67
next_client_reference::{
78
ClientReference, ClientReferenceGraphResult, ClientReferenceType, ServerEntries,
89
find_server_entries,
910
},
1011
next_dynamic::NextDynamicEntryModule,
1112
next_manifests::ActionLayer,
13+
next_server_utility::server_utility_module::NextServerUtilityModule,
1214
};
13-
use rustc_hash::{FxHashMap, FxHashSet};
15+
use rustc_hash::FxHashMap;
1416
use tracing::Instrument;
1517
use turbo_rcstr::{RcStr, rcstr};
1618
use turbo_tasks::{
17-
CollectiblesSource, FxIndexMap, ReadRef, ResolvedVc, TryFlatJoinIterExt, TryJoinIterExt,
19+
CollectiblesSource, FxIndexMap, FxIndexSet, ResolvedVc, TryFlatJoinIterExt, TryJoinIterExt,
1820
ValueToString, Vc,
1921
};
2022
use turbo_tasks_fs::FileSystemPath;
@@ -289,7 +291,8 @@ impl ClientReferencesGraph {
289291
// post_order callbacks which is the same as evaluation order
290292
let mut client_references = Vec::new();
291293
let mut client_reference_modules = Vec::new();
292-
let mut server_components = FxHashSet::default();
294+
let mut server_components = FxIndexSet::default();
295+
let mut server_utils = FxIndexSet::default();
293296

294297
// Track how we reached each client reference. This way if a client reference is
295298
// referenced by the root and by a server component we don't only associate it with the
@@ -355,6 +358,12 @@ impl ClientReferencesGraph {
355358
},
356359
|_, node, state_map| {
357360
let module = node.module();
361+
if let Some(server_util_module) =
362+
ResolvedVc::try_downcast_type::<NextServerUtilityModule>(module)
363+
{
364+
server_utils.insert(server_util_module);
365+
}
366+
358367
let Some(module_type) = data.manifest.get(&module) else {
359368
return Ok(());
360369
};
@@ -407,8 +416,9 @@ impl ClientReferencesGraph {
407416

408417
Ok(ClientReferenceGraphResult {
409418
client_references: client_references.into_iter().collect(),
410-
server_utils: vec![],
411-
server_component_entries: vec![],
419+
// The order of server_utils does not matter
420+
server_utils: server_utils.into_iter().collect(),
421+
server_component_entries: server_components.into_iter().collect(),
412422
}
413423
.cell())
414424
}
@@ -717,46 +727,68 @@ impl GlobalBuildInformation {
717727
) -> Result<Vc<ClientReferenceGraphResult>> {
718728
let span = tracing::info_span!("collect all client references for endpoint");
719729
async move {
720-
let mut result = if let [graph] = &self.client_references[..] {
721-
// Just a single graph, no need to merge results
722-
graph
723-
.get_client_references_for_endpoint(entry)
724-
.owned()
725-
.await?
730+
let result = if let [graph] = &self.client_references[..] {
731+
// Just a single graph, no need to merge results This also naturally aggregates
732+
// server components and server utilities in the correct order
733+
let result = graph.get_client_references_for_endpoint(entry);
734+
#[cfg(debug_assertions)]
735+
{
736+
let result = result.await?;
737+
if has_layout_segments {
738+
use rustc_hash::FxHashSet;
739+
740+
let ServerEntries {
741+
server_utils,
742+
server_component_entries,
743+
} = &*find_server_entries(entry, include_traced).await?;
744+
// order of server utils doesn't matter, so just ensure that they match
745+
assert_eq!(
746+
FxHashSet::from_iter(result.server_utils.iter()),
747+
FxHashSet::from_iter(server_utils.iter())
748+
);
749+
// The order of server_components does matter, enforce it is identical
750+
assert_eq!(&result.server_component_entries, server_component_entries);
751+
}
752+
}
753+
result
726754
} else {
727755
let results = self
728756
.client_references
729757
.iter()
730758
.map(|graph| graph.get_client_references_for_endpoint(entry))
731-
.try_join()
732-
.await?;
733-
734-
let mut iter = results.into_iter();
735-
let mut result = ReadRef::into_owned(iter.next().unwrap());
736-
for r in iter {
737-
result.extend(&r);
738-
}
739-
result
740-
};
759+
.try_join();
760+
// Do this separately for now, because the aggregation of multiple graph traversals
761+
// messes up the order of the server_component_entries.
762+
let server_entries = async {
763+
if has_layout_segments {
764+
let server_entries = find_server_entries(entry, include_traced).await?;
765+
Ok(Some(server_entries))
766+
} else {
767+
Ok(None)
768+
}
769+
};
770+
// Wait for both in parallel since `find_server_entries` tends to be slower than the
771+
// graph traversals
772+
let (results, server_entries) = join!(results, server_entries);
741773

742-
// TODO(luke.sandberg): at least in the whole_app_module_graph case we should be able to
743-
// collect server components and server utilities during the above traversals in the
744-
// correct order. `find_server_entries returns them in reverse topological order (root
745-
// layout first, page last) but the above traversals find them in DFS post
746-
// order which means we would need to reverse it.
747-
// For server_utils the order is irrelevant.
748-
if has_layout_segments {
749-
// Do this separately for now, because the graph traversal order messes up the order
750-
// of the server_component_entries.
751-
let ServerEntries {
774+
let mut result = ClientReferenceGraphResult {
775+
client_references: results?
776+
.iter()
777+
.flat_map(|r| r.client_references.iter().copied())
778+
.collect(),
779+
..Default::default()
780+
};
781+
if let Some(ServerEntries {
752782
server_utils,
753783
server_component_entries,
754-
} = &*find_server_entries(entry, include_traced).await?;
755-
result.server_utils = server_utils.clone();
756-
result.server_component_entries = server_component_entries.clone();
757-
}
758-
759-
Ok(result.cell())
784+
}) = server_entries?.as_deref()
785+
{
786+
result.server_utils = server_utils.clone();
787+
result.server_component_entries = server_component_entries.clone();
788+
}
789+
result.cell()
790+
};
791+
Ok(result)
760792
}
761793
.instrument(span)
762794
.await

crates/next-core/src/next_client_reference/visit_client_reference.rs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -106,17 +106,6 @@ impl ClientReferenceGraphResult {
106106
}
107107
}
108108

109-
impl ClientReferenceGraphResult {
110-
/// Merges multiple return values of client_reference_graph together.
111-
pub fn extend(&mut self, other: &Self) {
112-
self.client_references
113-
.extend(other.client_references.iter().copied());
114-
self.server_component_entries
115-
.extend(other.server_component_entries.iter().copied());
116-
self.server_utils.extend(other.server_utils.iter().copied());
117-
}
118-
}
119-
120109
#[turbo_tasks::value(shared)]
121110
#[derive(Clone, Debug)]
122111
pub struct ServerEntries {

docs/01-app/03-api-reference/04-functions/redirect.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ related:
66
- app/api-reference/functions/permanentRedirect
77
---
88

9-
The `redirect` function allows you to redirect the user to another URL. `redirect` can be used in [Server Components](/docs/app/getting-started/server-and-client-components), [Route Handlers](/docs/app/api-reference/file-conventions/route), and [Server Actions](/docs/app/getting-started/updating-data).
9+
The `redirect` function allows you to redirect the user to another URL. `redirect` can be used while rendering in [Server and Client Components](/docs/app/getting-started/server-and-client-components), [Route Handlers](/docs/app/api-reference/file-conventions/route), and [Server Actions](/docs/app/getting-started/updating-data).
1010

1111
When used in a [streaming context](/docs/app/getting-started/linking-and-navigating#streaming), this will insert a meta tag to emit the redirect on the client side. When used in a server action, it will serve a 303 HTTP redirect response to the caller. Otherwise, it will serve a 307 HTTP redirect response to the caller.
1212

lerna.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@
1616
"registry": "https://registry.npmjs.org/"
1717
}
1818
},
19-
"version": "15.4.2-canary.25"
19+
"version": "15.4.2-canary.26"
2020
}

packages/create-next-app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "create-next-app",
3-
"version": "15.4.2-canary.25",
3+
"version": "15.4.2-canary.26",
44
"keywords": [
55
"react",
66
"next",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/// <reference types="next" />
22
/// <reference types="next/image-types/global" />
3+
/// <reference path="./.next/types/routes.d.ts" />
34

45
// NOTE: This file should not be edited
56
// see https://nextjs.org/docs/basic-features/typescript for more information.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/// <reference types="next" />
22
/// <reference types="next/image-types/global" />
3+
/// <reference path="./.next/types/routes.d.ts" />
34

45
// NOTE: This file should not be edited
56
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/// <reference types="next" />
22
/// <reference types="next/image-types/global" />
3+
/// <reference path="./.next/types/routes.d.ts" />
34

45
// NOTE: This file should not be edited
56
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.

0 commit comments

Comments
 (0)