chore: Update swc_core to v0.28.10
(#41016)
This PR updates swc crates to 447e2449d9
This commit is contained in:
parent
6fa78a136a
commit
3f2fef19bc
18 changed files with 762 additions and 862 deletions
|
@ -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",
|
||||
]
|
1038
packages/next-swc/Cargo.lock
generated
1038
packages/next-swc/Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -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
|
|
@ -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"
|
||||
|
|
|
@ -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>,
|
||||
|
||||
|
|
|
@ -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()
|
||||
);
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()?;
|
||||
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
] }
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
|
|
|
@ -72,7 +72,6 @@ Error:
|
|||
x Unexpected eof
|
||||
,----
|
||||
1 | export default () => <div/
|
||||
: ^
|
||||
\`----
|
||||
|
||||
Caused by:
|
||||
|
|
Loading…
Reference in a new issue