mirror of
https://github.com/denoland/deno.git
synced 2025-01-21 04:52:26 -05:00
Compare commits
3 commits
12c1350cad
...
c4ce09f497
Author | SHA1 | Date | |
---|---|---|---|
|
c4ce09f497 | ||
|
0d3d4f5466 | ||
|
1e9e24f1f2 |
10 changed files with 114 additions and 25 deletions
3
Cargo.lock
generated
3
Cargo.lock
generated
|
@ -1767,8 +1767,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deno_graph"
|
name = "deno_graph"
|
||||||
version = "0.87.0"
|
version = "0.87.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/denoland/deno_graph.git?rev=70ca7ebbb7fe9bb6cf35115ef9531aa58aadec55#70ca7ebbb7fe9bb6cf35115ef9531aa58aadec55"
|
||||||
checksum = "f56d4eb4b7c81ae920b6d18c45a1866924f93110caee80bbbc362dc28143f2bb"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"capacity_builder 0.5.0",
|
"capacity_builder 0.5.0",
|
||||||
|
|
|
@ -49,6 +49,10 @@ edition = "2021"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
repository = "https://github.com/denoland/deno"
|
repository = "https://github.com/denoland/deno"
|
||||||
|
|
||||||
|
# TODO(nayeemrmn): Use proper version when https://github.com/denoland/deno_graph/pull/565 lands!
|
||||||
|
[patch.crates-io]
|
||||||
|
deno_graph = { git = "https://github.com/denoland/deno_graph.git", rev = "70ca7ebbb7fe9bb6cf35115ef9531aa58aadec55" }
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
deno_ast = { version = "=0.44.0", features = ["transpiling"] }
|
deno_ast = { version = "=0.44.0", features = ["transpiling"] }
|
||||||
deno_core = { version = "0.331.0" }
|
deno_core = { version = "0.331.0" }
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// Copyright 2018-2025 the Deno authors. MIT license.
|
// Copyright 2018-2025 the Deno authors. MIT license.
|
||||||
|
|
||||||
|
use std::collections::BTreeMap;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
@ -854,14 +855,22 @@ impl ModuleGraphBuilder {
|
||||||
&self,
|
&self,
|
||||||
) -> Result<CliGraphResolver, deno_json::ToMaybeJsxImportSourceConfigError>
|
) -> Result<CliGraphResolver, deno_json::ToMaybeJsxImportSourceConfigError>
|
||||||
{
|
{
|
||||||
let jsx_import_source_config = self
|
let jsx_import_source_config_unscoped = self
|
||||||
.cli_options
|
.cli_options
|
||||||
.start_dir
|
.start_dir
|
||||||
.to_maybe_jsx_import_source_config()?;
|
.to_maybe_jsx_import_source_config()?;
|
||||||
|
let mut jsx_import_source_config_by_scope = BTreeMap::default();
|
||||||
|
for (dir_url, dir) in &self.cli_options.all_dirs {
|
||||||
|
let jsx_import_source_config_unscoped =
|
||||||
|
dir.to_maybe_jsx_import_source_config()?;
|
||||||
|
jsx_import_source_config_by_scope
|
||||||
|
.insert(dir_url.clone(), jsx_import_source_config_unscoped);
|
||||||
|
}
|
||||||
Ok(CliGraphResolver {
|
Ok(CliGraphResolver {
|
||||||
cjs_tracker: &self.cjs_tracker,
|
cjs_tracker: &self.cjs_tracker,
|
||||||
resolver: &self.resolver,
|
resolver: &self.resolver,
|
||||||
jsx_import_source_config,
|
jsx_import_source_config_unscoped,
|
||||||
|
jsx_import_source_config_by_scope,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1193,28 +1202,45 @@ fn format_deno_graph_error(err: &dyn Error) -> String {
|
||||||
struct CliGraphResolver<'a> {
|
struct CliGraphResolver<'a> {
|
||||||
cjs_tracker: &'a CliCjsTracker,
|
cjs_tracker: &'a CliCjsTracker,
|
||||||
resolver: &'a CliResolver,
|
resolver: &'a CliResolver,
|
||||||
jsx_import_source_config: Option<JsxImportSourceConfig>,
|
jsx_import_source_config_unscoped: Option<JsxImportSourceConfig>,
|
||||||
|
jsx_import_source_config_by_scope:
|
||||||
|
BTreeMap<Arc<ModuleSpecifier>, Option<JsxImportSourceConfig>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> deno_graph::source::Resolver for CliGraphResolver<'a> {
|
impl<'a> deno_graph::source::Resolver for CliGraphResolver<'a> {
|
||||||
fn default_jsx_import_source(&self) -> Option<String> {
|
fn default_jsx_import_source(
|
||||||
|
&self,
|
||||||
|
referrer: &ModuleSpecifier,
|
||||||
|
) -> Option<String> {
|
||||||
self
|
self
|
||||||
.jsx_import_source_config
|
.jsx_import_source_config_by_scope
|
||||||
.as_ref()
|
.iter()
|
||||||
|
.rfind(|(s, _)| referrer.as_str().starts_with(s.as_str()))
|
||||||
|
.map(|(_, c)| c.as_ref())
|
||||||
|
.unwrap_or(self.jsx_import_source_config_unscoped.as_ref())
|
||||||
.and_then(|c| c.default_specifier.clone())
|
.and_then(|c| c.default_specifier.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn default_jsx_import_source_types(&self) -> Option<String> {
|
fn default_jsx_import_source_types(
|
||||||
|
&self,
|
||||||
|
referrer: &ModuleSpecifier,
|
||||||
|
) -> Option<String> {
|
||||||
self
|
self
|
||||||
.jsx_import_source_config
|
.jsx_import_source_config_by_scope
|
||||||
.as_ref()
|
.iter()
|
||||||
|
.rfind(|(s, _)| referrer.as_str().starts_with(s.as_str()))
|
||||||
|
.map(|(_, c)| c.as_ref())
|
||||||
|
.unwrap_or(self.jsx_import_source_config_unscoped.as_ref())
|
||||||
.and_then(|c| c.default_types_specifier.clone())
|
.and_then(|c| c.default_types_specifier.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn jsx_import_source_module(&self) -> &str {
|
fn jsx_import_source_module(&self, referrer: &ModuleSpecifier) -> &str {
|
||||||
self
|
self
|
||||||
.jsx_import_source_config
|
.jsx_import_source_config_by_scope
|
||||||
.as_ref()
|
.iter()
|
||||||
|
.rfind(|(s, _)| referrer.as_str().starts_with(s.as_str()))
|
||||||
|
.map(|(_, c)| c.as_ref())
|
||||||
|
.unwrap_or(self.jsx_import_source_config_unscoped.as_ref())
|
||||||
.map(|c| c.module.as_str())
|
.map(|c| c.module.as_str())
|
||||||
.unwrap_or(deno_graph::source::DEFAULT_JSX_IMPORT_SOURCE_MODULE)
|
.unwrap_or(deno_graph::source::DEFAULT_JSX_IMPORT_SOURCE_MODULE)
|
||||||
}
|
}
|
||||||
|
|
|
@ -978,19 +978,25 @@ pub struct SingleReferrerGraphResolver<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> deno_graph::source::Resolver for SingleReferrerGraphResolver<'a> {
|
impl<'a> deno_graph::source::Resolver for SingleReferrerGraphResolver<'a> {
|
||||||
fn default_jsx_import_source(&self) -> Option<String> {
|
fn default_jsx_import_source(
|
||||||
|
&self,
|
||||||
|
_referrer: &ModuleSpecifier,
|
||||||
|
) -> Option<String> {
|
||||||
self
|
self
|
||||||
.jsx_import_source_config
|
.jsx_import_source_config
|
||||||
.and_then(|c| c.default_specifier.clone())
|
.and_then(|c| c.default_specifier.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn default_jsx_import_source_types(&self) -> Option<String> {
|
fn default_jsx_import_source_types(
|
||||||
|
&self,
|
||||||
|
_referrer: &ModuleSpecifier,
|
||||||
|
) -> Option<String> {
|
||||||
self
|
self
|
||||||
.jsx_import_source_config
|
.jsx_import_source_config
|
||||||
.and_then(|c| c.default_types_specifier.clone())
|
.and_then(|c| c.default_types_specifier.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn jsx_import_source_module(&self) -> &str {
|
fn jsx_import_source_module(&self, _referrer: &ModuleSpecifier) -> &str {
|
||||||
self
|
self
|
||||||
.jsx_import_source_config
|
.jsx_import_source_config
|
||||||
.map(|c| c.module.as_str())
|
.map(|c| c.module.as_str())
|
||||||
|
|
|
@ -115,10 +115,16 @@ exec deno {} "$@"
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_installer_root() -> Result<PathBuf, io::Error> {
|
fn get_installer_root() -> Result<PathBuf, AnyError> {
|
||||||
if let Ok(env_dir) = env::var("DENO_INSTALL_ROOT") {
|
if let Some(env_dir) = env::var_os("DENO_INSTALL_ROOT") {
|
||||||
if !env_dir.is_empty() {
|
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
|
// 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");
|
let copy_path = get_hidden_file_with_ext(&file_path, "deno.json");
|
||||||
executable_args.push("--config".to_string());
|
executable_args.push("--config".to_string());
|
||||||
executable_args.push(copy_path.to_str().unwrap().to_string());
|
executable_args.push(copy_path.to_str().unwrap().to_string());
|
||||||
extra_files.push((
|
let mut config_text = fs::read_to_string(config_path)
|
||||||
copy_path,
|
.with_context(|| format!("error reading {config_path}"))?;
|
||||||
fs::read_to_string(config_path)
|
// always remove the import map field because when someone specifies `--import-map` we
|
||||||
.with_context(|| format!("error reading {config_path}"))?,
|
// 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 {
|
} else {
|
||||||
executable_args.push("--no-config".to_string());
|
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 {
|
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
|
// use a dot file to prevent the file from showing up in some
|
||||||
// users shell auto-complete since this directory is on the PATH
|
// users shell auto-complete since this directory is on the PATH
|
||||||
|
@ -1585,4 +1612,17 @@ mod tests {
|
||||||
assert!(!file_path.exists());
|
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(),
|
||||||
|
"{}"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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