From b5cff06b193d1865d94c0e8d0a8b5735c9ff4433 Mon Sep 17 00:00:00 2001 From: Toshit Chawda Date: Thu, 24 Jul 2025 16:46:29 -0700 Subject: [PATCH 1/2] fmt --- rewriter/js/src/changes.rs | 81 +++++++++--------- rewriter/js/src/rewrite.rs | 126 +++++++++++++++++----------- rewriter/js/src/visitor.rs | 163 ++++++++++++++++++------------------ rewriter/native/src/main.rs | 2 +- rewriter/native/test.js | 37 +------- rewriter/wasm/src/jsr.rs | 11 +-- 6 files changed, 209 insertions(+), 211 deletions(-) diff --git a/rewriter/js/src/changes.rs b/rewriter/js/src/changes.rs index 358ce4b9..7528ffbd 100644 --- a/rewriter/js/src/changes.rs +++ b/rewriter/js/src/changes.rs @@ -17,7 +17,6 @@ use crate::{ rewrite::Rewrite, }; - macro_rules! change { ($span:expr, $($ty:tt)*) => { $crate::changes::JsChange::new($span, $crate::changes::JsChangeType::$($ty)*) @@ -28,37 +27,45 @@ pub(crate) use change; #[derive(Debug, PartialEq, Eq)] pub enum JsChangeType<'alloc: 'data, 'data> { /// insert `${cfg.wrapfn}(` - WrapFnLeft { enclose: bool }, + WrapFnLeft { + enclose: bool, + }, /// insert `)` - WrapFnRight { enclose: bool }, + WrapFnRight { + enclose: bool, + }, WrapGetLeft { - ident: Atom<'data>, - enclose: bool, + ident: Atom<'data>, + enclose: bool, }, WrapGetComputedLeft { - enclose: bool, - }, + enclose: bool, + }, WrapGetRight { - enclose: bool, - }, + enclose: bool, + }, - WrapSet { - ident: Atom<'data>, - propspan: Span - }, - WrapSetComputed, + WrapSet { + ident: Atom<'data>, + propspan: Span, + }, + WrapSetComputed, /// insert `${cfg.setrealmfn}({}).` SetRealmFn, /// insert `$scramerr(ident);` - ScramErrFn { ident: Atom<'data> }, + ScramErrFn { + ident: Atom<'data>, + }, /// insert `$scramitize(` ScramitizeFn, /// insert `eval(${cfg.rewritefn}(` EvalRewriteFn, /// insert `: ${cfg.wrapfn}(ident)` - ShorthandObj { ident: Atom<'data> }, + ShorthandObj { + ident: Atom<'data>, + }, /// insert scramtag SourceTag, @@ -73,10 +80,15 @@ pub enum JsChangeType<'alloc: 'data, 'data> { }, /// insert `)` - ClosingParen { semi: bool, replace: bool }, + ClosingParen { + semi: bool, + replace: bool, + }, /// replace span with text - Replace { text: &'alloc str }, + Replace { + text: &'alloc str, + }, /// replace span with "" Delete, } @@ -105,7 +117,7 @@ impl<'alloc: 'data, 'data> Transform<'data> for JsChange<'alloc, 'data> { (cfg, flags): &Self::ToLowLevelData, offset: i32, ) -> TransformLL<'data> { - dbg!(&self); + dbg!(&self); use JsChangeType as Ty; use TransformLL as LL; match self.ty { @@ -119,33 +131,25 @@ impl<'alloc: 'data, 'data> Transform<'data> for JsChange<'alloc, 'data> { } else { transforms![")"] }), - Ty::WrapGetLeft { - ident, - enclose, - } => LL::insert(if enclose { - transforms!["(", &cfg.wrapgetbase, ident, "("] + Ty::WrapGetLeft { ident, enclose } => LL::insert(if enclose { + transforms!["(", &cfg.wrapgetbase, ident, "("] } else { - transforms![&cfg.wrapgetbase, ident, "("] + transforms![&cfg.wrapgetbase, ident, "("] }), Ty::WrapGetComputedLeft { enclose } => LL::insert(if enclose { - transforms!["(", &cfg.wrapcomputedgetfn, "("] - } else { - transforms![&cfg.wrapcomputedgetfn, "("] - }), + transforms!["(", &cfg.wrapcomputedgetfn, "("] + } else { + transforms![&cfg.wrapcomputedgetfn, "("] + }), Ty::WrapGetRight { enclose } => LL::replace(if enclose { transforms!["))"] } else { transforms![")"] }), - Ty::WrapSet { ident, propspan } => LL::insert(transforms![ - &cfg.wrapsetbase, - ident, - "(" - ]), - Ty::WrapSetComputed => LL::insert(transforms![ - &cfg.wrapcomputedsetfn, - "(" - ]), + Ty::WrapSet { ident, propspan } => { + LL::insert(transforms![&cfg.wrapsetbase, ident, "("]) + } + Ty::WrapSetComputed => LL::insert(transforms![&cfg.wrapcomputedsetfn, "("]), Ty::SetRealmFn => LL::insert(transforms![&cfg.setrealmfn, "({})."]), Ty::ScramErrFn { ident } => LL::insert(transforms!["$scramerr(", ident, ");"]), Ty::ScramitizeFn => LL::insert(transforms![" $scramitize("]), @@ -226,6 +230,7 @@ impl<'alloc: 'data, 'data> JsChanges<'alloc, 'data> { #[inline] pub fn add(&mut self, rewrite: Rewrite<'alloc, 'data>) { + dbg!(&rewrite); self.inner.add(rewrite.into_inner()); } diff --git a/rewriter/js/src/rewrite.rs b/rewriter/js/src/rewrite.rs index d820f799..e1f3eeff 100644 --- a/rewriter/js/src/rewrite.rs +++ b/rewriter/js/src/rewrite.rs @@ -27,31 +27,31 @@ pub(crate) enum RewriteType<'alloc: 'data, 'data> { /// `cfg.metafn("cfg.base")` MetaFn, - /// `window.location` -> cfg.wraplocation(window) + /// `window.attr` -> cfg.wrapattr(window) WrapGet { - ident: Atom<'data>, - propspan: Span, - enclose: bool, + ident: Atom<'data>, + propspan: Span, + enclose: bool, }, - /// `window["location"]` -> cfg.wrapgetcomputed(window, "location") + /// `window["attr"]` -> cfg.wrapgetcomputed(window, "attr") WrapGetComputed { - leftspan: Span, - propspan: Span, - enclose: bool, + leftspan: Span, + propspan: Span, + enclose: bool, }, - /// `window.location` -> cfg.wraplocation(window) + /// `window.attr` -> cfg.wrapattr(window) WrapSet { - ident: Atom<'data>, - propspan: Span, - leftspan: Span, - rightspan: Span, + ident: Atom<'data>, + propspan: Span, + leftspan: Span, + rightspan: Span, }, - /// `cfg.wrapcomputedsetfn(window, "location", t)` + /// `cfg.wrapcomputedsetfn(window, "attr", t)` WrapSetComputed { - propspan: Span, - leftspan: Span, - rightspan: Span, - }, + propspan: Span, + leftspan: Span, + rightspan: Span, + }, // dead code only if debug is disabled #[allow(dead_code)] /// `$scramerr(name)` @@ -84,6 +84,7 @@ pub(crate) enum RewriteType<'alloc: 'data, 'data> { Delete, } +#[derive(Debug)] pub(crate) struct Rewrite<'alloc, 'data> { span: Span, ty: RewriteType<'alloc, 'data>, @@ -122,51 +123,74 @@ impl<'alloc: 'data, 'data> RewriteType<'alloc, 'data> { change!(span!(end), WrapFnRight { enclose }), ], Self::WrapGet { - ident, - propspan, - enclose, + ident, + propspan, + enclose, } => smallvec![ - change!(span!(start), WrapGetLeft { - ident, - enclose, - }), + change!(span!(start), WrapGetLeft { ident, enclose }), change!(propspan, Delete), - change!(Span::new(propspan.start-1, propspan.start), Delete), - change!(Span::new(propspan.end, propspan.end), WrapGetRight { - enclose, - }), + change!(Span::new(propspan.start - 1, propspan.start), Delete), + change!( + Span::new(propspan.end, propspan.end), + WrapGetRight { enclose } + ), ], - Self::WrapGetComputed { leftspan, propspan, enclose } => smallvec![ - change!(span!(start), WrapGetComputedLeft { - enclose - }), + Self::WrapGetComputed { + leftspan, + propspan, + enclose, + } => smallvec![ + change!(span!(start), WrapGetComputedLeft { enclose }), // replace the bracket with , - change!(Span::new(leftspan.end, propspan.start), Replace { text: "," }), + change!( + Span::new(leftspan.end, propspan.start), + Replace { text: "," } + ), // replace the other bracket with ) - change!(Span::new(propspan.end, propspan.end + 1), ClosingParen { semi: false, replace: true }), - + change!( + Span::new(propspan.end, propspan.end + 1), + ClosingParen { + semi: false, + replace: true + } + ), ], - Self::WrapSet { ident, propspan, leftspan, rightspan } => smallvec![ - change!(span!(start), WrapSet { - ident, - propspan, - }), - change!(propspan, Delete), - change!(Span::new(leftspan.end, rightspan.start), Replace { text: "," }), - change!( + Self::WrapSet { + ident, + propspan, + leftspan, + rightspan, + } => smallvec![ + change!(span!(start), WrapSet { ident, propspan }), + change!(propspan, Delete), + change!( + Span::new(leftspan.end, rightspan.start), + Replace { text: "," } + ), + change!( span!(end), ClosingParen { semi: false, replace: true } ) - ], - RewriteType::WrapSetComputed { leftspan, rightspan, propspan } => smallvec![ - change!(span!(start), WrapSetComputed), - // replace the bracket with , - change!(Span::new(leftspan.end, propspan.start), Replace { text: "," }), + ], + RewriteType::WrapSetComputed { + leftspan, + rightspan, + propspan, + } => smallvec![ + change!(span!(start), WrapSetComputed), + // replace the bracket with , + change!( + Span::new(leftspan.end, propspan.start), + Replace { text: "," } + ), // replace the other bracket with another , - change!(Span::new(propspan.end, rightspan.start), Replace { text: "," }), + change!( + Span::new(propspan.end, rightspan.start), + Replace { text: "," } + ), change!( span!(end), ClosingParen { @@ -174,7 +198,7 @@ impl<'alloc: 'data, 'data> RewriteType<'alloc, 'data> { replace: true } ) - ], + ], Self::SetRealmFn => smallvec![change!(span, SetRealmFn)], Self::ImportFn => smallvec![change!(span, ImportFn)], Self::MetaFn => smallvec![change!(span, MetaFn)], diff --git a/rewriter/js/src/visitor.rs b/rewriter/js/src/visitor.rs index d5e2d9c4..ab2d2fd9 100644 --- a/rewriter/js/src/visitor.rs +++ b/rewriter/js/src/visitor.rs @@ -22,12 +22,7 @@ use crate::{ // js MUST not be able to get a reference to any of these because sbx // // maybe move this out of this lib? -const UNSAFE_GLOBALS: &[&str] = &[ - "parent", - "top", - "location", - "eval" -]; +const UNSAFE_GLOBALS: &[&str] = &["parent", "top", "location", "eval"]; pub struct Visitor<'alloc, 'data, E> where @@ -52,7 +47,7 @@ where builder.push_str("__URL_REWRITER_ALREADY_ERRORED__"); } else if let Err(err) = self.rewriter - .rewrite(self.config, &self.flags, &url.value, &mut builder,module) + .rewrite(self.config, &self.flags, &url.value, &mut builder, module) { self.error.replace(err); builder.push_str("__URL_REWRITER_ERROR__"); @@ -71,19 +66,17 @@ where fn walk_member_expression(&mut self, it: &Expression) -> bool { match it { - Expression::Identifier(s) => { - false - } + Expression::Identifier(s) => false, Expression::StaticMemberExpression(s) => { - if UNSAFE_GLOBALS.contains(&s.property.name.as_str()) { - // self.jschanges.add(rewrite!(s.span, WrapAccess { - // ident: s.property.name, - // propspan: s.property.span, - // } - // )); - } - self.walk_member_expression(&s.object) - }, + if UNSAFE_GLOBALS.contains(&s.property.name.as_str()) { + // self.jschanges.add(rewrite!(s.span, WrapAccess { + // ident: s.property.name, + // propspan: s.property.span, + // } + // )); + } + self.walk_member_expression(&s.object) + } Expression::ComputedMemberExpression(s) => self.walk_member_expression(&s.object), _ => false, } @@ -122,51 +115,55 @@ where } fn visit_member_expression(&mut self, it: &MemberExpression<'data>) { - match &it { - MemberExpression::StaticMemberExpression(s) =>{ + match &it { + MemberExpression::StaticMemberExpression(s) => { // TODO // you could break this with ["postMessage"] etc // however this code only exists because of recaptcha whatever // and it would slow down js execution a lot - if s.property.name == "postMessage" { - self.jschanges.add(rewrite!(s.property.span, SetRealmFn)); - - walk::walk_expression(self, &s.object); - return; // unwise to walk the rest of the tree - } - - if UNSAFE_GLOBALS.contains(&s.property.name.as_str()) { - self.jschanges.add(rewrite!(it.span(), WrapGet { - ident: s.property.name, - propspan: Span::new(s.property.span.start, s.property.span.end), - enclose: false, - })); - } + if s.property.name == "postMessage" { + self.jschanges.add(rewrite!(s.property.span, SetRealmFn)); + + walk::walk_expression(self, &s.object); + return; // unwise to walk the rest of the tree + } + + if UNSAFE_GLOBALS.contains(&s.property.name.as_str()) { + self.jschanges.add(rewrite!( + it.span(), + WrapGet { + ident: s.property.name, + propspan: Span::new(s.property.span.start, s.property.span.end), + enclose: false, + } + )); + } } MemberExpression::ComputedMemberExpression(s) => { - self.jschanges.add(rewrite!(it.span(), WrapGetComputed { - leftspan: s.object.span(), - propspan: s.expression.span(), - enclose: false, - })); - } - _=>{} - // if !self.flags.strict_rewrites - // && !UNSAFE_GLOBALS.contains(&s.property.name.as_str()) - // && let Expression::Identifier(_) | Expression::ThisExpression(_) = &s.object - // { - // // cull tree - this should be safe - // return; - // } - - // if self.flags.scramitize - // && !matches!(s.object, Expression::MetaProperty(_) | Expression::Super(_)) - // { - // self.scramitize(s.object.span()); - // } + self.jschanges.add(rewrite!( + it.span(), + WrapGetComputed { + leftspan: s.object.span(), + propspan: s.expression.span(), + enclose: false, + } + )); + } + _ => {} // if !self.flags.strict_rewrites + // && !UNSAFE_GLOBALS.contains(&s.property.name.as_str()) + // && let Expression::Identifier(_) | Expression::ThisExpression(_) = &s.object + // { + // // cull tree - this should be safe + // return; + // } + + // if self.flags.scramitize + // && !matches!(s.object, Expression::MetaProperty(_) | Expression::Super(_)) + // { + // self.scramitize(s.object.span()); + // } } - walk::walk_member_expression(self, it); } @@ -184,7 +181,7 @@ where self.jschanges.add(rewrite!( it.span, Eval { - inner: Span::new(s.span.end+1, it.span.end-1), + inner: Span::new(s.span.end + 1, it.span.end - 1), } )); @@ -201,7 +198,7 @@ where } fn visit_import_declaration(&mut self, it: &ImportDeclaration<'data>) { - self.rewrite_url(&it.source,true); + self.rewrite_url(&it.source, true); walk::walk_import_declaration(self, it); } fn visit_import_expression(&mut self, it: &ImportExpression<'data>) { @@ -213,11 +210,11 @@ where } fn visit_export_all_declaration(&mut self, it: &ExportAllDeclaration<'data>) { - self.rewrite_url(&it.source,true); + self.rewrite_url(&it.source, true); } fn visit_export_named_declaration(&mut self, it: &ExportNamedDeclaration<'data>) { if let Some(source) = &it.source { - self.rewrite_url(source,true); + self.rewrite_url(source, true); } // do not walk further, we don't want to rewrite the identifiers } @@ -314,27 +311,33 @@ where return; } } - AssignmentTarget::StaticMemberExpression(s) =>{ - if UNSAFE_GLOBALS.contains(&s.property.name.as_str()) { - self.jschanges.add(rewrite!(it.span, WrapSet { - ident: s.property.name, - propspan: Span::new(s.property.span.start-1, s.property.span.end), - leftspan: s.span(), - rightspan: it.right.span(), - })); - } - - // more to walk - walk::walk_expression(self, &s.object); + AssignmentTarget::StaticMemberExpression(s) => { + if UNSAFE_GLOBALS.contains(&s.property.name.as_str()) { + self.jschanges.add(rewrite!( + it.span, + WrapSet { + ident: s.property.name, + propspan: Span::new(s.property.span.start - 1, s.property.span.end), + leftspan: s.span(), + rightspan: it.right.span(), + } + )); + } + + // more to walk + walk::walk_expression(self, &s.object); } - AssignmentTarget::ComputedMemberExpression(s)=> { - self.jschanges.add(rewrite!(it.span, WrapSetComputed { - propspan: s.expression.span(), - leftspan: s.object.span(), - rightspan: it.right.span(), - })); - walk::walk_expression(self, &s.object); - walk::walk_expression(self, &s.expression); + AssignmentTarget::ComputedMemberExpression(s) => { + self.jschanges.add(rewrite!( + it.span, + WrapSetComputed { + propspan: s.expression.span(), + leftspan: s.object.span(), + rightspan: it.right.span(), + } + )); + walk::walk_expression(self, &s.object); + walk::walk_expression(self, &s.expression); } AssignmentTarget::ArrayAssignmentTarget(_) => { // [location] = ["https://example.com"] diff --git a/rewriter/native/src/main.rs b/rewriter/native/src/main.rs index 492fd760..56072268 100644 --- a/rewriter/native/src/main.rs +++ b/rewriter/native/src/main.rs @@ -110,7 +110,7 @@ fn main() -> Result<()> { let unrewritten = NativeRewriter::unrewrite(&res); // println!( // "unrewritten:\n{}", - // str::from_utf8(&unrewritten).context("failed to parse unrewritten js")? + // str::from_utf8(&unrewritten).context("failed to parse unrewritten js")? // ); eprintln!("errors:"); diff --git a/rewriter/native/test.js b/rewriter/native/test.js index 678596e0..08b5f722 100644 --- a/rewriter/native/test.js +++ b/rewriter/native/test.js @@ -1,36 +1 @@ -window.location.href = "http://example.com"; - -console.log(top.window.aaa); -consle.log(globalThis["win" + "dow"]); - -globalThis.eval(".."); - -let ref = { b: this.top.window, c: globalThis["win" + "dow"] }; - - -export default ref; - -export { ref }; - - -export { ref as default }; - -export { S } from "module"; -export * from "module"; -import sd from "d" - -location += "http://example.com"; - -function f() { return import("x") } - - -let window = (1, window); - -let x = new this.Abc(); - -try{}catch(e){this.a.log()}; - -await import("test") - - -import{c as d,u as g,a as l,r as i,b,d as m,g as p,e as h,f as v,h as k}from"./1e3cB0WW.js"; +parent.location diff --git a/rewriter/wasm/src/jsr.rs b/rewriter/wasm/src/jsr.rs index 09ebda67..8caa8876 100644 --- a/rewriter/wasm/src/jsr.rs +++ b/rewriter/wasm/src/jsr.rs @@ -74,11 +74,12 @@ impl UrlRewriter for WasmUrlRewriter { .map_err(RewriterError::from)? .to_string(); - let mut rewritten = self.0 - .call1(&JsValue::NULL, &url.into()) - .map_err(RewriterError::from)? - .as_string() - .ok_or_else(|| RewriterError::not_str("url rewriter output"))?; + let mut rewritten = self + .0 + .call1(&JsValue::NULL, &url.into()) + .map_err(RewriterError::from)? + .as_string() + .ok_or_else(|| RewriterError::not_str("url rewriter output"))?; if module { rewritten.push_str("?type=module"); From 654e354c2a4238cc9965da359ea1dc84103d4d4c Mon Sep 17 00:00:00 2001 From: Toshit Chawda Date: Thu, 24 Jul 2025 16:56:54 -0700 Subject: [PATCH 2/2] fix --- rewriter/js/src/changes.rs | 2 ++ rewriter/js/src/rewrite.rs | 32 +++++++++----------------------- rewriter/js/src/visitor.rs | 2 +- rewriter/native/test.js | 37 ++++++++++++++++++++++++++++++++++++- 4 files changed, 48 insertions(+), 25 deletions(-) diff --git a/rewriter/js/src/changes.rs b/rewriter/js/src/changes.rs index 7528ffbd..32e48f9e 100644 --- a/rewriter/js/src/changes.rs +++ b/rewriter/js/src/changes.rs @@ -209,6 +209,8 @@ impl Ord for JsChange<'_, '_> { Ordering::Equal => match (&self.ty, &other.ty) { (Ty::ScramErrFn { .. }, _) => Ordering::Less, (_, Ty::ScramErrFn { .. }) => Ordering::Greater, + (Ty::WrapFnRight { .. }, _) => Ordering::Less, + (_, Ty::WrapFnRight { .. }) => Ordering::Greater, _ => Ordering::Equal, }, x => x, diff --git a/rewriter/js/src/rewrite.rs b/rewriter/js/src/rewrite.rs index e1f3eeff..b251e9de 100644 --- a/rewriter/js/src/rewrite.rs +++ b/rewriter/js/src/rewrite.rs @@ -115,6 +115,9 @@ impl<'alloc: 'data, 'data> RewriteType<'alloc, 'data> { ($span1:ident $span2:ident end) => { Span::new($span1.end, $span2.end) }; + ($span1:ident $span2:ident between) => { + Span::new($span1.end, $span2.start) + }; } match self { @@ -128,12 +131,7 @@ impl<'alloc: 'data, 'data> RewriteType<'alloc, 'data> { enclose, } => smallvec![ change!(span!(start), WrapGetLeft { ident, enclose }), - change!(propspan, Delete), - change!(Span::new(propspan.start - 1, propspan.start), Delete), - change!( - Span::new(propspan.end, propspan.end), - WrapGetRight { enclose } - ), + change!(propspan.expand_left(1), WrapGetRight { enclose }), ], Self::WrapGetComputed { leftspan, @@ -142,13 +140,10 @@ impl<'alloc: 'data, 'data> RewriteType<'alloc, 'data> { } => smallvec![ change!(span!(start), WrapGetComputedLeft { enclose }), // replace the bracket with , - change!( - Span::new(leftspan.end, propspan.start), - Replace { text: "," } - ), + change!(span!(leftspan propspan between), Replace { text: "," }), // replace the other bracket with ) change!( - Span::new(propspan.end, propspan.end + 1), + propspan.expand_right(1), ClosingParen { semi: false, replace: true @@ -163,10 +158,7 @@ impl<'alloc: 'data, 'data> RewriteType<'alloc, 'data> { } => smallvec![ change!(span!(start), WrapSet { ident, propspan }), change!(propspan, Delete), - change!( - Span::new(leftspan.end, rightspan.start), - Replace { text: "," } - ), + change!(span!(leftspan rightspan between), Replace { text: "," }), change!( span!(end), ClosingParen { @@ -182,15 +174,9 @@ impl<'alloc: 'data, 'data> RewriteType<'alloc, 'data> { } => smallvec![ change!(span!(start), WrapSetComputed), // replace the bracket with , - change!( - Span::new(leftspan.end, propspan.start), - Replace { text: "," } - ), + change!(span!(leftspan propspan between), Replace { text: "," }), // replace the other bracket with another , - change!( - Span::new(propspan.end, rightspan.start), - Replace { text: "," } - ), + change!(span!(propspan rightspan between), Replace { text: "," }), change!( span!(end), ClosingParen { diff --git a/rewriter/js/src/visitor.rs b/rewriter/js/src/visitor.rs index ab2d2fd9..0e5be44b 100644 --- a/rewriter/js/src/visitor.rs +++ b/rewriter/js/src/visitor.rs @@ -133,7 +133,7 @@ where it.span(), WrapGet { ident: s.property.name, - propspan: Span::new(s.property.span.start, s.property.span.end), + propspan: s.property.span, enclose: false, } )); diff --git a/rewriter/native/test.js b/rewriter/native/test.js index 08b5f722..678596e0 100644 --- a/rewriter/native/test.js +++ b/rewriter/native/test.js @@ -1 +1,36 @@ -parent.location +window.location.href = "http://example.com"; + +console.log(top.window.aaa); +consle.log(globalThis["win" + "dow"]); + +globalThis.eval(".."); + +let ref = { b: this.top.window, c: globalThis["win" + "dow"] }; + + +export default ref; + +export { ref }; + + +export { ref as default }; + +export { S } from "module"; +export * from "module"; +import sd from "d" + +location += "http://example.com"; + +function f() { return import("x") } + + +let window = (1, window); + +let x = new this.Abc(); + +try{}catch(e){this.a.log()}; + +await import("test") + + +import{c as d,u as g,a as l,r as i,b,d as m,g as p,e as h,f as v,h as k}from"./1e3cB0WW.js";