From 33bc3d2b91f5f85dc1375d568b7a1e2ca2397749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Fri, 29 Oct 2021 23:36:11 +0900 Subject: [PATCH] feat(es/transforms/regenerator): Allow configuring import path (#2581) swc_ecma_transforms_compat: - `regenerator`: Allow configuring import path of `regenerator-runtime`. --- Cargo.lock | 24 +++++------ Cargo.toml | 14 +++---- bundler/Cargo.toml | 10 ++--- ecmascript/Cargo.toml | 8 ++-- ecmascript/minifier/Cargo.toml | 4 +- ecmascript/preset-env/Cargo.toml | 4 +- ecmascript/preset-env/src/lib.rs | 7 +++- ecmascript/transforms/Cargo.toml | 14 +++---- ecmascript/transforms/compat/Cargo.toml | 2 +- .../transforms/compat/src/es2015/mod.rs | 10 +++-- .../compat/src/es2015/regenerator/mod.rs | 42 +++++++++++++++---- .../compat/tests/es2015_regenerator.rs | 21 ++++++---- .../compat/tests/es2017_async_to_generator.rs | 9 ++-- ecmascript/transforms/module/Cargo.toml | 4 +- .../transforms/module/tests/common_js.rs | 7 +++- ecmascript/transforms/optimization/Cargo.toml | 12 +++--- ecmascript/transforms/proposal/Cargo.toml | 6 +-- ecmascript/transforms/react/Cargo.toml | 6 +-- ecmascript/transforms/typescript/Cargo.toml | 10 ++--- node/bundler/src/loaders/swc.rs | 1 + src/builder.rs | 11 ++++- src/config/mod.rs | 7 ++++ .../config/regenerator/import-path/1/.swcrc | 9 ++++ .../regenerator/import-path/1/input/index.js | 8 ++++ .../regenerator/import-path/1/output/index.js | 20 +++++++++ 25 files changed, 184 insertions(+), 86 deletions(-) create mode 100644 tests/fixture/config/regenerator/import-path/1/.swcrc create mode 100644 tests/fixture/config/regenerator/import-path/1/input/index.js create mode 100644 tests/fixture/config/regenerator/import-path/1/output/index.js diff --git a/Cargo.lock b/Cargo.lock index e487710dad2..7ac5b3c1638 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2325,7 +2325,7 @@ checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" [[package]] name = "swc" -version = "0.79.2" +version = "0.80.0" dependencies = [ "ahash", "anyhow", @@ -2431,7 +2431,7 @@ dependencies = [ [[package]] name = "swc_bundler" -version = "0.77.1" +version = "0.78.0" dependencies = [ "ahash", "anyhow", @@ -2679,7 +2679,7 @@ dependencies = [ [[package]] name = "swc_ecma_minifier" -version = "0.46.7" +version = "0.47.0" dependencies = [ "ahash", "ansi_term 0.12.1", @@ -2737,7 +2737,7 @@ dependencies = [ [[package]] name = "swc_ecma_preset_env" -version = "0.61.0" +version = "0.62.0" dependencies = [ "ahash", "dashmap", @@ -2763,7 +2763,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms" -version = "0.90.0" +version = "0.91.0" dependencies = [ "pretty_assertions 0.6.1", "sourcemap", @@ -2823,7 +2823,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_compat" -version = "0.47.2" +version = "0.48.0" dependencies = [ "ahash", "arrayvec", @@ -2861,7 +2861,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_module" -version = "0.53.0" +version = "0.54.0" dependencies = [ "Inflector", "ahash", @@ -2884,7 +2884,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_optimization" -version = "0.60.2" +version = "0.61.0" dependencies = [ "ahash", "dashmap", @@ -2913,7 +2913,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_proposal" -version = "0.53.0" +version = "0.54.0" dependencies = [ "either", "serde", @@ -2937,7 +2937,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_react" -version = "0.55.2" +version = "0.56.0" dependencies = [ "ahash", "base64 0.13.0", @@ -2986,7 +2986,7 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_typescript" -version = "0.56.1" +version = "0.57.0" dependencies = [ "serde", "swc_atoms 0.2.9", @@ -3034,7 +3034,7 @@ dependencies = [ [[package]] name = "swc_ecmascript" -version = "0.82.0" +version = "0.83.0" dependencies = [ "swc_ecma_ast", "swc_ecma_codegen", diff --git a/Cargo.toml b/Cargo.toml index 3f649474c19..96b22e7172c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ include = ["Cargo.toml", "src/**/*.rs"] license = "Apache-2.0/MIT" name = "swc" repository = "https://github.com/swc-project/swc.git" -version = "0.79.2" +version = "0.80.0" [lib] name = "swc" @@ -65,10 +65,10 @@ swc_ecma_ast = {version = "0.56.0", path = "./ecmascript/ast"} swc_ecma_codegen = {version = "0.78.0", path = "./ecmascript/codegen"} swc_ecma_ext_transforms = {version = "0.35.0", path = "./ecmascript/ext-transforms"} swc_ecma_loader = {version = "0.23.0", path = "./ecmascript/loader", features = ["lru", "node", "tsc"]} -swc_ecma_minifier = {version = "0.46.0", path = "./ecmascript/minifier"} +swc_ecma_minifier = {version = "0.47.0", path = "./ecmascript/minifier"} swc_ecma_parser = {version = "0.76.0", path = "./ecmascript/parser"} -swc_ecma_preset_env = {version = "0.61.0", path = "./ecmascript/preset-env"} -swc_ecma_transforms = {version = "0.90.0", path = "./ecmascript/transforms", features = [ +swc_ecma_preset_env = {version = "0.62.0", path = "./ecmascript/preset-env"} +swc_ecma_transforms = {version = "0.91.0", path = "./ecmascript/transforms", features = [ "compat", "module", "optimization", @@ -77,11 +77,11 @@ swc_ecma_transforms = {version = "0.90.0", path = "./ecmascript/transforms", fea "typescript", ]} swc_ecma_transforms_base = {version = "0.41.0", path = "./ecmascript/transforms/base"} -swc_ecma_transforms_compat = {version = "0.47.0", path = "./ecmascript/transforms/compat"} -swc_ecma_transforms_optimization = {version = "0.60.0", path = "./ecmascript/transforms/optimization"} +swc_ecma_transforms_compat = {version = "0.48.0", path = "./ecmascript/transforms/compat"} +swc_ecma_transforms_optimization = {version = "0.61.0", path = "./ecmascript/transforms/optimization"} swc_ecma_utils = {version = "0.49.0", path = "./ecmascript/utils"} swc_ecma_visit = {version = "0.42.0", path = "./ecmascript/visit"} -swc_ecmascript = {version = "0.82.0", path = "./ecmascript"} +swc_ecmascript = {version = "0.83.0", path = "./ecmascript"} swc_visit = {version = "0.2.3", path = "./visit"} tracing = "0.1.28" diff --git a/bundler/Cargo.toml b/bundler/Cargo.toml index 2717b271083..dea312ddc77 100644 --- a/bundler/Cargo.toml +++ b/bundler/Cargo.toml @@ -9,7 +9,7 @@ include = ["Cargo.toml", "build.rs", "src/**/*.rs", "src/**/*.js"] license = "Apache-2.0/MIT" name = "swc_bundler" repository = "https://github.com/swc-project/swc.git" -version = "0.77.1" +version = "0.78.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] @@ -43,7 +43,7 @@ swc_ecma_codegen = {version = "0.78.0", path = "../ecmascript/codegen"} swc_ecma_loader = {version = "0.23.0", path = "../ecmascript/loader"} swc_ecma_parser = {version = "0.76.0", path = "../ecmascript/parser"} swc_ecma_transforms_base = {version = "0.41.0", path = "../ecmascript/transforms/base"} -swc_ecma_transforms_optimization = {version = "0.60.0", path = "../ecmascript/transforms/optimization"} +swc_ecma_transforms_optimization = {version = "0.61.0", path = "../ecmascript/transforms/optimization"} swc_ecma_utils = {version = "0.49.0", path = "../ecmascript/utils"} swc_ecma_visit = {version = "0.42.0", path = "../ecmascript/visit"} tracing = "0.1.28" @@ -55,9 +55,9 @@ path-clean = "=0.1.0" reqwest = {version = "0.11.4", features = ["blocking"]} sha-1 = "0.9" swc_ecma_loader = {version = "0.23.0", path = "../ecmascript/loader", features = ["node", "lru"]} -swc_ecma_minifier = {version = "0.46.0", path = "../ecmascript/minifier"} -swc_ecma_transforms_react = {version = "0.55.0", path = "../ecmascript/transforms/react"} -swc_ecma_transforms_typescript = {version = "0.56.0", path = "../ecmascript/transforms/typescript"} +swc_ecma_minifier = {version = "0.47.0", path = "../ecmascript/minifier"} +swc_ecma_transforms_react = {version = "0.56.0", path = "../ecmascript/transforms/react"} +swc_ecma_transforms_typescript = {version = "0.57.0", path = "../ecmascript/transforms/typescript"} swc_node_base = {version = "0.5.0", path = "../node/base"} tempfile = "3.1.0" testing = {version = "0.15.0", path = "../testing"} diff --git a/ecmascript/Cargo.toml b/ecmascript/Cargo.toml index ad82719a8f3..9ea2072c541 100644 --- a/ecmascript/Cargo.toml +++ b/ecmascript/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecmascript" repository = "https://github.com/swc-project/swc.git" -version = "0.82.0" +version = "0.83.0" [package.metadata.docs.rs] all-features = true @@ -35,10 +35,10 @@ typescript = ["typescript-parser", "swc_ecma_transforms/typescript"] swc_ecma_ast = {version = "0.56.0", path = "./ast"} swc_ecma_codegen = {version = "0.78.0", path = "./codegen", optional = true} swc_ecma_dep_graph = {version = "0.45.0", path = "./dep-graph", optional = true} -swc_ecma_minifier = {version = "0.46.0", path = "./minifier", optional = true} +swc_ecma_minifier = {version = "0.47.0", path = "./minifier", optional = true} swc_ecma_parser = {version = "0.76.0", path = "./parser", optional = true, default-features = false} -swc_ecma_preset_env = {version = "0.61.0", path = "./preset-env", optional = true} -swc_ecma_transforms = {version = "0.90.0", path = "./transforms", optional = true} +swc_ecma_preset_env = {version = "0.62.0", path = "./preset-env", optional = true} +swc_ecma_transforms = {version = "0.91.0", path = "./transforms", optional = true} swc_ecma_utils = {version = "0.49.0", path = "./utils", optional = true} swc_ecma_visit = {version = "0.42.0", path = "./visit", optional = true} diff --git a/ecmascript/minifier/Cargo.toml b/ecmascript/minifier/Cargo.toml index 5e7fe114577..51b64357600 100644 --- a/ecmascript/minifier/Cargo.toml +++ b/ecmascript/minifier/Cargo.toml @@ -7,7 +7,7 @@ include = ["Cargo.toml", "src/**/*.rs", "src/lists/*.json"] license = "Apache-2.0/MIT" name = "swc_ecma_minifier" repository = "https://github.com/swc-project/swc.git" -version = "0.46.7" +version = "0.47.0" [features] debug = ["backtrace"] @@ -29,7 +29,7 @@ swc_common = {version = "0.14.0", path = "../../common"} swc_ecma_ast = {version = "0.56.0", path = "../ast"} swc_ecma_codegen = {version = "0.78.0", path = "../codegen"} swc_ecma_parser = {version = "0.76.0", path = "../parser"} -swc_ecma_transforms = {version = "0.90.0", path = "../transforms/", features = ["optimization"]} +swc_ecma_transforms = {version = "0.91.0", path = "../transforms/", features = ["optimization"]} swc_ecma_transforms_base = {version = "0.41.1", path = "../transforms/base"} swc_ecma_utils = {version = "0.49.0", path = "../utils"} swc_ecma_visit = {version = "0.42.0", path = "../visit"} diff --git a/ecmascript/preset-env/Cargo.toml b/ecmascript/preset-env/Cargo.toml index 6858a08a899..23e077b9c69 100644 --- a/ecmascript/preset-env/Cargo.toml +++ b/ecmascript/preset-env/Cargo.toml @@ -5,7 +5,7 @@ documentation = "https://rustdoc.swc.rs/swc_ecma_preset_env/" edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_preset_env" -version = "0.61.0" +version = "0.62.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -22,7 +22,7 @@ string_enum = {version = "0.3.1", path = "../../macros/string_enum"} swc_atoms = {version = "0.2", path = "../../atoms"} swc_common = {version = "0.14.0", path = "../../common"} swc_ecma_ast = {version = "0.56.0", path = "../ast"} -swc_ecma_transforms = {version = "0.90.0", path = "../transforms", features = ["compat", "proposal"]} +swc_ecma_transforms = {version = "0.91.0", path = "../transforms", features = ["compat", "proposal"]} swc_ecma_utils = {version = "0.49.0", path = "../utils"} swc_ecma_visit = {version = "0.42.0", path = "../visit"} walkdir = "2" diff --git a/ecmascript/preset-env/src/lib.rs b/ecmascript/preset-env/src/lib.rs index 06248ce1606..90dce43f551 100644 --- a/ecmascript/preset-env/src/lib.rs +++ b/ecmascript/preset-env/src/lib.rs @@ -159,7 +159,12 @@ where es2015::destructuring(es2015::destructuring::Config { loose }), true ); - let pass = add!(pass, Regenerator, es2015::regenerator(global_mark), true); + let pass = add!( + pass, + Regenerator, + es2015::regenerator(Default::default(), global_mark), + true + ); let pass = add!(pass, BlockScoping, es2015::block_scoping(), true); // TODO: diff --git a/ecmascript/transforms/Cargo.toml b/ecmascript/transforms/Cargo.toml index 30dbd9bc42d..b92090327f4 100644 --- a/ecmascript/transforms/Cargo.toml +++ b/ecmascript/transforms/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms" repository = "https://github.com/swc-project/swc.git" -version = "0.90.0" +version = "0.91.0" [package.metadata.docs.rs] all-features = true @@ -27,12 +27,12 @@ swc_common = {version = "0.14.0", path = "../../common"} swc_ecma_ast = {version = "0.56.0", path = "../ast"} swc_ecma_parser = {version = "0.76.0", path = "../parser"} swc_ecma_transforms_base = {version = "0.41.0", path = "./base"} -swc_ecma_transforms_compat = {version = "0.47.0", path = "./compat", optional = true} -swc_ecma_transforms_module = {version = "0.53.0", path = "./module", optional = true} -swc_ecma_transforms_optimization = {version = "0.60.0", path = "./optimization", optional = true} -swc_ecma_transforms_proposal = {version = "0.53.0", path = "./proposal", optional = true} -swc_ecma_transforms_react = {version = "0.55.0", path = "./react", optional = true} -swc_ecma_transforms_typescript = {version = "0.56.0", path = "./typescript", optional = true} +swc_ecma_transforms_compat = {version = "0.48.0", path = "./compat", optional = true} +swc_ecma_transforms_module = {version = "0.54.0", path = "./module", optional = true} +swc_ecma_transforms_optimization = {version = "0.61.0", path = "./optimization", optional = true} +swc_ecma_transforms_proposal = {version = "0.54.0", path = "./proposal", optional = true} +swc_ecma_transforms_react = {version = "0.56.0", path = "./react", optional = true} +swc_ecma_transforms_typescript = {version = "0.57.0", path = "./typescript", optional = true} swc_ecma_utils = {version = "0.49.0", path = "../utils"} swc_ecma_visit = {version = "0.42.0", path = "../visit"} unicode-xid = "0.2" diff --git a/ecmascript/transforms/compat/Cargo.toml b/ecmascript/transforms/compat/Cargo.toml index 8c4a9bff140..c382cb1aae6 100644 --- a/ecmascript/transforms/compat/Cargo.toml +++ b/ecmascript/transforms/compat/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms_compat" repository = "https://github.com/swc-project/swc.git" -version = "0.47.2" +version = "0.48.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] diff --git a/ecmascript/transforms/compat/src/es2015/mod.rs b/ecmascript/transforms/compat/src/es2015/mod.rs index a9552470ffe..3068dbffc3f 100644 --- a/ecmascript/transforms/compat/src/es2015/mod.rs +++ b/ecmascript/transforms/compat/src/es2015/mod.rs @@ -22,7 +22,7 @@ mod function_name; mod instanceof; pub mod new_target; mod parameters; -mod regenerator; +pub mod regenerator; mod shorthand_property; pub mod spread; mod sticky_regex; @@ -56,7 +56,7 @@ where for_of(c.for_of), // Should come before parameters // See: https://github.com/swc-project/swc/issues/1036 - regenerator(global_mark), + regenerator(c.regenerator, global_mark), parameters(), computed_properties(), destructuring(c.destructuring), @@ -64,7 +64,8 @@ where ) } -#[derive(Debug, Default, Deserialize)] +#[derive(Debug, Clone, Default, Deserialize)] +#[serde(rename_all = "camelCase")] pub struct Config { #[serde(flatten)] pub for_of: for_of::Config, @@ -74,6 +75,9 @@ pub struct Config { #[serde(flatten)] pub spread: spread::Config, + + #[serde(default)] + pub regenerator: regenerator::Config, } #[cfg(test)] diff --git a/ecmascript/transforms/compat/src/es2015/regenerator/mod.rs b/ecmascript/transforms/compat/src/es2015/regenerator/mod.rs index 76ca5291905..a718fea5d15 100644 --- a/ecmascript/transforms/compat/src/es2015/regenerator/mod.rs +++ b/ecmascript/transforms/compat/src/es2015/regenerator/mod.rs @@ -1,6 +1,7 @@ use self::{case::CaseHandler, hoist::hoist}; +use serde::{Deserialize, Serialize}; use std::mem::take; -use swc_atoms::js_word; +use swc_atoms::{js_word, JsWord}; use swc_common::{Mark, Spanned, DUMMY_SP}; use swc_ecma_ast::*; use swc_ecma_utils::{ @@ -12,9 +13,19 @@ mod case; mod hoist; mod leap; -pub fn regenerator(top_level_mark: Mark) -> impl Fold { +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] + +pub struct Config { + /// Import path used instead of `regenerator-runtime` + #[serde(default)] + pub import_path: Option, +} + +pub fn regenerator(config: Config, top_level_mark: Mark) -> impl Fold { Regenerator { - global_mark: top_level_mark, + config, + top_level_mark, regenerator_runtime: Default::default(), top_level_vars: Default::default(), } @@ -22,14 +33,15 @@ pub fn regenerator(top_level_mark: Mark) -> impl Fold { #[derive(Debug)] struct Regenerator { - global_mark: Mark, + config: Config, + top_level_mark: Mark, /// [Some] if used. regenerator_runtime: Option, /// mark top_level_vars: Vec, } -fn require_rt(global_mark: Mark, rt: Ident) -> Stmt { +fn require_rt(global_mark: Mark, rt: Ident, src: Option) -> Stmt { Stmt::Decl(Decl::Var(VarDecl { span: DUMMY_SP, kind: VarDeclKind::Var, @@ -40,7 +52,9 @@ fn require_rt(global_mark: Mark, rt: Ident) -> Stmt { init: Some(Box::new(Expr::Call(CallExpr { span: DUMMY_SP, callee: quote_ident!(DUMMY_SP.apply_mark(global_mark), "require").as_callee(), - args: vec![quote_str!("regenerator-runtime").as_arg()], + args: vec![ + quote_str!(src.unwrap_or_else(|| "regenerator-runtime".into())).as_arg(), + ], type_args: Default::default(), }))), definite: false, @@ -177,7 +191,11 @@ impl Fold for Regenerator { ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl { span: DUMMY_SP, specifiers: vec![specifier], - src: quote_str!("regenerator-runtime"), + src: quote_str!(self + .config + .import_path + .clone() + .unwrap_or_else(|| "regenerator-runtime".into())), type_only: Default::default(), asserts: Default::default(), })), @@ -279,7 +297,15 @@ impl Fold for Regenerator { fn fold_script(&mut self, s: Script) -> Script { let mut s: Script = s.fold_children_with(self); if let Some(rt_ident) = self.regenerator_runtime.take() { - prepend(&mut s.body, require_rt(self.global_mark, rt_ident).into()); + prepend( + &mut s.body, + require_rt( + self.top_level_mark, + rt_ident, + self.config.import_path.clone(), + ) + .into(), + ); } s } diff --git a/ecmascript/transforms/compat/tests/es2015_regenerator.rs b/ecmascript/transforms/compat/tests/es2015_regenerator.rs index 0d1bf6a7dcf..d9c18de8f7d 100644 --- a/ecmascript/transforms/compat/tests/es2015_regenerator.rs +++ b/ecmascript/transforms/compat/tests/es2015_regenerator.rs @@ -12,7 +12,10 @@ fn syntax() -> Syntax { } fn tr(_: ()) -> impl Fold { - chain!(resolver(), regenerator(Mark::fresh(Mark::root()))) + chain!( + resolver(), + regenerator(Default::default(), Mark::fresh(Mark::root())) + ) } // computed_properties_example @@ -946,7 +949,7 @@ test_exec!( |_| chain!( async_to_generator(), es2015::for_of(Default::default()), - es2015::regenerator(Mark::fresh(Mark::root())), + es2015::regenerator(Default::default(), Mark::fresh(Mark::root())), ), issue_600_exact_passes, "async function foo(b) { @@ -958,7 +961,7 @@ test_exec!( test_exec!( syntax(), - |_| es2015::regenerator(Mark::fresh(Mark::root())), + |_| es2015::regenerator(Default::default(), Mark::fresh(Mark::root())), issue_600_min, "function* foo() { try { @@ -982,7 +985,7 @@ test_exec!( test_exec!( syntax(), - |_| es2015::regenerator(Mark::fresh(Mark::root())), + |_| es2015::regenerator(Default::default(), Mark::fresh(Mark::root())), issue_831_1, "function* myGenerator() { yield* [1,2,3]; @@ -1002,7 +1005,7 @@ test!( |_| { let mark = Mark::fresh(Mark::root()); - es2015::regenerator(mark) + es2015::regenerator(Default::default(), mark) }, issue_831_3, "export function* myGenerator() { @@ -1030,7 +1033,7 @@ export function myGenerator() { test_exec!( syntax(), - |_| es2015::regenerator(Mark::fresh(Mark::root())), + |_| es2015::regenerator(Default::default(), Mark::fresh(Mark::root())), delegate_context, "function* a() { yield 5; @@ -1045,7 +1048,7 @@ test_exec!( test_exec!( syntax(), - |_| es2015::regenerator(Mark::fresh(Mark::root())), + |_| es2015::regenerator(Default::default(), Mark::fresh(Mark::root())), issue_849_1, "function* gen() { yield 1 }; function genFactory() { return function*() { yield 1 }; } @@ -1056,7 +1059,7 @@ expect(v.next()).toEqual({ done: true })" test_exec!( syntax(), - |_| es2015::regenerator(Mark::fresh(Mark::root())), + |_| es2015::regenerator(Default::default(), Mark::fresh(Mark::root())), issue_853_1, "function throwingFn() { throw 'Error' } function* gen() { @@ -1669,7 +1672,7 @@ test_exec!( chain!( async_to_generator(), es2015::for_of(Default::default()), - regenerator(mark) + regenerator(Default::default(), mark) ) }, issue_1918_1, diff --git a/ecmascript/transforms/compat/tests/es2017_async_to_generator.rs b/ecmascript/transforms/compat/tests/es2017_async_to_generator.rs index e6578936871..7a125ab2300 100644 --- a/ecmascript/transforms/compat/tests/es2017_async_to_generator.rs +++ b/ecmascript/transforms/compat/tests/es2017_async_to_generator.rs @@ -2419,7 +2419,7 @@ test_exec!( Syntax::default(), |_| { let mark = Mark::fresh(Mark::root()); - chain!(async_to_generator(), regenerator(mark)) + chain!(async_to_generator(), regenerator(Default::default(), mark)) }, issue_1575_2, " @@ -2569,7 +2569,10 @@ test!( Syntax::default(), |_| { let top_level_mark = Mark::fresh(Mark::root()); - chain!(async_to_generator(), regenerator(top_level_mark)) + chain!( + async_to_generator(), + regenerator(Default::default(), top_level_mark) + ) }, issue_1684_2, " @@ -2709,7 +2712,7 @@ fn exec_regenerator(input: PathBuf) { chain!( async_to_generator(), es2015::for_of(Default::default()), - regenerator(top_level_mark) + regenerator(Default::default(), top_level_mark) ) }, &input, diff --git a/ecmascript/transforms/module/Cargo.toml b/ecmascript/transforms/module/Cargo.toml index 23d6df278fa..04bc2680594 100644 --- a/ecmascript/transforms/module/Cargo.toml +++ b/ecmascript/transforms/module/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms_module" repository = "https://github.com/swc-project/swc.git" -version = "0.53.0" +version = "0.54.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] @@ -26,6 +26,6 @@ swc_ecma_utils = {version = "0.49.0", path = "../../utils"} swc_ecma_visit = {version = "0.42.0", path = "../../visit"} [dev-dependencies] -swc_ecma_transforms_compat = {version = "0.47.0", path = "../compat"} +swc_ecma_transforms_compat = {version = "0.48.0", path = "../compat"} swc_ecma_transforms_testing = {version = "0.42.0", path = "../testing/"} testing = {version = "0.15.0", path = "../../../testing/"} diff --git a/ecmascript/transforms/module/tests/common_js.rs b/ecmascript/transforms/module/tests/common_js.rs index 20001592c3a..f3eab5b2315 100644 --- a/ecmascript/transforms/module/tests/common_js.rs +++ b/ecmascript/transforms/module/tests/common_js.rs @@ -4449,7 +4449,7 @@ test!( syntax(), |_| chain!( resolver(), - regenerator(Mark::fresh(Mark::root())), + regenerator(Default::default(), Mark::fresh(Mark::root())), common_js(Mark::fresh(Mark::root()), Default::default(), None) ), regression_6733, @@ -4492,7 +4492,10 @@ test!( |_| { let mark = Mark::fresh(Mark::root()); - chain!(regenerator(mark), common_js(mark, Default::default(), None),) + chain!( + regenerator(Default::default(), mark), + common_js(mark, Default::default(), None), + ) }, issue_831_2, "export function* myGenerator() { diff --git a/ecmascript/transforms/optimization/Cargo.toml b/ecmascript/transforms/optimization/Cargo.toml index fb6b95502af..687b95e0c71 100644 --- a/ecmascript/transforms/optimization/Cargo.toml +++ b/ecmascript/transforms/optimization/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms_optimization" repository = "https://github.com/swc-project/swc.git" -version = "0.60.2" +version = "0.61.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] @@ -37,10 +37,10 @@ swc_ecma_visit = {version = "0.42.0", path = "../../visit"} tracing = "0.1.28" [dev-dependencies] -swc_ecma_transforms_compat = {version = "0.47.0", path = "../compat"} -swc_ecma_transforms_module = {version = "0.53.0", path = "../module"} -swc_ecma_transforms_proposal = {version = "0.53.0", path = "../proposal"} -swc_ecma_transforms_react = {version = "0.55.0", path = "../react"} +swc_ecma_transforms_compat = {version = "0.48.0", path = "../compat"} +swc_ecma_transforms_module = {version = "0.54.0", path = "../module"} +swc_ecma_transforms_proposal = {version = "0.54.0", path = "../proposal"} +swc_ecma_transforms_react = {version = "0.56.0", path = "../react"} swc_ecma_transforms_testing = {version = "0.42.0", path = "../testing"} -swc_ecma_transforms_typescript = {version = "0.56.0", path = "../typescript"} +swc_ecma_transforms_typescript = {version = "0.57.0", path = "../typescript"} testing = {version = "0.15.0", path = "../../../testing"} diff --git a/ecmascript/transforms/proposal/Cargo.toml b/ecmascript/transforms/proposal/Cargo.toml index e81bb67a6c0..19be9090461 100644 --- a/ecmascript/transforms/proposal/Cargo.toml +++ b/ecmascript/transforms/proposal/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms_proposal" repository = "https://github.com/swc-project/swc.git" -version = "0.53.0" +version = "0.54.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -31,7 +31,7 @@ swc_ecma_visit = {version = "0.42.0", path = "../../visit"} [dev-dependencies] serde_json = "1.0.66" -swc_ecma_transforms_compat = {version = "0.47.0", path = "../compat"} -swc_ecma_transforms_module = {version = "0.53.0", path = "../module"} +swc_ecma_transforms_compat = {version = "0.48.0", path = "../compat"} +swc_ecma_transforms_module = {version = "0.54.0", path = "../module"} swc_ecma_transforms_testing = {version = "0.42.0", path = "../testing"} testing = {version = "0.15.0", path = "../../../testing"} diff --git a/ecmascript/transforms/react/Cargo.toml b/ecmascript/transforms/react/Cargo.toml index c253eaa3295..777541310c2 100644 --- a/ecmascript/transforms/react/Cargo.toml +++ b/ecmascript/transforms/react/Cargo.toml @@ -7,7 +7,7 @@ include = ["Cargo.toml", "src/**/*.rs"] license = "Apache-2.0/MIT" name = "swc_ecma_transforms_react" repository = "https://github.com/swc-project/swc.git" -version = "0.55.2" +version = "0.56.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] @@ -31,7 +31,7 @@ swc_ecma_visit = {version = "0.42.0", path = "../../visit"} [dev-dependencies] swc_ecma_codegen = {version = "0.78.0", path = "../../codegen/"} -swc_ecma_transforms_compat = {version = "0.47.0", path = "../compat/"} -swc_ecma_transforms_module = {version = "0.53.0", path = "../module"} +swc_ecma_transforms_compat = {version = "0.48.0", path = "../compat/"} +swc_ecma_transforms_module = {version = "0.54.0", path = "../module"} swc_ecma_transforms_testing = {version = "0.42.0", path = "../testing/"} testing = {version = "0.15.0", path = "../../../testing"} diff --git a/ecmascript/transforms/typescript/Cargo.toml b/ecmascript/transforms/typescript/Cargo.toml index 8bef7bffe5a..e2f48da34e3 100644 --- a/ecmascript/transforms/typescript/Cargo.toml +++ b/ecmascript/transforms/typescript/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" license = "Apache-2.0/MIT" name = "swc_ecma_transforms_typescript" repository = "https://github.com/swc-project/swc.git" -version = "0.56.1" +version = "0.57.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] @@ -16,15 +16,15 @@ swc_common = {version = "0.14.0", path = "../../../common"} swc_ecma_ast = {version = "0.56.0", path = "../../ast"} swc_ecma_parser = {version = "0.76.0", path = "../../parser"} swc_ecma_transforms_base = {version = "0.41.0", path = "../base"} -swc_ecma_transforms_react = {version = "0.55.0", path = "../react"} +swc_ecma_transforms_react = {version = "0.56.0", path = "../react"} swc_ecma_utils = {version = "0.49.0", path = "../../utils"} swc_ecma_visit = {version = "0.42.0", path = "../../visit"} [dev-dependencies] swc_ecma_codegen = {version = "0.78.0", path = "../../codegen"} -swc_ecma_transforms_compat = {version = "0.47.0", path = "../compat"} -swc_ecma_transforms_module = {version = "0.53.0", path = "../module"} -swc_ecma_transforms_proposal = {version = "0.53.0", path = "../proposal/"} +swc_ecma_transforms_compat = {version = "0.48.0", path = "../compat"} +swc_ecma_transforms_module = {version = "0.54.0", path = "../module"} +swc_ecma_transforms_proposal = {version = "0.54.0", path = "../proposal/"} swc_ecma_transforms_testing = {version = "0.42.0", path = "../testing"} testing = {version = "0.15.0", path = "../../../testing"} walkdir = "2.3.1" diff --git a/node/bundler/src/loaders/swc.rs b/node/bundler/src/loaders/swc.rs index f4aaeb03e2e..f05ef5da59d 100644 --- a/node/bundler/src/loaders/swc.rs +++ b/node/bundler/src/loaders/swc.rs @@ -189,6 +189,7 @@ impl SwcLoader { legacy_decorator: c.legacy_decorator, decorator_metadata: c.decorator_metadata, hidden: Default::default(), + ..Default::default() }) } else { None diff --git a/src/builder.rs b/src/builder.rs index f3f5902f323..6fb88dc87de 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -5,7 +5,7 @@ use crate::{ }, SwcComments, }; -use compat::es2020::export_namespace_from; +use compat::{es2015::regenerator, es2020::export_namespace_from}; use either::Either; use std::{cell::RefCell, collections::HashMap, path::PathBuf, rc::Rc, sync::Arc}; use swc_atoms::JsWord; @@ -37,6 +37,7 @@ pub struct PassBuilder<'a, 'b, P: swc_ecma_visit::Fold> { fixer: bool, inject_helpers: bool, minify: Option, + regenerator: regenerator::Config, } impl<'a, 'b, P: swc_ecma_visit::Fold> PassBuilder<'a, 'b, P> { @@ -59,6 +60,7 @@ impl<'a, 'b, P: swc_ecma_visit::Fold> PassBuilder<'a, 'b, P> { fixer: true, inject_helpers: true, minify: None, + regenerator: Default::default(), } } @@ -79,6 +81,7 @@ impl<'a, 'b, P: swc_ecma_visit::Fold> PassBuilder<'a, 'b, P> { fixer: self.fixer, inject_helpers: self.inject_helpers, minify: self.minify, + regenerator: self.regenerator, } } @@ -132,6 +135,11 @@ impl<'a, 'b, P: swc_ecma_visit::Fold> PassBuilder<'a, 'b, P> { self } + pub fn regenerator(mut self, config: regenerator::Config) -> Self { + self.regenerator = config; + self + } + /// # Arguments /// ## module /// - Use `None` if you want swc to emit import statements. @@ -212,6 +220,7 @@ impl<'a, 'b, P: swc_ecma_visit::Fold> PassBuilder<'a, 'b, P> { destructuring: compat::es2015::destructuring::Config { loose: self.loose }, + regenerator: self.regenerator, } ), should_enable(self.target, JscTarget::Es2015) diff --git a/src/config/mod.rs b/src/config/mod.rs index 43fa60c2e13..afdc12591e3 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -43,6 +43,7 @@ use swc_ecma_transforms::{ proposals::{decorators, export_default_from, import_assertions}, react, resolver_with_mark, typescript, }; +use swc_ecma_transforms_compat::es2015::regenerator; use swc_ecma_transforms_optimization::{inline_globals2, GlobalExprMap}; use swc_ecma_visit::Fold; @@ -214,6 +215,8 @@ impl Options { let syntax = syntax.unwrap_or_default(); let mut transform = transform.unwrap_or_default(); + let regenerator = transform.regenerator.clone(); + let preserve_comments = js_minify.as_ref().map(|v| v.format.comments.clone()); if syntax.typescript() { @@ -272,6 +275,7 @@ impl Options { }) .fixer(!self.disable_fixer) .preset_env(config.env) + .regenerator(regenerator) .finalize( base_url, paths.into_iter().collect(), @@ -951,6 +955,9 @@ pub struct TransformConfig { #[serde(default)] pub hidden: HiddenTransformConfig, + + #[serde(default)] + pub regenerator: regenerator::Config, } #[derive(Debug, Default, Clone, Serialize, Deserialize)] diff --git a/tests/fixture/config/regenerator/import-path/1/.swcrc b/tests/fixture/config/regenerator/import-path/1/.swcrc new file mode 100644 index 00000000000..8a2d832aa80 --- /dev/null +++ b/tests/fixture/config/regenerator/import-path/1/.swcrc @@ -0,0 +1,9 @@ +{ + "jsc": { + "transform": { + "regenerator": { + "importPath": "custom" + } + } + } +} \ No newline at end of file diff --git a/tests/fixture/config/regenerator/import-path/1/input/index.js b/tests/fixture/config/regenerator/import-path/1/input/index.js new file mode 100644 index 00000000000..6cf1febc363 --- /dev/null +++ b/tests/fixture/config/regenerator/import-path/1/input/index.js @@ -0,0 +1,8 @@ + + +function* gen() { + + yield 1; + yield 2; + yield 3; +} \ No newline at end of file diff --git a/tests/fixture/config/regenerator/import-path/1/output/index.js b/tests/fixture/config/regenerator/import-path/1/output/index.js new file mode 100644 index 00000000000..241d4ea4fea --- /dev/null +++ b/tests/fixture/config/regenerator/import-path/1/output/index.js @@ -0,0 +1,20 @@ +import regeneratorRuntime from "custom"; +var _marked = regeneratorRuntime.mark(gen); +function gen() { + return regeneratorRuntime.wrap(function gen$(_ctx) { + while(1)switch(_ctx.prev = _ctx.next){ + case 0: + _ctx.next = 2; + return 1; + case 2: + _ctx.next = 4; + return 2; + case 4: + _ctx.next = 6; + return 3; + case 6: + case "end": + return _ctx.stop(); + } + }, _marked); +}