chore: Update swc_core to v0.28.10 (#41016)

This PR updates swc crates to 447e2449d9
This commit is contained in:
Donny/강동윤 2022-09-29 23:09:20 +09:00 committed by GitHub
parent 6fa78a136a
commit 3f2fef19bc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 762 additions and 862 deletions

View file

@ -2,23 +2,9 @@
[build] [build]
rustdocflags = [] rustdocflags = []
rustflags = [
"-Z",
"new-llvm-pass-manager=no",
]
[target.aarch64-apple-darwin]
rustflags = [
"-Z",
"new-llvm-pass-manager=no",
]
[target.aarch64-unknown-linux-gnu] [target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc" linker = "aarch64-linux-gnu-gcc"
rustflags = [
"-Z",
"new-llvm-pass-manager=no",
]
[target.aarch64-unknown-linux-musl] [target.aarch64-unknown-linux-musl]
linker = "aarch64-linux-musl-gcc" linker = "aarch64-linux-musl-gcc"
@ -27,31 +13,7 @@ rustflags = [
"target-feature=-crt-static", "target-feature=-crt-static",
"-C", "-C",
"link-arg=-lgcc", "link-arg=-lgcc",
"-Z",
"new-llvm-pass-manager=no",
] ]
[target.armv7-unknown-linux-gnueabihf] [target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc" linker = "arm-linux-gnueabihf-gcc"
rustflags = [
"-Z",
"new-llvm-pass-manager=no",
]
[target.aarch64-linux-android]
rustflags = [
"-Z",
"new-llvm-pass-manager=no",
]
[target.aarch64-pc-windows-msvc]
rustflags = [
"-Z",
"new-llvm-pass-manager=no",
]
[target.wasm32-unknown-unknown]
rustflags = [
"-Z",
"new-llvm-pass-manager=no",
]

File diff suppressed because it is too large Load diff

View file

@ -9,5 +9,9 @@ members = [
[profile.dev.package.swc_css_prefixer] [profile.dev.package.swc_css_prefixer]
opt-level = 2 opt-level = 2
# This is a workaround for wasm timeout issue
[profile.dev.package."*"]
debug-assertions = false
[profile.release] [profile.release]
lto = true lto = true

View file

@ -28,7 +28,7 @@ styled_jsx = {path="../styled_jsx"}
modularize_imports = {path="../modularize_imports"} modularize_imports = {path="../modularize_imports"}
tracing = { version = "0.1.32", features = ["release_max_level_info"] } tracing = { version = "0.1.32", features = ["release_max_level_info"] }
swc_core = { version = "0.27.4", features = [ swc_core = { version = "0.28.10", features = [
"common_concurrent", "common_concurrent",
"ecma_ast", "ecma_ast",
"ecma_visit", "ecma_visit",
@ -48,6 +48,6 @@ swc_core = { version = "0.27.4", features = [
] } ] }
[dev-dependencies] [dev-dependencies]
swc_core = { version = "0.27.4", features = ["testing_transform"] } swc_core = { version = "0.28.10", features = ["testing_transform"] }
testing = "0.31.1" testing = "0.31.3"
walkdir = "2.3.2" walkdir = "2.3.2"

View file

@ -103,6 +103,12 @@ pub struct TransformOptions {
#[cfg(not(target_arch = "wasm32"))] #[cfg(not(target_arch = "wasm32"))]
pub relay: Option<relay::Config>, pub relay: Option<relay::Config>,
#[allow(unused)]
#[serde(default)]
#[cfg(target_arch = "wasm32")]
/// Accept any value
pub relay: Option<serde_json::Value>,
#[serde(default)] #[serde(default)]
pub shake_exports: Option<shake_exports::Config>, pub shake_exports: Option<shake_exports::Config>,

View file

@ -8,7 +8,7 @@ use once_cell::sync::Lazy;
use swc_core::{ use swc_core::{
base::{try_with_handler, Compiler}, base::{try_with_handler, Compiler},
common::{FileName, FilePathMapping, SourceMap}, common::{FileName, FilePathMapping, SourceMap, GLOBALS},
ecma::transforms::base::pass::noop, ecma::transforms::base::pass::noop,
}; };
@ -41,14 +41,16 @@ export function getServerSideProps() {
); );
assert!( assert!(
try_with_handler(COMPILER.cm.clone(), Default::default(), |handler| { try_with_handler(COMPILER.cm.clone(), Default::default(), |handler| {
COMPILER.process_js_with_custom_pass( GLOBALS.set(&Default::default(), || {
fm, COMPILER.process_js_with_custom_pass(
None, fm,
handler, None,
&Default::default(), handler,
|_, _| next_ssg(eliminated_packages.clone()), &Default::default(),
|_, _| noop(), |_, _| next_ssg(eliminated_packages.clone()),
) |_, _| noop(),
)
})
}) })
.is_ok() .is_ok()
); );

View file

@ -19,9 +19,9 @@ regex = "1.5"
serde = "1" serde = "1"
sourcemap = "6.0.1" sourcemap = "6.0.1"
tracing = { version = "0.1.32", features = ["release_max_level_info"] } tracing = { version = "0.1.32", features = ["release_max_level_info"] }
swc_core = { version = "0.27.4", features = ["common", "ecma_ast","ecma_codegen", "ecma_utils", "ecma_visit", "trace_macro"] } swc_core = { version = "0.28.10", features = ["common", "ecma_ast","ecma_codegen", "ecma_utils", "ecma_visit", "trace_macro"] }
[dev-dependencies] [dev-dependencies]
swc_core = { version = "0.27.4", features = ["testing_transform", "ecma_transforms_react"] } swc_core = { version = "0.28.10", features = ["testing_transform", "ecma_transforms_react"] }
testing = "0.31.1" testing = "0.31.3"
serde_json = "1" serde_json = "1"

View file

@ -15,8 +15,8 @@ handlebars = "4.2.1"
once_cell = "1.13.0" once_cell = "1.13.0"
regex = "1.5" regex = "1.5"
serde = "1" serde = "1"
swc_core = { version = "0.27.4", features = ["cached", "ecma_ast", "ecma_visit"] } swc_core = { version = "0.28.10", features = ["cached", "ecma_ast", "ecma_visit"] }
[dev-dependencies] [dev-dependencies]
swc_core = { version = "0.27.4", features = ["testing_transform"] } swc_core = { version = "0.28.10", features = ["testing_transform"] }
testing = "0.31.1" testing = "0.31.3"

View file

@ -30,7 +30,7 @@ next-swc = {version = "0.0.0", path = "../core"}
once_cell = "1.13.0" once_cell = "1.13.0"
serde = "1" serde = "1"
serde_json = "1" serde_json = "1"
swc_core = { version = "0.27.4", features = [ swc_core = { version = "0.28.10", features = [
"allocator_node", "allocator_node",
"base_concurrent", # concurrent? "base_concurrent", # concurrent?
"common_concurrent", "common_concurrent",

View file

@ -13,7 +13,7 @@ use swc_core::{
common::{ common::{
collections::AHashMap, collections::AHashMap,
errors::{ColorConfig, Handler}, errors::{ColorConfig, Handler},
BytePos, FileName, SourceMap, Span, BytePos, FileName, Globals, SourceMap, Span, GLOBALS,
}, },
ecma::ast::*, ecma::ast::*,
ecma::atoms::JsWord, ecma::atoms::JsWord,
@ -69,10 +69,11 @@ impl Task for BundleTask {
.map(JsWord::from) .map(JsWord::from)
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let globals = Globals::default();
let comments = self.c.comments().clone(); let comments = self.c.comments().clone();
// //
let mut bundler = Bundler::new( let mut bundler = Bundler::new(
self.c.globals(), &globals,
self.c.cm.clone(), self.c.cm.clone(),
CustomLoader { CustomLoader {
cm: self.c.cm.clone(), cm: self.c.cm.clone(),
@ -88,46 +89,46 @@ impl Task for BundleTask {
}, },
Box::new(CustomHook), Box::new(CustomHook),
); );
GLOBALS.set(&globals, || {
let mut entries = HashMap::default();
let path: PathBuf = option.entry;
let path = path
.canonicalize()
.context("failed to canonicalize entry file")?;
entries.insert("main".to_string(), FileName::Real(path));
let outputs = bundler.bundle(entries)?;
let mut entries = HashMap::default(); let output = outputs.into_iter().next().ok_or_else(|| {
let path: PathBuf = option.entry; anyhow!("swc_bundler::Bundle::bundle returned empty result")
let path = path })?;
.canonicalize()
.context("failed to canonicalize entry file")?;
entries.insert("main".to_string(), FileName::Real(path));
let outputs = bundler.bundle(entries)?;
let output = outputs let source_map_names = {
.into_iter() let mut v = SourceMapIdentCollector {
.next() names: Default::default(),
.ok_or_else(|| anyhow!("swc_bundler::Bundle::bundle returned empty result"))?; };
let source_map_names = { output.module.visit_with(&mut v);
let mut v = SourceMapIdentCollector {
names: Default::default(), v.names
}; };
output.module.visit_with(&mut v); let code = self.c.print(
&output.module,
None,
None,
true,
EsVersion::Es5,
SourceMapsConfig::Bool(true),
&source_map_names,
None,
false,
Some(&comments),
true,
false,
)?;
v.names Ok(code)
}; })
let code = self.c.print(
&output.module,
None,
None,
true,
EsVersion::Es5,
SourceMapsConfig::Bool(true),
&source_map_names,
None,
false,
Some(&comments),
true,
false,
)?;
Ok(code)
}, },
) )
.convert_err() .convert_err()

View file

@ -35,7 +35,7 @@ use serde::Deserialize;
use std::sync::Arc; use std::sync::Arc;
use swc_core::{ use swc_core::{
base::{config::JsMinifyOptions, try_with_handler, TransformOutput}, base::{config::JsMinifyOptions, try_with_handler, TransformOutput},
common::{errors::ColorConfig, sync::Lrc, FileName, SourceFile, SourceMap}, common::{errors::ColorConfig, sync::Lrc, FileName, SourceFile, SourceMap, GLOBALS},
}; };
struct MinifyTask { struct MinifyTask {
@ -85,15 +85,17 @@ impl Task for MinifyTask {
skip_filename: true, skip_filename: true,
}, },
|handler| { |handler| {
let fm = self.code.to_file(self.c.cm.clone()); GLOBALS.set(&Default::default(), || {
let fm = self.code.to_file(self.c.cm.clone());
self.c.minify( self.c.minify(
fm, fm,
handler, handler,
&JsMinifyOptions { &JsMinifyOptions {
..self.opts.clone() ..self.opts.clone()
}, },
) )
})
}, },
) )
.convert_err() .convert_err()
@ -131,7 +133,7 @@ pub fn minify_sync(cx: CallContext) -> napi::Result<JsObject> {
color: ColorConfig::Never, color: ColorConfig::Never,
skip_filename: true, skip_filename: true,
}, },
|handler| c.minify(fm, handler, &opts), |handler| GLOBALS.set(&Default::default(), || c.minify(fm, handler, &opts)),
) )
.convert_err()?; .convert_err()?;

View file

@ -4,7 +4,9 @@ use napi::{CallContext, Either, Env, JsObject, JsString, JsUndefined, Task};
use std::sync::Arc; use std::sync::Arc;
use swc_core::{ use swc_core::{
base::{config::ParseOptions, try_with_handler}, base::{config::ParseOptions, try_with_handler},
common::{comments::Comments, errors::ColorConfig, FileName, FilePathMapping, SourceMap}, common::{
comments::Comments, errors::ColorConfig, FileName, FilePathMapping, SourceMap, GLOBALS,
},
}; };
pub struct ParseTask { pub struct ParseTask {
@ -22,41 +24,44 @@ impl Task for ParseTask {
type JsValue = JsString; type JsValue = JsString;
fn compute(&mut self) -> napi::Result<Self::Output> { fn compute(&mut self) -> napi::Result<Self::Output> {
let c = swc_core::base::Compiler::new(Arc::new(SourceMap::new(FilePathMapping::empty()))); GLOBALS.set(&Default::default(), || {
let c =
swc_core::base::Compiler::new(Arc::new(SourceMap::new(FilePathMapping::empty())));
let options: ParseOptions = deserialize_json(&self.options).convert_err()?; let options: ParseOptions = deserialize_json(&self.options).convert_err()?;
let comments = c.comments().clone(); let comments = c.comments().clone();
let comments: Option<&dyn Comments> = if options.comments { let comments: Option<&dyn Comments> = if options.comments {
Some(&comments) Some(&comments)
} else { } else {
None None
}; };
let fm = let fm =
c.cm.new_source_file(self.filename.clone(), self.src.clone()); c.cm.new_source_file(self.filename.clone(), self.src.clone());
let program = try_with_handler( let program = try_with_handler(
c.cm.clone(), c.cm.clone(),
swc_core::base::HandlerOpts { swc_core::base::HandlerOpts {
color: ColorConfig::Never, color: ColorConfig::Never,
skip_filename: false, skip_filename: false,
}, },
|handler| { |handler| {
c.parse_js( c.parse_js(
fm, fm,
handler, handler,
options.target, options.target,
options.syntax, options.syntax,
options.is_module, options.is_module,
comments, comments,
) )
}, },
) )
.convert_err()?;
let ast_json = serde_json::to_string(&program)
.context("failed to serialize Program")
.convert_err()?; .convert_err()?;
Ok(ast_json) let ast_json = serde_json::to_string(&program)
.context("failed to serialize Program")
.convert_err()?;
Ok(ast_json)
})
} }
fn resolve(self, env: Env, result: Self::Output) -> napi::Result<Self::JsValue> { fn resolve(self, env: Env, result: Self::Output) -> napi::Result<Self::JsValue> {

View file

@ -44,7 +44,7 @@ use std::{
}; };
use swc_core::{ use swc_core::{
base::{try_with_handler, Compiler, TransformOutput}, base::{try_with_handler, Compiler, TransformOutput},
common::{errors::ColorConfig, FileName}, common::{errors::ColorConfig, FileName, GLOBALS},
ecma::transforms::base::pass::noop, ecma::transforms::base::pass::noop,
}; };
@ -68,83 +68,85 @@ impl Task for TransformTask {
type JsValue = JsObject; type JsValue = JsObject;
fn compute(&mut self) -> napi::Result<Self::Output> { fn compute(&mut self) -> napi::Result<Self::Output> {
let eliminated_packages: Rc<RefCell<fxhash::FxHashSet<String>>> = Default::default(); GLOBALS.set(&Default::default(), || {
let res = catch_unwind(AssertUnwindSafe(|| { let eliminated_packages: Rc<RefCell<fxhash::FxHashSet<String>>> = Default::default();
try_with_handler( let res = catch_unwind(AssertUnwindSafe(|| {
self.c.cm.clone(), try_with_handler(
swc_core::base::HandlerOpts { self.c.cm.clone(),
color: ColorConfig::Never, swc_core::base::HandlerOpts {
skip_filename: true, color: ColorConfig::Never,
}, skip_filename: true,
|handler| { },
self.c.run(|| { |handler| {
let options: TransformOptions = deserialize_json(&self.options)?; self.c.run(|| {
let fm = match &self.input { let options: TransformOptions = deserialize_json(&self.options)?;
Input::Source { src } => { let fm = match &self.input {
let filename = if options.swc.filename.is_empty() { Input::Source { src } => {
FileName::Anon let filename = if options.swc.filename.is_empty() {
} else { FileName::Anon
FileName::Real(options.swc.filename.clone().into()) } else {
}; FileName::Real(options.swc.filename.clone().into())
};
self.c.cm.new_source_file(filename, src.to_string()) self.c.cm.new_source_file(filename, src.to_string())
}
Input::FromFilename => {
let filename = &options.swc.filename;
if filename.is_empty() {
bail!("no filename is provided via options");
} }
Input::FromFilename => {
let filename = &options.swc.filename;
if filename.is_empty() {
bail!("no filename is provided via options");
}
self.c.cm.new_source_file( self.c.cm.new_source_file(
FileName::Real(filename.into()), FileName::Real(filename.into()),
read_to_string(filename).with_context(|| { read_to_string(filename).with_context(|| {
format!("Failed to read source code from {}", filename) format!("Failed to read source code from {}", filename)
})?, })?,
) )
} }
}; };
let options = options.patch(&fm); let options = options.patch(&fm);
let cm = self.c.cm.clone(); let cm = self.c.cm.clone();
let file = fm.clone(); let file = fm.clone();
self.c.process_js_with_custom_pass( self.c.process_js_with_custom_pass(
fm, fm,
None, None,
handler, handler,
&options.swc, &options.swc,
|_, comments| { |_, comments| {
custom_before_pass( custom_before_pass(
cm, cm,
file, file,
&options, &options,
comments.clone(), comments.clone(),
eliminated_packages.clone(), eliminated_packages.clone(),
) )
}, },
|_, _| noop(), |_, _| noop(),
) )
}) })
}, },
) )
})) }))
.map_err(|err| { .map_err(|err| {
if let Some(s) = err.downcast_ref::<String>() { if let Some(s) = err.downcast_ref::<String>() {
anyhow!("failed to process {}", s) anyhow!("failed to process {}", s)
} else { } else {
anyhow!("failed to process") anyhow!("failed to process")
}
});
match res {
Ok(res) => res
.map(|o| (o, eliminated_packages.replace(Default::default())))
.convert_err(),
Err(err) => Err(napi::Error::new(
Status::GenericFailure,
format!("{:?}", err),
)),
} }
}); })
match res {
Ok(res) => res
.map(|o| (o, eliminated_packages.replace(Default::default())))
.convert_err(),
Err(err) => Err(napi::Error::new(
Status::GenericFailure,
format!("{:?}", err),
)),
}
} }
fn resolve( fn resolve(

View file

@ -16,7 +16,7 @@ once_cell = "1.13.0"
regex = {version = "1.5.4", features = ["std", "perf"], default-features = false} regex = {version = "1.5.4", features = ["std", "perf"], default-features = false}
serde = {version = "1.0.130", features = ["derive"]} serde = {version = "1.0.130", features = ["derive"]}
tracing = "0.1.32" tracing = "0.1.32"
swc_core = { version = "0.27.4", features = [ swc_core = { version = "0.28.10", features = [
"common", "common",
"ecma_ast", "ecma_ast",
"ecma_utils", "ecma_utils",
@ -25,8 +25,8 @@ swc_core = { version = "0.27.4", features = [
[dev-dependencies] [dev-dependencies]
serde_json = "1" serde_json = "1"
testing = "0.31.1" testing = "0.31.3"
swc_core = { version = "0.27.4", features = [ swc_core = { version = "0.28.10", features = [
"ecma_parser", "ecma_parser",
"ecma_transforms", "ecma_transforms",
"testing_transform" "testing_transform"

View file

@ -13,7 +13,7 @@ version = "0.20.0"
easy-error = "1.0.0" easy-error = "1.0.0"
tracing = "0.1.32" tracing = "0.1.32"
swc_core = { version = "0.27.4", features = [ swc_core = { version = "0.28.10", features = [
"common", "common",
"css_ast", "css_ast",
"css_codegen", "css_codegen",
@ -27,7 +27,7 @@ swc_core = { version = "0.27.4", features = [
] } ] }
[dev-dependencies] [dev-dependencies]
testing = "0.31.1" testing = "0.31.3"
swc_core = { version = "0.27.4", features = [ swc_core = { version = "0.28.10", features = [
"testing_transform" "testing_transform"
] } ] }

View file

@ -25,13 +25,14 @@ parking_lot_core = "=0.8.0"
path-clean = "0.1" path-clean = "0.1"
serde = {version = "1", features = ["derive"]} serde = {version = "1", features = ["derive"]}
serde_json = "1" serde_json = "1"
tracing = { version = "0.1.32", features = ["release_max_level_off"] } tracing = { version = "0.1.32", features = ["release_max_level_off","max_level_off"] }
wasm-bindgen = {version = "0.2", features = ["serde-serialize", "enable-interning"]} wasm-bindgen = {version = "0.2", features = ["enable-interning"]}
wasm-bindgen-futures = "0.4.8" wasm-bindgen-futures = "0.4.8"
getrandom = { version = "0.2.5", optional = true, default-features = false } getrandom = { version = "0.2.5", optional = true, default-features = false }
js-sys = "0.3.59" js-sys = "0.3.59"
serde-wasm-bindgen = "0.4.3"
swc_core = { version = "0.27.4", features = [ swc_core = { version = "0.28.10", features = [
"common_concurrent", "common_concurrent",
"binding_macro_wasm", "binding_macro_wasm",
"ecma_codegen", "ecma_codegen",
@ -45,3 +46,12 @@ swc_core = { version = "0.27.4", features = [
"ecma_utils", "ecma_utils",
"ecma_visit" "ecma_visit"
] } ] }
# Workaround a bug
[package.metadata.wasm-pack.profile.release]
wasm-opt = false
# Workaround a bug
[package.metadata.wasm-pack.profile.dev]
wasm-opt = false

View file

@ -1,14 +1,15 @@
use anyhow::{Context, Error}; use anyhow::{Context, Error};
use js_sys::JsString; use js_sys::JsString;
use next_swc::{custom_before_pass, TransformOptions}; use next_swc::{custom_before_pass, TransformOptions};
use once_cell::sync::Lazy;
use std::sync::Arc; use std::sync::Arc;
use wasm_bindgen::{prelude::*, JsCast}; use wasm_bindgen::{prelude::*, JsCast};
use wasm_bindgen_futures::future_to_promise; use wasm_bindgen_futures::future_to_promise;
use swc_core::{ use swc_core::{
base::{config::JsMinifyOptions, config::ParseOptions, try_with_handler, Compiler}, base::{config::JsMinifyOptions, config::ParseOptions, try_with_handler, Compiler},
common::{comments::Comments, errors::ColorConfig, FileName, FilePathMapping, SourceMap}, common::{
comments::Comments, errors::ColorConfig, FileName, FilePathMapping, SourceMap, GLOBALS,
},
ecma::transforms::base::pass::noop, ecma::transforms::base::pass::noop,
}; };
@ -22,24 +23,28 @@ pub fn minify_sync(s: JsString, opts: JsValue) -> Result<JsValue, JsValue> {
let c = compiler(); let c = compiler();
try_with_handler( let opts: JsMinifyOptions = serde_wasm_bindgen::from_value(opts)?;
let value = try_with_handler(
c.cm.clone(), c.cm.clone(),
swc_core::base::HandlerOpts { swc_core::base::HandlerOpts {
color: ColorConfig::Never, color: ColorConfig::Never,
skip_filename: false, skip_filename: false,
}, },
|handler| { |handler| {
let opts: JsMinifyOptions = opts.into_serde().context("failed to parse options")?; GLOBALS.set(&Default::default(), || {
let fm = c.cm.new_source_file(FileName::Anon, s.into());
let program = c
.minify(fm, handler, &opts)
.context("failed to minify file")?;
let fm = c.cm.new_source_file(FileName::Anon, s.into()); Ok(program)
let program = c })
.minify(fm, handler, &opts)
.context("failed to minify file")?;
JsValue::from_serde(&program).context("failed to serialize json")
}, },
) )
.map_err(convert_err) .map_err(convert_err)?;
Ok(serde_wasm_bindgen::to_value(&value)?)
} }
#[wasm_bindgen(js_name = "minify")] #[wasm_bindgen(js_name = "minify")]
@ -54,54 +59,61 @@ pub fn transform_sync(s: JsValue, opts: JsValue) -> Result<JsValue, JsValue> {
console_error_panic_hook::set_once(); console_error_panic_hook::set_once();
let c = compiler(); let c = compiler();
let opts: TransformOptions = serde_wasm_bindgen::from_value(opts)?;
try_with_handler( let s = s.dyn_into::<js_sys::JsString>();
let out = try_with_handler(
c.cm.clone(), c.cm.clone(),
swc_core::base::HandlerOpts { swc_core::base::HandlerOpts {
color: ColorConfig::Never, color: ColorConfig::Never,
skip_filename: false, skip_filename: false,
}, },
|handler| { |handler| {
let opts: TransformOptions = opts.into_serde().context("failed to parse options")?; GLOBALS.set(&Default::default(), || {
let out = match s {
let s = s.dyn_into::<js_sys::JsString>(); Ok(s) => {
let out = match s { let fm = c.cm.new_source_file(
Ok(s) => { if opts.swc.filename.is_empty() {
let fm = c.cm.new_source_file( FileName::Anon
if opts.swc.filename.is_empty() { } else {
FileName::Anon FileName::Real(opts.swc.filename.clone().into())
} else { },
FileName::Real(opts.swc.filename.clone().into()) s.into(),
}, );
s.into(), let cm = c.cm.clone();
); let file = fm.clone();
let cm = c.cm.clone(); c.process_js_with_custom_pass(
let file = fm.clone(); fm,
c.process_js_with_custom_pass( None,
fm, handler,
None, &opts.swc,
|_, comments| {
custom_before_pass(
cm,
file,
&opts,
comments.clone(),
Default::default(),
)
},
|_, _| noop(),
)
.context("failed to process js file")?
}
Err(v) => c.process_js(
handler, handler,
serde_wasm_bindgen::from_value(v).expect(""),
&opts.swc, &opts.swc,
|_, comments| { )?,
custom_before_pass( };
cm,
file,
&opts,
comments.clone(),
Default::default(),
)
},
|_, _| noop(),
)
.context("failed to process js file")?
}
Err(v) => c.process_js(handler, v.into_serde().expect(""), &opts.swc)?,
};
JsValue::from_serde(&out).context("failed to serialize json") Ok(out)
})
}, },
) )
.map_err(convert_err) .map_err(convert_err)?;
Ok(serde_wasm_bindgen::to_value(&out)?)
} }
#[wasm_bindgen(js_name = "transform")] #[wasm_bindgen(js_name = "transform")]
@ -116,6 +128,7 @@ pub fn parse_sync(s: JsString, opts: JsValue) -> Result<JsValue, JsValue> {
console_error_panic_hook::set_once(); console_error_panic_hook::set_once();
let c = swc_core::base::Compiler::new(Arc::new(SourceMap::new(FilePathMapping::empty()))); let c = swc_core::base::Compiler::new(Arc::new(SourceMap::new(FilePathMapping::empty())));
let opts: ParseOptions = serde_wasm_bindgen::from_value(opts)?;
try_with_handler( try_with_handler(
c.cm.clone(), c.cm.clone(),
@ -124,30 +137,30 @@ pub fn parse_sync(s: JsString, opts: JsValue) -> Result<JsValue, JsValue> {
}, },
|handler| { |handler| {
c.run(|| { c.run(|| {
let opts: ParseOptions = opts.into_serde().context("failed to parse options")?; GLOBALS.set(&Default::default(), || {
let fm = c.cm.new_source_file(FileName::Anon, s.into());
let fm = c.cm.new_source_file(FileName::Anon, s.into()); let cmts = c.comments().clone();
let comments = if opts.comments {
Some(&cmts as &dyn Comments)
} else {
None
};
let cmts = c.comments().clone(); let program = c
let comments = if opts.comments { .parse_js(
Some(&cmts as &dyn Comments) fm,
} else { handler,
None opts.target,
}; opts.syntax,
opts.is_module,
comments,
)
.context("failed to parse code")?;
let program = c let s = serde_json::to_string(&program).unwrap();
.parse_js( Ok(JsValue::from_str(&s))
fm, })
handler,
opts.target,
opts.syntax,
opts.is_module,
comments,
)
.context("failed to parse code")?;
let s = serde_json::to_string(&program).unwrap();
Ok(JsValue::from_str(&s))
}) })
}, },
) )
@ -163,11 +176,7 @@ pub fn parse(s: JsString, opts: JsValue) -> js_sys::Promise {
/// Get global sourcemap /// Get global sourcemap
fn compiler() -> Arc<Compiler> { fn compiler() -> Arc<Compiler> {
static C: Lazy<Arc<Compiler>> = Lazy::new(|| { let cm = Arc::new(SourceMap::new(FilePathMapping::empty()));
let cm = Arc::new(SourceMap::new(FilePathMapping::empty()));
Arc::new(Compiler::new(cm)) Arc::new(Compiler::new(cm))
});
C.clone()
} }

View file

@ -72,7 +72,6 @@ Error:
x Unexpected eof x Unexpected eof
,---- ,----
1 | export default () => <div/ 1 | export default () => <div/
: ^
\`---- \`----
Caused by: Caused by: