Skip to content

Commit e3b9c0c

Browse files
committed
chore: Refactor package json, and deno_package references
1 parent 2d1669c commit e3b9c0c

File tree

15 files changed

+132
-41
lines changed

15 files changed

+132
-41
lines changed

Cargo.lock

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

crates/base/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ edition = "2021"
77

88
[dependencies]
99
async-trait.workspace = true
10-
thiserror = "1.0.40"
10+
thiserror.workspace = true
1111
monch.workspace = true
1212
once_cell.workspace = true
1313
deno_semver.workspace = true

crates/npm/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,5 @@ serde.workspace = true
3030
percent-encoding = "=2.3.0"
3131
hex = "0.4"
3232
base64.workspace = true
33-
bincode = "=1.3.3"
33+
bincode = "=1.3.3"
34+
thiserror.workspace = true

crates/npm/installer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
use std::future::Future;
44
use std::sync::Arc;
55

6+
use crate::package_json::PackageJsonDepsProvider;
67
use deno_core::error::AnyError;
78
use deno_core::futures::stream::FuturesOrdered;
89
use deno_core::futures::StreamExt;
910
use deno_npm::registry::NpmRegistryApi;
1011
use deno_npm::registry::NpmRegistryPackageInfoLoadError;
1112
use deno_semver::package::PackageReq;
12-
use module_fetcher::args::package_json::PackageJsonDepsProvider;
1313
use sb_core::util::sync::AtomicFlag;
1414

1515
use super::CliNpmRegistryApi;

crates/npm/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
pub mod cache;
44
pub mod installer;
5+
pub mod package_json;
56
pub mod registry;
67
pub mod resolution;
78
pub mod resolvers;

crates/npm/package_json.rs

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
use std::collections::BTreeMap;
2+
use std::collections::HashMap;
3+
use std::path::Path;
4+
use std::path::PathBuf;
5+
6+
use deno_core::anyhow::bail;
7+
use deno_core::error::AnyError;
8+
use deno_npm::registry::parse_dep_entry_name_and_raw_version;
9+
use deno_npm::registry::PackageDepNpmSchemeValueParseError;
10+
use deno_semver::package::PackageReq;
11+
use deno_semver::VersionReq;
12+
use deno_semver::VersionReqSpecifierParseError;
13+
use sb_node::PackageJson;
14+
use thiserror::Error;
15+
16+
#[derive(Debug, Error, Clone)]
17+
pub enum PackageJsonDepValueParseError {
18+
#[error(transparent)]
19+
SchemeValue(#[from] PackageDepNpmSchemeValueParseError),
20+
#[error(transparent)]
21+
Specifier(#[from] VersionReqSpecifierParseError),
22+
#[error("Not implemented scheme '{scheme}'")]
23+
Unsupported { scheme: String },
24+
}
25+
26+
pub type PackageJsonDeps = BTreeMap<String, Result<PackageReq, PackageJsonDepValueParseError>>;
27+
28+
#[derive(Debug, Default)]
29+
pub struct PackageJsonDepsProvider(Option<PackageJsonDeps>);
30+
31+
impl PackageJsonDepsProvider {
32+
pub fn new(deps: Option<PackageJsonDeps>) -> Self {
33+
Self(deps)
34+
}
35+
36+
pub fn deps(&self) -> Option<&PackageJsonDeps> {
37+
self.0.as_ref()
38+
}
39+
40+
pub fn reqs(&self) -> Vec<&PackageReq> {
41+
match &self.0 {
42+
Some(deps) => {
43+
let mut package_reqs = deps
44+
.values()
45+
.filter_map(|r| r.as_ref().ok())
46+
.collect::<Vec<_>>();
47+
package_reqs.sort(); // deterministic resolution
48+
package_reqs
49+
}
50+
None => Vec::new(),
51+
}
52+
}
53+
}
54+
55+
/// Gets an application level package.json's npm package requirements.
56+
///
57+
/// Note that this function is not general purpose. It is specifically for
58+
/// parsing the application level package.json that the user has control
59+
/// over. This is a design limitation to allow mapping these dependency
60+
/// entries to npm specifiers which can then be used in the resolver.
61+
pub fn get_local_package_json_version_reqs(package_json: &PackageJson) -> PackageJsonDeps {
62+
fn parse_entry(key: &str, value: &str) -> Result<PackageReq, PackageJsonDepValueParseError> {
63+
if value.starts_with("workspace:")
64+
|| value.starts_with("file:")
65+
|| value.starts_with("git:")
66+
|| value.starts_with("http:")
67+
|| value.starts_with("https:")
68+
{
69+
return Err(PackageJsonDepValueParseError::Unsupported {
70+
scheme: value.split(':').next().unwrap().to_string(),
71+
});
72+
}
73+
let (name, version_req) = parse_dep_entry_name_and_raw_version(key, value)
74+
.map_err(PackageJsonDepValueParseError::SchemeValue)?;
75+
76+
let result = VersionReq::parse_from_specifier(version_req);
77+
match result {
78+
Ok(version_req) => Ok(PackageReq {
79+
name: name.to_string(),
80+
version_req,
81+
}),
82+
Err(err) => Err(PackageJsonDepValueParseError::Specifier(err)),
83+
}
84+
}
85+
86+
fn insert_deps(deps: Option<&HashMap<String, String>>, result: &mut PackageJsonDeps) {
87+
if let Some(deps) = deps {
88+
for (key, value) in deps {
89+
result.insert(key.to_string(), parse_entry(key, value));
90+
}
91+
}
92+
}
93+
94+
let deps = package_json.dependencies.as_ref();
95+
let dev_deps = package_json.dev_dependencies.as_ref();
96+
let mut result = BTreeMap::new();
97+
98+
// insert the dev dependencies first so the dependencies will
99+
// take priority and overwrite any collisions
100+
insert_deps(dev_deps, &mut result);
101+
insert_deps(deps, &mut result);
102+
103+
result
104+
}

crates/npm/resolution.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use deno_semver::VersionReq;
3333
use sb_core::util::sync::TaskQueue;
3434

3535
use super::registry::CliNpmRegistryApi;
36-
use module_fetcher::args::lockfile::Lockfile;
36+
use deno_lockfile::Lockfile;
3737

3838
/// Handles updating and storing npm resolution in memory where the underlying
3939
/// snapshot can be updated concurrently. Additionally handles updating the lockfile

crates/npm/resolvers/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use sb_node::NpmResolver;
2929
use serde::Deserialize;
3030
use serde::Serialize;
3131

32-
use module_fetcher::args::lockfile::Lockfile;
32+
use deno_lockfile::Lockfile;
3333
use sb_core::util::fs::canonicalize_path_maybe_not_exists_with_fs;
3434

3535
use self::local::LocalNpmPackageResolver;

crates/sb_graph/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ license = "MIT"
1010
path = "lib.rs"
1111

1212
[dependencies]
13-
module_fetcher = { path = "../module_fetcher" }
1413
sb_node = { version = "0.1.0", path = "../node" }
1514
sb_npm = { version = "0.1.0", path = "../npm" }
1615
sb_fs = { version = "0.1.0", path = "../sb_fs" }
@@ -29,3 +28,5 @@ deno_npm.workspace = true
2928
once_cell.workspace = true
3029
deno_web.workspace = true
3130
urlencoding.workspace = true
31+
deno_lockfile.workspace = true
32+
deno_config.workspace = true

crates/sb_graph/emitter.rs

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@ use crate::graph_resolver::{CliGraphResolver, CliGraphResolverOptions};
22
use deno_ast::EmitOptions;
33
use deno_core::error::AnyError;
44
use deno_core::parking_lot::Mutex;
5+
use deno_lockfile::Lockfile;
56
use deno_npm::resolution::ValidSerializedNpmResolutionSnapshot;
67
use deno_npm::NpmSystemInfo;
78
use eszip::deno_graph::source::{Loader, Resolver};
89
use import_map::ImportMap;
9-
use module_fetcher::args::lockfile::{snapshot_from_lockfile, Lockfile};
10-
use module_fetcher::args::package_json::{
11-
get_local_package_json_version_reqs, PackageJsonDeps, PackageJsonDepsProvider,
12-
};
1310
use sb_core::cache::caches::Caches;
1411
use sb_core::cache::deno_dir::{DenoDir, DenoDirProvider};
1512
use sb_core::cache::emit::EmitCache;
@@ -21,6 +18,9 @@ use sb_core::emit::Emitter;
2118
use sb_core::file_fetcher::{FileCache, FileFetcher};
2219
use sb_core::util::http_util::HttpClient;
2320
use sb_node::{NodeResolver, PackageJson};
21+
use sb_npm::package_json::{
22+
get_local_package_json_version_reqs, PackageJsonDeps, PackageJsonDepsProvider,
23+
};
2424
use sb_npm::{
2525
create_npm_fs_resolver, CliNpmRegistryApi, CliNpmResolver, NpmCache, NpmCacheDir,
2626
NpmPackageFsResolver, NpmResolution, PackageJsonDepsInstaller,
@@ -138,24 +138,6 @@ impl EmitterFactory {
138138
.unwrap_or_else(|| None);
139139
}
140140

141-
pub async fn init_npm(&mut self) {
142-
let _init_lock_file = self.get_lock_file();
143-
144-
self.npm_snapshot_from_lockfile().await;
145-
}
146-
147-
pub async fn npm_snapshot_from_lockfile(&mut self) {
148-
if let Some(lockfile) = self.get_lock_file().clone() {
149-
let npm_api = self.npm_api();
150-
let snapshot = snapshot_from_lockfile(lockfile, &*npm_api.clone())
151-
.await
152-
.unwrap();
153-
self.npm_snapshot = Some(snapshot);
154-
} else {
155-
panic!("Lockfile not available");
156-
}
157-
}
158-
159141
pub fn init_package_json_deps(&mut self, package: &PackageJson) {
160142
self.maybe_package_json_deps = Some(get_local_package_json_version_reqs(package));
161143
}

0 commit comments

Comments
 (0)