Skip to content

Commit 8e5c9cb

Browse files
committed
wip
1 parent bee5a22 commit 8e5c9cb

File tree

4 files changed

+46
-41
lines changed

4 files changed

+46
-41
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "pnp"
3-
version = "0.4.0"
3+
version = "0.4.1"
44
edition = "2021"
55
license = "BSD-2-Clause"
66
description = "Resolution primitives for Yarn PnP"

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# `pnp`
2+
3+
This crate implements the Yarn Plug'n'Play [resolution algorithms](https://yarnpkg.com/advanced/pnp-spec).

src/lib.rs

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -195,21 +195,19 @@ pub fn init_pnp_manifest<P: AsRef<Path>>(manifest: &mut Manifest, p: P) {
195195

196196
for (name, ranges) in manifest.package_registry_data.iter_mut() {
197197
for (reference, info) in ranges.iter_mut() {
198-
if info.discard_from_lookup {
199-
continue;
200-
}
201-
202198
let p = manifest.manifest_dir
203199
.join(info.package_location.clone());
204200

205201
info.package_location = util::normalize_path(
206202
p.to_string_lossy(),
207203
);
208204

209-
manifest.location_trie.insert(info.package_location.clone(), PackageLocator {
210-
name: name.clone(),
211-
reference: reference.clone(),
212-
});
205+
if !info.discard_from_lookup {
206+
manifest.location_trie.insert(info.package_location.clone(), PackageLocator {
207+
name: name.clone(),
208+
reference: reference.clone(),
209+
});
210+
}
213211
}
214212
}
215213

@@ -263,51 +261,55 @@ pub fn is_excluded_from_fallback(manifest: &Manifest, locator: &PackageLocator)
263261
}
264262
}
265263

266-
pub fn resolve_to_unqualified<P: AsRef<Path>>(specifier: &str, parent: P, config: &ResolutionConfig) -> Result<Resolution, Error> {
264+
fn resolve_to_unqualified_via_manifest<P: AsRef<Path>>(manifest: &Manifest, specifier: &str, parent: P) -> Result<Resolution, Error> {
267265
let (ident, module_path) = parse_bare_identifier(specifier)?;
268266

269-
if let Some(manifest) = (config.host.find_pnp_manifest)(parent.as_ref())? {
270-
if let Some(parent_locator) = find_locator(&manifest, &parent) {
271-
let parent_pkg = get_package(&manifest, parent_locator)?;
272-
273-
let mut reference_or_alias: Option<PackageDependency> = None;
274-
let mut is_set = false;
275-
276-
if !is_set {
277-
if let Some(Some(binding)) = parent_pkg.package_dependencies.get(&ident) {
278-
reference_or_alias = Some(binding.clone());
279-
is_set = true;
280-
}
281-
}
267+
if let Some(parent_locator) = find_locator(&manifest, &parent) {
268+
let parent_pkg = get_package(&manifest, parent_locator)?;
282269

283-
if !is_set && manifest.enable_top_level_fallback && !is_excluded_from_fallback(&manifest, parent_locator) {
284-
if let Some(fallback_resolution) = manifest.fallback_pool.get(&ident) {
285-
reference_or_alias = fallback_resolution.clone();
286-
is_set = true;
287-
}
270+
let mut reference_or_alias: Option<PackageDependency> = None;
271+
let mut is_set = false;
272+
273+
if !is_set {
274+
if let Some(Some(binding)) = parent_pkg.package_dependencies.get(&ident) {
275+
reference_or_alias = Some(binding.clone());
276+
is_set = true;
288277
}
278+
}
289279

290-
if !is_set {
291-
return Err(Error::FailedResolution);
280+
if !is_set && manifest.enable_top_level_fallback && !is_excluded_from_fallback(&manifest, parent_locator) {
281+
if let Some(fallback_resolution) = manifest.fallback_pool.get(&ident) {
282+
reference_or_alias = fallback_resolution.clone();
283+
is_set = true;
292284
}
285+
}
286+
287+
if !is_set {
288+
return Err(Error::FailedResolution);
289+
}
293290

294-
if let Some(resolution) = reference_or_alias {
295-
let dependency_pkg = match resolution {
296-
PackageDependency::Reference(reference) => get_package(&manifest, &PackageLocator { name: ident, reference }),
297-
PackageDependency::Alias(name, reference) => get_package(&manifest, &PackageLocator { name, reference }),
298-
}?;
291+
if let Some(resolution) = reference_or_alias {
292+
let dependency_pkg = match resolution {
293+
PackageDependency::Reference(reference) => get_package(&manifest, &PackageLocator { name: ident, reference }),
294+
PackageDependency::Alias(name, reference) => get_package(&manifest, &PackageLocator { name, reference }),
295+
}?;
299296

300-
Ok(Resolution::Package(PathBuf::from(dependency_pkg.package_location.clone()), module_path.clone()))
301-
} else {
302-
return Err(Error::FailedResolution);
303-
}
297+
Ok(Resolution::Package(PathBuf::from(dependency_pkg.package_location.clone()), module_path.clone()))
304298
} else {
305-
Ok(Resolution::Specifier(specifier.to_string()))
299+
return Err(Error::FailedResolution);
306300
}
307301
} else {
308302
Ok(Resolution::Specifier(specifier.to_string()))
309303
}
310304
}
311305

306+
pub fn resolve_to_unqualified<P: AsRef<Path>>(specifier: &str, parent: P, config: &ResolutionConfig) -> Result<Resolution, Error> {
307+
if let Some(manifest) = (config.host.find_pnp_manifest)(parent.as_ref())? {
308+
resolve_to_unqualified_via_manifest(&manifest, &specifier, &parent)
309+
} else {
310+
Ok(Resolution::Specifier(specifier.to_string()))
311+
}
312+
}
313+
312314
#[cfg(test)]
313315
mod lib_tests;

0 commit comments

Comments
 (0)