Skip to content

Commit 17afbeb

Browse files
authored
feat: support webpackIgnore in commonjs require (#11704)
* feat: support webpackIgnore in commonjs require * feat: gate commonjs magic comment support * chore: rebuild napi bindings * fix: treat ignored commonjs require as handled * fix: collapse webpackIgnore pattern guards * refactor: remove commonjsMagicComments in default config * fix: comments
1 parent e598f28 commit 17afbeb

File tree

11 files changed

+64
-3
lines changed

11 files changed

+64
-3
lines changed

crates/node_binding/napi-binding.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2322,6 +2322,7 @@ export interface RawJavascriptParserOptions {
23222322
* @experimental
23232323
*/
23242324
importDynamic?: boolean
2325+
commonjsMagicComments?: boolean
23252326
/**
23262327
* This option is experimental in Rspack only and subject to change or be removed anytime.
23272328
* @experimental

crates/rspack/src/builder/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1714,6 +1714,7 @@ impl ModuleOptionsBuilder {
17141714
require_dynamic: Some(true),
17151715
require_resolve: Some(true),
17161716
import_dynamic: Some(true),
1717+
commonjs_magic_comments: Some(false),
17171718
inline_const: Some(false),
17181719
..Default::default()
17191720
}),

crates/rspack/tests/snapshots/defaults__default_options.snap

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1438,6 +1438,9 @@ CompilerOptions {
14381438
import_dynamic: Some(
14391439
true,
14401440
),
1441+
commonjs_magic_comments: Some(
1442+
false,
1443+
),
14411444
inline_const: Some(
14421445
false,
14431446
),

crates/rspack_binding_api/src/raw_options/raw_module/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ pub struct RawJavascriptParserOptions {
291291
/// This option is experimental in Rspack only and subject to change or be removed anytime.
292292
/// @experimental
293293
pub import_dynamic: Option<bool>,
294+
pub commonjs_magic_comments: Option<bool>,
294295
/// This option is experimental in Rspack only and subject to change or be removed anytime.
295296
/// @experimental
296297
pub inline_const: Option<bool>,
@@ -341,6 +342,7 @@ impl From<RawJavascriptParserOptions> for JavascriptParserOptions {
341342
require_dynamic: value.require_dynamic,
342343
require_resolve: value.require_resolve,
343344
import_dynamic: value.import_dynamic,
345+
commonjs_magic_comments: value.commonjs_magic_comments,
344346
inline_const: value.inline_const,
345347
}
346348
}

crates/rspack_core/src/options/module.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ pub struct JavascriptParserOptions {
282282
pub require_dynamic: Option<bool>,
283283
pub require_resolve: Option<bool>,
284284
pub import_dynamic: Option<bool>,
285+
pub commonjs_magic_comments: Option<bool>,
285286
pub inline_const: Option<bool>,
286287
}
287288

crates/rspack_plugin_javascript/src/parser_plugin/common_js_imports_parse_plugin.rs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use crate::{
2121
visitors::{
2222
JavascriptParser, context_reg_exp, create_context_dependency, create_traceable_error, expr_name,
2323
},
24+
webpack_comment::try_extract_webpack_magic_comment,
2425
};
2526

2627
fn create_commonjs_require_context_dependency(
@@ -126,11 +127,38 @@ impl CallOrNewExpr<'_> {
126127
pub struct CommonJsImportsParserPlugin;
127128

128129
impl CommonJsImportsParserPlugin {
130+
fn has_webpack_ignore_comment(
131+
parser: &mut JavascriptParser,
132+
error_span: Span,
133+
span: Span,
134+
) -> bool {
135+
if !parser
136+
.javascript_options
137+
.commonjs_magic_comments
138+
.unwrap_or(false)
139+
{
140+
return false;
141+
}
142+
143+
try_extract_webpack_magic_comment(parser, error_span, span)
144+
.get_webpack_ignore()
145+
.unwrap_or_default()
146+
}
147+
129148
fn process_resolve(&self, parser: &mut JavascriptParser, call_expr: &CallExpr, weak: bool) {
130149
if call_expr.args.len() != 1 {
131150
return;
132151
}
133152

153+
if let ExprOrSpread {
154+
spread: None,
155+
expr: argument_expr,
156+
} = &call_expr.args[0]
157+
&& Self::has_webpack_ignore_comment(parser, call_expr.span, argument_expr.span())
158+
{
159+
return;
160+
}
161+
134162
let argument_expr = &call_expr.args[0].expr;
135163
let param = parser.evaluate_expression(argument_expr);
136164
let require_resolve_header_dependency = Box::new(RequireResolveHeaderDependency::new(
@@ -196,6 +224,14 @@ impl CommonJsImportsParserPlugin {
196224
return None;
197225
}
198226
let arg = &call_expr.args[0];
227+
if let ExprOrSpread {
228+
spread: None,
229+
expr: argument_expr,
230+
} = arg
231+
&& Self::has_webpack_ignore_comment(parser, call_expr.span, argument_expr.span())
232+
{
233+
return None;
234+
}
199235
let param = parser.evaluate_expression(&arg.expr);
200236
param.is_string().then(|| {
201237
CommonJsFullRequireDependency::new(
@@ -252,8 +288,16 @@ impl CommonJsImportsParserPlugin {
252288
return None;
253289
}
254290

255-
let argument_expr = &args[0].expr;
256-
let param = parser.evaluate_expression(argument_expr);
291+
if let ExprOrSpread {
292+
spread: None,
293+
expr: argument_expr,
294+
} = &args[0]
295+
&& Self::has_webpack_ignore_comment(parser, expr.span(), argument_expr.span())
296+
{
297+
return Some(true);
298+
}
299+
300+
let param = parser.evaluate_expression(&args[0].expr);
257301
if param.is_conditional() {
258302
let mut is_expression = false;
259303
for p in param.options() {

packages/rspack/etc/core.api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3377,6 +3377,7 @@ export type JavascriptParserOptions = {
33773377
requireDynamic?: boolean;
33783378
requireResolve?: boolean;
33793379
importDynamic?: boolean;
3380+
commonjsMagicComments?: boolean;
33803381
inlineConst?: boolean;
33813382
typeReexportsPresence?: "no-tolerant" | "tolerant" | "tolerant-no-check";
33823383
};

packages/rspack/src/config/adapter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,7 @@ function getRawJavascriptParserOptions(
584584
requireDynamic: parser.requireDynamic,
585585
requireResolve: parser.requireResolve,
586586
importDynamic: parser.importDynamic,
587+
commonjsMagicComments: parser.commonjsMagicComments,
587588
inlineConst: parser.inlineConst,
588589
typeReexportsPresence: parser.typeReexportsPresence
589590
};

packages/rspack/src/config/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,11 @@ export type JavascriptParserOptions = {
11081108
// TODO: add docs
11091109
importDynamic?: boolean;
11101110

1111+
/**
1112+
* Enable magic comments for CommonJS require() expressions.
1113+
*/
1114+
commonjsMagicComments?: boolean;
1115+
11111116
/** Inline const values in this module */
11121117
inlineConst?: boolean;
11131118

packages/rspack/src/schema/config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,7 @@ export const getRspackOptionsSchema = memoize(() => {
651651
const requireDynamic = z.boolean();
652652
const requireResolve = z.boolean();
653653
const importDynamic = z.boolean();
654+
const commonjsMagicComments = z.boolean();
654655
const inlineConst = z.boolean();
655656
const typeReexportsPresence = z.enum([
656657
"no-tolerant",
@@ -676,6 +677,7 @@ export const getRspackOptionsSchema = memoize(() => {
676677
strictExportPresence: strictExportPresence,
677678
worker: worker,
678679
overrideStrict: overrideStrict,
680+
commonjsMagicComments: commonjsMagicComments,
679681
// #region Not available in webpack yet.
680682
requireAsExpression: requireAsExpression,
681683
requireDynamic: requireDynamic,

0 commit comments

Comments
 (0)