Skip to content

Commit

Permalink
Fix large regression with turning ModuleRuleCondition::matches into a…
Browse files Browse the repository at this point in the history
… tt::fun (#2450)

* Fix large regression with turning ModuleRuleConditionVc::matches into a tt::fun

* Remove Vcs from ModuleRule altogether
  • Loading branch information
alexkirsz committed Oct 28, 2022
1 parent ebc140a commit 4c1463a
Show file tree
Hide file tree
Showing 6 changed files with 117 additions and 158 deletions.
18 changes: 7 additions & 11 deletions crates/next-core/src/next_client/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use turbo_tasks_fs::FileSystemPathVc;
use turbopack::{
module_options::{
module_options_context::{ModuleOptionsContext, ModuleOptionsContextVc},
ModuleRuleCondition, ModuleRuleEffect, ModuleRuleVc,
ModuleRule, ModuleRuleCondition, ModuleRuleEffect,
},
resolve_options_context::{ResolveOptionsContext, ResolveOptionsContextVc},
transition::TransitionsByNameVc,
Expand Down Expand Up @@ -116,23 +116,19 @@ pub async fn add_next_transforms_to_pages(
) -> Result<ModuleOptionsContextVc> {
let mut module_options_context = module_options_context.await?.clone_value();
// Apply the Next SSG tranform to all pages.
module_options_context.custom_rules.push(ModuleRuleVc::new(
module_options_context.custom_rules.push(ModuleRule::new(
ModuleRuleCondition::all(vec![
ModuleRuleCondition::ResourcePathInExactDirectory(pages_dir),
ModuleRuleCondition::ResourcePathInExactDirectory(pages_dir.await?),
ModuleRuleCondition::any(vec![
ModuleRuleCondition::ResourcePathEndsWith(".js".to_string()),
ModuleRuleCondition::ResourcePathEndsWith(".jsx".to_string()),
ModuleRuleCondition::ResourcePathEndsWith(".ts".to_string()),
ModuleRuleCondition::ResourcePathEndsWith(".tsx".to_string()),
]),
])
.cell(),
vec![
ModuleRuleEffect::AddEcmascriptTransforms(EcmascriptInputTransformsVc::cell(vec![
EcmascriptInputTransform::NextJs,
]))
.cell(),
],
]),
vec![ModuleRuleEffect::AddEcmascriptTransforms(
EcmascriptInputTransformsVc::cell(vec![EcmascriptInputTransform::NextJs]),
)],
));
Ok(module_options_context.cell())
}
Expand Down
2 changes: 1 addition & 1 deletion crates/turbo-tasks/src/primitives.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ impl ValueToString for JsonValue {
}

#[turbo_tasks::value(transparent, eq = "manual")]
#[derive(Debug)]
#[derive(Debug, Clone)]
pub struct Regex(
#[turbo_tasks(trace_ignore)]
#[serde(with = "serde_regex")]
Expand Down
6 changes: 3 additions & 3 deletions crates/turbopack/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,9 @@ impl Issue for ModuleIssue {
async fn get_module_type(path: FileSystemPathVc, options: ModuleOptionsVc) -> Result<ModuleTypeVc> {
let mut current_module_type = None;
for rule in options.await?.rules.iter() {
if *rule.matches(path).await? {
for (_, effect) in rule.await?.effects() {
match &*effect.await? {
if rule.matches(&path.await?) {
for (_, effect) in rule.effects() {
match effect {
ModuleRuleEffect::ModuleType(module) => {
current_module_type = Some(*module);
}
Expand Down
134 changes: 68 additions & 66 deletions crates/turbopack/src/module_options/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ pub use module_rule::*;

#[turbo_tasks::value(cell = "new", eq = "manual")]
pub struct ModuleOptions {
pub rules: Vec<ModuleRuleVc>,
pub rules: Vec<ModuleRule>,
}

#[turbo_tasks::value_impl]
Expand Down Expand Up @@ -78,92 +78,95 @@ impl ModuleOptionsVc {
let css_transforms = CssInputTransformsVc::cell(vec![CssInputTransform::Nested]);

let mut rules = vec![
ModuleRuleVc::new(
ModuleRuleCondition::ResourcePathEndsWith(".json".to_string()).cell(),
vec![ModuleRuleEffect::ModuleType(ModuleType::Json).cell()],
ModuleRule::new(
ModuleRuleCondition::ResourcePathEndsWith(".json".to_string()),
vec![ModuleRuleEffect::ModuleType(ModuleType::Json)],
),
ModuleRuleVc::new(
ModuleRuleCondition::ResourcePathEndsWith(".css".to_string()).cell(),
vec![ModuleRuleEffect::ModuleType(ModuleType::Css(css_transforms)).cell()],
ModuleRule::new(
ModuleRuleCondition::ResourcePathEndsWith(".css".to_string()),
vec![ModuleRuleEffect::ModuleType(ModuleType::Css(
css_transforms,
))],
),
ModuleRuleVc::new(
ModuleRuleCondition::ResourcePathEndsWith(".module.css".to_string()).cell(),
vec![ModuleRuleEffect::ModuleType(ModuleType::CssModule(css_transforms)).cell()],
ModuleRule::new(
ModuleRuleCondition::ResourcePathEndsWith(".module.css".to_string()),
vec![ModuleRuleEffect::ModuleType(ModuleType::CssModule(
css_transforms,
))],
),
ModuleRuleVc::new(
ModuleRule::new(
ModuleRuleCondition::any(vec![
ModuleRuleCondition::ResourcePathEndsWith(".js".to_string()),
ModuleRuleCondition::ResourcePathEndsWith(".jsx".to_string()),
])
.cell(),
vec![ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(app_transforms)).cell()],
]),
vec![ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(
app_transforms,
))],
),
ModuleRuleVc::new(
ModuleRule::new(
ModuleRuleCondition::all(vec![
ModuleRuleCondition::ResourcePathEndsWith(".js".to_string()),
ModuleRuleCondition::ResourcePathInDirectory("node_modules".to_string()),
])
.cell(),
vec![
ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(vendor_transforms)).cell(),
],
]),
vec![ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(
vendor_transforms,
))],
),
ModuleRuleVc::new(
ModuleRuleCondition::ResourcePathEndsWith(".mjs".to_string()).cell(),
vec![ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(app_transforms)).cell()],
ModuleRule::new(
ModuleRuleCondition::ResourcePathEndsWith(".mjs".to_string()),
vec![ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(
app_transforms,
))],
),
ModuleRuleVc::new(
ModuleRule::new(
ModuleRuleCondition::all(vec![
ModuleRuleCondition::ResourcePathEndsWith(".mjs".to_string()),
ModuleRuleCondition::ResourcePathInDirectory("node_modules".to_string()),
])
.cell(),
vec![
ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(vendor_transforms)).cell(),
],
]),
vec![ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(
vendor_transforms,
))],
),
ModuleRuleVc::new(
ModuleRuleCondition::ResourcePathEndsWith(".cjs".to_string()).cell(),
vec![ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(app_transforms)).cell()],
ModuleRule::new(
ModuleRuleCondition::ResourcePathEndsWith(".cjs".to_string()),
vec![ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(
app_transforms,
))],
),
ModuleRuleVc::new(
ModuleRule::new(
ModuleRuleCondition::all(vec![
ModuleRuleCondition::ResourcePathEndsWith(".cjs".to_string()),
ModuleRuleCondition::ResourcePathInDirectory("node_modules".to_string()),
])
.cell(),
vec![
ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(vendor_transforms)).cell(),
],
]),
vec![ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(
vendor_transforms,
))],
),
ModuleRuleVc::new(
ModuleRule::new(
ModuleRuleCondition::any(vec![
ModuleRuleCondition::ResourcePathEndsWith(".ts".to_string()),
ModuleRuleCondition::ResourcePathEndsWith(".tsx".to_string()),
])
.cell(),
vec![
ModuleRuleEffect::ModuleType(ModuleType::Typescript(ts_app_transforms)).cell(),
],
]),
vec![ModuleRuleEffect::ModuleType(ModuleType::Typescript(
ts_app_transforms,
))],
),
ModuleRuleVc::new(
ModuleRule::new(
ModuleRuleCondition::all(vec![
ModuleRuleCondition::ResourcePathEndsWith(".ts".to_string()),
ModuleRuleCondition::ResourcePathInDirectory("node_modules".to_string()),
])
.cell(),
vec![ModuleRuleEffect::ModuleType(ModuleType::Typescript(ts_transforms)).cell()],
]),
vec![ModuleRuleEffect::ModuleType(ModuleType::Typescript(
ts_transforms,
))],
),
ModuleRuleVc::new(
ModuleRuleCondition::ResourcePathEndsWith(".d.ts".to_string()).cell(),
vec![
ModuleRuleEffect::ModuleType(ModuleType::TypescriptDeclaration(
vendor_transforms,
))
.cell(),
],
ModuleRule::new(
ModuleRuleCondition::ResourcePathEndsWith(".d.ts".to_string()),
vec![ModuleRuleEffect::ModuleType(
ModuleType::TypescriptDeclaration(vendor_transforms),
)],
),
ModuleRuleVc::new(
ModuleRule::new(
ModuleRuleCondition::any(vec![
ModuleRuleCondition::ResourcePathEndsWith(".apng".to_string()),
ModuleRuleCondition::ResourcePathEndsWith(".avif".to_string()),
Expand All @@ -175,19 +178,18 @@ impl ModuleOptionsVc {
ModuleRuleCondition::ResourcePathEndsWith(".svg".to_string()),
ModuleRuleCondition::ResourcePathEndsWith(".webp".to_string()),
ModuleRuleCondition::ResourcePathEndsWith(".woff2".to_string()),
])
.cell(),
vec![ModuleRuleEffect::ModuleType(ModuleType::Static).cell()],
]),
vec![ModuleRuleEffect::ModuleType(ModuleType::Static)],
),
ModuleRuleVc::new(
ModuleRuleCondition::ResourcePathHasNoExtension.cell(),
vec![
ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(vendor_transforms)).cell(),
],
ModuleRule::new(
ModuleRuleCondition::ResourcePathHasNoExtension,
vec![ModuleRuleEffect::ModuleType(ModuleType::Ecmascript(
vendor_transforms,
))],
),
];

rules.extend(custom_rules.iter().copied());
rules.extend(custom_rules.iter().cloned());

Ok(ModuleOptionsVc::cell(ModuleOptions { rules }))
}
Expand Down
4 changes: 2 additions & 2 deletions crates/turbopack/src/module_options/module_options_context.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use turbopack_core::environment::EnvironmentVc;
use turbopack_ecmascript::EcmascriptInputTransform;

use super::ModuleRuleVc;
use super::ModuleRule;

#[turbo_tasks::value(shared)]
#[derive(Default, Clone)]
Expand All @@ -15,7 +15,7 @@ pub struct ModuleOptionsContext {
pub custom_ecmascript_app_transforms: Vec<EcmascriptInputTransform>,
pub custom_ecmascript_transforms: Vec<EcmascriptInputTransform>,
/// Custom rules to be applied after all default rules.
pub custom_rules: Vec<ModuleRuleVc>,
pub custom_rules: Vec<ModuleRule>,
pub placeholder_for_future_extensions: (),
}

Expand Down
Loading

0 comments on commit 4c1463a

Please sign in to comment.