Skip to content

Commit 9d38be6

Browse files
committed
chore: Remove the serde_regex dependency, which wasn't very heavily used
1 parent 999f8db commit 9d38be6

File tree

5 files changed

+87
-47
lines changed

5 files changed

+87
-47
lines changed

Cargo.lock

Lines changed: 0 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/next-core/src/next_route_matcher/path_regex.rs

Lines changed: 84 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,81 @@
1+
use std::fmt;
2+
13
use anyhow::{Context, Result};
2-
use serde::{Deserialize, Serialize};
3-
use turbo_tasks::primitives::Regex;
4+
use regex::Regex;
5+
use serde::{
6+
Deserialize, Deserializer, Serialize, Serializer,
7+
de::{Error as _, Visitor},
8+
ser::SerializeTupleStruct,
9+
};
410
use turbopack_node::route_matcher::{Param, Params, RouteMatcherRef};
511

612
/// A regular expression that matches a path, with named capture groups for the
713
/// dynamic parts of the path.
8-
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq)]
14+
#[derive(Debug)]
915
pub struct PathRegex {
1016
regex: Regex,
1117
named_params: Vec<NamedParam>,
1218
}
1319

20+
impl PartialEq for PathRegex {
21+
fn eq(&self, other: &Self) -> bool {
22+
self.regex.as_str() == other.regex.as_str() && self.named_params == other.named_params
23+
}
24+
}
25+
26+
impl Eq for PathRegex {}
27+
28+
impl Serialize for PathRegex {
29+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
30+
where
31+
S: Serializer,
32+
{
33+
let mut ts = serializer.serialize_tuple_struct("PathRegex", 2)?;
34+
ts.serialize_field(self.regex.as_str())?;
35+
ts.serialize_field(&self.named_params)?;
36+
ts.end()
37+
}
38+
}
39+
40+
impl<'de> Deserialize<'de> for PathRegex {
41+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
42+
where
43+
D: Deserializer<'de>,
44+
{
45+
struct PathRegexVisitor;
46+
47+
impl<'de> Visitor<'de> for PathRegexVisitor {
48+
type Value = PathRegex;
49+
50+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
51+
formatter.write_str("a PathRegex tuple struct")
52+
}
53+
54+
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
55+
where
56+
A: serde::de::SeqAccess<'de>,
57+
{
58+
let regex_str: String = seq
59+
.next_element()?
60+
.ok_or_else(|| A::Error::invalid_length(0, &self))?;
61+
let named_params: Vec<NamedParam> = seq
62+
.next_element()?
63+
.ok_or_else(|| A::Error::invalid_length(1, &self))?;
64+
65+
let regex = Regex::new(&regex_str)
66+
.map_err(|e| A::Error::custom(format!("invalid regex: {e}")))?;
67+
68+
Ok(PathRegex {
69+
regex,
70+
named_params,
71+
})
72+
}
73+
}
74+
75+
deserializer.deserialize_tuple_struct("PathRegex", 2, PathRegexVisitor)
76+
}
77+
}
78+
1479
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq)]
1580
struct NamedParam {
1681
name: String,
@@ -153,7 +218,7 @@ impl PathRegexBuilder {
153218
pub fn build(mut self) -> Result<PathRegex> {
154219
self.regex_str += "$";
155220
Ok(PathRegex {
156-
regex: Regex(regex::Regex::new(&self.regex_str).with_context(|| "invalid path regex")?),
221+
regex: regex::Regex::new(&self.regex_str).with_context(|| "invalid path regex")?,
157222
named_params: self.named_params,
158223
})
159224
}
@@ -164,3 +229,18 @@ impl Default for PathRegexBuilder {
164229
Self::new()
165230
}
166231
}
232+
233+
#[cfg(test)]
234+
mod tests {
235+
use super::*;
236+
237+
#[test]
238+
fn test_path_regex_serde_roundtrip() {
239+
let path_regex = super::super::build_path_regex("/api/[version]/[[...path]]").unwrap();
240+
241+
let serialized = serde_json::to_string(&path_regex).unwrap();
242+
let deserialized: PathRegex = serde_json::from_str(&serialized).unwrap();
243+
244+
assert_eq!(path_regex, deserialized);
245+
}
246+
}

turbopack/crates/turbo-tasks/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ regex = { workspace = true }
3939
rustc-hash = { workspace = true }
4040
serde = { workspace = true, features = ["rc", "derive"] }
4141
serde_json = { workspace = true }
42-
serde_regex = "1.1.0"
4342
shrink-to-fit = { workspace=true,features = ["indexmap", "serde_json", "smallvec", "nightly"] }
4443
smallvec = { workspace = true }
4544
thiserror = { workspace = true }

turbopack/crates/turbo-tasks/src/primitives.rs

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{ops::Deref, time::Duration};
1+
use std::time::Duration;
22

33
use turbo_rcstr::RcStr;
44
use turbo_tasks_macros::primitive as __turbo_tasks_internal_primitive;
@@ -33,27 +33,3 @@ __turbo_tasks_internal_primitive!(serde_json::Value);
3333
__turbo_tasks_internal_primitive!(Duration);
3434
__turbo_tasks_internal_primitive!(Vec<u8>, manual_shrink_to_fit);
3535
__turbo_tasks_internal_primitive!(Vec<bool>, manual_shrink_to_fit);
36-
37-
#[turbo_tasks::value(transparent, eq = "manual")]
38-
#[derive(Debug, Clone)]
39-
pub struct Regex(
40-
#[turbo_tasks(trace_ignore)]
41-
#[serde(with = "serde_regex")]
42-
pub regex::Regex,
43-
);
44-
45-
impl Deref for Regex {
46-
type Target = regex::Regex;
47-
48-
fn deref(&self) -> &Self::Target {
49-
&self.0
50-
}
51-
}
52-
53-
impl PartialEq for Regex {
54-
fn eq(&self, other: &Regex) -> bool {
55-
// Context: https://github.com/rust-lang/regex/issues/313#issuecomment-269898900
56-
self.0.as_str() == other.0.as_str()
57-
}
58-
}
59-
impl Eq for Regex {}

turbopack/crates/turbopack/src/module_options/rule_condition.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ use std::{
33
mem::{replace, take},
44
};
55

6-
use anyhow::{Result, bail};
6+
use anyhow::Result;
77
use either::Either;
88
use serde::{Deserialize, Serialize};
99
use smallvec::SmallVec;
1010
use turbo_esregex::EsRegex;
11-
use turbo_tasks::{NonLocalValue, ReadRef, ResolvedVc, primitives::Regex, trace::TraceRawVcs};
11+
use turbo_tasks::{NonLocalValue, ReadRef, ResolvedVc, trace::TraceRawVcs};
1212
use turbo_tasks_fs::{FileContent, FileSystemPath, glob::Glob};
1313
use turbopack_core::{
1414
asset::Asset, reference_type::ReferenceType, source::Source, virtual_source::VirtualSource,
@@ -30,7 +30,6 @@ pub enum RuleCondition {
3030
ResourcePathInExactDirectory(FileSystemPath),
3131
ContentTypeStartsWith(String),
3232
ContentTypeEmpty,
33-
ResourcePathRegex(#[turbo_tasks(trace_ignore)] Regex),
3433
ResourcePathEsRegex(#[turbo_tasks(trace_ignore)] ReadRef<EsRegex>),
3534
ResourceContentEsRegex(#[turbo_tasks(trace_ignore)] ReadRef<EsRegex>),
3635
/// For paths that are within the same filesystem as the `base`, it need to
@@ -268,9 +267,6 @@ impl RuleCondition {
268267
.map_or(path.path.as_str(), |(_, b)| b);
269268
return Ok(glob.matches(basename));
270269
}
271-
RuleCondition::ResourcePathRegex(_) => {
272-
bail!("ResourcePathRegex not implemented yet");
273-
}
274270
RuleCondition::ResourcePathEsRegex(regex) => {
275271
return Ok(regex.is_match(&path.path));
276272
}

0 commit comments

Comments
 (0)