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

Bump swc #7777

Merged
merged 12 commits into from Mar 12, 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
699 changes: 468 additions & 231 deletions Cargo.lock

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion packages/core/integration-tests/test/javascript.js
Expand Up @@ -23,6 +23,7 @@ import {makeDeferredWithPromise, normalizePath} from '@parcel/utils';
import vm from 'vm';
import Logger from '@parcel/logger';
import nullthrows from 'nullthrows';
import {md} from '@parcel/diagnostic';

describe('javascript', function () {
beforeEach(async () => {
Expand Down Expand Up @@ -5308,7 +5309,7 @@ describe('javascript', function () {
name: 'BuildError',
diagnostics: [
{
message: `Failed to resolve '@swc/helpers' from '${normalizePath(
message: md`Failed to resolve '@swc/helpers' from '${normalizePath(
require.resolve('@parcel/transformer-js/src/JSTransformer.js'),
)}'`,
origin: '@parcel/core',
Expand Down
4 changes: 2 additions & 2 deletions packages/transformers/js/core/Cargo.toml
Expand Up @@ -8,8 +8,8 @@ edition = "2018"
crate-type = ["rlib"]

[dependencies]
swc_ecmascript = { version = "0.99.9", features = ["parser", "transforms", "module", "optimization", "react", "typescript", "utils", "visit", "codegen", "utils", "preset_env"] }
swc_common = { version = "0.15.1", features = ["tty-emitter", "sourcemap"] }
swc_ecmascript = { version = "0.132.0", features = ["parser", "transforms", "module", "optimization", "react", "typescript", "utils", "visit", "codegen", "utils", "preset_env"] }
swc_common = { version = "0.17.15", features = ["tty-emitter", "sourcemap"] }
swc_atoms = "0.2.9"
indoc = "1.0.3"
serde = "1.0.123"
Expand Down
374 changes: 174 additions & 200 deletions packages/transformers/js/core/src/dependency_collector.rs

Large diffs are not rendered by default.

32 changes: 7 additions & 25 deletions packages/transformers/js/core/src/env_replacer.rs
Expand Up @@ -53,25 +53,11 @@ impl<'a> Fold for EnvReplacer<'a> {
return node.fold_children_with(self);
}

if let MemberExpr {
obj: ExprOrSuper::Expr(ref expr),
ref prop,
computed,
..
} = member
{
if let Expr::Member(member) = &**expr {
if match_member_expr(member, vec!["process", "env"], self.decls) {
if let Expr::Lit(Lit::Str(Str { value: ref sym, .. })) = &**prop {
if let Some(replacement) = self.replace(sym, true) {
return replacement;
}
} else if let Expr::Ident(Ident { ref sym, .. }) = &**prop {
if !computed {
if let Some(replacement) = self.replace(sym, true) {
return replacement;
}
}
if let Expr::Member(obj) = &*member.obj {
if match_member_expr(obj, vec!["process", "env"], self.decls) {
if let Some((sym, _)) = match_property_name(member) {
if let Some(replacement) = self.replace(&sym, true) {
return replacement;
}
}
}
Expand Down Expand Up @@ -128,11 +114,7 @@ impl<'a> Fold for EnvReplacer<'a> {
PatOrExpr::Expr(expr) => Some(&**expr),
};

if let Some(Expr::Member(MemberExpr {
obj: ExprOrSuper::Expr(ref obj),
..
})) = expr
{
if let Some(Expr::Member(MemberExpr { obj, .. })) = &expr {
if let Expr::Member(member) = &**obj {
if match_member_expr(member, vec!["process", "env"], self.decls) {
self.emit_mutating_error(assign.span);
Expand All @@ -148,7 +130,7 @@ impl<'a> Fold for EnvReplacer<'a> {
Expr::Unary(UnaryExpr { op: UnaryOp::Delete, arg, span, .. }) |
// e.g. process.env.UPDATE++
Expr::Update(UpdateExpr { arg, span, .. }) => {
if let Expr::Member(MemberExpr { obj: ExprOrSuper::Expr(ref obj), .. }) = &**arg {
if let Expr::Member(MemberExpr { ref obj, .. }) = &**arg {
if let Expr::Member(member) = &**obj {
if match_member_expr(member, vec!["process", "env"], self.decls) {
self.emit_mutating_error(*span);
Expand Down
57 changes: 24 additions & 33 deletions packages/transformers/js/core/src/fs.rs
@@ -1,21 +1,15 @@
use crate::dependency_collector::{DependencyDescriptor, DependencyKind};
use crate::hoist::{Collect, Import};
use crate::utils::SourceLocation;
use crate::id;
use crate::utils::{IdentId, SourceLocation};
use data_encoding::{BASE64, HEXLOWER};
use std::collections::HashSet;
use std::path::{Path, PathBuf};
use swc_atoms::JsWord;
use swc_common::{Mark, Span, SyntaxContext, DUMMY_SP};
use swc_common::{Mark, Span, DUMMY_SP};
use swc_ecmascript::ast::*;
use swc_ecmascript::visit::{Fold, FoldWith, VisitWith};

type IdentId = (JsWord, SyntaxContext);
macro_rules! id {
($ident: expr) => {
($ident.sym.clone(), $ident.span.ctxt)
};
}

pub fn inline_fs<'a>(
filename: &str,
source_map: swc_common::sync::Lrc<swc_common::SourceMap>,
Expand Down Expand Up @@ -55,7 +49,7 @@ impl<'a> Fold for InlineFS<'a> {

fn fold_expr(&mut self, node: Expr) -> Expr {
if let Expr::Call(call) = &node {
if let ExprOrSuper::Expr(expr) = &call.callee {
if let Callee::Expr(expr) = &call.callee {
if let Some((source, specifier)) = self.match_module_reference(expr) {
if &source == "fs" && &specifier == "readFileSync" {
if let Some(arg) = call.args.get(0) {
Expand Down Expand Up @@ -84,31 +78,29 @@ impl<'a> InlineFS<'a> {
}
}
Expr::Member(member) => {
let prop = match &*member.prop {
Expr::Ident(ident) => {
if !member.computed {
ident.sym.clone()
let prop = match &member.prop {
MemberProp::Ident(ident) => ident.sym.clone(),
MemberProp::Computed(ComputedPropName { expr, .. }) => {
if let Expr::Lit(Lit::Str(str_)) = &**expr {
str_.value.clone()
} else {
return None;
}
}
Expr::Lit(Lit::Str(str_)) => str_.value.clone(),
_ => return None,
};

if let ExprOrSuper::Expr(expr) = &member.obj {
if let Some(source) = self.collect.match_require(expr) {
return Some((source, prop));
}
if let Some(source) = self.collect.match_require(&*member.obj) {
return Some((source, prop));
}

if let Expr::Ident(ident) = &**expr {
if let Some(Import {
source, specifier, ..
}) = self.collect.imports.get(&id!(ident))
{
if specifier == "default" || specifier == "*" {
return Some((source.clone(), prop));
}
if let Expr::Ident(ident) = &*member.obj {
if let Some(Import {
source, specifier, ..
}) = self.collect.imports.get(&id!(ident))
{
if specifier == "default" || specifier == "*" {
return Some((source.clone(), prop));
}
}
}
Expand Down Expand Up @@ -196,13 +188,12 @@ impl<'a> InlineFS<'a> {
// If buffer, wrap in Buffer.from(base64String, 'base64')
if encoding == "buffer" {
Some(Expr::Call(CallExpr {
callee: ExprOrSuper::Expr(Box::new(Expr::Member(MemberExpr {
obj: ExprOrSuper::Expr(Box::new(Expr::Ident(Ident::new(
callee: Callee::Expr(Box::new(Expr::Member(MemberExpr {
obj: Box::new(Expr::Ident(Ident::new(
"Buffer".into(),
DUMMY_SP.apply_mark(self.global_mark),
)))),
prop: Box::new(Expr::Ident(Ident::new("from".into(), DUMMY_SP))),
computed: false,
))),
prop: MemberProp::Ident(Ident::new("from".into(), DUMMY_SP)),
span: DUMMY_SP,
}))),
args: vec![
Expand Down Expand Up @@ -286,7 +277,7 @@ impl<'a> Fold for Evaluator<'a> {
},
Expr::Call(call) => {
let callee = match &call.callee {
ExprOrSuper::Expr(expr) => &*expr,
Callee::Expr(expr) => &*expr,
_ => return node,
};

Expand Down
26 changes: 12 additions & 14 deletions packages/transformers/js/core/src/global_replacer.rs
Expand Up @@ -4,7 +4,7 @@ use std::path::Path;

use swc_atoms::JsWord;
use swc_common::{SourceMap, SyntaxContext, DUMMY_SP};
use swc_ecmascript::ast;
use swc_ecmascript::ast::{self, ComputedPropName};
use swc_ecmascript::utils::ident::IdentLike;
use swc_ecmascript::visit::{Fold, FoldWith};

Expand All @@ -24,12 +24,12 @@ pub struct GlobalReplacer<'a> {

impl<'a> Fold for GlobalReplacer<'a> {
fn fold_expr(&mut self, node: ast::Expr) -> ast::Expr {
use ast::{Expr::*, Ident, MemberExpr};
use ast::{Expr::*, Ident, MemberExpr, MemberProp};

// Do not traverse into the `prop` side of member expressions unless computed.
let node = match node {
Member(expr) => {
if expr.computed {
if let MemberProp::Computed(_) = expr.prop {
Member(MemberExpr {
obj: expr.obj.fold_with(self),
prop: expr.prop.fold_with(self),
Expand Down Expand Up @@ -87,9 +87,8 @@ impl<'a> Fold for GlobalReplacer<'a> {
id.sym.clone(),
self.global_mark,
Member(MemberExpr {
obj: ast::ExprOrSuper::Expr(Box::new(Call(create_require(specifier.clone())))),
prop: Box::new(Ident(ast::Ident::new("Buffer".into(), DUMMY_SP))),
computed: false,
obj: Box::new(Call(create_require(specifier.clone()))),
prop: MemberProp::Ident(ast::Ident::new("Buffer".into(), DUMMY_SP)),
span: DUMMY_SP,
}),
),
Expand Down Expand Up @@ -169,15 +168,14 @@ impl<'a> Fold for GlobalReplacer<'a> {
id.sym.clone(),
self.global_mark,
ast::Expr::Member(ast::MemberExpr {
obj: ast::ExprOrSuper::Expr(Box::new(Ident(Ident::new(
js_word!("arguments"),
DUMMY_SP,
)))),
prop: Box::new(Lit(ast::Lit::Num(ast::Number {
value: 3.0,
obj: Box::new(Ident(Ident::new(js_word!("arguments"), DUMMY_SP))),
prop: MemberProp::Computed(ComputedPropName {
span: DUMMY_SP,
}))),
computed: true,
expr: Box::new(Lit(ast::Lit::Num(ast::Number {
value: 3.0,
span: DUMMY_SP,
}))),
}),
span: DUMMY_SP,
}),
),
Expand Down