mirror of
https://github.com/denoland/deno.git
synced 2025-01-20 20:42:19 -05:00
Compare commits
3 commits
c9e05c2e5d
...
d9347c93f0
Author | SHA1 | Date | |
---|---|---|---|
|
d9347c93f0 | ||
|
0d3d4f5466 | ||
|
262c05ecf5 |
7 changed files with 109 additions and 8 deletions
|
@ -115,10 +115,16 @@ exec deno {} "$@"
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn get_installer_root() -> Result<PathBuf, io::Error> {
|
||||
if let Ok(env_dir) = env::var("DENO_INSTALL_ROOT") {
|
||||
fn get_installer_root() -> Result<PathBuf, AnyError> {
|
||||
if let Some(env_dir) = env::var_os("DENO_INSTALL_ROOT") {
|
||||
if !env_dir.is_empty() {
|
||||
return canonicalize_path_maybe_not_exists(&PathBuf::from(env_dir));
|
||||
let env_dir = PathBuf::from(env_dir);
|
||||
return canonicalize_path_maybe_not_exists(&env_dir).with_context(|| {
|
||||
format!(
|
||||
"Canonicalizing DENO_INSTALL_ROOT ('{}').",
|
||||
env_dir.display()
|
||||
)
|
||||
});
|
||||
}
|
||||
}
|
||||
// Note: on Windows, the $HOME environment variable may be set by users or by
|
||||
|
@ -587,11 +593,22 @@ async fn resolve_shim_data(
|
|||
let copy_path = get_hidden_file_with_ext(&file_path, "deno.json");
|
||||
executable_args.push("--config".to_string());
|
||||
executable_args.push(copy_path.to_str().unwrap().to_string());
|
||||
extra_files.push((
|
||||
copy_path,
|
||||
fs::read_to_string(config_path)
|
||||
.with_context(|| format!("error reading {config_path}"))?,
|
||||
));
|
||||
let mut config_text = fs::read_to_string(config_path)
|
||||
.with_context(|| format!("error reading {config_path}"))?;
|
||||
// always remove the import map field because when someone specifies `--import-map` we
|
||||
// don't want that file to be attempted to be loaded and when they don't specify that
|
||||
// (which is just something we haven't implemented yet)
|
||||
if let Some(new_text) = remove_import_map_field_from_text(&config_text) {
|
||||
if flags.import_map_path.is_none() {
|
||||
log::warn!(
|
||||
"{} \"importMap\" field in the specified config file we be ignored. Use the --import-map flag instead.",
|
||||
crate::colors::yellow("Warning"),
|
||||
);
|
||||
}
|
||||
config_text = new_text;
|
||||
}
|
||||
|
||||
extra_files.push((copy_path, config_text));
|
||||
} else {
|
||||
executable_args.push("--no-config".to_string());
|
||||
}
|
||||
|
@ -631,6 +648,16 @@ async fn resolve_shim_data(
|
|||
})
|
||||
}
|
||||
|
||||
fn remove_import_map_field_from_text(config_text: &str) -> Option<String> {
|
||||
let value =
|
||||
jsonc_parser::cst::CstRootNode::parse(config_text, &Default::default())
|
||||
.ok()?;
|
||||
let root_value = value.object_value()?;
|
||||
let import_map_value = root_value.get("importMap")?;
|
||||
import_map_value.remove();
|
||||
Some(value.to_string())
|
||||
}
|
||||
|
||||
fn get_hidden_file_with_ext(file_path: &Path, ext: &str) -> PathBuf {
|
||||
// use a dot file to prevent the file from showing up in some
|
||||
// users shell auto-complete since this directory is on the PATH
|
||||
|
@ -1585,4 +1612,17 @@ mod tests {
|
|||
assert!(!file_path.exists());
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_remove_import_map_field_from_text() {
|
||||
assert_eq!(
|
||||
remove_import_map_field_from_text(
|
||||
r#"{
|
||||
"importMap": "./value.json"
|
||||
}"#,
|
||||
)
|
||||
.unwrap(),
|
||||
"{}"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ use std::future::Future;
|
|||
use std::io;
|
||||
use std::net::SocketAddr;
|
||||
use std::pin::Pin;
|
||||
use std::sync::Arc;
|
||||
use std::task::Poll;
|
||||
use std::task::{self};
|
||||
use std::vec;
|
||||
|
@ -19,6 +20,16 @@ pub enum Resolver {
|
|||
Gai(GaiResolver),
|
||||
/// hickory-resolver's userspace resolver.
|
||||
Hickory(hickory_resolver::Resolver<TokioConnectionProvider>),
|
||||
/// A custom resolver that implements `Resolve`.
|
||||
Custom(Arc<dyn Resolve>),
|
||||
}
|
||||
|
||||
/// Alias for `Future` type returned by a custom DNS resolver.
|
||||
pub type Resolving =
|
||||
Pin<Box<dyn Future<Output = Result<SocketAddrs, io::Error>> + Send>>;
|
||||
|
||||
pub trait Resolve: Send + Sync + std::fmt::Debug {
|
||||
fn resolve(&self, name: Name) -> Resolving;
|
||||
}
|
||||
|
||||
impl Default for Resolver {
|
||||
|
@ -107,7 +118,43 @@ impl Service<Name> for Resolver {
|
|||
Ok(iter)
|
||||
})
|
||||
}
|
||||
Resolver::Custom(resolver) => {
|
||||
let resolver = resolver.clone();
|
||||
tokio::spawn(async move { resolver.resolve(name).await })
|
||||
}
|
||||
};
|
||||
ResolveFut { inner: task }
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::str::FromStr;
|
||||
|
||||
use super::*;
|
||||
|
||||
// A resolver that resolves any name into the same address.
|
||||
#[derive(Debug)]
|
||||
struct DebugResolver(SocketAddr);
|
||||
|
||||
impl Resolve for DebugResolver {
|
||||
fn resolve(&self, _name: Name) -> Resolving {
|
||||
let addr = self.0;
|
||||
Box::pin(async move { Ok(vec![addr].into_iter()) })
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn custom_dns_resolver() {
|
||||
let mut resolver = Resolver::Custom(Arc::new(DebugResolver(
|
||||
"127.0.0.1:8080".parse().unwrap(),
|
||||
)));
|
||||
let mut addr = resolver
|
||||
.call(Name::from_str("foo.com").unwrap())
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let addr = addr.next().unwrap();
|
||||
assert_eq!(addr, "127.0.0.1:8080".parse().unwrap());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"tempDir": true,
|
||||
"args": "install -g --root ./folder --config deno.json main.ts --name my-cli",
|
||||
"output": "install.out"
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"importMap": "./import_map.json"
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
{
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
Warning "importMap" field in the specified config file we be ignored. Use the --import-map flag instead.
|
||||
✅ Successfully installed my-cli
|
||||
[WILDCARD]
|
|
@ -0,0 +1 @@
|
|||
console.log(1);
|
Loading…
Add table
Reference in a new issue