summaryrefslogtreecommitdiff
path: root/js/compiler.ts
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2019-07-31 19:16:03 +0200
committerRyan Dahl <ry@tinyclouds.org>2019-07-31 13:16:03 -0400
commit2e1ab8232156a23afd22834c1e707fb3403c0db6 (patch)
tree933b5a33aaa27ce359c9b7133a4718baaa730db7 /js/compiler.ts
parente7cee29c849286f9b492eb404634a0387b9a75a0 (diff)
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
Diffstat (limited to 'js/compiler.ts')
-rw-r--r--js/compiler.ts25
1 files changed, 24 insertions, 1 deletions
diff --git a/js/compiler.ts b/js/compiler.ts
index 34ac2f482..4203f753b 100644
--- a/js/compiler.ts
+++ b/js/compiler.ts
@@ -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