Skip to content
This repository was archived by the owner on Jul 6, 2025. It is now read-only.

Commit b225187

Browse files
committed
Imporove compiler
1 parent e335da5 commit b225187

File tree

9 files changed

+65
-129
lines changed

9 files changed

+65
-129
lines changed

compiler/dist/compiler.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,17 +112,16 @@ function addHeapObject(obj) {
112112
/**
113113
* @param {string} specifier
114114
* @param {string} code
115-
* @param {any} options
116115
* @returns {any}
117116
*/
118-
export function fastTransform(specifier, code, options) {
117+
export function parseExportNames(specifier, code) {
119118
try {
120119
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
121120
const ptr0 = passStringToWasm0(specifier, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
122121
const len0 = WASM_VECTOR_LEN;
123122
const ptr1 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
124123
const len1 = WASM_VECTOR_LEN;
125-
wasm.fastTransform(retptr, ptr0, len0, ptr1, len1, addHeapObject(options));
124+
wasm.parseExportNames(retptr, ptr0, len0, ptr1, len1);
126125
var r0 = getInt32Memory0()[retptr / 4 + 0];
127126
var r1 = getInt32Memory0()[retptr / 4 + 1];
128127
var r2 = getInt32Memory0()[retptr / 4 + 2];
@@ -138,16 +137,17 @@ export function fastTransform(specifier, code, options) {
138137
/**
139138
* @param {string} specifier
140139
* @param {string} code
140+
* @param {any} options
141141
* @returns {any}
142142
*/
143-
export function parseExportNames(specifier, code) {
143+
export function parseDeps(specifier, code, options) {
144144
try {
145145
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
146146
const ptr0 = passStringToWasm0(specifier, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
147147
const len0 = WASM_VECTOR_LEN;
148148
const ptr1 = passStringToWasm0(code, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
149149
const len1 = WASM_VECTOR_LEN;
150-
wasm.parseExportNames(retptr, ptr0, len0, ptr1, len1);
150+
wasm.parseDeps(retptr, ptr0, len0, ptr1, len1, addHeapObject(options));
151151
var r0 = getInt32Memory0()[retptr / 4 + 0];
152152
var r1 = getInt32Memory0()[retptr / 4 + 1];
153153
var r2 = getInt32Memory0()[retptr / 4 + 2];

compiler/dist/wasm.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/mod.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import { dirname, join } from "https://deno.land/[email protected]/path/mod.ts";
33
import { existsFile } from "../lib/fs.ts";
44
import { isCanary, VERSION } from "../version.ts";
55
import init, {
6-
fastTransform as fastSWC,
7-
parseExportNames as parseExportNamesSWC,
8-
transform as swc,
6+
parseDeps as parseDepsWasmFn,
7+
parseExportNames as parseExportNamesWasmFn,
8+
transform as transformWasmFn,
99
transformCSS as parcelCSS,
1010
} from "./dist/compiler.js";
1111
import decodeWasmData from "./dist/wasm.js";
1212
import {
13-
FastTransformOptions,
13+
DependencyDescriptor,
1414
TransformCSSOptions,
1515
TransformCSSResult,
1616
TransformOptions,
@@ -56,17 +56,17 @@ export async function parseExportNames(
5656
code: string,
5757
): Promise<string[]> {
5858
await checkWasmReady();
59-
return parseExportNamesSWC(specifier, code);
59+
return parseExportNamesWasmFn(specifier, code);
6060
}
6161

6262
/** fast transform without transpile code raw syntax */
63-
export async function fastTransform(
63+
export async function parseDeps(
6464
specifier: string,
6565
code: string,
66-
options: FastTransformOptions = {},
67-
): Promise<TransformResult> {
66+
options: Pick<TransformOptions, "importMap" | "lang"> = {},
67+
): Promise<DependencyDescriptor[]> {
6868
await checkWasmReady();
69-
return fastSWC(specifier, code, options);
69+
return parseDepsWasmFn(specifier, code, options);
7070
}
7171

7272
/**
@@ -91,7 +91,7 @@ export async function transform(
9191
options: TransformOptions = {},
9292
): Promise<TransformResult> {
9393
await checkWasmReady();
94-
return swc(specifier, code, options);
94+
return transformWasmFn(specifier, code, options);
9595
}
9696

9797
/**

compiler/src/lib.rs

Lines changed: 15 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ mod tests;
1515

1616
use resolver::{DependencyDescriptor, Resolver};
1717
use serde::{Deserialize, Serialize};
18-
use std::collections::HashMap;
1918
use std::str::FromStr;
2019
use std::{cell::RefCell, rc::Rc};
2120
use swc::{EmitOptions, SWC};
@@ -38,12 +37,6 @@ pub struct Options {
3837
#[serde(default)]
3938
pub import_map: Option<String>,
4039

41-
#[serde(default)]
42-
pub graph_versions: HashMap<String, String>,
43-
44-
#[serde(default)]
45-
pub initial_graph_version: Option<String>,
46-
4740
#[serde(default = "default_target")]
4841
pub target: String,
4942

@@ -78,8 +71,18 @@ pub struct TransformOutput {
7871
pub map: Option<String>,
7972
}
8073

81-
#[wasm_bindgen(js_name = "fastTransform")]
82-
pub fn fast_transform(specifier: &str, code: &str, options: JsValue) -> Result<JsValue, JsValue> {
74+
#[wasm_bindgen(js_name = "parseExportNames")]
75+
pub fn parse_export_names(specifier: &str, code: &str) -> Result<JsValue, JsValue> {
76+
console_error_panic_hook::set_once();
77+
78+
let module = SWC::parse(specifier, code, EsVersion::Es2022, None).expect("could not parse the module");
79+
let names = module.parse_export_names().expect("could not parse the module");
80+
81+
Ok(JsValue::from_serde(&names).unwrap())
82+
}
83+
84+
#[wasm_bindgen(js_name = "parseDeps")]
85+
pub fn parse_deps(specifier: &str, code: &str, options: JsValue) -> Result<JsValue, JsValue> {
8386
console_error_panic_hook::set_once();
8487

8588
let options: Options = options
@@ -93,41 +96,12 @@ pub fn fast_transform(specifier: &str, code: &str, options: JsValue) -> Result<J
9396
.expect("could not pause the import map")
9497
.import_map;
9598
let resolver = Rc::new(RefCell::new(Resolver::new(
96-
specifier,
97-
"",
98-
None,
99-
None,
100-
None,
101-
importmap,
102-
options.graph_versions,
103-
options.initial_graph_version,
104-
false,
105-
false,
99+
specifier, "", None, None, None, importmap, false, false,
106100
)));
107101
let module = SWC::parse(specifier, code, EsVersion::Es2022, options.lang).expect("could not parse the module");
108-
let (code, map) = module
109-
.fast_transform(resolver.clone())
110-
.expect("could not transform the module");
111-
let r = resolver.borrow();
102+
let deps = module.parse_deps(resolver).expect("could not parse the module");
112103

113-
Ok(
114-
JsValue::from_serde(&TransformOutput {
115-
code,
116-
deps: r.deps.clone(),
117-
map,
118-
})
119-
.unwrap(),
120-
)
121-
}
122-
123-
#[wasm_bindgen(js_name = "parseExportNames")]
124-
pub fn parse_export_names(specifier: &str, code: &str) -> Result<JsValue, JsValue> {
125-
console_error_panic_hook::set_once();
126-
127-
let module = SWC::parse(specifier, code, EsVersion::Es2022, None).expect("could not parse the module");
128-
let names = module.parse_export_names().expect("could not parse the module");
129-
130-
Ok(JsValue::from_serde(&names).unwrap())
104+
Ok(JsValue::from_serde(&deps).unwrap())
131105
}
132106

133107
#[wasm_bindgen(js_name = "transform")]
@@ -151,8 +125,6 @@ pub fn transform(specifier: &str, code: &str, options: JsValue) -> Result<JsValu
151125
options.jsx_runtime_version,
152126
options.jsx_runtime_cdn_version,
153127
importmap,
154-
options.graph_versions,
155-
options.initial_graph_version,
156128
options.is_dev,
157129
true,
158130
)));

compiler/src/resolve_fold.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ impl Fold for ResolveFold {
3535
ModuleItem::ModuleDecl(ModuleDecl::Import(import_decl))
3636
} else {
3737
let mut resolver = self.resolver.borrow_mut();
38-
let resolved_url = resolver.resolve(import_decl.src.value.as_ref(), false);
38+
let resolved_url = resolver.resolve(import_decl.src.value.as_ref(), &import_decl.src.span, false);
3939
ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl {
4040
src: new_str(&resolved_url),
4141
..import_decl
@@ -62,7 +62,7 @@ impl Fold for ResolveFold {
6262
}))
6363
} else {
6464
let mut resolver = self.resolver.borrow_mut();
65-
let resolved_url = resolver.resolve(src.value.as_ref(), false);
65+
let resolved_url = resolver.resolve(src.value.as_ref(), &src.span, false);
6666
ModuleItem::ModuleDecl(ModuleDecl::ExportNamed(NamedExport {
6767
span,
6868
specifiers,
@@ -75,7 +75,7 @@ impl Fold for ResolveFold {
7575
// match: export * from "https://esm.sh/react"
7676
ModuleDecl::ExportAll(ExportAll { src, span, asserts }) => {
7777
let mut resolver = self.resolver.borrow_mut();
78-
let resolved_url = resolver.resolve(src.value.as_ref(), false);
78+
let resolved_url = resolver.resolve(src.value.as_ref(), &src.span, false);
7979
ModuleItem::ModuleDecl(ModuleDecl::ExportAll(ExportAll {
8080
span,
8181
src: new_str(&resolved_url),
@@ -154,23 +154,23 @@ impl Fold for ResolveFold {
154154
};
155155
if ok {
156156
if let Some(args) = &mut new_expr.args {
157-
let url = match args.first() {
157+
let src = match args.first() {
158158
Some(ExprOrSpread { expr, .. }) => match expr.as_ref() {
159159
Expr::Lit(lit) => match lit {
160-
Lit::Str(s) => Some(s.value.as_ref()),
160+
Lit::Str(s) => Some(s),
161161
_ => None,
162162
},
163163
_ => None,
164164
},
165165
_ => None,
166166
};
167-
if let Some(url) = url {
167+
if let Some(src) = src {
168168
let mut resolver = self.resolver.borrow_mut();
169-
let new_url = resolver.resolve(url, true);
169+
let new_src = resolver.resolve(src.value.as_ref(), &src.span, true);
170170

171171
args[0] = ExprOrSpread {
172172
spread: None,
173-
expr: Box::new(Expr::Lit(Lit::Str(new_str(&new_url)))),
173+
expr: Box::new(Expr::Lit(Lit::Str(new_str(&new_src)))),
174174
}
175175
}
176176
}
@@ -182,23 +182,23 @@ impl Fold for ResolveFold {
182182
// fold&resolve dynamic import url
183183
fn fold_call_expr(&mut self, mut call: CallExpr) -> CallExpr {
184184
if is_call_expr_by_name(&call, "import") {
185-
let url = match call.args.first() {
185+
let src = match call.args.first() {
186186
Some(ExprOrSpread { expr, .. }) => match expr.as_ref() {
187187
Expr::Lit(lit) => match lit {
188-
Lit::Str(s) => Some(s.value.as_ref()),
188+
Lit::Str(s) => Some(s),
189189
_ => None,
190190
},
191191
_ => None,
192192
},
193193
_ => None,
194194
};
195-
if let Some(url) = url {
195+
if let Some(src) = src {
196196
let mut resolver = self.resolver.borrow_mut();
197-
let new_url = resolver.resolve(url, true);
197+
let new_src = resolver.resolve(src.value.as_ref(), &src.span, true);
198198

199199
call.args[0] = ExprOrSpread {
200200
spread: None,
201-
expr: Box::new(Expr::Lit(Lit::Str(new_str(&new_url)))),
201+
expr: Box::new(Expr::Lit(Lit::Str(new_str(&new_src)))),
202202
}
203203
}
204204
}

compiler/src/resolver.rs

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ use path_slash::PathBufExt;
44
use pathdiff::diff_paths;
55
use regex::Regex;
66
use serde::Serialize;
7-
use std::collections::HashMap;
87
use std::path::{Path, PathBuf};
98
use std::str::FromStr;
9+
use swc_common::Span;
1010
use url::Url;
1111

1212
lazy_static! {
@@ -19,8 +19,8 @@ lazy_static! {
1919
#[serde(rename_all = "camelCase")]
2020
pub struct DependencyDescriptor {
2121
pub specifier: String,
22-
#[serde(skip)]
2322
pub import_url: String,
23+
pub loc: Span,
2424
#[serde(skip_serializing_if = "is_false")]
2525
pub dynamic: bool,
2626
}
@@ -46,8 +46,6 @@ pub struct Resolver {
4646
resolve_remote_deps: bool,
4747
jsx_runtime_version: Option<String>,
4848
jsx_runtime_cdn_version: Option<String>,
49-
graph_versions: HashMap<String, String>,
50-
initial_graph_version: Option<String>,
5149
}
5250

5351
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
@@ -66,8 +64,6 @@ impl Resolver {
6664
jsx_runtime_version: Option<String>,
6765
jsx_runtime_cdn_version: Option<String>,
6866
import_map: ImportMap,
69-
graph_versions: HashMap<String, String>,
70-
initial_graph_version: Option<String>,
7167
is_dev: bool,
7268
resolve_remote_deps: bool,
7369
) -> Self {
@@ -81,8 +77,6 @@ impl Resolver {
8177
jsx_runtime_cdn_version,
8278
jsx_static_classes: IndexSet::new(),
8379
import_map,
84-
graph_versions,
85-
initial_graph_version,
8680
is_dev,
8781
resolve_remote_deps,
8882
}
@@ -126,7 +120,7 @@ impl Resolver {
126120
}
127121

128122
/// Resolve import/export URLs.
129-
pub fn resolve(&mut self, url: &str, dynamic: bool) -> String {
123+
pub fn resolve(&mut self, url: &str, span: &Span, dynamic: bool) -> String {
130124
let referrer = if self.specifier_is_remote {
131125
Url::from_str(self.specifier.as_str()).unwrap()
132126
} else {
@@ -214,30 +208,15 @@ impl Resolver {
214208
}
215209
}
216210

217-
if is_remote {
218-
// fix remote url to local path if allowed
219-
if self.resolve_remote_deps {
220-
import_url = self.to_local_path(&import_url);
221-
}
222-
} else {
223-
// apply graph version if exists
224-
let v = if self.graph_versions.contains_key(&fixed_url) {
225-
self.graph_versions.get(&fixed_url)
226-
} else {
227-
self.initial_graph_version.as_ref()
228-
};
229-
if let Some(version) = v {
230-
if import_url.contains("?") {
231-
import_url = format!("{}&v={}", import_url, version);
232-
} else {
233-
import_url = format!("{}?v={}", import_url, version);
234-
}
235-
}
211+
// fix remote url to local path if allowed
212+
if is_remote && self.resolve_remote_deps {
213+
import_url = self.to_local_path(&import_url);
236214
}
237215

238216
// update dep graph
239217
self.deps.push(DependencyDescriptor {
240218
specifier: fixed_url.clone(),
219+
loc: span.clone(),
241220
import_url: import_url.clone(),
242221
dynamic,
243222
});

0 commit comments

Comments
 (0)