Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions crates/next-api/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1776,8 +1776,8 @@ impl AppEndpoint {
.config
.await?
.preferred_region
.clone()
.map(Regions::Multiple),
.as_ref()
.map(|region| Regions::Multiple(region.to_vec())),
matchers: vec![matchers],
env: project.edge_env().owned().await?,
};
Expand Down
91 changes: 17 additions & 74 deletions crates/next-api/src/middleware.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ use next_core::{
middleware::get_middleware_module,
next_edge::entry::wrap_edge_entry,
next_manifests::{EdgeFunctionDefinition, MiddlewaresManifestV2, ProxyMatcher, Regions},
segment_config::NextSegmentConfig,
util::{MiddlewareMatcherKind, NextRuntime},
segment_config::{NextSegmentConfig, NextSegmentRegion},
util::NextRuntime,
};
use tracing::Instrument;
use turbo_rcstr::{RcStr, rcstr};
Expand Down Expand Up @@ -161,68 +161,15 @@ impl MiddlewareEndpoint {
let has_i18n_locales = i18n.is_some();
let base_path = next_config.base_path().await?;

let matchers = if let Some(matchers) = config.middleware_matcher.as_ref() {
matchers
.iter()
.map(|matcher| {
let mut matcher = match matcher {
MiddlewareMatcherKind::Str(matcher) => ProxyMatcher {
original_source: matcher.as_str().into(),
..Default::default()
},
MiddlewareMatcherKind::Matcher(matcher) => matcher.clone(),
};

// Mirrors implementation in get-page-static-info.ts getMiddlewareMatchers
let mut source = matcher.original_source.to_string();
let is_root = source == "/";
let has_locale = matcher.locale;

if has_i18n_locales && has_locale {
if is_root {
source.clear();
}
source.insert_str(0, "/:nextInternalLocale((?!_next/)[^/.]{1,})");
}

// Match transport-specific route forms that resolve to the
// same page:
// - Pages Router data routes: /_next/data/<build-id>/...
// - App Router transport routes: .rsc, ...segments/...segment.rsc
if is_root {
source.push('(');
if has_i18n {
source.push_str("|\\.json|");
}
source.push_str("/?index|/?index\\.json|");
source.push_str("/?index(?:\\.rsc|\\.segments/.+\\.segment\\.rsc)");
source.push_str(")?");
} else {
source.push_str("{(\\.json|\\.rsc|\\.segments/.+\\.segment\\.rsc)}?");
};

source.insert_str(0, "/:nextData(_next/data/[^/]{1,})?");

if let Some(base_path) = base_path.as_ref() {
source.insert_str(0, base_path);
}

// TODO: The implementation of getMiddlewareMatchers outputs a regex here
// using path-to-regexp. Currently there is no
// equivalent of that so it post-processes
// this value to the relevant regex in manifest-loader.ts
matcher.regexp = Some(RcStr::from(source));

matcher
})
.collect()
} else {
vec![ProxyMatcher {
regexp: Some(rcstr!("^/.*$")),
original_source: rcstr!("/:path*"),
..Default::default()
}]
};
let matchers = config
.get_proxy_matchers(has_i18n, has_i18n_locales, base_path.as_deref())
.unwrap_or_else(|| {
vec![ProxyMatcher {
regexp: Some(rcstr!("^/.*$")),
original_source: rcstr!("/:path*"),
..Default::default()
}]
});

if matches!(this.runtime, NextRuntime::NodeJs) {
let chunk = self.node_chunk().to_resolved().await?;
Expand Down Expand Up @@ -282,17 +229,13 @@ impl MiddlewareEndpoint {
let all_assets =
get_asset_paths_from_root(&node_root_value, edge_all_assets.await?).await?;

let regions = if let Some(regions) = config.preferred_region.as_ref() {
if regions.len() == 1 {
regions
.first()
.map(|region| Regions::Single(region.clone()))
} else {
Some(Regions::Multiple(regions.clone()))
let regions = config.preferred_region.as_ref().map(|region| match region {
NextSegmentRegion::Single(region) => Regions::Single(region.clone()),
NextSegmentRegion::Multiple(regions) if regions.len() == 1 => {
Regions::Single(regions[0].clone())
}
} else {
None
};
NextSegmentRegion::Multiple(regions) => Regions::Multiple(regions.clone()),
});

let edge_function_definition = EdgeFunctionDefinition {
files: file_paths_from_root,
Expand Down
12 changes: 9 additions & 3 deletions crates/next-api/src/pages.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ use next_core::{
PagesDirectoryStructure, PagesStructure, PagesStructureItem, find_pages_structure,
},
parse_segment_config_from_source,
segment_config::ParseSegmentMode,
segment_config::{NextSegmentRegion, ParseSegmentMode},
util::{NextRuntime, get_asset_prefix_from_pathname, pages_function_name},
};
use smallvec::smallvec;
Expand Down Expand Up @@ -966,7 +966,10 @@ impl PageEndpoint {
// /_app and /_document are always rendered for Node.js for this case. For edge
// they're included in the page bundle.
runtime: NextRuntime::NodeJs,
regions: config.preferred_region.clone(),
regions: config
.preferred_region
.as_ref()
.map(NextSegmentRegion::to_vec),
Comment thread
vercel[bot] marked this conversation as resolved.
}
} else {
let modules = create_page_ssr_entry_module(
Expand All @@ -991,7 +994,10 @@ impl PageEndpoint {
app_module: modules.app_module,
document_module: modules.document_module,
runtime,
regions: config.preferred_region.clone(),
regions: config
.preferred_region
.as_ref()
.map(NextSegmentRegion::to_vec),
}
}
.cell(),
Expand Down
Loading
Loading