swc/crates/swc_ecma_transforms_module/tests/system_js.rs
Donny/강동윤 0259a7465f
build(cargo): Update rustc to nightly-2023-03-20 (#7170)
**Description:**

This PR also updates `rkyv` to `=0.7.40`.

**Related issue:**

 - Closes https://github.com/swc-project/swc/issues/6807.
2023-03-30 08:06:02 +00:00

183 lines
3.7 KiB
Rust

#![deny(warnings)]
use std::path::PathBuf;
use swc_common::{chain, Mark};
use swc_ecma_parser::Syntax;
use swc_ecma_transforms_base::resolver;
use swc_ecma_transforms_module::system_js::{system_js, Config};
use swc_ecma_transforms_testing::{test, test_fixture, Tester};
use swc_ecma_visit::Fold;
fn syntax() -> Syntax {
Syntax::Es(Default::default())
}
fn tr(_tester: &mut Tester<'_>, config: Config) -> impl Fold {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
chain!(
resolver(unresolved_mark, top_level_mark, false),
system_js(unresolved_mark, config)
)
}
test!(
syntax(),
|tester| tr(
tester,
Config {
allow_top_level_this: true
}
),
allow_top_level_this_true,
r#"export var v = this;"#,
r#"System.register([], function(_export, _context) {
"use strict";
var v;
return {
setters: [],
execute: function() {
_export("v", v = this);
}
};
});"#
);
test!(
syntax(),
|tester| tr(
tester,
Config {
allow_top_level_this: false
}
),
iife,
r#"
(function(a) {
this.foo = a;
})(this);
"#,
r#"System.register([], function(_export, _context) {
"use strict";
return {
setters: [],
execute: function() {
(function(a) {
this.foo = a;
})(void 0);
}
};
});"#
);
test!(
syntax(),
|tester| tr(
tester,
Config {
allow_top_level_this: false
}
),
top_level_this_false_class,
r#"
const a = this;
class A {
constructor() {
this.a = 1;
}
test() {
this.a = 2;
}
}"#,
r#"System.register([], function(_export, _context) {
"use strict";
var A, a;
return {
setters: [],
execute: function() {
a = void 0;
A = class A {
constructor(){
this.a = 1;
}
test() {
this.a = 2;
}
};
}
};
});"#
);
test!(
syntax(),
|tester| tr(
tester,
Config {
allow_top_level_this: false
}
),
allow_top_level_this_false,
r#"export var v = this;
function a() {
function d () {}
var b = this;
} "#,
r#"System.register([], function(_export, _context) {
"use strict";
var v;
function a() {
function d() {}
var b = this;
}
return {
setters: [],
execute: function() {
_export("v", v = void 0);
}
};
});"#
);
test!(
syntax(),
|tester| tr(tester, Default::default()),
imports,
r#"
import.meta.url;
import.meta.fn();
await import('./test2');
"#,
r#"
System.register([], function(_export, _context) {
"use strict";
return {
setters: [],
execute: async function() {
_context.meta.url;
_context.meta.fn();
await _context.import('./test2');
}
};
});
"#
);
// TODO: test get-module-name-option, tla
#[testing::fixture("tests/fixture/systemjs/**/input.mjs")]
fn fixture(input: PathBuf) {
let dir = input.parent().unwrap().to_path_buf();
let output = dir.join("output.mjs");
test_fixture(
syntax(),
&|tester| tr(tester, Default::default()),
&input,
&output,
Default::default(),
);
}