mirror of
https://github.com/denoland/deno.git
synced 2025-09-27 04:39:10 +00:00
refactor: cleanup compiler pipeline (#2686)
* remove fetch_source_file_and_maybe_compile_async and replace it with State.fetch_compiled_module * remove SourceFile.js_source() * introduce CompiledModule which is basically the same as deno::SourceInfo and represents arbitrary file that has been compiled to JS module * introduce //cli/compilers module containing all compilers * introduce JsCompiler which is a no-op compiler - output is the same as input, no compilation takes place - it is used for MediaType::JavaScript and MediaType::Unknown * introduce JsonCompiler that wraps JSON in default export * support JS-to-JS compilation using checkJs
This commit is contained in:
parent
e7cee29c84
commit
2e1ab82321
14 changed files with 353 additions and 199 deletions
|
@ -219,6 +219,8 @@ function getExtension(
|
|||
}
|
||||
|
||||
class Host implements ts.CompilerHost {
|
||||
extensionCache: Record<string, ts.Extension> = {};
|
||||
|
||||
private readonly _options: ts.CompilerOptions = {
|
||||
allowJs: true,
|
||||
allowNonTsExtensions: true,
|
||||
|
@ -370,10 +372,16 @@ class Host implements ts.CompilerHost {
|
|||
// This flags to the compiler to not go looking to transpile functional
|
||||
// code, anything that is in `/$asset$/` is just library code
|
||||
const isExternalLibraryImport = moduleName.startsWith(ASSETS);
|
||||
const extension = getExtension(
|
||||
resolvedFileName,
|
||||
SourceFile.mediaType
|
||||
);
|
||||
this.extensionCache[resolvedFileName] = extension;
|
||||
|
||||
const r = {
|
||||
resolvedFileName,
|
||||
isExternalLibraryImport,
|
||||
extension: getExtension(resolvedFileName, SourceFile.mediaType)
|
||||
extension
|
||||
};
|
||||
return r;
|
||||
} else {
|
||||
|
@ -401,6 +409,21 @@ class Host implements ts.CompilerHost {
|
|||
} else {
|
||||
assert(sourceFiles != null && sourceFiles.length == 1);
|
||||
const sourceFileName = sourceFiles![0].fileName;
|
||||
const maybeExtension = this.extensionCache[sourceFileName];
|
||||
|
||||
if (maybeExtension) {
|
||||
// NOTE: If it's a `.json` file we don't want to write it to disk.
|
||||
// JSON files are loaded and used by TS compiler to check types, but we don't want
|
||||
// to emit them to disk because output file is the same as input file.
|
||||
if (maybeExtension === ts.Extension.Json) {
|
||||
return;
|
||||
}
|
||||
|
||||
// NOTE: JavaScript files are only emitted to disk if `checkJs` option in on
|
||||
if (maybeExtension === ts.Extension.Js && !this._options.checkJs) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (fileName.endsWith(".map")) {
|
||||
// Source Map
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue