mirror of
https://github.com/denoland/deno.git
synced 2025-01-03 04:48:52 -05:00
fix(cli): ensure that transitory dependencies are emitted (#8275)
Fixes #8111
This commit is contained in:
parent
37b7024a8f
commit
e9edc05bed
6 changed files with 60 additions and 7 deletions
|
@ -774,7 +774,7 @@ impl Graph {
|
||||||
info!("{} {}", colors::green("Check"), specifier);
|
info!("{} {}", colors::green("Check"), specifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
let root_names = self.get_root_names();
|
let root_names = self.get_root_names(!config.get_check_js());
|
||||||
let maybe_tsbuildinfo = self.maybe_tsbuildinfo.clone();
|
let maybe_tsbuildinfo = self.maybe_tsbuildinfo.clone();
|
||||||
let hash_data =
|
let hash_data =
|
||||||
vec![config.as_bytes(), version::DENO.as_bytes().to_owned()];
|
vec![config.as_bytes(), version::DENO.as_bytes().to_owned()];
|
||||||
|
@ -896,7 +896,7 @@ impl Graph {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
let root_names = self.get_root_names();
|
let root_names = self.get_root_names(!config.get_check_js());
|
||||||
let hash_data =
|
let hash_data =
|
||||||
vec![config.as_bytes(), version::DENO.as_bytes().to_owned()];
|
vec![config.as_bytes(), version::DENO.as_bytes().to_owned()];
|
||||||
let graph = Rc::new(RefCell::new(self));
|
let graph = Rc::new(RefCell::new(self));
|
||||||
|
@ -1152,10 +1152,37 @@ impl Graph {
|
||||||
/// Transform `self.roots` into something that works for `tsc`, because `tsc`
|
/// Transform `self.roots` into something that works for `tsc`, because `tsc`
|
||||||
/// doesn't like root names without extensions that match its expectations,
|
/// doesn't like root names without extensions that match its expectations,
|
||||||
/// nor does it have any concept of redirection, so we have to resolve all
|
/// nor does it have any concept of redirection, so we have to resolve all
|
||||||
/// that upfront before feeding it to `tsc`.
|
/// that upfront before feeding it to `tsc`. In addition, if checkJs is not
|
||||||
fn get_root_names(&self) -> Vec<(ModuleSpecifier, MediaType)> {
|
/// true, we should pass all emittable files in as the roots, so that `tsc`
|
||||||
self
|
/// type checks them and potentially emits them.
|
||||||
.roots
|
fn get_root_names(
|
||||||
|
&self,
|
||||||
|
include_emittable: bool,
|
||||||
|
) -> Vec<(ModuleSpecifier, MediaType)> {
|
||||||
|
let root_names: Vec<ModuleSpecifier> = if include_emittable {
|
||||||
|
// in situations where there is `allowJs` with tsc, but not `checkJs`,
|
||||||
|
// then tsc will not parse the whole module graph, meaning that any
|
||||||
|
// JavaScript importing TypeScript will get ignored, meaning that those
|
||||||
|
// files will not get emitted. To counter act that behavior, we will
|
||||||
|
// include all modules that are emittable.
|
||||||
|
let mut specifiers = HashSet::<&ModuleSpecifier>::new();
|
||||||
|
for (_, module) in self.modules.iter() {
|
||||||
|
if module.media_type == MediaType::JSX
|
||||||
|
|| module.media_type == MediaType::TypeScript
|
||||||
|
|| module.media_type == MediaType::TSX
|
||||||
|
{
|
||||||
|
specifiers.insert(&module.specifier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// We should include all the original roots as well.
|
||||||
|
for specifier in self.roots.iter() {
|
||||||
|
specifiers.insert(specifier);
|
||||||
|
}
|
||||||
|
specifiers.into_iter().cloned().collect()
|
||||||
|
} else {
|
||||||
|
self.roots.clone()
|
||||||
|
};
|
||||||
|
root_names
|
||||||
.iter()
|
.iter()
|
||||||
.map(|ms| {
|
.map(|ms| {
|
||||||
// if the root module has a types specifier, we should be sending that
|
// if the root module has a types specifier, we should be sending that
|
||||||
|
@ -1417,9 +1444,10 @@ impl Graph {
|
||||||
if module.media_type == MediaType::Dts {
|
if module.media_type == MediaType::Dts {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// if we don't have check_js enabled, we won't touch non TypeScript
|
// if we don't have check_js enabled, we won't touch non TypeScript or JSX
|
||||||
// modules
|
// modules
|
||||||
if !(emit_options.check_js
|
if !(emit_options.check_js
|
||||||
|
|| module.media_type == MediaType::JSX
|
||||||
|| module.media_type == MediaType::TSX
|
|| module.media_type == MediaType::TSX
|
||||||
|| module.media_type == MediaType::TypeScript)
|
|| module.media_type == MediaType::TypeScript)
|
||||||
{
|
{
|
||||||
|
|
7
cli/tests/fix_emittable_skipped.js
Normal file
7
cli/tests/fix_emittable_skipped.js
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/// <reference types="./subdir/emittable.d.ts" />
|
||||||
|
|
||||||
|
import "./subdir/polyfill.ts";
|
||||||
|
|
||||||
|
export const a = "a";
|
||||||
|
|
||||||
|
console.log(globalThis.polyfill);
|
2
cli/tests/fix_emittable_skipped.ts.out
Normal file
2
cli/tests/fix_emittable_skipped.ts.out
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
[WILDCARD]
|
||||||
|
[Function]
|
|
@ -2865,6 +2865,11 @@ itest!(tsx_imports {
|
||||||
output: "tsx_imports.ts.out",
|
output: "tsx_imports.ts.out",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
itest!(fix_emittable_skipped {
|
||||||
|
args: "run --reload fix_emittable_skipped.js",
|
||||||
|
output: "fix_emittable_skipped.ts.out",
|
||||||
|
});
|
||||||
|
|
||||||
itest!(fix_exotic_specifiers {
|
itest!(fix_exotic_specifiers {
|
||||||
args: "run --quiet --reload fix_exotic_specifiers.ts",
|
args: "run --quiet --reload fix_exotic_specifiers.ts",
|
||||||
output: "fix_exotic_specifiers.ts.out",
|
output: "fix_exotic_specifiers.ts.out",
|
||||||
|
|
1
cli/tests/subdir/emittable.d.ts
vendored
Normal file
1
cli/tests/subdir/emittable.d.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export const a: string;
|
10
cli/tests/subdir/polyfill.ts
Normal file
10
cli/tests/subdir/polyfill.ts
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
declare global {
|
||||||
|
const polyfill: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export {};
|
||||||
|
|
||||||
|
// deno-lint-ignore no-explicit-any
|
||||||
|
(globalThis as any).polyfill = () => {
|
||||||
|
console.log("polyfill");
|
||||||
|
};
|
Loading…
Reference in a new issue