mirror of
https://github.com/denoland/deno.git
synced 2024-12-22 07:14:47 -05:00
fix(cli): allow configurations files to also be json modules (#15444)
Closes #15440
This commit is contained in:
parent
d9fae38d1e
commit
578f12d531
6 changed files with 77 additions and 57 deletions
|
@ -9,6 +9,7 @@ use deno_core::error::custom_error;
|
||||||
use deno_core::error::AnyError;
|
use deno_core::error::AnyError;
|
||||||
use deno_core::ModuleSpecifier;
|
use deno_core::ModuleSpecifier;
|
||||||
use deno_graph::Dependency;
|
use deno_graph::Dependency;
|
||||||
|
use deno_graph::GraphImport;
|
||||||
use deno_graph::MediaType;
|
use deno_graph::MediaType;
|
||||||
use deno_graph::ModuleGraph;
|
use deno_graph::ModuleGraph;
|
||||||
use deno_graph::ModuleGraphError;
|
use deno_graph::ModuleGraphError;
|
||||||
|
@ -49,9 +50,6 @@ pub enum ModuleEntry {
|
||||||
checked_libs: HashSet<TsTypeLib>,
|
checked_libs: HashSet<TsTypeLib>,
|
||||||
maybe_types: Option<Resolved>,
|
maybe_types: Option<Resolved>,
|
||||||
},
|
},
|
||||||
Configuration {
|
|
||||||
dependencies: BTreeMap<String, Resolved>,
|
|
||||||
},
|
|
||||||
Error(ModuleGraphError),
|
Error(ModuleGraphError),
|
||||||
Redirect(ModuleSpecifier),
|
Redirect(ModuleSpecifier),
|
||||||
}
|
}
|
||||||
|
@ -63,7 +61,7 @@ pub struct GraphData {
|
||||||
/// Map of first known referrer locations for each module. Used to enhance
|
/// Map of first known referrer locations for each module. Used to enhance
|
||||||
/// error messages.
|
/// error messages.
|
||||||
referrer_map: HashMap<ModuleSpecifier, Range>,
|
referrer_map: HashMap<ModuleSpecifier, Range>,
|
||||||
configurations: HashSet<ModuleSpecifier>,
|
graph_imports: Vec<GraphImport>,
|
||||||
cjs_esm_translations: HashMap<ModuleSpecifier, String>,
|
cjs_esm_translations: HashMap<ModuleSpecifier, String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,24 +69,22 @@ impl GraphData {
|
||||||
/// Store data from `graph` into `self`.
|
/// Store data from `graph` into `self`.
|
||||||
pub fn add_graph(&mut self, graph: &ModuleGraph, reload: bool) {
|
pub fn add_graph(&mut self, graph: &ModuleGraph, reload: bool) {
|
||||||
for graph_import in &graph.imports {
|
for graph_import in &graph.imports {
|
||||||
let mut dependencies = BTreeMap::new();
|
for dep in graph_import.dependencies.values() {
|
||||||
for (specifier, dependency) in &graph_import.dependencies {
|
for resolved in [&dep.maybe_code, &dep.maybe_type] {
|
||||||
if !matches!(dependency.maybe_type, Resolved::None) {
|
|
||||||
dependencies.insert(specifier.clone(), dependency.maybe_type.clone());
|
|
||||||
if let Resolved::Ok {
|
if let Resolved::Ok {
|
||||||
specifier, range, ..
|
specifier, range, ..
|
||||||
} = &dependency.maybe_type
|
} = resolved
|
||||||
{
|
{
|
||||||
let entry = self.referrer_map.entry(specifier.clone());
|
let entry = self.referrer_map.entry(specifier.clone());
|
||||||
entry.or_insert_with(|| range.clone());
|
entry.or_insert_with(|| range.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.modules.insert(
|
// TODO(nayeemrmn): Implement `Clone` on `GraphImport`.
|
||||||
graph_import.referrer.clone(),
|
self.graph_imports.push(GraphImport {
|
||||||
ModuleEntry::Configuration { dependencies },
|
referrer: graph_import.referrer.clone(),
|
||||||
);
|
dependencies: graph_import.dependencies.clone(),
|
||||||
self.configurations.insert(graph_import.referrer.clone());
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
for (specifier, result) in graph.specifiers() {
|
for (specifier, result) in graph.specifiers() {
|
||||||
|
@ -187,9 +183,20 @@ impl GraphData {
|
||||||
seen.insert(root);
|
seen.insert(root);
|
||||||
visiting.push_back(root);
|
visiting.push_back(root);
|
||||||
}
|
}
|
||||||
for root in &self.configurations {
|
for (_, dep) in self.graph_imports.iter().flat_map(|i| &i.dependencies) {
|
||||||
seen.insert(root);
|
let mut resolutions = vec![&dep.maybe_code];
|
||||||
visiting.push_back(root);
|
if follow_type_only {
|
||||||
|
resolutions.push(&dep.maybe_type);
|
||||||
|
}
|
||||||
|
#[allow(clippy::manual_flatten)]
|
||||||
|
for resolved in resolutions {
|
||||||
|
if let Resolved::Ok { specifier, .. } = resolved {
|
||||||
|
if !seen.contains(specifier) {
|
||||||
|
seen.insert(specifier);
|
||||||
|
visiting.push_front(specifier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
while let Some(specifier) = visiting.pop_front() {
|
while let Some(specifier) = visiting.pop_front() {
|
||||||
let (specifier, entry) = match self.modules.get_key_value(specifier) {
|
let (specifier, entry) = match self.modules.get_key_value(specifier) {
|
||||||
|
@ -239,16 +246,6 @@ impl GraphData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ModuleEntry::Configuration { dependencies } => {
|
|
||||||
for resolved in dependencies.values() {
|
|
||||||
if let Resolved::Ok { specifier, .. } = resolved {
|
|
||||||
if !seen.contains(specifier) {
|
|
||||||
seen.insert(specifier);
|
|
||||||
visiting.push_front(specifier);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ModuleEntry::Error(_) => {}
|
ModuleEntry::Error(_) => {}
|
||||||
ModuleEntry::Redirect(specifier) => {
|
ModuleEntry::Redirect(specifier) => {
|
||||||
if !seen.contains(specifier) {
|
if !seen.contains(specifier) {
|
||||||
|
@ -282,7 +279,15 @@ impl GraphData {
|
||||||
Some(Self {
|
Some(Self {
|
||||||
modules,
|
modules,
|
||||||
referrer_map,
|
referrer_map,
|
||||||
configurations: self.configurations.clone(),
|
// TODO(nayeemrmn): Implement `Clone` on `GraphImport`.
|
||||||
|
graph_imports: self
|
||||||
|
.graph_imports
|
||||||
|
.iter()
|
||||||
|
.map(|i| GraphImport {
|
||||||
|
referrer: i.referrer.clone(),
|
||||||
|
dependencies: i.dependencies.clone(),
|
||||||
|
})
|
||||||
|
.collect(),
|
||||||
cjs_esm_translations: Default::default(),
|
cjs_esm_translations: Default::default(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -352,20 +357,6 @@ impl GraphData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ModuleEntry::Configuration { dependencies } => {
|
|
||||||
for resolved_result in dependencies.values() {
|
|
||||||
if let Resolved::Err(error) = resolved_result {
|
|
||||||
let range = error.range();
|
|
||||||
if !range.specifier.as_str().contains("$deno") {
|
|
||||||
return Some(Err(custom_error(
|
|
||||||
get_error_class_name(&error.clone().into()),
|
|
||||||
format!("{}\n at {}", error, range),
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
return Some(Err(error.clone().into()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ModuleEntry::Error(error) => {
|
ModuleEntry::Error(error) => {
|
||||||
if !contains_specifier(roots, specifier) {
|
if !contains_specifier(roots, specifier) {
|
||||||
if let Some(range) = self.referrer_map.get(specifier) {
|
if let Some(range) = self.referrer_map.get(specifier) {
|
||||||
|
@ -443,6 +434,24 @@ impl GraphData {
|
||||||
self.modules.get(specifier)
|
self.modules.get(specifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the dependencies of a module or graph import.
|
||||||
|
pub fn get_dependencies<'a>(
|
||||||
|
&'a self,
|
||||||
|
specifier: &ModuleSpecifier,
|
||||||
|
) -> Option<&'a BTreeMap<String, Dependency>> {
|
||||||
|
let specifier = self.follow_redirect(specifier);
|
||||||
|
if let Some(ModuleEntry::Module { dependencies, .. }) = self.get(&specifier)
|
||||||
|
{
|
||||||
|
return Some(dependencies);
|
||||||
|
}
|
||||||
|
if let Some(graph_import) =
|
||||||
|
self.graph_imports.iter().find(|i| i.referrer == specifier)
|
||||||
|
{
|
||||||
|
return Some(&graph_import.dependencies);
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
// TODO(bartlomieju): after saving translated source
|
// TODO(bartlomieju): after saving translated source
|
||||||
// it's never removed, potentially leading to excessive
|
// it's never removed, potentially leading to excessive
|
||||||
// memory consumption
|
// memory consumption
|
||||||
|
|
|
@ -2754,6 +2754,12 @@ itest!(custom_inspect_url {
|
||||||
output: "custom_inspect_url.js.out",
|
output: "custom_inspect_url.js.out",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
itest!(config_json_import {
|
||||||
|
args: "run --quiet -c jsx/deno-jsx.json config_json_import.ts",
|
||||||
|
output: "config_json_import.ts.out",
|
||||||
|
http_server: true,
|
||||||
|
});
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn running_declaration_files() {
|
fn running_declaration_files() {
|
||||||
let temp_dir = TempDir::new();
|
let temp_dir = TempDir::new();
|
||||||
|
|
2
cli/tests/testdata/config_json_import.ts
vendored
Normal file
2
cli/tests/testdata/config_json_import.ts
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
import config from "./jsx/deno-jsx.json" assert { type: "json" };
|
||||||
|
console.log(config);
|
3
cli/tests/testdata/config_json_import.ts.out
vendored
Normal file
3
cli/tests/testdata/config_json_import.ts.out
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
compilerOptions: { jsx: "react-jsx", jsxImportSource: "http://localhost:4545/jsx" }
|
||||||
|
}
|
6
cli/tests/testdata/jsx/deno-jsx.json
vendored
Normal file
6
cli/tests/testdata/jsx/deno-jsx.json
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"jsx": "react-jsx",
|
||||||
|
"jsxImportSource": "http://localhost:4545/jsx"
|
||||||
|
}
|
||||||
|
}
|
14
cli/tsc.rs
14
cli/tsc.rs
|
@ -490,21 +490,15 @@ fn op_resolve(
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
let graph_data = state.graph_data.read();
|
let graph_data = state.graph_data.read();
|
||||||
let referrer = graph_data.follow_redirect(&referrer);
|
let resolved_dep = match graph_data.get_dependencies(&referrer) {
|
||||||
let resolved_dep = match graph_data.get(&referrer) {
|
Some(dependencies) => dependencies.get(specifier).map(|d| {
|
||||||
Some(ModuleEntry::Module { dependencies, .. }) => {
|
|
||||||
dependencies.get(specifier).map(|d| {
|
|
||||||
if matches!(d.maybe_type, Resolved::Ok { .. }) {
|
if matches!(d.maybe_type, Resolved::Ok { .. }) {
|
||||||
&d.maybe_type
|
&d.maybe_type
|
||||||
} else {
|
} else {
|
||||||
&d.maybe_code
|
&d.maybe_code
|
||||||
}
|
}
|
||||||
})
|
}),
|
||||||
}
|
None => None,
|
||||||
Some(ModuleEntry::Configuration { dependencies }) => {
|
|
||||||
dependencies.get(specifier)
|
|
||||||
}
|
|
||||||
_ => None,
|
|
||||||
};
|
};
|
||||||
let maybe_result = match resolved_dep {
|
let maybe_result = match resolved_dep {
|
||||||
Some(Resolved::Ok { specifier, .. }) => {
|
Some(Resolved::Ok { specifier, .. }) => {
|
||||||
|
|
Loading…
Reference in a new issue