Skip to content

Commit 64912e5

Browse files
authored
feat(BREAKING): remove resolved npm versions from deno_graph (#631)
1 parent 2dbd27e commit 64912e5

File tree

5 files changed

+32
-84
lines changed

5 files changed

+32
-84
lines changed

src/graph.rs

Lines changed: 16 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,11 @@ use deno_semver::VersionReq;
4646
use deno_semver::jsr::JsrDepPackageReq;
4747
use deno_semver::jsr::JsrPackageNvReference;
4848
use deno_semver::jsr::JsrPackageReqReference;
49-
use deno_semver::npm::NpmPackageNvReference;
5049
use deno_semver::npm::NpmPackageReqReference;
5150
use deno_semver::package::PackageNv;
5251
use deno_semver::package::PackageNvReference;
5352
use deno_semver::package::PackageReq;
5453
use deno_semver::package::PackageReqReferenceParseError;
55-
use deno_semver::package::PackageSubPath;
5654
use futures::FutureExt;
5755
use futures::future::LocalBoxFuture;
5856
use futures::stream::FuturesOrdered;
@@ -1226,7 +1224,6 @@ impl Module {
12261224
Module::Js(module) => &module.specifier,
12271225
Module::Json(module) => &module.specifier,
12281226
Module::Wasm(module) => &module.specifier,
1229-
#[allow(deprecated)]
12301227
Module::Npm(module) => &module.specifier,
12311228
Module::Node(module) => &module.specifier,
12321229
Module::External(module) => &module.specifier,
@@ -1343,25 +1340,16 @@ static EMPTY_DEPS: std::sync::OnceLock<IndexMap<String, Dependency>> =
13431340
std::sync::OnceLock::new();
13441341

13451342
/// An npm package entrypoint.
1343+
///
1344+
/// Note that deno_graph does NOT store the resolved version of npm specifiers.
1345+
/// That needs to be retreived from the npm snapshot, which is the single
1346+
/// source of truth on that matter.
13461347
#[derive(Debug, Clone, Serialize)]
13471348
#[serde(rename_all = "camelCase")]
13481349
pub struct NpmModule {
1349-
// We need to change the NpmModule to instead only store an NpmReqReference
1350-
// and then map the req reference through the npm snapshot instead (have a single
1351-
// source of truth). This is necessary because deno_npm now does deduplication
1352-
// and so it will update on the fly the req to nv mapping, but then these
1353-
// properties in deno_graph won't get updated.
1354-
#[deprecated(
1355-
since = "0.103.1",
1356-
note = "Map the npm package req ref through the npm snapshot instead."
1357-
)]
13581350
pub specifier: ModuleSpecifier,
1359-
#[deprecated(
1360-
since = "0.103.1",
1361-
note = "Map the npm package req ref through the npm snapshot instead."
1362-
)]
13631351
#[serde(skip_serializing)]
1364-
pub nv_reference: NpmPackageNvReference,
1352+
pub pkg_req_ref: NpmPackageReqReference,
13651353
}
13661354

13671355
/// Represents a module which is not statically analyzed and is only available
@@ -2200,8 +2188,6 @@ pub struct ModuleGraph {
22002188
pub imports: IndexMap<ModuleSpecifier, GraphImport>,
22012189
pub redirects: BTreeMap<ModuleSpecifier, ModuleSpecifier>,
22022190
#[serde(skip_serializing)]
2203-
pub npm_packages: IndexSet<PackageNv>,
2204-
#[serde(skip_serializing)]
22052191
pub has_node_specifier: bool,
22062192
#[serde(rename = "packages")]
22072193
#[serde(skip_serializing_if = "PackageSpecifiers::is_empty")]
@@ -2220,7 +2206,6 @@ impl ModuleGraph {
22202206
module_slots: Default::default(),
22212207
imports: Default::default(),
22222208
redirects: Default::default(),
2223-
npm_packages: Default::default(),
22242209
has_node_specifier: false,
22252210
packages: Default::default(),
22262211
npm_dep_graph_result: Ok(()),
@@ -2417,7 +2402,6 @@ impl ModuleGraph {
24172402
}
24182403
new_graph.imports.clone_from(&self.imports);
24192404
new_graph.roots = roots.iter().map(|r| (*r).to_owned()).collect();
2420-
new_graph.npm_packages.clone_from(&self.npm_packages);
24212405
// todo(dsherret): it should be a bit smarter about this, but this is not terrible
24222406
new_graph.packages.clone_from(&self.packages);
24232407
new_graph.has_node_specifier = self.has_node_specifier;
@@ -2437,7 +2421,6 @@ impl ModuleGraph {
24372421
let mut seen_pending =
24382422
SeenPendingCollection::with_capacity(specifiers_count);
24392423
seen_pending.extend(self.roots.iter().cloned());
2440-
let mut found_nvs = HashSet::with_capacity(self.npm_packages.len());
24412424
let mut has_node_specifier = false;
24422425

24432426
let handle_dependencies =
@@ -2489,10 +2472,7 @@ impl ModuleGraph {
24892472
wasm_module.source_dts = Default::default();
24902473
handle_dependencies(&mut seen_pending, &mut wasm_module.dependencies);
24912474
}
2492-
Module::Npm(module) => {
2493-
#[allow(deprecated)]
2494-
found_nvs.insert(module.nv_reference.nv().clone());
2495-
}
2475+
Module::Npm(_) => {}
24962476
Module::Node(_) => {
24972477
has_node_specifier = true;
24982478
}
@@ -2507,7 +2487,6 @@ impl ModuleGraph {
25072487
self
25082488
.module_slots
25092489
.retain(|specifier, _| seen_pending.has_seen(specifier));
2510-
self.npm_packages.retain(|nv| found_nvs.contains(nv));
25112490
self
25122491
.redirects
25132492
.retain(|redirect, _| seen_pending.has_seen(redirect));
@@ -6344,7 +6323,6 @@ fn validate_jsr_specifier(
63446323
/// Pending information to insert into the module graph once
63456324
/// npm specifier resolution has been finalized.
63466325
struct NpmSpecifierBuildPendingInfo {
6347-
found_pkg_nvs: IndexSet<PackageNv>,
63486326
module_slots: HashMap<ModuleSpecifier, ModuleSlot>,
63496327
dependencies_resolution: Option<Result<(), Arc<dyn JsErrorClass>>>,
63506328
redirects: HashMap<ModuleSpecifier, ModuleSpecifier>,
@@ -6353,7 +6331,6 @@ struct NpmSpecifierBuildPendingInfo {
63536331
impl NpmSpecifierBuildPendingInfo {
63546332
pub fn with_capacity(capacity: usize) -> Self {
63556333
Self {
6356-
found_pkg_nvs: IndexSet::with_capacity(capacity),
63576334
module_slots: HashMap::with_capacity(capacity),
63586335
dependencies_resolution: None,
63596336
redirects: HashMap::with_capacity(capacity),
@@ -6451,11 +6428,10 @@ impl<'a> NpmSpecifierResolver<'a> {
64516428
let items = items_by_req.get(&req).unwrap();
64526429
for item in items {
64536430
match &resolution {
6454-
Ok(pkg_nv) => {
6455-
self.add_nv_for_item(
6431+
Ok(_) => {
6432+
self.add_req_ref_for_item(
64566433
item.specifier.clone(),
6457-
pkg_nv.clone(),
6458-
item.package_ref.sub_path().map(PackageSubPath::from_str),
6434+
item.package_ref.clone(),
64596435
);
64606436
}
64616437
Err(err) => {
@@ -6483,7 +6459,7 @@ impl<'a> NpmSpecifierResolver<'a> {
64836459
.await;
64846460
assert_eq!(result.results.len(), 1);
64856461
match result.results.remove(0) {
6486-
Ok(pkg_nv) => {
6462+
Ok(_) => {
64876463
if let Err(err) = result.dep_graph_result {
64886464
self.pending_info.module_slots.insert(
64896465
item.specifier.clone(),
@@ -6497,11 +6473,7 @@ impl<'a> NpmSpecifierResolver<'a> {
64976473
),
64986474
);
64996475
} else {
6500-
self.add_nv_for_item(
6501-
item.specifier,
6502-
pkg_nv,
6503-
item.package_ref.into_inner().sub_path,
6504-
);
6476+
self.add_req_ref_for_item(item.specifier, item.package_ref);
65056477
}
65066478
}
65076479
Err(err) => {
@@ -6521,31 +6493,16 @@ impl<'a> NpmSpecifierResolver<'a> {
65216493
}
65226494
}
65236495

6524-
fn add_nv_for_item(
6496+
fn add_req_ref_for_item(
65256497
&mut self,
65266498
specifier: ModuleSpecifier,
6527-
pkg_nv: PackageNv,
6528-
sub_path: Option<SmallStackString>,
6499+
pkg_req_ref: NpmPackageReqReference,
65296500
) {
6530-
let pkg_id_ref = NpmPackageNvReference::new(PackageNvReference {
6531-
nv: pkg_nv.clone(),
6532-
sub_path,
6533-
});
6534-
let resolved_specifier = pkg_id_ref.as_specifier();
6535-
if resolved_specifier != specifier {
6536-
self
6537-
.pending_info
6538-
.redirects
6539-
.insert(specifier.clone(), resolved_specifier.clone());
6540-
}
6541-
self.pending_info.found_pkg_nvs.insert(pkg_nv);
65426501
self.pending_info.module_slots.insert(
6543-
resolved_specifier.clone(),
6502+
specifier.clone(),
65446503
ModuleSlot::Module(Module::Npm(NpmModule {
6545-
#[allow(deprecated)]
6546-
specifier: resolved_specifier,
6547-
#[allow(deprecated)]
6548-
nv_reference: pkg_id_ref,
6504+
specifier,
6505+
pkg_req_ref,
65496506
})),
65506507
);
65516508
}
@@ -6563,7 +6520,6 @@ impl<'a> NpmSpecifierResolver<'a> {
65636520
graph.redirects.entry(key).or_insert(value);
65646521
}
65656522

6566-
graph.npm_packages.extend(pending_info.found_pkg_nvs);
65676523
if let Some(result) = pending_info.dependencies_resolution {
65686524
graph.npm_dep_graph_result = result;
65696525
}

src/source/mod.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::sync::Arc;
88
use std::time::SystemTime;
99

1010
use async_trait::async_trait;
11+
use deno_error::JsErrorBox;
1112
use deno_error::JsErrorClass;
1213
use deno_media_type::MediaType;
1314
use deno_media_type::data_url::RawDataUrl;
@@ -472,6 +473,12 @@ pub enum ResolveError {
472473
Other(#[from] deno_error::JsErrorBox),
473474
}
474475

476+
impl ResolveError {
477+
pub fn from_err<T: JsErrorClass>(err: T) -> Self {
478+
Self::Other(JsErrorBox::from_err(err))
479+
}
480+
}
481+
475482
/// The kind of resolution currently being done by deno_graph.
476483
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
477484
pub enum ResolutionKind {
@@ -559,9 +566,9 @@ pub struct NpmResolvePkgReqsResult {
559566
/// The individual results of resolving the package requirements.
560567
///
561568
/// This MUST correspond to the indexes of the provided package requirements.
562-
pub results: Vec<Result<PackageNv, NpmLoadError>>,
569+
pub results: Vec<Result<(), NpmLoadError>>,
563570
/// Result of resolving the entire dependency graph after the initial reqs
564-
/// were resolved to NVs.
571+
/// were resolved.
565572
///
566573
/// Don't run dependency graph resolution if there are any individual failures.
567574
pub dep_graph_result: Result<(), Arc<dyn JsErrorClass>>,

tests/helpers/mod.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,7 @@ impl NpmResolver for TestNpmResolver {
115115
.iter()
116116
.map(|pkg_req| {
117117
match Version::parse_from_npm(&pkg_req.version_req.to_string()) {
118-
Ok(version) => Ok(PackageNv {
119-
name: pkg_req.name.clone(),
120-
version,
121-
}),
118+
Ok(_) => Ok(()),
122119
Err(err) => Err(NpmLoadError::PackageReqResolution(Arc::new(err))),
123120
}
124121
})

tests/integration_test.rs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ use deno_graph::source::ResolveError;
3232
use deno_semver::jsr::JsrDepPackageReq;
3333
use deno_semver::package::PackageNv;
3434
use deno_semver::package::PackageReq;
35-
use indexmap::IndexSet;
3635
use pretty_assertions::assert_eq;
3736
use serde_json::json;
3837
use sys_traits::FsCreateDirAll;
@@ -1050,10 +1049,6 @@ await import("https://example.com/main.ts");
10501049
graph.valid().unwrap();
10511050
graph.prune_types();
10521051
assert_eq!(graph.graph_kind(), GraphKind::CodeOnly);
1053-
assert_eq!(
1054-
graph.npm_packages,
1055-
IndexSet::from([PackageNv::from_str("chalk@1.0.0").unwrap()])
1056-
);
10571052
assert_eq!(
10581053
json!(graph),
10591054
json!({
@@ -1135,12 +1130,10 @@ await import("https://example.com/main.ts");
11351130
},
11361131
{
11371132
"kind": "npm",
1138-
"specifier": "npm:/chalk@1.0.0"
1133+
"specifier": "npm:chalk@1.0.0"
11391134
}
11401135
],
1141-
"redirects": {
1142-
"npm:chalk@1.0.0": "npm:/chalk@1.0.0"
1143-
}
1136+
"redirects": {}
11441137
})
11451138
);
11461139
}
@@ -1179,10 +1172,6 @@ async fn test_reload() {
11791172
.await;
11801173

11811174
graph.valid().unwrap();
1182-
assert_eq!(
1183-
graph.npm_packages,
1184-
IndexSet::from([PackageNv::from_str("chalk@1.0.0").unwrap()])
1185-
);
11861175
assert_eq!(
11871176
json!(graph),
11881177
json!({
@@ -1246,9 +1235,9 @@ async fn test_reload() {
12461235
"mediaType": "TypeScript",
12471236
"specifier": "file:///project/mod.ts"
12481237
},
1249-
{ "kind": "npm", "specifier": "npm:/chalk@1.0.0" }
1238+
{ "kind": "npm", "specifier": "npm:chalk@1.0.0" }
12501239
],
1251-
"redirects": { "npm:chalk@1.0.0": "npm:/chalk@1.0.0" }
1240+
"redirects": {}
12521241
})
12531242
);
12541243
}

tests/specs/graph/fast_check/npm_types.txt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,11 @@ import 'jsr:@scope/a'
9595
},
9696
{
9797
"kind": "npm",
98-
"specifier": "npm:/@denotest/test@0.2.0"
98+
"specifier": "npm:@denotest/test@0.2.0"
9999
}
100100
],
101101
"redirects": {
102-
"jsr:@scope/a": "https://jsr.io/@scope/a/1.0.0/mod.ts",
103-
"npm:@denotest/test@0.2.0": "npm:/@denotest/test@0.2.0"
102+
"jsr:@scope/a": "https://jsr.io/@scope/a/1.0.0/mod.ts"
104103
},
105104
"packages": {
106105
"@scope/a@*": "@scope/a@1.0.0"

0 commit comments

Comments
 (0)