Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update swc #33201

Merged
merged 15 commits into from Jan 14, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
152 changes: 76 additions & 76 deletions packages/next-swc/Cargo.lock

Large diffs are not rendered by default.

18 changes: 9 additions & 9 deletions packages/next-swc/crates/core/Cargo.toml
Expand Up @@ -14,21 +14,21 @@ fxhash = "0.2.1"
pathdiff = "0.2.0"
serde = "1"
serde_json = "1"
styled_components = "0.9.0"
swc = "0.110.0"
styled_components = "0.11.0"
swc = "0.114.0"
swc_atoms = "0.2.7"
swc_common = { version = "0.16.0", features = ["concurrent", "sourcemap"] }
swc_css = "0.45.0"
swc_ecma_loader = { version = "0.26.0", features = ["node", "lru"] }
swc_ecmascript = { version = "0.105.0", features = ["codegen", "minifier", "optimization", "parser", "react", "transforms", "typescript", "utils", "visit"] }
swc_common = { version = "0.17.0", features = ["concurrent", "sourcemap"] }
swc_css = "0.46.0"
swc_ecma_loader = { version = "0.27.0", features = ["node", "lru"] }
swc_ecmascript = { version = "0.108.1", features = ["codegen", "minifier", "optimization", "parser", "react", "transforms", "typescript", "utils", "visit"] }
swc_node_base = "0.5.1"
swc_stylis = "0.42.0"
swc_stylis = "0.43.0"
tracing = {version = "0.1.28", features = ["release_max_level_off"]}
regex = "1.5"

[dev-dependencies]
swc_ecma_transforms_testing = "0.56.0"
testing = "0.17.0"
swc_ecma_transforms_testing = "0.58.0"
testing = "0.18.0"
walkdir = "2.3.2"


32 changes: 12 additions & 20 deletions packages/next-swc/crates/core/src/auto_cjs/mod.rs
Expand Up @@ -18,28 +18,20 @@ struct CjsFinder {
/// does not support changing configuration based on content of the file.
impl Visit for CjsFinder {
fn visit_member_expr(&mut self, e: &MemberExpr) {
if !e.computed {
match &e.obj {
ExprOrSuper::Super(_) => {}
ExprOrSuper::Expr(obj) => match &**obj {
Expr::Ident(obj) => match &*e.prop {
Expr::Ident(prop) => {
if &*obj.sym == "module" && &*prop.sym == "exports" {
self.found = true;
return;
}
}
_ => {}
},
_ => {}
},
}
match &*e.obj {
Expr::Ident(obj) => match &e.prop {
MemberProp::Ident(prop) => {
if &*obj.sym == "module" && &*prop.sym == "exports" {
self.found = true;
return;
}
}
_ => {}
},
_ => {}
}

e.obj.visit_with(self);

if e.computed {
e.prop.visit_with(self);
}
e.prop.visit_with(self);
}
}
178 changes: 89 additions & 89 deletions packages/next-swc/crates/core/src/hook_optimizer.rs
@@ -1,119 +1,119 @@
use swc_atoms::JsWord;
use swc_common::DUMMY_SP;
use swc_ecmascript::ast::{
ArrayPat, Decl, Expr, ExprOrSuper, Ident, ImportDecl, ImportSpecifier, KeyValuePatProp, Number,
ObjectPat, ObjectPatProp, Pat, PropName, VarDecl, VarDeclarator,
ArrayPat, Callee, Decl, Expr, Ident, ImportDecl, ImportSpecifier, KeyValuePatProp, Number,
ObjectPat, ObjectPatProp, Pat, PropName, VarDecl, VarDeclarator,
};
use swc_ecmascript::visit::{Fold, FoldWith};

pub fn hook_optimizer() -> impl Fold {
HookOptimizer::default()
HookOptimizer::default()
}

#[derive(Debug, Default)]
struct HookOptimizer {
hooks: Vec<JsWord>,
hooks: Vec<JsWord>,
}

impl Fold for HookOptimizer {
// Find hooks imported from react/preact
fn fold_import_decl(&mut self, decl: ImportDecl) -> ImportDecl {
let ImportDecl {
ref src,
ref specifiers,
..
} = decl;
if &src.value == "react" || &src.value == "preact/hooks" {
for specifier in specifiers {
if let ImportSpecifier::Named(named_specifier) = specifier {
if named_specifier.local.sym.starts_with("use") {
self.hooks.push(named_specifier.local.sym.clone())
}
// Find hooks imported from react/preact
fn fold_import_decl(&mut self, decl: ImportDecl) -> ImportDecl {
let ImportDecl {
ref src,
ref specifiers,
..
} = decl;
if &src.value == "react" || &src.value == "preact/hooks" {
for specifier in specifiers {
if let ImportSpecifier::Named(named_specifier) = specifier {
if named_specifier.local.sym.starts_with("use") {
self.hooks.push(named_specifier.local.sym.clone())
}
}
}
}
}

decl
}
// Transform array desctructing to object destructuring for relevant hooks
fn fold_decl(&mut self, node: Decl) -> Decl {
let node = node.fold_children_with(self);
match node {
Decl::Var(VarDecl {
decls,
span,
kind,
declare,
}) => {
let mut new_decls = Vec::with_capacity(decls.len());
for decl in decls {
new_decls.push(self.get_decl(decl));
}

decl
}
// Transform array desctructing to object destructuring for relevant hooks
fn fold_decl(&mut self, node: Decl) -> Decl {
let node = node.fold_children_with(self);
match node {
Decl::Var(VarDecl {
decls,
span,
kind,
declare,
}) => {
let mut new_decls = Vec::with_capacity(decls.len());
for decl in decls {
new_decls.push(self.get_decl(decl));
Decl::Var(VarDecl {
decls: new_decls,
span,
kind,
declare,
})
}
_ => node,
}

Decl::Var(VarDecl {
decls: new_decls,
span,
kind,
declare,
})
}
_ => node,
}
}
}

impl HookOptimizer {
fn get_decl(&mut self, decl: VarDeclarator) -> VarDeclarator {
let VarDeclarator {
name,
init,
span,
definite,
} = &decl;
let init_clone = init.clone();
if let Pat::Array(a) = name {
if let Expr::Call(c) = &*init.as_deref().unwrap() {
if let ExprOrSuper::Expr(i) = &c.callee {
if let Expr::Ident(Ident { sym, .. }) = &**i {
if self.hooks.contains(&sym) {
let name = get_object_pattern(&a);
return VarDeclarator {
name,
init: init_clone,
span: *span,
definite: *definite,
};
fn get_decl(&mut self, decl: VarDeclarator) -> VarDeclarator {
let VarDeclarator {
name,
init,
span,
definite,
} = &decl;
let init_clone = init.clone();
if let Pat::Array(a) = name {
if let Expr::Call(c) = &*init.as_deref().unwrap() {
if let Callee::Expr(i) = &c.callee {
if let Expr::Ident(Ident { sym, .. }) = &**i {
if self.hooks.contains(&sym) {
let name = get_object_pattern(&a);
return VarDeclarator {
name,
init: init_clone,
span: *span,
definite: *definite,
};
}
}
}
}
}
}
}
}

return decl;
}
return decl;
}
}

fn get_object_pattern(array_pattern: &ArrayPat) -> Pat {
let props: Vec<ObjectPatProp> = array_pattern
.elems
.iter()
.enumerate()
.filter_map(|(i, elem)| match elem {
Some(elem) => Some(ObjectPatProp::KeyValue(KeyValuePatProp {
key: PropName::Num(Number {
value: i as f64,
span: DUMMY_SP,
}),
value: Box::new(elem.clone()),
})),
None => None,
})
.collect();
let props: Vec<ObjectPatProp> = array_pattern
.elems
.iter()
.enumerate()
.filter_map(|(i, elem)| match elem {
Some(elem) => Some(ObjectPatProp::KeyValue(KeyValuePatProp {
key: PropName::Num(Number {
value: i as f64,
span: DUMMY_SP,
}),
value: Box::new(elem.clone()),
})),
None => None,
})
.collect();

Pat::Object(ObjectPat {
props,
span: DUMMY_SP,
optional: false,
type_ann: None,
})
Pat::Object(ObjectPat {
props,
span: DUMMY_SP,
optional: false,
type_ann: None,
})
}
37 changes: 15 additions & 22 deletions packages/next-swc/crates/core/src/next_dynamic.rs
Expand Up @@ -4,9 +4,9 @@ use pathdiff::diff_paths;
use swc_atoms::js_word;
use swc_common::{FileName, DUMMY_SP};
use swc_ecmascript::ast::{
ArrayLit, ArrowExpr, BinExpr, BinaryOp, BlockStmtOrExpr, Bool, CallExpr, Expr, ExprOrSpread,
ExprOrSuper, Ident, ImportDecl, ImportSpecifier, KeyValueProp, Lit, MemberExpr, Null,
ObjectLit, Prop, PropName, PropOrSpread, Str, StrKind,
ArrayLit, ArrowExpr, BinExpr, BinaryOp, BlockStmtOrExpr, Bool, CallExpr, Callee, Expr,
ExprOrSpread, Ident, ImportDecl, ImportSpecifier, KeyValueProp, Lit, MemberExpr, MemberProp,
Null, ObjectLit, Prop, PropName, PropOrSpread, Str, StrKind,
};
use swc_ecmascript::utils::ExprFactory;
use swc_ecmascript::utils::{
Expand Down Expand Up @@ -63,19 +63,15 @@ impl Fold for NextDynamicPatcher {

fn fold_call_expr(&mut self, expr: CallExpr) -> CallExpr {
if self.is_next_dynamic_first_arg {
if let ExprOrSuper::Expr(e) = &expr.callee {
if let Expr::Ident(Ident { sym, .. }) = &**e {
if sym == "import" {
if let Expr::Lit(Lit::Str(Str { value, .. })) = &*expr.args[0].expr {
self.dynamically_imported_specifier = Some(value.to_string());
}
}
if let Callee::Import(..) = &expr.callee {
if let Expr::Lit(Lit::Str(Str { value, .. })) = &*expr.args[0].expr {
self.dynamically_imported_specifier = Some(value.to_string());
}
}
return expr.fold_children_with(self);
}
let mut expr = expr.fold_children_with(self);
if let ExprOrSuper::Expr(i) = &expr.callee {
if let Callee::Expr(i) = &expr.callee {
if let Expr::Ident(identifier) = &**i {
if self.dynamic_bindings.contains(&identifier.to_id()) {
if expr.args.len() == 0 {
Expand Down Expand Up @@ -182,21 +178,18 @@ impl Fold for NextDynamicPatcher {
body: BlockStmtOrExpr::Expr(Box::new(Expr::Array(ArrayLit {
elems: vec![Some(ExprOrSpread {
expr: Box::new(Expr::Call(CallExpr {
callee: ExprOrSuper::Expr(Box::new(Expr::Member(
callee: Callee::Expr(Box::new(Expr::Member(
MemberExpr {
obj: ExprOrSuper::Expr(Box::new(
Expr::Ident(Ident {
sym: js_word!("require"),
span: DUMMY_SP,
optional: false,
}),
)),
prop: Box::new(Expr::Ident(Ident {
sym: "resolveWeak".into(),
obj: Box::new(Expr::Ident(Ident {
sym: js_word!("require"),
span: DUMMY_SP,
optional: false,
})),
computed: false,
prop: MemberProp::Ident(Ident {
sym: "resolveWeak".into(),
span: DUMMY_SP,
optional: false,
}),
span: DUMMY_SP,
},
))),
Expand Down
18 changes: 2 additions & 16 deletions packages/next-swc/crates/core/src/next_ssg.rs
Expand Up @@ -144,12 +144,8 @@ impl Fold for Analyzer<'_> {
fn fold_jsx_element(&mut self, jsx: JSXElement) -> JSXElement {
fn get_leftmost_id_member_expr(e: &JSXMemberExpr) -> Id {
match &e.obj {
JSXObject::Ident(i) => {
i.to_id()
}
JSXObject::JSXMemberExpr(e) => {
get_leftmost_id_member_expr(e)
}
JSXObject::Ident(i) => i.to_id(),
JSXObject::JSXMemberExpr(e) => get_leftmost_id_member_expr(e),
}
}

Expand Down Expand Up @@ -202,16 +198,6 @@ impl Fold for Analyzer<'_> {
f
}

fn fold_member_expr(&mut self, mut e: MemberExpr) -> MemberExpr {
e.obj = e.obj.fold_with(self);

if e.computed {
e.prop = e.prop.fold_with(self);
}

e
}

/// Drops [ExportDecl] if all specifiers are removed.
fn fold_module_item(&mut self, s: ModuleItem) -> ModuleItem {
match s {
Expand Down