use std::path::Path; use swc::{config::Options, error::Error, Compiler}; use testing::{NormalizedOutput, StdErr, Tester}; use walkdir::WalkDir; fn file(f: &str) -> Result { Tester::new().print_errors(|cm, handler| { let c = Compiler::new(cm.clone(), handler); let fm = cm.load_file(Path::new(f)).expect("failed to load file"); let s = c.process_js_file( fm, &Options { swcrc: true, is_module: true, ..Default::default() }, ); match s { Ok(v) => Ok(v.code.into()), Err(..) => Err(()), } }) } fn project(dir: &str) { Tester::new() .print_errors(|cm, handler| { let c = Compiler::new(cm.clone(), handler); for entry in WalkDir::new(dir) { let entry = entry.unwrap(); if entry.metadata().unwrap().is_dir() { continue; } println!("File: {}", entry.path().to_string_lossy()); if !entry.file_name().to_string_lossy().ends_with(".ts") && !entry.file_name().to_string_lossy().ends_with(".js") && !entry.file_name().to_string_lossy().ends_with(".tsx") { continue; } let fm = cm.load_file(entry.path()).expect("failed to load file"); match c.process_js_file( fm, &Options { swcrc: true, is_module: true, ..Default::default() }, ) { Ok(..) => {} Err(Error::Unmatched) => {} Err(..) => return Err(()), } } Ok(()) }) .map(|_| ()) .expect("failed"); } //fn par_project(dir: &str) { // Tester::new() // .print_errors(|cm, handler| { // let c = Compiler::new(cm.clone(), handler); // // let entries = WalkDir::new(dir) // .into_iter() // .map(|entry| entry.unwrap()) // .filter(|e| { // if e.metadata().unwrap().is_dir() { // return false; // } // // if !e.file_name().to_string_lossy().ends_with(".ts") // && !e.file_name().to_string_lossy().ends_with(".js") // && !e.file_name().to_string_lossy().ends_with(".tsx") // { // return false; // } // // true // }) // .collect::>(); // // entries.into_par_iter().for_each(|entry| { // let fm = cm.load_file(entry.path()).expect("failed to load // file"); let _ = c.process_js_file( // fm, // &Options { // swcrc: true, // is_module: true, // // ..Default::default() // }, // ); // }); // // if c.handler.has_errors() { // Err(()) // } else { // Ok(()) // } // }) // .map(|_| ()) // .expect(""); //} //#[test] //fn angular_core() { // project("tests/projects/angular/repo/packages/core/src"); //} // //#[test] //fn rxjs() { // project("tests/projects/rxjs/repo/src"); //} // //#[test] //fn webpack() { // project("tests/projects/webpack/repo/lib"); //} /// should respect modules config in .swcrc #[test] fn issue_225() { let s = file("tests/projects/issue-225/input.js").unwrap(); println!("{}", s); assert!(s.contains("function _interopRequireDefault")); assert!(s.contains("var _foo = _interopRequireDefault(require('foo'))")); } /// should handle exportNamespaceFrom configured by .swcrc #[test] fn issue_226() { let s = file("tests/projects/issue-226/input.js").unwrap(); println!("{}", s); assert!(s.contains("import * as _Foo from 'bar';")); assert!(s.contains("export { _Foo as Foo }")); } /// should handle react correctly #[test] fn issue_351() { let s = file("tests/projects/issue-351/input.js").unwrap(); println!("{}", s); assert!(s.contains(".default.createElement('div', null);")); } /// should handle cjs imports #[test] fn issue_389() { let s = file("tests/projects/issue-389/input.js").unwrap(); println!("{}", s); assert!(s.contains(".default.bar = true")); } /// should handle comments in arrow expression #[test] fn issue_406() { let s = file("tests/projects/issue-406/input.js").unwrap(); println!("{}", s); assert!(s.contains("return true")); } #[test] fn issue_409_1() { let s = file("tests/projects/issue-409-1/input.js").unwrap(); println!("{}", s); assert!(s.contains("JSON.parse")); } #[test] fn issue_409_2() { let s = file("tests/projects/issue-409-2/input.js").unwrap(); println!("{}", s); assert!(!s.contains("JSON.parse")); } /// should handle multiple entries in swcrc #[test] fn issue_414() { let s1 = file("tests/projects/issue-414/a.js").unwrap(); println!("{}", s1); assert!(s1.contains("require('foo')")); let s2 = file("tests/projects/issue-414/b.ts").unwrap(); println!("{}", s2); assert!(s2.contains("define(['bar'], function(_bar) {")); } /// should handle comments in return statement #[test] fn issue_415() { let s = file("tests/projects/issue-415/input.js").unwrap(); assert!(s.replace(" ", "").contains("return(/*#__PURE__*/")); } #[test] fn issue_466_1() { project("tests/projects/issue-466-1"); } #[test] fn issue_466_2() { project("tests/projects/issue-466-2"); } #[test] fn issue_467() { project("tests/projects/issue-467/"); } #[test] fn issue_468() { file("tests/projects/issue-468/input.ts").expect("failed to parse typescript"); } #[test] fn issue_528() { let f = file("tests/projects/issue-528/input.js") .unwrap() .replace(" ", ""); let f = f.trim(); println!("{}", f); assert_eq!( f, "\ //bar [ //foo a, //baz //bar b ];" ); }