summaryrefslogtreecommitdiff
path: root/cli/tools
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2024-03-01 21:34:13 +0000
committerGitHub <noreply@github.com>2024-03-01 21:34:13 +0000
commit15f5f74eb745915e68b3bc16b9ec048b94e26b97 (patch)
tree2cf1b5a4febadffa77fb0a82fb2e273093034545 /cli/tools
parent2e4a1fc3e89d00e060ca9d747b6887dae215f0eb (diff)
feat(unstable/pm): support version contraints in 'deno add' (#22646)
Diffstat (limited to 'cli/tools')
-rw-r--r--cli/tools/registry/pm.rs63
1 files changed, 22 insertions, 41 deletions
diff --git a/cli/tools/registry/pm.rs b/cli/tools/registry/pm.rs
index a3fa8a0f3..0c10c4993 100644
--- a/cli/tools/registry/pm.rs
+++ b/cli/tools/registry/pm.rs
@@ -2,6 +2,7 @@
use std::collections::HashMap;
use std::path::PathBuf;
+use std::sync::Arc;
use deno_ast::TextChange;
use deno_config::FmtOptionsConfig;
@@ -13,7 +14,6 @@ use deno_core::futures::StreamExt;
use deno_core::serde_json;
use deno_semver::jsr::JsrPackageReqReference;
use deno_semver::npm::NpmPackageReqReference;
-use deno_semver::package::PackageReq;
use jsonc_parser::ast::ObjectProp;
use jsonc_parser::ast::Value;
@@ -22,8 +22,7 @@ use crate::args::CacheSetting;
use crate::args::Flags;
use crate::factory::CliFactory;
use crate::file_fetcher::FileFetcher;
-use crate::lsp::jsr::CliJsrSearchApi;
-use crate::lsp::search::PackageSearchApi;
+use crate::jsr::JsrFetchResolver;
pub async fn add(flags: Flags, add_flags: AddFlags) -> Result<(), AnyError> {
let cli_factory = CliFactory::from_flags(flags.clone()).await?;
@@ -78,16 +77,13 @@ pub async fn add(flags: Flags, add_flags: AddFlags) -> Result<(), AnyError> {
None,
);
deps_file_fetcher.set_download_log_level(log::Level::Trace);
- let jsr_search_api = CliJsrSearchApi::new(deps_file_fetcher);
+ let jsr_resolver = Arc::new(JsrFetchResolver::new(deps_file_fetcher));
let package_futures = package_reqs
.into_iter()
- .map(|package_req| {
- find_package_and_select_version_for_req(
- jsr_search_api.clone(),
- package_req,
- )
- .boxed_local()
+ .map(move |package_req| {
+ find_package_and_select_version_for_req(jsr_resolver.clone(), package_req)
+ .boxed_local()
})
.collect::<Vec<_>>();
@@ -185,42 +181,27 @@ enum PackageAndVersion {
Selected(SelectedPackage),
}
-async fn jsr_find_package_and_select_version(
- jsr_search_api: CliJsrSearchApi,
- req: &PackageReq,
-) -> Result<PackageAndVersion, AnyError> {
- let jsr_prefixed_name = format!("jsr:{}", req.name);
-
- // TODO(bartlomieju): Need to do semver as well - @luca/flag@^0.14 should use to
- // highest possible `0.14.x` version.
- let version_req = req.version_req.version_text();
- if version_req != "*" {
- bail!("Specifying version constraints is currently not supported. Package: {}@{}", jsr_prefixed_name, version_req);
- }
-
- let Ok(versions) = jsr_search_api.versions(&req.name).await else {
- return Ok(PackageAndVersion::NotFound(jsr_prefixed_name));
- };
-
- let Some(latest_version) = versions.first() else {
- return Ok(PackageAndVersion::NotFound(jsr_prefixed_name));
- };
-
- Ok(PackageAndVersion::Selected(SelectedPackage {
- import_name: req.name.to_string(),
- package_name: jsr_prefixed_name,
- // TODO(bartlomieju): fix it, it should not always be caret
- version_req: format!("^{}", latest_version),
- }))
-}
-
async fn find_package_and_select_version_for_req(
- jsr_search_api: CliJsrSearchApi,
+ jsr_resolver: Arc<JsrFetchResolver>,
add_package_req: AddPackageReq,
) -> Result<PackageAndVersion, AnyError> {
match add_package_req {
AddPackageReq::Jsr(pkg_ref) => {
- jsr_find_package_and_select_version(jsr_search_api, pkg_ref.req()).await
+ let req = pkg_ref.req();
+ let jsr_prefixed_name = format!("jsr:{}", &req.name);
+ let Some(nv) = jsr_resolver.req_to_nv(req).await else {
+ return Ok(PackageAndVersion::NotFound(jsr_prefixed_name));
+ };
+ let range_symbol = if req.version_req.version_text().starts_with('~') {
+ '~'
+ } else {
+ '^'
+ };
+ Ok(PackageAndVersion::Selected(SelectedPackage {
+ import_name: req.name.to_string(),
+ package_name: jsr_prefixed_name,
+ version_req: format!("{}{}", range_symbol, &nv.version),
+ }))
}
AddPackageReq::Npm(pkg_req) => {
bail!(