2021-11-28 11:02:14 +03:00
|
|
|
use anyhow::{anyhow, Error};
|
|
|
|
use std::{
|
|
|
|
env, fs,
|
|
|
|
path::{Path, PathBuf},
|
|
|
|
process::{Command, Stdio},
|
|
|
|
};
|
|
|
|
use swc_common::FileName;
|
2022-01-10 16:54:42 +03:00
|
|
|
use swc_ecma_ast::{CallExpr, Callee, EsVersion, Expr, Lit, MemberExpr, Str};
|
2021-11-28 11:02:14 +03:00
|
|
|
use swc_ecma_parser::{lexer::Lexer, EsConfig, Parser, StringInput, Syntax};
|
2022-01-10 15:34:16 +03:00
|
|
|
use swc_ecma_visit::{Visit, VisitWith};
|
2021-11-28 11:02:14 +03:00
|
|
|
|
|
|
|
/// Returns the path to the built plugin
|
|
|
|
fn build_plugin(dir: &Path) -> Result<PathBuf, Error> {
|
|
|
|
{
|
2022-01-09 09:02:56 +03:00
|
|
|
let mut cmd = if cfg!(windows) {
|
|
|
|
let mut c = Command::new("cmd");
|
|
|
|
c.args(&["/C", "build.cmd"]);
|
|
|
|
c
|
|
|
|
} else {
|
|
|
|
let mut c = Command::new("sh");
|
|
|
|
c.args(&["-c", "./build.sh"]);
|
|
|
|
c
|
|
|
|
};
|
|
|
|
|
2021-11-28 11:02:14 +03:00
|
|
|
cmd.current_dir(dir);
|
2022-01-09 09:02:56 +03:00
|
|
|
cmd.stderr(Stdio::inherit()).output()?;
|
2021-11-28 11:02:14 +03:00
|
|
|
}
|
|
|
|
|
2022-01-07 09:13:46 +03:00
|
|
|
for entry in fs::read_dir(
|
|
|
|
&dir.join("target")
|
|
|
|
.join("wasm32-unknown-unknown")
|
|
|
|
.join("debug"),
|
|
|
|
)? {
|
2021-11-28 11:02:14 +03:00
|
|
|
let entry = entry?;
|
|
|
|
|
|
|
|
let s = entry.file_name().to_string_lossy().into_owned();
|
2022-01-07 09:13:46 +03:00
|
|
|
if s.eq_ignore_ascii_case("swc_internal_plugin.wasm") {
|
2021-11-28 11:02:14 +03:00
|
|
|
return Ok(entry.path());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Err(anyhow!("Could not find built plugin"))
|
|
|
|
}
|
|
|
|
|
2022-01-10 15:34:16 +03:00
|
|
|
struct TestVisitor {
|
|
|
|
pub plugin_transform_found: bool,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Visit for TestVisitor {
|
|
|
|
fn visit_call_expr(&mut self, call: &CallExpr) {
|
2022-01-10 16:54:42 +03:00
|
|
|
if let Callee::Expr(expr) = &call.callee {
|
2022-01-10 15:34:16 +03:00
|
|
|
if let Expr::Member(MemberExpr { obj, .. }) = &**expr {
|
2022-01-10 16:54:42 +03:00
|
|
|
if let Expr::Ident(ident) = &**obj {
|
|
|
|
if ident.sym == *"console" {
|
|
|
|
let args = &*(call.args[0].expr);
|
|
|
|
if let Expr::Lit(Lit::Str(Str { value, .. })) = args {
|
|
|
|
self.plugin_transform_found = value == "changed_via_plugin";
|
2022-01-10 15:34:16 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-28 11:02:14 +03:00
|
|
|
#[test]
|
|
|
|
fn internal() -> Result<(), Error> {
|
|
|
|
let path = build_plugin(
|
|
|
|
&PathBuf::from(env::var("CARGO_MANIFEST_DIR")?)
|
|
|
|
.join("..")
|
|
|
|
.join("..")
|
|
|
|
.join("tests")
|
|
|
|
.join("rust-plugins")
|
|
|
|
.join("swc_internal_plugin"),
|
|
|
|
)?;
|
|
|
|
|
|
|
|
testing::run_test(false, |cm, _handler| {
|
|
|
|
let fm = cm.new_source_file(FileName::Anon, "console.log(foo)".into());
|
|
|
|
|
|
|
|
let lexer = Lexer::new(
|
|
|
|
Syntax::Es(EsConfig {
|
|
|
|
..Default::default()
|
|
|
|
}),
|
|
|
|
EsVersion::latest(),
|
|
|
|
StringInput::from(&*fm),
|
|
|
|
None,
|
|
|
|
);
|
|
|
|
let mut parser = Parser::new_from(lexer);
|
|
|
|
|
|
|
|
let program = parser.parse_program().unwrap();
|
|
|
|
|
2022-01-10 15:34:16 +03:00
|
|
|
let program =
|
2022-01-04 10:10:39 +03:00
|
|
|
swc_plugin_runner::apply_js_plugin("internal-test", &path, &mut None, "{}", program)
|
2022-01-10 15:34:16 +03:00
|
|
|
.expect("Plugin should apply transform");
|
|
|
|
|
|
|
|
let mut visitor = TestVisitor {
|
|
|
|
plugin_transform_found: false,
|
|
|
|
};
|
|
|
|
program.visit_with(&mut visitor);
|
2021-11-28 11:02:14 +03:00
|
|
|
|
2022-01-10 15:34:16 +03:00
|
|
|
visitor
|
|
|
|
.plugin_transform_found
|
|
|
|
.then(|| visitor.plugin_transform_found)
|
|
|
|
.ok_or(())
|
2021-11-28 11:02:14 +03:00
|
|
|
})
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|