#![cfg(all(
feature = "swc_ecma_transforms_compat",
feature = "swc_ecma_transforms_module",
feature = "swc_ecma_transforms_optimization",
feature = "swc_ecma_transforms_proposal",
))]
use swc_common::{chain, Mark};
use swc_ecma_parser::Syntax;
use swc_ecma_transforms_base::resolver;
use swc_ecma_transforms_compat::{
es2015::{arrow, block_scoping, classes, function_name, shorthand},
es2022::class_properties,
};
use swc_ecma_transforms_module::common_js::common_js;
use swc_ecma_transforms_proposal::decorators;
use swc_ecma_transforms_testing::test;
use swc_ecma_visit::Fold;
fn syntax() -> Syntax {
Default::default()
}
fn tr() -> impl Fold {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
chain!(
resolver(unresolved_mark, top_level_mark, false),
function_name(),
block_scoping(unresolved_mark)
)
}
//macro_rules! identical {
// ($name:ident, $src:literal) => {
// test!(syntax(), |_| tr(), $name, $src, $src);
// };
//}
test!(
syntax(),
|_| tr(),
basic,
r#"var number = function (x) {
return x;
};"#
);
test!(
syntax(),
|_| tr(),
assign,
r#"number = function (x) {
return x;
};"#
);
test!(
syntax(),
|_| tr(),
let_complex,
r#"
let TestClass = {
name: "John Doe",
testMethodFailure() {
return new Promise(async function(resolve) {
console.log(this);
setTimeout(resolve, 1000);
});
}
};
"#
);
test!(
syntax(),
|_| tr(),
class_simple,
r#"
var Foo = function() {
var Foo = function () {
_class_call_check(this, Foo);
};
_define_property(Foo, 'num', 0);
return Foo;
}();
expect(Foo.num).toBe(0);
expect(Foo.num = 1).toBe(1);
expect(Foo.name).toBe('Foo');
"#
);
test!(
syntax(),
|_| tr(),
issue_288_01,
"var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf || {
__proto__: []
} instanceof Array && function (d, b) {
d.__proto__ = b;
} || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
};
return extendStatics(d, b);
};"
);
//identical!(
// issue_288_02,
// "function components_Link_extends() {
// components_Link_extends = Object.assign || function (target) { for (var
// i = 1; i < \ arguments.length; i++) { var source = arguments[i]; for (var
// key in source) { if \ (Object.prototype.hasOwnProperty.call(source, key))
// { target[key] = source[key]; } } } \ return target; };
// return components_Link_extends.apply(this, arguments); }"
//);
// issues_5004
test!(
syntax(),
|_| function_name(),
issues_5004,
r#"
export const x = ({x}) => x;
export const y = function () {};
"#
);
//// function_name_export_default_arrow_renaming_module_system
//test!(syntax(),|_| tr("{
// "plugins": [
// function_name(),
// shorthand(),
// arrow(),
// "transform-modules-systemjs"
// ]
//}
//"), function_name_export_default_arrow_renaming_module_system, r#"
//export default (a) => {
// return { a() { return a } };
//}
//
//"# r#"
//System.register([], function (_export, _context) {
// "use strict";
//
// return {
// setters: [],
// execute: function () {
// _export("default", function (_a) {
// return {
// a: function a() {
// return _a;
// }
// };
// });
// }
// };
//});
//
//"#);
//// function_name_export_default_arrow_renaming_2
//test!(syntax(),|_| tr("{
// "presets": ["env"]
//}
//"), function_name_export_default_arrow_renaming_2, r#"
//export default () => ({
// x: ({x}) => {}
//})
//
//"# r#"
//"use strict";
//
//Object.defineProperty(exports, "__esModule", {
// value: true
//});
//exports["default"] = void 0;
//
//var _default = function _default() {
// return {
// x: function x(_ref) {
// var _x = _ref.x;
// }
// };
//};
//
//exports["default"] = _default;
//
//"#);
// function_name_with_arrow_functions_transform
test!(
ignore,
syntax(),
|_| chain!(arrow(Mark::new()), function_name()),
function_name_with_arrow_functions_transform,
r#"
const x = () => x;
const y = x => x();
const z = { z: () => y(x) }.z;
"#
);
// function_name_modules_3
test!(
syntax(),
|t| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
chain!(
resolver(unresolved_mark, top_level_mark, true),
function_name(),
classes(Some(t.comments.clone()), Default::default()),
decorators(decorators::Config {
legacy: true,
..Default::default()
}),
common_js(
unresolved_mark,
Default::default(),
Default::default(),
Some(t.comments.clone())
)
)
},
function_name_modules_3,
r#"
import {getForm} from "./store"
export default class Login extends React.Component {
getForm() {
return getForm().toJS()
}
}
"#
);
// function_name_basic
test!(
syntax(),
|t| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
chain!(
resolver(unresolved_mark, top_level_mark, true),
decorators(decorators::Config {
legacy: true,
..Default::default()
}),
classes(Some(t.comments.clone()), Default::default()),
function_name(),
)
},
function_name_basic,
r#"
var g = function () {
doSmth();
};
"#
);
// function_name_export_default_arrow_renaming
test!(
ignore,
syntax(),
|t| {
let unresolved_mark = Mark::new();
chain!(
arrow(unresolved_mark),
shorthand(),
function_name(),
common_js(
unresolved_mark,
Default::default(),
Default::default(),
Some(t.comments.clone())
)
)
},
function_name_export_default_arrow_renaming,
r#"
export default (a) => {
return { a() { return a } };
}
"#
);
// issues_7199
test!(
// Not important
ignore,
syntax(),
|_| function_name(),
issues_7199,
r#"
const x = {
[null]: function () {},
[/regex/gi]: function () {},
[`y`]: function () {},
[`abc${y}def`]: function () {},
[0]: function () {},
[false]: function () {},
};
"#
);
//// function_name_export_default_arrow_renaming_3
//test!(syntax(),|_| tr("{
// "presets": ["env", "react"]
//}
//"), function_name_export_default_arrow_renaming_3, r#"
//export default ({ onClick }) => (
//
onClick()} />
//)
//
//
//"# r#"
//"use strict";
//
//Object.defineProperty(exports, "__esModule", {
// value: true
//});
//exports["default"] = void 0;
//
//var _default = function _default(_ref) {
// var _onClick = _ref.onClick;
// return React.createElement("div", {
// onClick: function onClick() {
// return _onClick();
// }
// });
//};
//
//exports["default"] = _default;
//
//"#);
//// function_name_export_default_arrow_renaming_es3
//test!(syntax(),|_| tr("{
// "presets": ["env"],
// "plugins": [
// "transform-member-expression-literals",
// "transform-property-literals"
// ]
//}
//"), function_name_export_default_arrow_renaming_es3, r#"
//export default (a) => {
// return { a() { return a } };
//}
//
//"# r#"
//"use strict";
//
//Object.defineProperty(exports, "__esModule", {
// value: true
//});
//exports["default"] = void 0;
//
//var _default = function _default(_a) {
// return {
// a: function a() {
// return _a;
// }
// };
//};
//
//exports["default"] = _default;
//
//"#);
// function_name_self_reference
test!(
// not important
ignore,
syntax(),
|t| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
chain!(
resolver(unresolved_mark, top_level_mark, true),
decorators(decorators::Config {
legacy: true,
..Default::default()
}),
function_name(),
classes(Some(t.comments.clone()), Default::default())
)
},
function_name_self_reference,
r#"
var f = function () {
console.log(f, g);
};
f = null;
"#
);
// function_name_with_arrow_functions_transform_spec
test!(
ignore,
syntax(),
|_| chain!(arrow(Mark::new()), function_name()),
function_name_with_arrow_functions_transform_spec,
r#"
// These are actually handled by transform-arrow-functions
const x = () => x;
const y = x => x();
const z = { z: () => y(x) }.z;
"#
);
// function_name_method_definition
test!(
syntax(),
|t| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
chain!(
resolver(unresolved_mark, top_level_mark, true),
decorators(decorators::Config {
legacy: true,
..Default::default()
}),
classes(Some(t.comments.clone()), Default::default()),
function_name(),
)
},
function_name_method_definition,
r#"
({ x() {} });
"#
);
// function_name_export_default_arrow_renaming_module_es6
test!(
ignore,
syntax(),
|_| chain!(arrow(Mark::new()), shorthand(), function_name()),
function_name_export_default_arrow_renaming_module_es6,
r#"
export default (a) => {
return { a() { return a } };
}
"#
);
// function_name_assignment
test!(
// not important
ignore,
syntax(),
|_| tr(),
function_name_assignment,
r#"
var i = function () {
i = 5;
};
var j = function () {
({ j } = 5);
({ y: j } = 5);
;
};
"#
);
// function_name_own_bindings
test!(
// not important
ignore,
syntax(),
|t| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
chain!(
resolver(unresolved_mark, top_level_mark, true),
decorators(decorators::Config {
legacy: true,
..Default::default()
}),
classes(Some(t.comments.clone()), Default::default()),
function_name(),
)
},
function_name_own_bindings,
r#"
var f = function () {
var f = 2;
};
var g = function (g) {
g;
};
var obj = {
f: function (f) {
f;
}
};
"#
);
// decorators_legacy_interop_strict
test!(
// See: https://github.com/swc-project/swc/issues/421
ignore,
syntax(),
|t| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
chain!(
resolver(unresolved_mark, top_level_mark, true),
decorators(decorators::Config {
legacy: true,
..Default::default()
}),
class_properties(
Some(t.comments.clone()),
Default::default(),
unresolved_mark
),
classes(Some(t.comments.clone()), Default::default()),
)
},
decorators_legacy_interop_strict,
r#"
function dec() {}
class A {
@dec a;
@dec b = 123;
c = 456;
}
"#
);
// function_name_function_collision
test!(
ignore,
syntax(),
|t| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
chain!(
resolver(unresolved_mark, top_level_mark, true),
decorators(decorators::Config {
legacy: true,
..Default::default()
}),
classes(Some(t.comments.clone()), Default::default()),
function_name(),
)
},
function_name_function_collision,
r#"
function f() {
f;
}
{
let obj = {
f: function () {
f;
}
};
}
(function b() {
var obj = {
b: function () {
b;
}
};
function commit(b) {
b();
}
});
"#
);
// function_name_collisions
test!(
syntax(),
|t| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
chain!(
resolver(unresolved_mark, top_level_mark, true),
decorators(decorators::Config {
legacy: true,
..Default::default()
}),
classes(Some(t.comments.clone()), Default::default()),
function_name(),
)
},
function_name_collisions,
r#"
var obj = {
search: function({search}) {
console.log(search);
}
};
function search({search}) {
console.log(search);
}
"#
);
// function_name_modules_2
test!(
ignore,
Default::default(),
|t| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
chain!(
resolver(unresolved_mark, top_level_mark, true),
decorators(decorators::Config {
legacy: true,
..Default::default()
}),
classes(Some(t.comments.clone()), Default::default()),
function_name(),
common_js(
unresolved_mark,
Default::default(),
Default::default(),
Some(t.comments.clone())
)
)
},
function_name_modules_2,
r#"
import last from "lodash/last"
export default class Container {
last(key) {
if (!this.has(key)) {
return;
}
return last(this.tokens.get(key))
}
}
"#
);
// function_name_await
test!(
Default::default(),
|t| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
chain!(
resolver(unresolved_mark, top_level_mark, true),
decorators(decorators::Config {
legacy: true,
..Default::default()
}),
classes(Some(t.comments.clone()), Default::default()),
function_name(),
)
},
function_name_await,
r#"
export {};
var obj = { await: function () {} };
"#
);