Skip to content

Commit 03515cb

Browse files
authored
Add rust docs for resolver crate (#10002)
1 parent 0467893 commit 03515cb

File tree

25 files changed

+841
-357
lines changed

25 files changed

+841
-357
lines changed

Cargo.lock

Lines changed: 0 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
resolver = "2"
33
members = [
44
"crates/*",
5-
"packages/transformers/js/core",
6-
"packages/utils/node-resolver-rs",
7-
"packages/utils/dev-dep-resolver"
5+
"packages/transformers/js/core"
86
]
97

108
[profile.canary]

packages/utils/dev-dep-resolver/Cargo.toml renamed to crates/dev-dep-resolver/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ version = "0.1.0"
55
edition = "2021"
66

77
[dependencies]
8-
parcel-resolver = { path = "../node-resolver-rs" }
8+
parcel-resolver = { path = "../parcel-resolver" }
99
es-module-lexer = { git = "https://github.com/devongovett/es-module-lexer" }
1010
serde_json = "1.0.91"
1111
rayon = "1.7.0"

packages/utils/dev-dep-resolver/src/lib.rs renamed to crates/dev-dep-resolver/src/lib.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use std::{
66
use dashmap::{DashMap, DashSet};
77
use es_module_lexer::{lex, ImportKind};
88
use parcel_resolver::{
9-
CacheCow, Invalidations, ModuleType, Resolution, ResolveOptions, Resolver, ResolverError,
10-
Specifier, SpecifierError, SpecifierType,
9+
Invalidations, ModuleType, Resolution, ResolutionAndQuery, ResolveOptions, Resolver,
10+
ResolverError, Specifier, SpecifierError, SpecifierType,
1111
};
1212
// use rayon::prelude::{ParallelBridge, ParallelIterator};
1313

@@ -103,7 +103,7 @@ impl<'a> EsmGraphBuilder<'a> {
103103
ModuleType::CommonJs | ModuleType::Json => &self.cjs_resolver,
104104
ModuleType::Module => &self.esm_resolver,
105105
};
106-
let contents = resolver.cache.fs.read_to_string(file)?;
106+
let contents = resolver.cache().fs.read_to_string(file)?;
107107
let module = lex(&contents)?;
108108
#[allow(clippy::map_collect_result_unit)]
109109
module
@@ -126,7 +126,10 @@ impl<'a> EsmGraphBuilder<'a> {
126126
return Ok(());
127127
}
128128

129-
if let Ok((Resolution::Path(p), _)) = resolver.resolve_with_invalidations(
129+
if let Ok(ResolutionAndQuery {
130+
resolution: Resolution::Path(p),
131+
..
132+
}) = resolver.resolve_with_invalidations(
130133
&import.specifier(),
131134
file,
132135
SpecifierType::Esm,
@@ -140,7 +143,7 @@ impl<'a> EsmGraphBuilder<'a> {
140143
// file,
141144
// p
142145
// );
143-
invalidations.invalidate_on_file_change(resolver.cache.get(&p));
146+
invalidations.invalidate_on_file_change(resolver.cache().get(&p));
144147
self.build(&p)?;
145148
} else {
146149
// Ignore dependencies that don't resolve to anything.
@@ -184,7 +187,10 @@ impl<'a> EsmGraphBuilder<'a> {
184187
invalidations,
185188
ResolveOptions::default(),
186189
) {
187-
Ok((Resolution::Path(p), _)) => Cow::Owned(p.parent().unwrap().join(subpath.as_ref())),
190+
Ok(ResolutionAndQuery {
191+
resolution: Resolution::Path(p),
192+
..
193+
}) => Cow::Owned(p.parent().unwrap().join(subpath.as_ref())),
188194
_ => return Ok(()),
189195
}
190196
}
@@ -202,7 +208,7 @@ impl<'a> EsmGraphBuilder<'a> {
202208

203209
for path in glob::glob(pattern.to_string_lossy().as_ref())? {
204210
let path = path?;
205-
invalidations.invalidate_on_file_change(resolver.cache.get(&path));
211+
invalidations.invalidate_on_file_change(resolver.cache().get(&path));
206212
self.build(&path)?;
207213
}
208214

@@ -490,14 +496,8 @@ pub fn build_esm_graph(
490496
visited: DashSet::new(),
491497
visited_globs: DashSet::new(),
492498
invalidations: Invalidations::default(),
493-
cjs_resolver: Resolver::node(
494-
Cow::Borrowed(project_root),
495-
CacheCow::Borrowed(resolver_cache),
496-
),
497-
esm_resolver: Resolver::node_esm(
498-
Cow::Borrowed(project_root),
499-
CacheCow::Borrowed(resolver_cache),
500-
),
499+
cjs_resolver: Resolver::node(project_root, resolver_cache),
500+
esm_resolver: Resolver::node_esm(project_root, resolver_cache),
501501
cache,
502502
};
503503

packages/utils/dev-dep-resolver/src/main.rs renamed to crates/dev-dep-resolver/src/main.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
1-
use std::{borrow::Cow, sync::Arc};
2-
31
use parcel_dev_dep_resolver::build_esm_graph;
4-
use parcel_resolver::{Cache, CacheCow, OsFileSystem, Resolution, Resolver, SpecifierType};
2+
use parcel_resolver::{Cache, Resolution, Resolver, SpecifierType};
53

64
fn main() {
75
let contents = std::fs::read_to_string("package.json").unwrap();
86
let pkg: serde_json::Value = serde_json::from_str(&contents).unwrap();
97
let deps = pkg.get("dependencies").unwrap().as_object().unwrap();
108
let cwd = std::env::current_dir().unwrap();
119

12-
let cache = Cache::new(Arc::new(OsFileSystem));
13-
let cjs_resolver = Resolver::node(Cow::Borrowed(&cwd), CacheCow::Borrowed(&cache));
10+
let cache = Cache::default();
11+
let cjs_resolver = Resolver::node(&cwd, &cache);
1412
let esm_graph_cache = parcel_dev_dep_resolver::Cache::default();
1513

1614
deps.keys().for_each(|dep| {
1715
#[cfg(debug_assertions)]
1816
println!("------------ {} -----------", dep);
1917
let resolved = match cjs_resolver.resolve(dep, &cwd, SpecifierType::Esm).result {
20-
Ok(res) => res.0,
18+
Ok(res) => res.resolution,
2119
Err(e) => {
2220
#[cfg(debug_assertions)]
2321
println!("FAILED TO RESOLVE {} {:?}", dep, e);

crates/json-comments-rs/Cargo.toml

Lines changed: 0 additions & 15 deletions
This file was deleted.

crates/node-bindings/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ crate-type = ["cdylib"]
1010
[dependencies]
1111
napi-derive = "2.16.3"
1212
parcel-js-swc-core = { path = "../../packages/transformers/js/core" }
13-
parcel-resolver = { path = "../../packages/utils/node-resolver-rs" }
13+
parcel-resolver = { path = "../parcel-resolver" }
1414
dashmap = "6.1.0"
1515
xxhash-rust = { version = "0.8.2", features = ["xxh3"] }
1616

1717
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
1818
napi = { version = "2.16.4", features = ["serde-json", "napi4", "napi5"] }
19-
parcel-dev-dep-resolver = { path = "../../packages/utils/dev-dep-resolver" }
19+
parcel-dev-dep-resolver = { path = "../dev-dep-resolver" }
2020
parcel-macros = { path = "../macros", features = ["napi"] }
2121
oxipng = "8.0.0"
2222
mozjpeg-sys = "2.0.0"

crates/node-bindings/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::alloc::alloc;
55
#[cfg(target_arch = "wasm32")]
66
use std::alloc::Layout;
77

8-
#[cfg(all(target_os = "macos", not(miri), not(feature = "canary")))]
8+
#[cfg(all(target_os = "macos", not(miri)))]
99
#[global_allocator]
1010
static GLOBAL: jemallocator::Jemalloc = jemallocator::Jemalloc;
1111

crates/node-bindings/src/resolver.rs

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ use napi_derive::napi;
1515
use parcel_resolver::OsFileSystem;
1616
use parcel_resolver::{
1717
ExportsCondition, Extensions, Fields, FileCreateInvalidation, FileKind, FileSystem, Flags,
18-
IncludeNodeModules, Invalidations, ModuleType, Resolution, ResolverError, SpecifierType,
18+
IncludeNodeModules, Invalidations, ModuleType, Resolution, ResolutionAndQuery, ResolverError,
19+
SpecifierType,
1920
};
2021

2122
type NapiSideEffectsVariants = Either3<bool, Vec<String>, HashMap<String, bool>>;
@@ -195,14 +196,12 @@ impl Resolver {
195196
};
196197

197198
let mut resolver = match options.mode {
198-
1 => parcel_resolver::Resolver::parcel(
199-
Cow::Owned(project_root.into()),
200-
parcel_resolver::CacheCow::Owned(parcel_resolver::Cache::new(fs)),
201-
),
202-
2 => parcel_resolver::Resolver::node(
203-
Cow::Owned(project_root.into()),
204-
parcel_resolver::CacheCow::Owned(parcel_resolver::Cache::new(fs)),
205-
),
199+
1 => {
200+
parcel_resolver::Resolver::parcel(Path::new(&project_root), parcel_resolver::Cache::new(fs))
201+
}
202+
2 => {
203+
parcel_resolver::Resolver::node(Path::new(&project_root), parcel_resolver::Cache::new(fs))
204+
}
206205
_ => return Err(napi::Error::new(napi::Status::InvalidArg, "Invalid mode")),
207206
};
208207

@@ -315,7 +314,7 @@ impl Resolver {
315314
match parcel_dev_dep_resolver::build_esm_graph(
316315
path,
317316
&self.resolver.project_root.as_path(),
318-
&self.resolver.cache,
317+
self.resolver.cache(),
319318
&self.invalidations_cache,
320319
) {
321320
Ok(invalidations) => {
@@ -341,7 +340,7 @@ fn resolve_internal(
341340
mode: u8,
342341
options: ResolveOptions,
343342
) -> napi::Result<(
344-
std::result::Result<(Resolution, Option<String>), ResolverError>,
343+
std::result::Result<ResolutionAndQuery, ResolverError>,
345344
ConvertedInvalidations,
346345
bool,
347346
u8,
@@ -373,7 +372,11 @@ fn resolve_internal(
373372
},
374373
);
375374

376-
let side_effects = if let Ok((Resolution::Path(p), _)) = &res.result {
375+
let side_effects = if let Ok(ResolutionAndQuery {
376+
resolution: Resolution::Path(p),
377+
..
378+
}) = &res.result
379+
{
377380
match resolver.resolve_side_effects(p, &res.invalidations) {
378381
Ok(side_effects) => side_effects,
379382
Err(err) => {
@@ -388,7 +391,11 @@ fn resolve_internal(
388391
let mut module_type = 0;
389392

390393
if mode == 2 {
391-
if let Ok((Resolution::Path(p), _)) = &res.result {
394+
if let Ok(ResolutionAndQuery {
395+
resolution: Resolution::Path(p),
396+
..
397+
}) = &res.result
398+
{
392399
module_type = match resolver.resolve_module_type(p, &res.invalidations) {
393400
Ok(t) => match t {
394401
ModuleType::CommonJs | ModuleType::Json => 1,
@@ -412,20 +419,20 @@ fn resolve_internal(
412419

413420
fn resolve_result_to_js(
414421
env: Env,
415-
res: std::result::Result<(Resolution, Option<String>), ResolverError>,
422+
res: std::result::Result<ResolutionAndQuery, ResolverError>,
416423
invalidations: ConvertedInvalidations,
417424
side_effects: bool,
418425
module_type: u8,
419426
) -> napi::Result<ResolveResult> {
420427
let (invalidate_on_file_change, invalidate_on_file_create) = invalidations;
421428

422429
match res {
423-
Ok((res, query)) => Ok(ResolveResult {
424-
resolution: env.to_js_value(&res)?,
430+
Ok(res) => Ok(ResolveResult {
431+
resolution: env.to_js_value(&res.resolution)?,
425432
invalidate_on_file_change,
426433
invalidate_on_file_create,
427434
side_effects,
428-
query,
435+
query: res.query,
429436
error: env.get_undefined()?.into_unknown(),
430437
module_type,
431438
}),

packages/utils/node-resolver-rs/Cargo.toml renamed to crates/parcel-resolver/Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
authors = ["Devon Govett <devongovett@gmail.com>"]
33
name = "parcel-resolver"
44
version = "0.1.0"
5+
license = "MIT"
6+
repository = "https://github.com/parcel-bundler/parcel"
7+
keywords = ["resolver", "node", "cjs", "esm", "bundler"]
8+
description = "Node.js compatible module resolver used by the Parcel bundler"
59
edition = "2021"
610

711
[dependencies]
@@ -10,7 +14,6 @@ dashmap = { version = "6.1.0", features = ["raw-api"] }
1014
glob-match = "0.2.1"
1115
indexmap = { version = "1.9.2", features = ["serde"] }
1216
itertools = "0.10.5"
13-
json_comments = { path = "../../../crates/json-comments-rs" }
1417
parking_lot = "0.12"
1518
percent-encoding = "2.2.0"
1619
serde = { version = "1.0.152", features = ["derive"] }

0 commit comments

Comments
 (0)