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:
parent
6f5e0f3694
commit
1d8b70411f
5 changed files with 93 additions and 67 deletions
|
@ -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()
|
||||
};
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
],
|
||||
|
|
Loading…
Reference in a new issue