mirror of
https://github.com/denoland/deno
synced 2024-10-04 07:09:20 +00:00
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.
This commit is contained in:
parent
422cff1f24
commit
43c8c1cc6e
|
@ -666,6 +666,7 @@ impl CliFactory {
|
||||||
// todo(dsherret): ideally the graph container would not be used
|
// todo(dsherret): ideally the graph container would not be used
|
||||||
// for deno cache because it doesn't dynamically load modules
|
// for deno cache because it doesn't dynamically load modules
|
||||||
DenoSubcommand::Cache(_) => GraphKind::All,
|
DenoSubcommand::Cache(_) => GraphKind::All,
|
||||||
|
DenoSubcommand::Check(_) => GraphKind::TypesOnly,
|
||||||
_ => self.options.type_check_mode().as_graph_kind(),
|
_ => self.options.type_check_mode().as_graph_kind(),
|
||||||
};
|
};
|
||||||
Arc::new(ModuleGraphContainer::new(graph_kind))
|
Arc::new(ModuleGraphContainer::new(graph_kind))
|
||||||
|
|
|
@ -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 {
|
if options.is_vendoring {
|
||||||
// warn about failing dynamic imports when vendoring, but don't fail completely
|
// warn about failing dynamic imports when vendoring, but don't fail completely
|
||||||
if matches!(
|
if matches!(
|
||||||
error,
|
error,
|
||||||
ModuleGraphError::ModuleError(ModuleError::MissingDynamic(_, _))
|
ModuleGraphError::ModuleError(ModuleError::MissingDynamic(_, _))
|
||||||
) {
|
) {
|
||||||
log::warn!("Ignoring: {:#}", message);
|
log::warn!("Ignoring: {}", message);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -508,7 +508,20 @@ fn op_load_inner(
|
||||||
} else {
|
} else {
|
||||||
&specifier
|
&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 {
|
match module {
|
||||||
Module::Js(module) => {
|
Module::Js(module) => {
|
||||||
media_type = module.media_type;
|
media_type = module.media_type;
|
||||||
|
@ -674,7 +687,20 @@ fn resolve_graph_specifier_types(
|
||||||
state: &State,
|
state: &State,
|
||||||
) -> Result<Option<(ModuleSpecifier, MediaType)>, AnyError> {
|
) -> Result<Option<(ModuleSpecifier, MediaType)>, AnyError> {
|
||||||
let graph = &state.graph;
|
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
|
// follow the types reference directive, which may be pointing at an npm package
|
||||||
let maybe_module = match maybe_module {
|
let maybe_module = match maybe_module {
|
||||||
Some(Module::Js(module)) => {
|
Some(Module::Js(module)) => {
|
||||||
|
|
24
tests/specs/check/css_import/__test__.jsonc
Normal file
24
tests/specs/check/css_import/__test__.jsonc
Normal file
|
@ -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"
|
||||||
|
}]
|
||||||
|
}
|
0
tests/specs/check/css_import/app.css
Normal file
0
tests/specs/check/css_import/app.css
Normal file
1
tests/specs/check/css_import/exists.out
Normal file
1
tests/specs/check/css_import/exists.out
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Check [WILDLINE]exists.ts
|
2
tests/specs/check/css_import/exists.ts
Normal file
2
tests/specs/check/css_import/exists.ts
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
// should not error for deno check
|
||||||
|
import "./app.css";
|
5
tests/specs/check/css_import/exists_and_try_uses.out
Normal file
5
tests/specs/check/css_import/exists_and_try_uses.out
Normal file
|
@ -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
|
3
tests/specs/check/css_import/exists_and_try_uses.ts
Normal file
3
tests/specs/check/css_import/exists_and_try_uses.ts
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
import test from "./app.css";
|
||||||
|
|
||||||
|
test(123);
|
3
tests/specs/check/css_import/exists_dynamic_import.ts
Normal file
3
tests/specs/check/css_import/exists_dynamic_import.ts
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
if (false) {
|
||||||
|
await import("./app.css");
|
||||||
|
}
|
3
tests/specs/check/css_import/exists_run_with_check.out
Normal file
3
tests/specs/check/css_import/exists_run_with_check.out
Normal file
|
@ -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
|
2
tests/specs/check/css_import/not_exists.out
Normal file
2
tests/specs/check/css_import/not_exists.out
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
error: Module not found "file:///[WILDLINE]/not_exists.css".
|
||||||
|
at file:///[WILDLINE]/not_exists.ts:1:8
|
1
tests/specs/check/css_import/not_exists.ts
Normal file
1
tests/specs/check/css_import/not_exists.ts
Normal file
|
@ -0,0 +1 @@
|
||||||
|
import "./not_exists.css";
|
Loading…
Reference in a new issue