Skip to content

Commit

Permalink
Merge branch 'fix/escape-url-value-in-css-url' of https://github.com/…
Browse files Browse the repository at this point in the history
…Shinyaigeek/parcel into fix/escape-url-value-in-css-url
  • Loading branch information
Shinyaigeek committed Mar 20, 2022
2 parents 5562777 + bf6da94 commit 6980ae3
Show file tree
Hide file tree
Showing 13 changed files with 987 additions and 844 deletions.
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 @@ -5328,7 +5329,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

0 comments on commit 6980ae3

Please sign in to comment.