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]
rustdocflags = []
rustflags = [
"-Z",
"new-llvm-pass-manager=no",
]
[target.aarch64-apple-darwin]
rustflags = [
"-Z",
"new-llvm-pass-manager=no",
]
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
rustflags = [
"-Z",
"new-llvm-pass-manager=no",
]
[target.aarch64-unknown-linux-musl]
linker = "aarch64-linux-musl-gcc"
@ -27,31 +13,7 @@ rustflags = [
"target-feature=-crt-static",
"-C",
"link-arg=-lgcc",
"-Z",
"new-llvm-pass-manager=no",
]
[target.armv7-unknown-linux-gnueabihf]
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]
opt-level = 2
# This is a workaround for wasm timeout issue
[profile.dev.package."*"]
debug-assertions = false
[profile.release]
lto = true

View file

@ -28,7 +28,7 @@ styled_jsx = {path="../styled_jsx"}
modularize_imports = {path="../modularize_imports"}
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",
"ecma_ast",
"ecma_visit",
@ -48,6 +48,6 @@ swc_core = { version = "0.27.4", features = [
] }
[dev-dependencies]
swc_core = { version = "0.27.4", features = ["testing_transform"] }
testing = "0.31.1"
swc_core = { version = "0.28.10", features = ["testing_transform"] }
testing = "0.31.3"
walkdir = "2.3.2"

View file

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

View file

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

View file

@ -19,9 +19,9 @@ regex = "1.5"
serde = "1"
sourcemap = "6.0.1"
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]
swc_core = { version = "0.27.4", features = ["testing_transform", "ecma_transforms_react"] }
testing = "0.31.1"
swc_core = { version = "0.28.10", features = ["testing_transform", "ecma_transforms_react"] }
testing = "0.31.3"
serde_json = "1"

View file

@ -15,8 +15,8 @@ handlebars = "4.2.1"
once_cell = "1.13.0"
regex = "1.5"
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]
swc_core = { version = "0.27.4", features = ["testing_transform"] }
testing = "0.31.1"
swc_core = { version = "0.28.10", features = ["testing_transform"] }
testing = "0.31.3"

View file

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

View file

@ -13,7 +13,7 @@ use swc_core::{
common::{
collections::AHashMap,
errors::{ColorConfig, Handler},
BytePos, FileName, SourceMap, Span,
BytePos, FileName, Globals, SourceMap, Span, GLOBALS,
},
ecma::ast::*,
ecma::atoms::JsWord,
@ -69,10 +69,11 @@ impl Task for BundleTask {
.map(JsWord::from)
.collect::<Vec<_>>();
let globals = Globals::default();
let comments = self.c.comments().clone();
//
let mut bundler = Bundler::new(
self.c.globals(),
&globals,
self.c.cm.clone(),
CustomLoader {
cm: self.c.cm.clone(),
@ -88,46 +89,46 @@ impl Task for BundleTask {
},
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 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 output = outputs.into_iter().next().ok_or_else(|| {
anyhow!("swc_bundler::Bundle::bundle returned empty result")
})?;
let output = outputs
.into_iter()
.next()
.ok_or_else(|| anyhow!("swc_bundler::Bundle::bundle returned empty result"))?;
let source_map_names = {
let mut v = SourceMapIdentCollector {
names: Default::default(),
};
let source_map_names = {
let mut v = SourceMapIdentCollector {
names: Default::default(),
output.module.visit_with(&mut v);
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
};
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)
Ok(code)
})
},
)
.convert_err()

View file

@ -35,7 +35,7 @@ use serde::Deserialize;
use std::sync::Arc;
use swc_core::{
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 {
@ -85,15 +85,17 @@ impl Task for MinifyTask {
skip_filename: true,
},
|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(
fm,
handler,
&JsMinifyOptions {
..self.opts.clone()
},
)
self.c.minify(
fm,
handler,
&JsMinifyOptions {
..self.opts.clone()
},
)
})
},
)
.convert_err()
@ -131,7 +133,7 @@ pub fn minify_sync(cx: CallContext) -> napi::Result<JsObject> {
color: ColorConfig::Never,
skip_filename: true,
},
|handler| c.minify(fm, handler, &opts),
|handler| GLOBALS.set(&Default::default(), || c.minify(fm, handler, &opts)),
)
.convert_err()?;

View file

@ -4,7 +4,9 @@ use napi::{CallContext, Either, Env, JsObject, JsString, JsUndefined, Task};
use std::sync::Arc;
use swc_core::{
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 {
@ -22,41 +24,44 @@ impl Task for ParseTask {
type JsValue = JsString;
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 comments = c.comments().clone();
let comments: Option<&dyn Comments> = if options.comments {
Some(&comments)
} else {
None
};
let fm =
c.cm.new_source_file(self.filename.clone(), self.src.clone());
let program = try_with_handler(
c.cm.clone(),
swc_core::base::HandlerOpts {
color: ColorConfig::Never,
skip_filename: false,
},
|handler| {
c.parse_js(
fm,
handler,
options.target,
options.syntax,
options.is_module,
comments,
)
},
)
.convert_err()?;
let ast_json = serde_json::to_string(&program)
.context("failed to serialize Program")
let options: ParseOptions = deserialize_json(&self.options).convert_err()?;
let comments = c.comments().clone();
let comments: Option<&dyn Comments> = if options.comments {
Some(&comments)
} else {
None
};
let fm =
c.cm.new_source_file(self.filename.clone(), self.src.clone());
let program = try_with_handler(
c.cm.clone(),
swc_core::base::HandlerOpts {
color: ColorConfig::Never,
skip_filename: false,
},
|handler| {
c.parse_js(
fm,
handler,
options.target,
options.syntax,
options.is_module,
comments,
)
},
)
.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> {

View file

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

View file

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

View file

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

View file

@ -25,13 +25,14 @@ parking_lot_core = "=0.8.0"
path-clean = "0.1"
serde = {version = "1", features = ["derive"]}
serde_json = "1"
tracing = { version = "0.1.32", features = ["release_max_level_off"] }
wasm-bindgen = {version = "0.2", features = ["serde-serialize", "enable-interning"]}
tracing = { version = "0.1.32", features = ["release_max_level_off","max_level_off"] }
wasm-bindgen = {version = "0.2", features = ["enable-interning"]}
wasm-bindgen-futures = "0.4.8"
getrandom = { version = "0.2.5", optional = true, default-features = false }
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",
"binding_macro_wasm",
"ecma_codegen",
@ -45,3 +46,12 @@ swc_core = { version = "0.27.4", features = [
"ecma_utils",
"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 js_sys::JsString;
use next_swc::{custom_before_pass, TransformOptions};
use once_cell::sync::Lazy;
use std::sync::Arc;
use wasm_bindgen::{prelude::*, JsCast};
use wasm_bindgen_futures::future_to_promise;
use swc_core::{
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,
};
@ -22,24 +23,28 @@ pub fn minify_sync(s: JsString, opts: JsValue) -> Result<JsValue, JsValue> {
let c = compiler();
try_with_handler(
let opts: JsMinifyOptions = serde_wasm_bindgen::from_value(opts)?;
let value = try_with_handler(
c.cm.clone(),
swc_core::base::HandlerOpts {
color: ColorConfig::Never,
skip_filename: false,
},
|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());
let program = c
.minify(fm, handler, &opts)
.context("failed to minify file")?;
JsValue::from_serde(&program).context("failed to serialize json")
Ok(program)
})
},
)
.map_err(convert_err)
.map_err(convert_err)?;
Ok(serde_wasm_bindgen::to_value(&value)?)
}
#[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();
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(),
swc_core::base::HandlerOpts {
color: ColorConfig::Never,
skip_filename: false,
},
|handler| {
let opts: TransformOptions = opts.into_serde().context("failed to parse options")?;
let s = s.dyn_into::<js_sys::JsString>();
let out = match s {
Ok(s) => {
let fm = c.cm.new_source_file(
if opts.swc.filename.is_empty() {
FileName::Anon
} else {
FileName::Real(opts.swc.filename.clone().into())
},
s.into(),
);
let cm = c.cm.clone();
let file = fm.clone();
c.process_js_with_custom_pass(
fm,
None,
GLOBALS.set(&Default::default(), || {
let out = match s {
Ok(s) => {
let fm = c.cm.new_source_file(
if opts.swc.filename.is_empty() {
FileName::Anon
} else {
FileName::Real(opts.swc.filename.clone().into())
},
s.into(),
);
let cm = c.cm.clone();
let file = fm.clone();
c.process_js_with_custom_pass(
fm,
None,
handler,
&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,
serde_wasm_bindgen::from_value(v).expect(""),
&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")]
@ -116,6 +128,7 @@ pub fn parse_sync(s: JsString, opts: JsValue) -> Result<JsValue, JsValue> {
console_error_panic_hook::set_once();
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(
c.cm.clone(),
@ -124,30 +137,30 @@ pub fn parse_sync(s: JsString, opts: JsValue) -> Result<JsValue, JsValue> {
},
|handler| {
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 comments = if opts.comments {
Some(&cmts as &dyn Comments)
} else {
None
};
let program = c
.parse_js(
fm,
handler,
opts.target,
opts.syntax,
opts.is_module,
comments,
)
.context("failed to parse code")?;
let program = c
.parse_js(
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))
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
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))
});
C.clone()
Arc::new(Compiler::new(cm))
}

View file

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