Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: replace the "typeof __webpack_require__" content #1688

Merged
merged 6 commits into from
Dec 17, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions crates/mako/src/build/transform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ use crate::visitors::try_resolve::TryResolve;
use crate::visitors::ts_strip::ts_strip;
use crate::visitors::tsx_strip::tsx_strip;
use crate::visitors::virtual_css_modules::VirtualCSSModules;
use crate::visitors::webpack_require::WebpackRequire;
use crate::visitors::worker_module::WorkerModule;

pub struct Transform {}
Expand Down Expand Up @@ -111,6 +112,7 @@ impl Transform {
unresolved_mark,
}),
Box::new(WorkerModule::new(unresolved_mark)),
Box::new(WebpackRequire::new(unresolved_mark)),
];

// named default export
Expand Down
1 change: 1 addition & 0 deletions crates/mako/src/visitors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,5 @@ pub(crate) mod try_resolve;
pub(crate) mod ts_strip;
pub(crate) mod tsx_strip;
pub(crate) mod virtual_css_modules;
pub(crate) mod webpack_require;
pub(crate) mod worker_module;
88 changes: 88 additions & 0 deletions crates/mako/src/visitors/webpack_require.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
use swc_core::common::{Mark, DUMMY_SP};
use swc_core::ecma::ast::{Expr, Ident, UnaryExpr};
use swc_core::ecma::visit::{VisitMut, VisitMutWith};

pub const WEBPACK_VALUES: [&str; 14] = [
"__webpack_get_script_filename__",
"__webpack_runtime_id__",
"__webpack_chunkname__",
"__webpack_nonce__",
"__webpack_init_sharing__",
"__webpack_share_scopes__",
"__system_context__",
"__non_webpack_require__",
"__webpack_require__",
"__webpack_hash__",
"__webpack_modules__",
"__webpack_module__",
"__webpack_chunk_load__",
"__webpack_base_uri__",
];

pub struct WebpackRequire {
pub unresolved_mark: Mark,
}

impl WebpackRequire {
pub fn new(unresolved_mark: Mark) -> Self {
Self { unresolved_mark }
}
fn is_ident_webpack(&self, ident: &Ident, unresolved_mark: &Mark) -> bool {
WEBPACK_VALUES.iter().any(|&i| i == &ident.sym) && ident.ctxt.outer() == *unresolved_mark
}
}

impl VisitMut for WebpackRequire {
// find the "typeof __webpack_require__" in the ast tree
fn visit_mut_unary_expr(&mut self, unary_expr: &mut UnaryExpr) {
if unary_expr.op.as_str() == "typeof"
&& let Some(arg_ident) = unary_expr.arg.as_ident()
&& self.is_ident_webpack(arg_ident, &self.unresolved_mark)
{
unary_expr.arg = Expr::undefined(DUMMY_SP)
} else {
unary_expr.visit_mut_children_with(self);
}
}
}

#[cfg(test)]
mod tests {
use swc_core::common::GLOBALS;
use swc_core::ecma::visit::VisitMutWith;

use super::WebpackRequire;
use crate::ast::tests::TestUtils;

#[test]
fn test_webpack_require_ident() {
assert_eq!(
run(r#"typeof __webpack_require__ === 'function';"#),
r#"typeof void 0 === 'function';"#
);
}

#[test]
fn test_webpack_module_ident() {
assert_eq!(run(r#"typeof __webpack_modules__;"#), r#"typeof void 0;"#);
notcold marked this conversation as resolved.
Show resolved Hide resolved
}
#[test]
fn test_dbcheck_webpack_module_ident() {
assert_eq!(
run(r#"typeof typeof __webpack_modules__;"#),
r#"typeof typeof void 0;"#
);
}

fn run(js_code: &str) -> String {
let mut test_utils = TestUtils::gen_js_ast(js_code);
let ast = test_utils.ast.js_mut();
GLOBALS.set(&test_utils.context.meta.script.globals, || {
let mut visitor = WebpackRequire {
unresolved_mark: ast.unresolved_mark,
};
ast.ast.visit_mut_with(&mut visitor);
});
test_utils.js_ast_to_code()
}
}
Loading