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

Commit 9370813

Browse files
committed
breaking(compliler): add ReactResolve type
1 parent fde17f0 commit 9370813

File tree

5 files changed

+80
-84
lines changed

5 files changed

+80
-84
lines changed

compiler/mod.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { join } from 'https://deno.land/[email protected]/path/mod.ts'
22
import { ensureDir } from 'https://deno.land/[email protected]/fs/ensure_dir.ts'
33
import { existsFileSync } from '../shared/fs.ts'
44
import log from '../shared/log.ts'
5-
import type { LoaderPlugin } from '../types.ts'
65
import { VERSION } from '../version.ts'
76
import { checksum } from './dist/wasm-checksum.js'
87
import init, { parseExportNamesSync, transformSync } from './dist/wasm-pack.js'
@@ -21,6 +20,11 @@ export type ImportMap = {
2120
scopes: Record<string, Record<string, string>>
2221
}
2322

23+
export type ReactResolve = {
24+
version: string,
25+
esmShBuildVersion: number
26+
}
27+
2428
export type SWCOptions = {
2529
sourceType?: SourceType
2630
target?: 'es2015' | 'es2016' | 'es2017' | 'es2018' | 'es2019' | 'es2020'
@@ -31,8 +35,7 @@ export type SWCOptions = {
3135
export type TransformOptions = {
3236
importMap?: ImportMap
3337
alephPkgUri?: string
34-
reactVersion?: string
35-
fixedReactEsmShBuildVersion?: number
38+
react?: ReactResolve
3639
swcOptions?: SWCOptions
3740
sourceMap?: boolean
3841
isDev?: boolean

compiler/src/lib.rs

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ mod source_type;
1111
mod swc;
1212

1313
use import_map::ImportHashMap;
14-
use resolve::{DependencyDescriptor, InlineStyle, Resolver};
14+
use resolve::{DependencyDescriptor, InlineStyle, ReactResolve, Resolver};
1515
use serde::{Deserialize, Serialize};
1616
use source_type::SourceType;
1717
use std::collections::HashMap;
@@ -30,10 +30,7 @@ pub struct Options {
3030
pub aleph_pkg_uri: String,
3131

3232
#[serde(default)]
33-
pub react_version: String,
34-
35-
#[serde(default)]
36-
pub fixed_react_esm_sh_build_version: usize,
33+
pub react: Option<ReactResolve>,
3734

3835
#[serde(default)]
3936
pub swc_options: SWCOptions,
@@ -141,15 +138,7 @@ pub fn transform_sync(url: &str, code: &str, options: JsValue) -> Result<JsValue
141138
"" => None,
142139
_ => Some(options.aleph_pkg_uri),
143140
},
144-
match options.react_version.as_str() {
145-
"" => None,
146-
_ => Some(options.react_version),
147-
},
148-
if options.fixed_react_esm_sh_build_version > 0 {
149-
Some(options.fixed_react_esm_sh_build_version)
150-
} else {
151-
None
152-
},
141+
options.react,
153142
)));
154143
let module =
155144
SWC::parse(url, code, Some(options.swc_options.source_type)).expect("could not parse module");

compiler/src/resolve.rs

Lines changed: 62 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use path_slash::PathBufExt;
55
use pathdiff::diff_paths;
66
use regex::Regex;
77
use relative_path::RelativePath;
8-
use serde::Serialize;
8+
use serde::{Deserialize, Serialize};
99
use std::{
1010
collections::HashMap,
1111
path::{Path, PathBuf},
@@ -39,6 +39,15 @@ pub struct InlineStyle {
3939
pub exprs: Vec<String>,
4040
}
4141

42+
#[derive(Clone, Debug, Deserialize)]
43+
#[serde(deny_unknown_fields, rename_all = "camelCase")]
44+
pub struct ReactResolve {
45+
#[serde(default)]
46+
pub version: String,
47+
#[serde(default)]
48+
pub esm_sh_build_version: usize,
49+
}
50+
4251
/// A Resolver to resolve aleph.js import/export URL.
4352
pub struct Resolver {
4453
/// the text specifier associated with the import/export statement.
@@ -63,8 +72,7 @@ pub struct Resolver {
6372
// private
6473
import_map: ImportMap,
6574
aleph_pkg_uri: Option<String>,
66-
react_version: Option<String>,
67-
fixed_react_esm_sh_build_version: Option<usize>,
75+
react: Option<ReactResolve>,
6876
}
6977

7078
impl Resolver {
@@ -74,8 +82,7 @@ impl Resolver {
7482
bundle_mode: bool,
7583
bundle_external: Vec<String>,
7684
aleph_pkg_uri: Option<String>,
77-
react_version: Option<String>,
78-
fixed_react_esm_sh_build_version: Option<usize>,
85+
react: Option<ReactResolve>,
7986
) -> Self {
8087
let mut set = IndexSet::<String>::new();
8188
for url in bundle_external {
@@ -93,8 +100,7 @@ impl Resolver {
93100
extra_imports: IndexSet::new(),
94101
import_map: ImportMap::from_hashmap(import_map),
95102
aleph_pkg_uri,
96-
react_version,
97-
fixed_react_esm_sh_build_version,
103+
react,
98104
}
99105
}
100106

@@ -243,7 +249,7 @@ impl Resolver {
243249
}
244250
}
245251
// fix react/react-dom url
246-
if let Some(version) = &self.react_version {
252+
if let Some(react) = &self.react {
247253
if RE_REACT_URL.is_match(fixed_url.as_str()) {
248254
let caps = RE_REACT_URL.captures(fixed_url.as_str()).unwrap();
249255
let mut host = caps.get(1).map_or("", |m| m.as_str());
@@ -253,41 +259,34 @@ impl Resolver {
253259
let dom = caps.get(3).map_or("", |m| m.as_str());
254260
let ver = caps.get(4).map_or("", |m| m.as_str());
255261
let path = caps.get(5).map_or("", |m| m.as_str());
256-
let (target_build_version, should_replace_build_version) =
257-
match self.fixed_react_esm_sh_build_version {
258-
Some(v) => {
259-
if build_version != "" && v > 0 && !build_version.eq(v.to_string().as_str()) {
260-
(v.to_string(), true)
261-
} else {
262-
("".to_owned(), false)
263-
}
264-
}
265-
_ => ("".to_owned(), false),
266-
};
267-
println!(
268-
"---{}-{}---",
269-
target_build_version, should_replace_build_version
270-
);
262+
let (target_build_version, should_replace_build_version) = if build_version != ""
263+
&& react.esm_sh_build_version > 0
264+
&& !build_version.eq(react.esm_sh_build_version.to_string().as_str())
265+
{
266+
(react.esm_sh_build_version.to_string(), true)
267+
} else {
268+
("".to_owned(), false)
269+
};
271270
let non_esm_sh_cdn = match host {
272271
"esm.sh" | "cdn.esm.sh" | "cdn.esm.sh.cn" | "esm.x-static.io" => false,
273272
_ => true,
274273
};
275274
if non_esm_sh_cdn {
276275
host = "esm.sh"
277276
}
278-
if non_esm_sh_cdn || ver != version || should_replace_build_version {
277+
if non_esm_sh_cdn || ver != react.version || should_replace_build_version {
279278
if should_replace_build_version {
280279
fixed_url = format!(
281280
"https://{}/v{}/react{}@{}{}",
282-
host, target_build_version, dom, version, path
281+
host, target_build_version, dom, react.version, path
283282
);
284283
} else if build_version != "" {
285284
fixed_url = format!(
286285
"https://{}/v{}/react{}@{}{}",
287-
host, build_version, dom, version, path
286+
host, build_version, dom, react.version, path
288287
);
289288
} else {
290-
fixed_url = format!("https://{}/react{}@{}{}", host, dom, version, path);
289+
fixed_url = format!("https://{}/react{}@{}{}", host, dom, react.version, path);
291290
}
292291
}
293292
}
@@ -420,7 +419,6 @@ mod tests {
420419
vec![],
421420
None,
422421
None,
423-
None,
424422
);
425423
assert_eq!(
426424
resolver.fix_import_url("https://esm.sh/react"),
@@ -477,14 +475,16 @@ mod tests {
477475
false,
478476
vec![],
479477
None,
480-
Some("17.0.1".into()),
481-
None,
478+
Some(ReactResolve {
479+
version: "17.0.2".into(),
480+
esm_sh_build_version: 2,
481+
}),
482482
);
483483
assert_eq!(
484484
resolver.resolve("https://esm.sh/react", false),
485485
(
486-
"../-/esm.sh/[email protected].1.js".into(),
487-
"https://esm.sh/[email protected].1".into()
486+
"../-/esm.sh/[email protected].2.js".into(),
487+
"https://esm.sh/[email protected].2".into()
488488
)
489489
);
490490
assert_eq!(
@@ -504,50 +504,50 @@ mod tests {
504504
assert_eq!(
505505
resolver.resolve("https://esm.sh/react@16", false),
506506
(
507-
"../-/esm.sh/[email protected].1.js".into(),
508-
"https://esm.sh/[email protected].1".into()
507+
"../-/esm.sh/[email protected].2.js".into(),
508+
"https://esm.sh/[email protected].2".into()
509509
)
510510
);
511511
assert_eq!(
512512
resolver.resolve("https://esm.sh/react-dom", false),
513513
(
514-
"../-/esm.sh/[email protected].1.js".into(),
515-
"https://esm.sh/[email protected].1".into()
514+
"../-/esm.sh/[email protected].2.js".into(),
515+
"https://esm.sh/[email protected].2".into()
516516
)
517517
);
518518
assert_eq!(
519519
resolver.resolve("https://esm.sh/[email protected]", false),
520520
(
521-
"../-/esm.sh/[email protected].1.js".into(),
522-
"https://esm.sh/[email protected].1".into()
521+
"../-/esm.sh/[email protected].2.js".into(),
522+
"https://esm.sh/[email protected].2".into()
523523
)
524524
);
525525
assert_eq!(
526526
resolver.resolve("https://esm.sh/react-dom/server", false),
527527
(
528-
"../-/esm.sh/[email protected].1/server.js".into(),
529-
"https://esm.sh/[email protected].1/server".into()
528+
"../-/esm.sh/[email protected].2/server.js".into(),
529+
"https://esm.sh/[email protected].2/server".into()
530530
)
531531
);
532532
assert_eq!(
533533
resolver.resolve("https://esm.sh/[email protected]/server", false),
534534
(
535-
"../-/esm.sh/[email protected].1/server.js".into(),
536-
"https://esm.sh/[email protected].1/server".into()
535+
"../-/esm.sh/[email protected].2/server.js".into(),
536+
"https://esm.sh/[email protected].2/server".into()
537537
)
538538
);
539539
assert_eq!(
540540
resolver.resolve("react-dom/server", false),
541541
(
542-
"../-/esm.sh/[email protected].1/server.js".into(),
543-
"https://esm.sh/[email protected].1/server".into()
542+
"../-/esm.sh/[email protected].2/server.js".into(),
543+
"https://esm.sh/[email protected].2/server".into()
544544
)
545545
);
546546
assert_eq!(
547547
resolver.resolve("react", false),
548548
(
549-
"../-/esm.sh/[email protected].1.js".into(),
550-
"https://esm.sh/[email protected].1".into()
549+
"../-/esm.sh/[email protected].2.js".into(),
550+
"https://esm.sh/[email protected].2".into()
551551
)
552552
);
553553
assert_eq!(
@@ -602,14 +602,16 @@ mod tests {
602602
false,
603603
vec![],
604604
None,
605-
Some("17.0.1".into()),
606-
Some(2),
605+
Some(ReactResolve {
606+
version: "17.0.2".into(),
607+
esm_sh_build_version: 2,
608+
}),
607609
);
608610
assert_eq!(
609611
resolver.resolve("https://cdn.esm.sh/v1/[email protected]/es2020/react.js", false),
610612
(
611-
"../cdn.esm.sh/v2/[email protected].1/es2020/react.js".into(),
612-
"https://cdn.esm.sh/v2/[email protected].1/es2020/react.js".into()
613+
"../cdn.esm.sh/v2/[email protected].2/es2020/react.js".into(),
614+
"https://cdn.esm.sh/v2/[email protected].2/es2020/react.js".into()
613615
)
614616
);
615617
assert_eq!(
@@ -618,22 +620,22 @@ mod tests {
618620
false
619621
),
620622
(
621-
"../cdn.esm.sh/v2/[email protected].1/es2020/react.js".into(),
622-
"https://cdn.esm.sh/v2/[email protected].1/es2020/react.js".into()
623+
"../cdn.esm.sh/v2/[email protected].2/es2020/react.js".into(),
624+
"https://cdn.esm.sh/v2/[email protected].2/es2020/react.js".into()
623625
)
624626
);
625627
assert_eq!(
626628
resolver.resolve("./react", false),
627629
(
628-
"./[email protected].1.js".into(),
629-
"https://esm.sh/[email protected].1".into()
630+
"./[email protected].2.js".into(),
631+
"https://esm.sh/[email protected].2".into()
630632
)
631633
);
632634
assert_eq!(
633635
resolver.resolve("/react", false),
634636
(
635-
"./[email protected].1.js".into(),
636-
"https://esm.sh/[email protected].1".into()
637+
"./[email protected].2.js".into(),
638+
"https://esm.sh/[email protected].2".into()
637639
)
638640
);
639641
}
@@ -646,8 +648,10 @@ mod tests {
646648
false,
647649
vec![],
648650
None,
649-
None,
650-
Some(2),
651+
Some(ReactResolve {
652+
version: "17.0.2".into(),
653+
esm_sh_build_version: 2,
654+
}),
651655
);
652656
assert_eq!(
653657
resolver.resolve(

compiler/src/resolve_fold.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ fn new_str(str: String) -> Str {
570570
mod tests {
571571
use super::*;
572572
use crate::import_map::ImportHashMap;
573-
use crate::resolve::Resolver;
573+
use crate::resolve::{ReactResolve, Resolver};
574574
use crate::swc::{st, EmitOptions, SWC};
575575
use sha1::{Digest, Sha1};
576576
use std::collections::HashMap;
@@ -608,23 +608,25 @@ mod tests {
608608
false,
609609
vec![],
610610
Some("https://deno.land/x/[email protected]".into()),
611-
Some("17.0.1".into()),
612-
None,
611+
Some(ReactResolve {
612+
version: "17.0.2".into(),
613+
esm_sh_build_version: 2,
614+
}),
613615
)));
614616
let (code, _) = module
615617
.transform(resolver.clone(), &EmitOptions::default())
616618
.expect("could not transform module");
617619
println!("{}", code);
618-
assert!(code.contains("import React from \"../-/esm.sh/[email protected].1.js\""));
620+
assert!(code.contains("import React from \"../-/esm.sh/[email protected].2.js\""));
619621
assert!(code.contains("import { redirect } from \"../-/deno.land/x/[email protected]/mod.js\""));
620622
assert!(code.contains("import { useDeno } from \"../-/deno.land/x/[email protected]/hooks.js\""));
621-
assert!(code.contains("import { render } from \"../-/esm.sh/[email protected].1/server.js\""));
622-
assert!(code.contains("import { render as _render } from \"../-/cdn.esm.sh/v1/[email protected].1/es2020/react-dom.js\""));
623+
assert!(code.contains("import { render } from \"../-/esm.sh/[email protected].2/server.js\""));
624+
assert!(code.contains("import { render as _render } from \"../-/cdn.esm.sh/v2/[email protected].2/es2020/react-dom.js\""));
623625
assert!(code.contains("import Logo from \"../component/logo.js#/component/logo.tsx@000000\""));
624626
assert!(code.contains("import Logo2 from \"../component/logo.js#/component/logo.tsx@000000\""));
625627
assert!(code.contains("import Logo3 from \"../component/logo.js#/component/logo.tsx@000000\""));
626628
assert!(code.contains("const AsyncLogo = React.lazy(()=>import(\"../components/async-logo.js#/components/async-logo.tsx@000000\")"));
627-
assert!(code.contains("export { useState } from \"../-/esm.sh/[email protected].1.js\""));
629+
assert!(code.contains("export { useState } from \"../-/esm.sh/[email protected].2.js\""));
628630
assert!(code.contains("export * from \"../-/esm.sh/swr.js\""));
629631
}
630632

@@ -726,7 +728,6 @@ mod tests {
726728
],
727729
None,
728730
None,
729-
None,
730731
)));
731732
let (code, _) = module
732733
.transform(resolver.clone(), &EmitOptions::default())

compiler/src/swc.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,6 @@ pub fn st(specifer: &str, source: &str, bundling: bool) -> (String, Rc<RefCell<R
334334
vec![],
335335
Some("https://deno.land/x/[email protected]".into()),
336336
None,
337-
None,
338337
)));
339338
let (code, _) = module
340339
.transform(resolver.clone(), &EmitOptions::default())

0 commit comments

Comments
 (0)