diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2020-05-06 00:19:18 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-06 00:19:18 +0200 |
commit | 2ecdbb62ae8f925b01e3e49f397d439a2f464a21 (patch) | |
tree | ca45ddcf322337affdf1bbb8f87139b373d2d93d /cli/js/compiler/sourcefile.ts | |
parent | 9cd7d598405f8bf6600775827f870848fd3e120a (diff) |
refactor: merge TS compiler into single file (#5091)
Diffstat (limited to 'cli/js/compiler/sourcefile.ts')
-rw-r--r-- | cli/js/compiler/sourcefile.ts | 165 |
1 files changed, 0 insertions, 165 deletions
diff --git a/cli/js/compiler/sourcefile.ts b/cli/js/compiler/sourcefile.ts deleted file mode 100644 index d390c3f56..000000000 --- a/cli/js/compiler/sourcefile.ts +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. - -import { getMappedModuleName, parseTypeDirectives } from "./type_directives.ts"; -import { assert, log } from "../util.ts"; - -// Warning! The values in this enum are duplicated in `cli/msg.rs` -// Update carefully! -export enum MediaType { - JavaScript = 0, - JSX = 1, - TypeScript = 2, - TSX = 3, - Json = 4, - Wasm = 5, - Unknown = 6, -} - -export interface SourceFileJson { - url: string; - filename: string; - mediaType: MediaType; - sourceCode: string; -} - -export const ASSETS = "$asset$"; - -function getExtension(fileName: string, mediaType: MediaType): ts.Extension { - switch (mediaType) { - case MediaType.JavaScript: - return ts.Extension.Js; - case MediaType.JSX: - return ts.Extension.Jsx; - case MediaType.TypeScript: - return fileName.endsWith(".d.ts") ? ts.Extension.Dts : ts.Extension.Ts; - case MediaType.TSX: - return ts.Extension.Tsx; - case MediaType.Wasm: - // Custom marker for Wasm type. - return ts.Extension.Js; - case MediaType.Unknown: - default: - throw TypeError( - `Cannot resolve extension for "${fileName}" with mediaType "${MediaType[mediaType]}".` - ); - } -} - -/** A global cache of module source files that have been loaded. */ -const moduleCache: Map<string, SourceFile> = new Map(); -/** A map of maps which cache source files for quicker modules resolution. */ -const specifierCache: Map<string, Map<string, SourceFile>> = new Map(); - -export class SourceFile { - extension!: ts.Extension; - filename!: string; - - mediaType!: MediaType; - processed = false; - sourceCode?: string; - tsSourceFile?: ts.SourceFile; - url!: string; - - constructor(json: SourceFileJson) { - if (moduleCache.has(json.url)) { - throw new TypeError("SourceFile already exists"); - } - Object.assign(this, json); - this.extension = getExtension(this.url, this.mediaType); - moduleCache.set(this.url, this); - } - - cache(moduleSpecifier: string, containingFile?: string): void { - containingFile = containingFile || ""; - let innerCache = specifierCache.get(containingFile); - if (!innerCache) { - innerCache = new Map(); - specifierCache.set(containingFile, innerCache); - } - innerCache.set(moduleSpecifier, this); - } - - imports(processJsImports: boolean): Array<[string, string]> { - if (this.processed) { - throw new Error("SourceFile has already been processed."); - } - assert(this.sourceCode != null); - // we shouldn't process imports for files which contain the nocheck pragma - // (like bundles) - if (this.sourceCode.match(/\/{2}\s+@ts-nocheck/)) { - log(`Skipping imports for "${this.filename}"`); - return []; - } - - const readImportFiles = true; - const detectJsImports = - this.mediaType === MediaType.JavaScript || - this.mediaType === MediaType.JSX; - - const preProcessedFileInfo = ts.preProcessFile( - this.sourceCode, - readImportFiles, - detectJsImports - ); - this.processed = true; - const files: Array<[string, string]> = []; - - function process(references: Array<{ fileName: string }>): void { - for (const { fileName } of references) { - files.push([fileName, fileName]); - } - } - - const { - importedFiles, - referencedFiles, - libReferenceDirectives, - typeReferenceDirectives, - } = preProcessedFileInfo; - const typeDirectives = parseTypeDirectives(this.sourceCode); - if (typeDirectives) { - for (const importedFile of importedFiles) { - files.push([ - importedFile.fileName, - getMappedModuleName(importedFile, typeDirectives), - ]); - } - } else if ( - !( - !processJsImports && - (this.mediaType === MediaType.JavaScript || - this.mediaType === MediaType.JSX) - ) - ) { - process(importedFiles); - } - process(referencedFiles); - // built in libs comes across as `"dom"` for example, and should be filtered - // out during pre-processing as they are either already cached or they will - // be lazily fetched by the compiler host. Ones that contain full files are - // not filtered out and will be fetched as normal. - process( - libReferenceDirectives.filter( - ({ fileName }) => !ts.libMap.has(fileName.toLowerCase()) - ) - ); - process(typeReferenceDirectives); - return files; - } - - static getUrl( - moduleSpecifier: string, - containingFile: string - ): string | undefined { - const containingCache = specifierCache.get(containingFile); - if (containingCache) { - const sourceFile = containingCache.get(moduleSpecifier); - return sourceFile && sourceFile.url; - } - return undefined; - } - - static get(url: string): SourceFile | undefined { - return moduleCache.get(url); - } -} |