Skip to content

Commit db225f9

Browse files
authored
fix: import.meta.prop with define plugin (#11525)
1 parent 9e927f2 commit db225f9

File tree

7 files changed

+72
-5
lines changed

7 files changed

+72
-5
lines changed

crates/rspack_plugin_javascript/src/parser_plugin/drive.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,21 @@ impl JavascriptParserPlugin for JavaScriptParserPluginDrive {
430430
None
431431
}
432432

433+
fn evaluate<'a>(
434+
&self,
435+
parser: &mut JavascriptParser,
436+
expr: &'a Expr,
437+
) -> Option<BasicEvaluatedExpression<'a>> {
438+
for plugin in &self.plugins {
439+
let res = plugin.evaluate(parser, expr);
440+
// `SyncBailHook`
441+
if res.is_some() {
442+
return res;
443+
}
444+
}
445+
None
446+
}
447+
433448
fn evaluate_typeof<'a>(
434449
&self,
435450
parser: &mut JavascriptParser,

crates/rspack_plugin_javascript/src/parser_plugin/import_meta_plugin.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use rspack_core::{ConstDependency, SpanExt, property_access};
33
use rspack_error::miette::Severity;
44
use swc_core::{
55
common::{Span, Spanned},
6-
ecma::ast::{Expr, MemberProp},
6+
ecma::ast::{Expr, MemberProp, MetaPropKind},
77
};
88
use url::Url;
99

@@ -44,7 +44,7 @@ impl JavascriptParserPlugin for ImportMetaPlugin {
4444
_parser: &mut JavascriptParser,
4545
expr: &'a swc_core::ecma::ast::UnaryExpr,
4646
for_name: &str,
47-
) -> Option<crate::utils::eval::BasicEvaluatedExpression<'a>> {
47+
) -> Option<eval::BasicEvaluatedExpression<'a>> {
4848
let mut evaluated = None;
4949
if for_name == expr_name::IMPORT_META {
5050
evaluated = Some("object".to_string());
@@ -88,6 +88,33 @@ impl JavascriptParserPlugin for ImportMetaPlugin {
8888
}
8989
}
9090

91+
fn evaluate<'a>(
92+
&self,
93+
_parser: &mut JavascriptParser,
94+
expr: &'a Expr,
95+
) -> Option<eval::BasicEvaluatedExpression<'a>> {
96+
if let Some(member) = expr.as_member()
97+
&& let Some(meta_prop) = member.obj.as_meta_prop()
98+
&& meta_prop.kind == MetaPropKind::ImportMeta
99+
{
100+
if member.prop.is_ident() {
101+
return Some(eval::evaluate_to_undefined(
102+
member.span().real_lo(),
103+
member.span().real_hi(),
104+
));
105+
}
106+
if let Some(computed) = member.prop.as_computed()
107+
&& computed.expr.is_lit()
108+
{
109+
return Some(eval::evaluate_to_undefined(
110+
member.span().real_lo(),
111+
member.span().real_hi(),
112+
));
113+
}
114+
}
115+
None
116+
}
117+
91118
fn r#typeof(
92119
&self,
93120
parser: &mut JavascriptParser,

crates/rspack_plugin_javascript/src/parser_plugin/trait.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,14 @@ pub trait JavascriptParserPlugin {
7979
None
8080
}
8181

82+
fn evaluate<'a>(
83+
&self,
84+
_parser: &mut JavascriptParser,
85+
_expr: &'a Expr,
86+
) -> Option<BasicEvaluatedExpression<'a>> {
87+
None
88+
}
89+
8290
fn evaluate_typeof<'a>(
8391
&self,
8492
_parser: &mut JavascriptParser,

crates/rspack_plugin_javascript/src/utils/eval/eval_member_expr.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use rspack_core::SpanExt;
2-
use swc_core::ecma::ast::MemberExpr;
2+
use swc_core::ecma::ast::{Expr, MemberExpr};
33

44
use super::BasicEvaluatedExpression;
55
use crate::{
@@ -10,6 +10,7 @@ use crate::{
1010
pub fn eval_member_expression<'a>(
1111
parser: &mut JavascriptParser,
1212
member: &'a MemberExpr,
13+
expr: &'a Expr,
1314
) -> Option<BasicEvaluatedExpression<'a>> {
1415
let ret = if let Some(MemberExpressionInfo::Expression(info)) =
1516
parser.get_member_expression_info(member, AllowedMemberTypes::Expression)
@@ -23,6 +24,7 @@ pub fn eval_member_expression<'a>(
2324
member.span.real_lo(),
2425
member.span.hi().0,
2526
)
27+
.or_else(|| parser.plugin_drive.clone().evaluate(parser, expr))
2628
.or_else(|| {
2729
// TODO: fallback with `evaluateDefinedIdentifier`
2830
let mut eval =

crates/rspack_plugin_javascript/src/visitors/dependency/parser/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1141,9 +1141,9 @@ impl JavascriptParser<'_> {
11411141
eval::eval_call_expression(parser, call_expr)
11421142
})
11431143
},
1144-
|parser, member| eval::eval_member_expression(parser, member),
1144+
|parser, member| eval::eval_member_expression(parser, member, expr),
11451145
),
1146-
Expr::Member(member) => eval::eval_member_expression(self, member),
1146+
Expr::Member(member) => eval::eval_member_expression(self, member, expr),
11471147
Expr::Ident(ident) => {
11481148
let name = &ident.sym;
11491149
if name.eq("undefined") {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
it("should not have import.meta.env", function() {
2+
var _env;
3+
(_env = import.meta.env) === null || _env === void 0 ? void 0 : _env.production;
4+
expect(_env).toBe(undefined);
5+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
var DefinePlugin = require("@rspack/core").DefinePlugin;
2+
3+
/** @type {import("@rspack/core").Configuration} */
4+
module.exports = {
5+
plugins: [
6+
new DefinePlugin({
7+
"import.meta.env.MODE": '"production"'
8+
})
9+
]
10+
};

0 commit comments

Comments
 (0)