Skip to content

Commit

Permalink
fix: umd should be import as cjs (#1642)
Browse files Browse the repository at this point in the history
* fix: umd should be import as cjs

* refactor: 🎨 just short circuit typeof define to prevent define takes effect

* revert: ⏪ binding.d.ts

---------

Co-authored-by: pshu <[email protected]>
  • Loading branch information
Jinbao1001 and stormslowly authored Oct 23, 2024
1 parent 9172ca7 commit ca24e14
Show file tree
Hide file tree
Showing 8 changed files with 111 additions and 1 deletion.
2 changes: 2 additions & 0 deletions crates/mako/src/build/transform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ use crate::features;
use crate::module::ModuleAst;
use crate::plugin::PluginTransformJsParam;
use crate::plugins::context_module::ContextModuleVisitor;
use crate::visitors::amd_define_overrides::amd_define_overrides;
use crate::visitors::css_assets::CSSAssets;
use crate::visitors::css_flexbugs::CSSFlexbugs;
use crate::visitors::css_px2rem::Px2Rem;
Expand Down Expand Up @@ -246,6 +247,7 @@ impl Transform {
..Default::default()
},
)),
Box::new(amd_define_overrides(unresolved_mark)),
];
ast.transform(
&mut vec![],
Expand Down
1 change: 0 additions & 1 deletion crates/mako/src/generate/transform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,6 @@ pub fn transform_js_generate(transform_js_param: TransformJsParam) -> Result<()>
let origin_comments = context.meta.script.origin_comments.read().unwrap();
let swc_comments = origin_comments.get_swc_comments();
ast.ast.visit_mut_with(&mut fixer(Some(swc_comments)));

Ok(())
})
})
Expand Down
1 change: 1 addition & 0 deletions crates/mako/src/visitors.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
pub(crate) mod amd_define_overrides;
pub(crate) mod async_module;
pub(crate) mod common_js;
pub(crate) mod css_assets;
Expand Down
82 changes: 82 additions & 0 deletions crates/mako/src/visitors/amd_define_overrides.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
use swc_core::common::{Mark, DUMMY_SP};
use swc_core::ecma::ast::*;
use swc_core::ecma::visit::{as_folder, Fold, VisitMut};

use crate::ast::utils::is_ident_undefined;

pub struct AmdDefineOverrides {
unresolved_mark: Mark,
}

pub fn amd_define_overrides(unresolved_mark: Mark) -> impl VisitMut + Fold {
as_folder(AmdDefineOverrides { unresolved_mark })
}

impl VisitMut for AmdDefineOverrides {
fn visit_mut_unary_expr(&mut self, node: &mut UnaryExpr) {
if node.op == UnaryOp::TypeOf
&& let Some(arg_ident) = node.arg.as_ident()
&& is_ident_undefined(arg_ident, "define", &self.unresolved_mark)
{
node.arg = Expr::undefined(DUMMY_SP)
}
}
}

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

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

#[test]
fn unresolve_typeof_define_change_to_undefined() {
let mut tu = TestUtils::gen_js_ast(
r#"if(typeof define ==="function" && define.amd) {
console.log("amd")
}"#,
);
let js = tu.ast.js_mut();
let unresolved_mark = js.unresolved_mark;
GLOBALS.set(&tu.context.meta.script.globals, || {
js.ast
.visit_mut_with(&mut amd_define_overrides(unresolved_mark));
});

let code = tu.js_ast_to_code();

assert_eq!(
code,
r#"if (typeof void 0 === "function" && define.amd) {
console.log("amd");
}"#
)
}

#[test]
fn id_define_is_declared() {
let mut tu = TestUtils::gen_js_ast(
r#"let define = 1; if(typeof define ==="number") {
console.log("number")
}"#,
);
let js = tu.ast.js_mut();
let unresolved_mark = js.unresolved_mark;
GLOBALS.set(&tu.context.meta.script.globals, || {
js.ast
.visit_mut_with(&mut amd_define_overrides(unresolved_mark));
});

let code = tu.js_ast_to_code();

assert_eq!(
code,
r#"let define = 1;
if (typeof define === "number") {
console.log("number");
}"#
);
}
}
6 changes: 6 additions & 0 deletions e2e/fixtures/javascript.transform.amd/expect.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const {parseBuildResult, injectSimpleJest} = require("../../../scripts/test-utils");
const {distDir} = parseBuildResult(__dirname);

injectSimpleJest()
require('./dist/index.js');

1 change: 1 addition & 0 deletions e2e/fixtures/javascript.transform.amd/mako.config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
13 changes: 13 additions & 0 deletions e2e/fixtures/javascript.transform.amd/src/a.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// @ts-nocheck
(function (root, definition) {
"use strict";
if (typeof define === 'function' && define.amd) {
define(definition);
} else if (typeof module === 'object' && module.exports) {
module.exports = definition();
} else {
root.log = definition();
}
}(this, function () {
return 1
}))
6 changes: 6 additions & 0 deletions e2e/fixtures/javascript.transform.amd/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// @ts-ignore
import a from './a'

it("amd/umd should be exports as commonjs", () => {
expect(a).toEqual(1)
});

0 comments on commit ca24e14

Please sign in to comment.