diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2024-01-22 16:31:12 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-22 22:31:12 +0100 |
commit | 69d5f136badfd7cfa9b979ff2fee7caf397098ca (patch) | |
tree | 665c6686fbf6f0732d84984f5f48557e45b4c7b6 /cli/factory.rs | |
parent | d20c9e75d1540b1a27e721d0cf66d29ba6a2c3fb (diff) |
feat(lockfile): track JSR and npm dependencies in config file (#22004)
See overview in https://github.com/denoland/deno_lockfile/pull/13
Diffstat (limited to 'cli/factory.rs')
-rw-r--r-- | cli/factory.rs | 88 |
1 files changed, 83 insertions, 5 deletions
diff --git a/cli/factory.rs b/cli/factory.rs index 1b084fc28..bee805215 100644 --- a/cli/factory.rs +++ b/cli/factory.rs @@ -44,6 +44,8 @@ use crate::standalone::DenoCompileBinaryWriter; use crate::tools::check::TypeChecker; use crate::util::file_watcher::WatcherCommunicator; use crate::util::fs::canonicalize_path_maybe_not_exists; +use crate::util::import_map::deno_json_deps; +use crate::util::import_map::import_map_deps; use crate::util::progress_bar::ProgressBar; use crate::util::progress_bar::ProgressBarStyle; use crate::worker::CliMainWorkerFactory; @@ -54,12 +56,14 @@ use deno_core::parking_lot::Mutex; use deno_core::FeatureChecker; use deno_graph::GraphKind; +use deno_lockfile::WorkspaceMemberConfig; use deno_runtime::deno_fs; use deno_runtime::deno_node::analyze::NodeCodeTranslator; use deno_runtime::deno_node::NodeResolver; use deno_runtime::deno_tls::RootCertStoreProvider; use deno_runtime::deno_web::BlobStore; use deno_runtime::inspector_server::InspectorServer; +use deno_semver::package::PackageNv; use import_map::ImportMap; use log::warn; use std::future::Future; @@ -289,10 +293,84 @@ impl CliFactory { } pub fn maybe_lockfile(&self) -> &Option<Arc<Mutex<Lockfile>>> { - self - .services - .lockfile - .get_or_init(|| self.options.maybe_lockfile()) + self.services.lockfile.get_or_init(|| { + let maybe_lockfile = self.options.maybe_lockfile(); + + // initialize the lockfile with the workspace's configuration + if let Some(lockfile) = &maybe_lockfile { + let package_json_deps = self + .package_json_deps_provider() + .reqs() + .map(|reqs| reqs.into_iter().map(|s| format!("npm:{}", s)).collect()) + .unwrap_or_default(); + let mut lockfile = lockfile.lock(); + let config = match self.options.maybe_workspace_config() { + Some(workspace_config) => deno_lockfile::WorkspaceConfig { + root: WorkspaceMemberConfig { + package_json_deps, + dependencies: import_map_deps( + &workspace_config.base_import_map_value, + ) + .into_iter() + .map(|req| req.to_string()) + .collect(), + }, + members: workspace_config + .members + .iter() + .map(|member| { + ( + member.package_name.clone(), + WorkspaceMemberConfig { + package_json_deps: Default::default(), + dependencies: deno_json_deps(&member.config_file) + .into_iter() + .map(|req| req.to_string()) + .collect(), + }, + ) + }) + .collect(), + }, + None => deno_lockfile::WorkspaceConfig { + root: WorkspaceMemberConfig { + package_json_deps, + dependencies: self + .options + .maybe_config_file() + .as_ref() + .map(|config| { + deno_json_deps(config) + .into_iter() + .map(|req| req.to_string()) + .collect() + }) + .unwrap_or_default(), + }, + members: Default::default(), + }, + }; + lockfile.set_workspace_config( + deno_lockfile::SetWorkspaceConfigOptions { + no_npm: self.options.no_npm(), + no_config: self.options.no_config(), + config, + nv_to_jsr_url: |nv| { + let nv = PackageNv::from_str(nv).ok()?; + Some( + deno_graph::source::recommended_registry_package_url( + crate::args::deno_registry_url(), + &nv, + ) + .to_string(), + ) + }, + }, + ); + } + + maybe_lockfile + }) } pub async fn npm_resolver( @@ -320,7 +398,7 @@ impl CliFactory { Some(snapshot) => { CliNpmResolverManagedSnapshotOption::Specified(Some(snapshot)) } - None => match self.maybe_lockfile() { + None => match self.maybe_lockfile().as_ref() { Some(lockfile) => { CliNpmResolverManagedSnapshotOption::ResolveFromLockfile( lockfile.clone(), |