diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2024-04-16 16:46:31 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-16 16:46:31 -0400 |
commit | 43c8c1cc6e0f0fe4accde97c52f7f2bb998ac669 (patch) | |
tree | 157e9e3801253b1ad9345aded73e684a39292bc5 | |
parent | 422cff1f247dc334d5eb9387be924f5937b0c6d9 (diff) |
feat(check): allow using side effect imports with unknown module kinds (ex. css modules) (#23392)
This allows people to use imports like:
```ts
import "./app.css";
```
...with `deno check` in systems where there's a bundle step (ex. Vite).
This will still error when using it with `deno run` or if the referenced
file does not exist.
See test cases for behaviour.
-rw-r--r-- | cli/factory.rs | 1 | ||||
-rw-r--r-- | cli/graph_util.rs | 12 | ||||
-rw-r--r-- | cli/tsc/mod.rs | 30 | ||||
-rw-r--r-- | tests/specs/check/css_import/__test__.jsonc | 24 | ||||
-rw-r--r-- | tests/specs/check/css_import/app.css | 0 | ||||
-rw-r--r-- | tests/specs/check/css_import/exists.out | 1 | ||||
-rw-r--r-- | tests/specs/check/css_import/exists.ts | 2 | ||||
-rw-r--r-- | tests/specs/check/css_import/exists_and_try_uses.out | 5 | ||||
-rw-r--r-- | tests/specs/check/css_import/exists_and_try_uses.ts | 3 | ||||
-rw-r--r-- | tests/specs/check/css_import/exists_dynamic_import.ts | 3 | ||||
-rw-r--r-- | tests/specs/check/css_import/exists_run_with_check.out | 3 | ||||
-rw-r--r-- | tests/specs/check/css_import/not_exists.out | 2 | ||||
-rw-r--r-- | tests/specs/check/css_import/not_exists.ts | 1 |
13 files changed, 84 insertions, 3 deletions
diff --git a/cli/factory.rs b/cli/factory.rs index 56837110a..fd33d295c 100644 --- a/cli/factory.rs +++ b/cli/factory.rs @@ -666,6 +666,7 @@ impl CliFactory { // todo(dsherret): ideally the graph container would not be used // for deno cache because it doesn't dynamically load modules DenoSubcommand::Cache(_) => GraphKind::All, + DenoSubcommand::Check(_) => GraphKind::TypesOnly, _ => self.options.type_check_mode().as_graph_kind(), }; Arc::new(ModuleGraphContainer::new(graph_kind)) diff --git a/cli/graph_util.rs b/cli/graph_util.rs index 6214a1628..f3b69b243 100644 --- a/cli/graph_util.rs +++ b/cli/graph_util.rs @@ -110,13 +110,23 @@ pub fn graph_valid( } } + if graph.graph_kind() == GraphKind::TypesOnly + && matches!( + error, + ModuleGraphError::ModuleError(ModuleError::UnsupportedMediaType(..)) + ) + { + log::debug!("Ignoring: {}", message); + return None; + } + if options.is_vendoring { // warn about failing dynamic imports when vendoring, but don't fail completely if matches!( error, ModuleGraphError::ModuleError(ModuleError::MissingDynamic(_, _)) ) { - log::warn!("Ignoring: {:#}", message); + log::warn!("Ignoring: {}", message); return None; } diff --git a/cli/tsc/mod.rs b/cli/tsc/mod.rs index 2d06e0a95..e2a7da3ed 100644 --- a/cli/tsc/mod.rs +++ b/cli/tsc/mod.rs @@ -508,7 +508,20 @@ fn op_load_inner( } else { &specifier }; - let maybe_source = if let Some(module) = graph.get(specifier) { + let maybe_module = match graph.try_get(specifier) { + Ok(maybe_module) => maybe_module, + Err(err) => match err { + deno_graph::ModuleError::UnsupportedMediaType(_, media_type, _) => { + return Ok(Some(LoadResponse { + data: "".to_string(), + version: Some("1".to_string()), + script_kind: as_ts_script_kind(*media_type), + })) + } + _ => None, + }, + }; + let maybe_source = if let Some(module) = maybe_module { match module { Module::Js(module) => { media_type = module.media_type; @@ -674,7 +687,20 @@ fn resolve_graph_specifier_types( state: &State, ) -> Result<Option<(ModuleSpecifier, MediaType)>, AnyError> { let graph = &state.graph; - let maybe_module = graph.get(specifier); + let maybe_module = match graph.try_get(specifier) { + Ok(Some(module)) => Some(module), + Ok(None) => None, + Err(err) => match err { + deno_graph::ModuleError::UnsupportedMediaType( + specifier, + media_type, + _, + ) => { + return Ok(Some((specifier.clone(), *media_type))); + } + _ => None, + }, + }; // follow the types reference directive, which may be pointing at an npm package let maybe_module = match maybe_module { Some(Module::Js(module)) => { diff --git a/tests/specs/check/css_import/__test__.jsonc b/tests/specs/check/css_import/__test__.jsonc new file mode 100644 index 000000000..629dcd383 --- /dev/null +++ b/tests/specs/check/css_import/__test__.jsonc @@ -0,0 +1,24 @@ +{ + "steps": [{ + "args": "check exists.ts", + "output": "exists.out" + }, { + "args": "run --check exists.ts", + "output": "exists_run_with_check.out", + "exitCode": 1 + }, { + "args": "check not_exists.ts", + "output": "not_exists.out", + "exitCode": 1 + }, { + "args": "check exists_and_try_uses.ts", + "output": "exists_and_try_uses.out", + "exitCode": 1 + }, { + "args": "check exists_dynamic_import.ts", + "output": "Check file:///[WILDCARD]exists_dynamic_import.ts\n" + }, { + "args": "run --check --reload exists_dynamic_import.ts", + "output": "Check file:///[WILDCARD]exists_dynamic_import.ts\n" + }] +} diff --git a/tests/specs/check/css_import/app.css b/tests/specs/check/css_import/app.css new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/specs/check/css_import/app.css diff --git a/tests/specs/check/css_import/exists.out b/tests/specs/check/css_import/exists.out new file mode 100644 index 000000000..1e9af3607 --- /dev/null +++ b/tests/specs/check/css_import/exists.out @@ -0,0 +1 @@ +Check [WILDLINE]exists.ts diff --git a/tests/specs/check/css_import/exists.ts b/tests/specs/check/css_import/exists.ts new file mode 100644 index 000000000..d5e05ae67 --- /dev/null +++ b/tests/specs/check/css_import/exists.ts @@ -0,0 +1,2 @@ +// should not error for deno check +import "./app.css"; diff --git a/tests/specs/check/css_import/exists_and_try_uses.out b/tests/specs/check/css_import/exists_and_try_uses.out new file mode 100644 index 000000000..b51ea2391 --- /dev/null +++ b/tests/specs/check/css_import/exists_and_try_uses.out @@ -0,0 +1,5 @@ +Check file:///[WILDLINE]/exists_and_try_uses.ts +error: TS1192 [ERROR]: Module '"file:///[WILDLINE]/app.css"' has no default export. +import test from "./app.css"; + ~~~~ + at file:///[WILDLINE]/exists_and_try_uses.ts:1:8 diff --git a/tests/specs/check/css_import/exists_and_try_uses.ts b/tests/specs/check/css_import/exists_and_try_uses.ts new file mode 100644 index 000000000..afaa6e4e0 --- /dev/null +++ b/tests/specs/check/css_import/exists_and_try_uses.ts @@ -0,0 +1,3 @@ +import test from "./app.css"; + +test(123); diff --git a/tests/specs/check/css_import/exists_dynamic_import.ts b/tests/specs/check/css_import/exists_dynamic_import.ts new file mode 100644 index 000000000..14f63fd23 --- /dev/null +++ b/tests/specs/check/css_import/exists_dynamic_import.ts @@ -0,0 +1,3 @@ +if (false) { + await import("./app.css"); +} diff --git a/tests/specs/check/css_import/exists_run_with_check.out b/tests/specs/check/css_import/exists_run_with_check.out new file mode 100644 index 000000000..1a1dafeb7 --- /dev/null +++ b/tests/specs/check/css_import/exists_run_with_check.out @@ -0,0 +1,3 @@ +error: Expected a JavaScript or TypeScript module, but identified a Unknown module. Importing these types of modules is currently not supported. + Specifier: file:///[WILDLINE]/app.css + at file:///[WILDLINE]/exists.ts:2:8 diff --git a/tests/specs/check/css_import/not_exists.out b/tests/specs/check/css_import/not_exists.out new file mode 100644 index 000000000..95fd14668 --- /dev/null +++ b/tests/specs/check/css_import/not_exists.out @@ -0,0 +1,2 @@ +error: Module not found "file:///[WILDLINE]/not_exists.css". + at file:///[WILDLINE]/not_exists.ts:1:8 diff --git a/tests/specs/check/css_import/not_exists.ts b/tests/specs/check/css_import/not_exists.ts new file mode 100644 index 000000000..762c9acd7 --- /dev/null +++ b/tests/specs/check/css_import/not_exists.ts @@ -0,0 +1 @@ +import "./not_exists.css"; |