apply some transforms on foreign code too (#62827)

### What?

some transforms need to be applied on node_modules code too to work
correctly

### Why?

### How?


Closes PACK-2651
This commit is contained in:
Tobias Koppers 2024-03-05 16:03:35 +01:00 committed by GitHub
parent 6f5e0f3694
commit 1d8b70411f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 93 additions and 67 deletions

View file

@ -246,7 +246,9 @@ pub async fn get_client_module_options_context(
let target_browsers = env.runtime_versions();
let mut next_client_rules =
get_next_client_transforms_rules(next_config, ty.into_value(), mode).await?;
get_next_client_transforms_rules(next_config, ty.into_value(), mode, false).await?;
let foreign_next_client_rules =
get_next_client_transforms_rules(next_config, ty.into_value(), mode, true).await?;
let additional_rules: Vec<ModuleRule> = vec![
get_swc_ecma_transform_plugin_rule(next_config, project_path).await?,
get_relay_transform_rule(next_config).await?,
@ -286,6 +288,7 @@ pub async fn get_client_module_options_context(
let foreign_codes_options_context = ModuleOptionsContext {
enable_webpack_loaders: foreign_webpack_loaders,
enable_postcss_transform: enable_foreign_postcss_transform,
custom_rules: foreign_next_client_rules,
// NOTE(WEB-1016) PostCSS transforms should also apply to foreign code.
..module_options_context.clone()
};

View file

@ -24,6 +24,7 @@ pub async fn get_next_client_transforms_rules(
next_config: Vc<NextConfig>,
context_ty: ClientContextType,
mode: Vc<NextMode>,
foreign_code: bool,
) -> Result<Vec<ModuleRule>> {
let mut rules = vec![];
@ -40,15 +41,21 @@ pub async fn get_next_client_transforms_rules(
let pages_dir = match context_ty {
ClientContextType::Pages { pages_dir } => {
rules.push(
get_next_pages_transforms_rule(pages_dir, ExportFilter::StripDataExports, mdx_rs)
if !foreign_code {
rules.push(
get_next_pages_transforms_rule(
pages_dir,
ExportFilter::StripDataExports,
mdx_rs,
)
.await?,
);
rules.push(get_next_disallow_export_all_in_page_rule(
mdx_rs,
pages_dir.await?,
));
rules.push(get_next_page_config_rule(mdx_rs, pages_dir.await?));
);
rules.push(get_next_disallow_export_all_in_page_rule(
mdx_rs,
pages_dir.await?,
));
rules.push(get_next_page_config_rule(mdx_rs, pages_dir.await?));
}
Some(pages_dir)
}
ClientContextType::App { .. } => {
@ -61,13 +68,15 @@ pub async fn get_next_client_transforms_rules(
ClientContextType::Fallback | ClientContextType::Other => None,
};
rules.push(get_next_amp_attr_rule(mdx_rs));
rules.push(get_next_cjs_optimizer_rule(mdx_rs));
rules.push(get_next_pure_rule(mdx_rs));
if !foreign_code {
rules.push(get_next_amp_attr_rule(mdx_rs));
rules.push(get_next_cjs_optimizer_rule(mdx_rs));
rules.push(get_next_pure_rule(mdx_rs));
rules.push(get_next_dynamic_transform_rule(false, false, pages_dir, mode, mdx_rs).await?);
rules.push(get_next_dynamic_transform_rule(false, false, pages_dir, mode, mdx_rs).await?);
rules.push(get_next_image_rule());
rules.push(get_next_image_rule());
}
Ok(rules)
}

View file

@ -305,8 +305,10 @@ pub async fn get_server_module_options_context(
mode: Vc<NextMode>,
next_config: Vc<NextConfig>,
) -> Result<Vc<ModuleOptionsContext>> {
let mut base_next_server_rules =
get_next_server_transforms_rules(next_config, ty.into_value(), mode).await?;
let mut next_server_rules =
get_next_server_transforms_rules(next_config, ty.into_value(), mode, false).await?;
let mut foreign_next_server_rules =
get_next_server_transforms_rules(next_config, ty.into_value(), mode, true).await?;
let internal_custom_rules =
get_next_server_internal_transforms_rules(ty.into_value(), *next_config.mdx_rs().await?)
.await?;
@ -415,8 +417,6 @@ pub async fn get_server_module_options_context(
.flatten()
.collect();
let mut foreign_custom_transform_rules = custom_source_transform_rules.clone();
if let ServerContextType::Pages { .. } = ty.into_value() {
custom_source_transform_rules.push(
get_next_react_server_components_transform_rule(next_config, false, None)
@ -424,8 +424,11 @@ pub async fn get_server_module_options_context(
);
}
base_next_server_rules.extend(custom_source_transform_rules);
base_next_server_rules.extend(source_transform_rules);
next_server_rules.extend(custom_source_transform_rules.iter().cloned());
next_server_rules.extend(source_transform_rules);
foreign_next_server_rules.extend(custom_source_transform_rules);
foreign_next_server_rules.extend(internal_custom_rules);
let url_rewrite_behavior = Some(
//https://github.com/vercel/next.js/blob/bbb730e5ef10115ed76434f250379f6f53efe998/packages/next/src/build/webpack-config.ts#L1384
@ -445,9 +448,8 @@ pub async fn get_server_module_options_context(
..Default::default()
};
foreign_custom_transform_rules.extend(internal_custom_rules);
let foreign_code_module_options_context = ModuleOptionsContext {
custom_rules: foreign_custom_transform_rules.clone(),
custom_rules: foreign_next_server_rules.clone(),
enable_webpack_loaders: foreign_webpack_loaders,
// NOTE(WEB-1016) PostCSS transforms should also apply to foreign code.
enable_postcss_transform: enable_foreign_postcss_transform,
@ -457,7 +459,7 @@ pub async fn get_server_module_options_context(
let internal_module_options_context = ModuleOptionsContext {
enable_typescript_transform: Some(TypescriptTransformOptions::default().cell()),
enable_jsx: Some(JsxTransformOptions::default().cell()),
custom_rules: foreign_custom_transform_rules,
custom_rules: foreign_next_server_rules,
..module_options_context.clone()
};
@ -478,7 +480,7 @@ pub async fn get_server_module_options_context(
internal_module_options_context.cell(),
),
],
custom_rules: base_next_server_rules,
custom_rules: next_server_rules,
..module_options_context
}
}
@ -489,15 +491,16 @@ pub async fn get_server_module_options_context(
.flatten()
.collect();
let mut foreign_custom_transform_rules = custom_source_transform_rules.clone();
foreign_next_server_rules.extend(custom_source_transform_rules.iter().cloned());
foreign_next_server_rules.extend(internal_custom_rules);
custom_source_transform_rules.push(
get_next_react_server_components_transform_rule(next_config, false, Some(app_dir))
.await?,
);
base_next_server_rules.extend(custom_source_transform_rules.clone());
base_next_server_rules.extend(source_transform_rules);
next_server_rules.extend(custom_source_transform_rules.clone());
next_server_rules.extend(source_transform_rules);
let module_options_context = ModuleOptionsContext {
execution_context: Some(execution_context),
@ -507,9 +510,8 @@ pub async fn get_server_module_options_context(
..Default::default()
};
foreign_custom_transform_rules.extend(internal_custom_rules);
let foreign_code_module_options_context = ModuleOptionsContext {
custom_rules: foreign_custom_transform_rules.clone(),
custom_rules: foreign_next_server_rules.clone(),
enable_webpack_loaders: foreign_webpack_loaders,
// NOTE(WEB-1016) PostCSS transforms should also apply to foreign code.
enable_postcss_transform: enable_foreign_postcss_transform,
@ -517,7 +519,7 @@ pub async fn get_server_module_options_context(
};
let internal_module_options_context = ModuleOptionsContext {
enable_typescript_transform: Some(TypescriptTransformOptions::default().cell()),
custom_rules: foreign_custom_transform_rules,
custom_rules: foreign_next_server_rules,
..module_options_context.clone()
};
@ -538,7 +540,7 @@ pub async fn get_server_module_options_context(
internal_module_options_context.cell(),
),
],
custom_rules: base_next_server_rules,
custom_rules: next_server_rules,
..module_options_context
}
}
@ -565,15 +567,16 @@ pub async fn get_server_module_options_context(
));
}
let mut foreign_custom_transform_rules = custom_source_transform_rules.clone();
foreign_next_server_rules.extend(custom_source_transform_rules.iter().cloned());
foreign_next_server_rules.extend(internal_custom_rules);
custom_source_transform_rules.push(
get_next_react_server_components_transform_rule(next_config, true, Some(app_dir))
.await?,
);
base_next_server_rules.extend(custom_source_transform_rules.clone());
base_next_server_rules.extend(source_transform_rules);
next_server_rules.extend(custom_source_transform_rules.clone());
next_server_rules.extend(source_transform_rules);
let module_options_context = ModuleOptionsContext {
execution_context: Some(execution_context),
@ -583,9 +586,8 @@ pub async fn get_server_module_options_context(
..Default::default()
};
foreign_custom_transform_rules.extend(internal_custom_rules);
let foreign_code_module_options_context = ModuleOptionsContext {
custom_rules: foreign_custom_transform_rules.clone(),
custom_rules: foreign_next_server_rules.clone(),
enable_webpack_loaders: foreign_webpack_loaders,
// NOTE(WEB-1016) PostCSS transforms should also apply to foreign code.
enable_postcss_transform: enable_foreign_postcss_transform,
@ -593,7 +595,7 @@ pub async fn get_server_module_options_context(
};
let internal_module_options_context = ModuleOptionsContext {
enable_typescript_transform: Some(TypescriptTransformOptions::default().cell()),
custom_rules: foreign_custom_transform_rules,
custom_rules: foreign_next_server_rules,
..module_options_context.clone()
};
ModuleOptionsContext {
@ -613,12 +615,12 @@ pub async fn get_server_module_options_context(
internal_module_options_context.cell(),
),
],
custom_rules: base_next_server_rules,
custom_rules: next_server_rules,
..module_options_context
}
}
ServerContextType::AppRoute { .. } => {
base_next_server_rules.extend(source_transform_rules);
next_server_rules.extend(source_transform_rules);
let module_options_context = ModuleOptionsContext {
execution_context: Some(execution_context),
@ -654,7 +656,7 @@ pub async fn get_server_module_options_context(
internal_module_options_context.cell(),
),
],
custom_rules: base_next_server_rules,
custom_rules: next_server_rules,
..module_options_context
}
}
@ -665,8 +667,8 @@ pub async fn get_server_module_options_context(
.flatten()
.collect();
base_next_server_rules.extend(custom_source_transform_rules);
base_next_server_rules.extend(source_transform_rules);
next_server_rules.extend(custom_source_transform_rules);
next_server_rules.extend(source_transform_rules);
let module_options_context = ModuleOptionsContext {
execution_context: Some(execution_context),
@ -703,7 +705,7 @@ pub async fn get_server_module_options_context(
internal_module_options_context.cell(),
),
],
custom_rules: base_next_server_rules,
custom_rules: next_server_rules,
..module_options_context
}
}

View file

@ -24,6 +24,7 @@ pub async fn get_next_server_transforms_rules(
next_config: Vc<NextConfig>,
context_ty: ServerContextType,
mode: Vc<NextMode>,
foreign_code: bool,
) -> Result<Vec<ModuleRule>> {
let mut rules = vec![];
@ -39,25 +40,34 @@ pub async fn get_next_server_transforms_rules(
let (is_server_components, pages_dir) = match context_ty {
ServerContextType::Pages { pages_dir } | ServerContextType::PagesApi { pages_dir } => {
rules.push(get_next_disallow_export_all_in_page_rule(
mdx_rs,
pages_dir.await?,
));
if !foreign_code {
rules.push(get_next_disallow_export_all_in_page_rule(
mdx_rs,
pages_dir.await?,
));
}
(false, Some(pages_dir))
}
ServerContextType::PagesData { pages_dir } => {
rules.push(
get_next_pages_transforms_rule(pages_dir, ExportFilter::StripDefaultExport, mdx_rs)
if !foreign_code {
rules.push(
get_next_pages_transforms_rule(
pages_dir,
ExportFilter::StripDefaultExport,
mdx_rs,
)
.await?,
);
rules.push(get_next_disallow_export_all_in_page_rule(
mdx_rs,
pages_dir.await?,
));
);
rules.push(get_next_disallow_export_all_in_page_rule(
mdx_rs,
pages_dir.await?,
));
}
(false, Some(pages_dir))
}
ServerContextType::AppSSR { .. } => {
// Yah, this is SSR, but this is still treated as a Client transform layer.
// need to apply to foreign code too
rules.push(get_server_actions_transform_rule(
ActionsTransform::Client,
mdx_rs,
@ -85,21 +95,23 @@ pub async fn get_next_server_transforms_rules(
}
};
rules.push(
get_next_dynamic_transform_rule(true, is_server_components, pages_dir, mode, mdx_rs)
.await?,
);
if !foreign_code {
rules.push(
get_next_dynamic_transform_rule(true, is_server_components, pages_dir, mode, mdx_rs)
.await?,
);
rules.push(get_next_amp_attr_rule(mdx_rs));
rules.push(get_next_cjs_optimizer_rule(mdx_rs));
rules.push(get_next_pure_rule(mdx_rs));
rules.push(get_next_amp_attr_rule(mdx_rs));
rules.push(get_next_cjs_optimizer_rule(mdx_rs));
rules.push(get_next_pure_rule(mdx_rs));
// [NOTE]: this rule only works in prod config
// https://github.com/vercel/next.js/blob/a1d0259ea06592c5ca6df882e9b1d0d0121c5083/packages/next/src/build/swc/options.ts#L409
// rules.push(get_next_optimize_server_react_rule(enable_mdx_rs,
// optimize_use_state))
// [NOTE]: this rule only works in prod config
// https://github.com/vercel/next.js/blob/a1d0259ea06592c5ca6df882e9b1d0d0121c5083/packages/next/src/build/swc/options.ts#L409
// rules.push(get_next_optimize_server_react_rule(enable_mdx_rs,
// optimize_use_state))
rules.push(get_next_image_rule());
rules.push(get_next_image_rule());
}
Ok(rules)
}

View file

@ -2588,6 +2588,7 @@
"app dir - external dependency react in external esm packages should use the same react in edge server app",
"app dir - external dependency react in external esm packages should use the same react in pages",
"app dir - external dependency react in external esm packages should use the same react in server app",
"app dir - external dependency server actions should compile server actions from node_modules in client components",
"app dir - external dependency server actions should not prefer to resolve esm over cjs for bundling optout packages",
"app dir - external dependency should correctly collect global css imports and mark them as side effects",
"app dir - external dependency should emit cjs helpers for external cjs modules when compiled",
@ -2605,7 +2606,6 @@
"app dir - external dependency should use the same export type for packages in both ssr and client"
],
"failed": [
"app dir - external dependency server actions should compile server actions from node_modules in client components",
"app dir - external dependency should be able to opt-out 3rd party packages being bundled in server components",
"app dir - external dependency should not apply swc optimizer transform for external packages in browser layer"
],