diff --git a/rewriter/src/lib.rs b/rewriter/src/lib.rs index a1f2874..633a570 100644 --- a/rewriter/src/lib.rs +++ b/rewriter/src/lib.rs @@ -51,6 +51,7 @@ fn get_config(scramjet: &Object) -> Config { wrapfn: get_str(config, "wrapfn"), importfn: get_str(config, "importfn"), rewritefn: get_str(config, "rewritefn"), + metafn: get_str(config, "metafn"), } } diff --git a/rewriter/src/main.rs b/rewriter/src/main.rs index dfe1149..9234ca7 100644 --- a/rewriter/src/main.rs +++ b/rewriter/src/main.rs @@ -118,6 +118,7 @@ fn dorewrite(source_text: &str) -> String { wrapfn: "$wrap".to_string(), importfn: "$import".to_string(), rewritefn: "$rewrite".to_string(), + metafn: "$meta".to_string(), }, ) .as_slice(), diff --git a/rewriter/src/rewrite.rs b/rewriter/src/rewrite.rs index 4480d7f..ccf0817 100644 --- a/rewriter/src/rewrite.rs +++ b/rewriter/src/rewrite.rs @@ -38,6 +38,7 @@ pub struct Config { pub wrapfn: String, pub importfn: String, pub rewritefn: String, + pub metafn: String, pub encode: EncodeFn, } @@ -58,6 +59,23 @@ impl Rewriter { }); } } + + fn walk_member_expression(&mut self, it: &Expression) -> bool { + if match it { + Expression::Identifier(s) => { + self.rewrite_ident(&s.name, s.span); + true + } + Expression::StaticMemberExpression(s) => self.walk_member_expression(&s.object), + Expression::ComputedMemberExpression(s) => self.walk_member_expression(&s.object), + _ => false, + } { + return true; + } + // TODO: WE SHOULD PROBABLY WALK THE REST OF THE TREE + // walk::walk_expression(self, it); + false + } } impl<'a> Visit<'a> for Rewriter { @@ -79,28 +97,7 @@ impl<'a> Visit<'a> for Rewriter { // we need to rewrite `new Something` to `new (wrapfn(Something))` instead of `new wrapfn(Something)`, that's why there's weird extra code here fn visit_new_expression(&mut self, it: &oxc_ast::ast::NewExpression<'a>) { - match &it.callee { - Expression::Identifier(s) => { - self.rewrite_ident(&s.name, s.span); - return; - } - Expression::StaticMemberExpression(s) => match &s.object { - Expression::Identifier(s) => { - self.rewrite_ident(&s.name, s.span); - return; - } - _ => {} - }, - Expression::ComputedMemberExpression(s) => match &s.object { - Expression::Identifier(s) => { - self.rewrite_ident(&s.name, s.span); - return; - } - _ => {} - }, - _ => {} - } - walk::walk_new_expression(self, it); + self.walk_member_expression(&it.callee); } fn visit_this_expression(&mut self, it: &oxc_ast::ast::ThisExpression) { self.jschanges.push(JsChange::GenericChange { @@ -253,6 +250,15 @@ impl<'a> Visit<'a> for Rewriter { // then no, don't walk it, we don't care } + fn visit_meta_property(&mut self, it: &oxc_ast::ast::MetaProperty<'a>) { + if it.meta.name == "import" { + self.jschanges.push(JsChange::GenericChange { + span: it.span, + text: format!("{}(\"{}\")", self.config.metafn, self.base), + }); + } + } + fn visit_assignment_expression(&mut self, it: &oxc_ast::ast::AssignmentExpression<'a>) { #[allow(clippy::single_match)] match &it.left { diff --git a/src/client/shared/import.ts b/src/client/shared/import.ts index 38fc4d3..c6ccb47 100644 --- a/src/client/shared/import.ts +++ b/src/client/shared/import.ts @@ -1,11 +1,20 @@ import { config, encodeUrl } from "../shared"; export default function (client, self) { - self[config.importfn] = function (base) { - return function (url) { + self[config.importfn] = function (base: string) { + return function (url: string) { const resolved = new URL(url, base).href; return Function(`return import("${encodeUrl(resolved)}")`)(); }; }; + + self[config.metafn] = function (base: string) { + return { + url: base, + resolve: function (url: string) { + return new URL(url, base).href; + }, + }; + }; } diff --git a/src/controller/index.ts b/src/controller/index.ts index dcd6e81..46d3fc4 100644 --- a/src/controller/index.ts +++ b/src/controller/index.ts @@ -15,6 +15,7 @@ export class ScramjetController { trysetfn: "$scramjet$tryset", importfn: "$scramjet$import", rewritefn: "$scramjet$rewrite", + metafn: "$scramjet$meta", wasm: "/scramjet.wasm.js", shared: "/scramjet.shared.js", worker: "/scramjet.worker.js", diff --git a/src/types.d.ts b/src/types.d.ts index 61c03fd..8554aaf 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -18,6 +18,7 @@ interface ScramjetConfig { trysetfn: string; importfn: string; rewritefn: string; + metafn: string; wasm: string; shared: string; worker: string;