浏览代码

Let TypeScript resolve deps in lib files + allow external tools to extend the lib support

Orta Therox 5 年之前
父节点
当前提交
1d6f5a0e24
共有 3 个文件被更改,包括 38 次插入30 次删除
  1. 10 12
      scripts/importTypescript.js
  2. 1 1
      src/lib/lib.ts
  3. 27 17
      src/tsWorker.ts

+ 10 - 12
scripts/importTypescript.js

@@ -124,6 +124,7 @@ function importLibs() {
 	};
 
 	enqueue('');
+	enqueue('es6');
 	enqueue('es2015');
 
 	var result = [];
@@ -149,10 +150,9 @@ function importLibs() {
 		for (let i = 0; i < lines.length; i++) {
 			let m = lines[i].match(/\/\/\/\s*<reference\s*lib="([^"]+)"/);
 			if (m) {
-				flushOutputLines();
-				writeOutput(getVariableName(m[1]));
 				deps.push(getVariableName(m[1]));
 				enqueue(m[1]);
+				outputLines.push(lines[i]);
 				continue;
 			}
 			outputLines.push(lines[i]);
@@ -161,6 +161,7 @@ function importLibs() {
 
 		result.push({
 			name: getVariableName(name),
+			filepath: getFileName(name),
 			deps: deps,
 			output: output
 		});
@@ -170,14 +171,19 @@ function importLibs() {
  *  Copyright (c) Microsoft Corporation. All rights reserved.
  *  Licensed under the MIT License. See License.txt in the project root for license information.
  *--------------------------------------------------------------------------------------------*/
-${generatedNote}`;
+${generatedNote}
+
+/** Contains all the lib files */
+export const libFileMap: Record<string, string> = {}
+`
+;
 	// Do a topological sort
 	while (result.length > 0) {
 		for (let i = result.length - 1; i >= 0; i--) {
 			if (result[i].deps.length === 0) {
 				// emit this node
 				strResult += `\nexport const ${result[i].name}: string = ${result[i].output};\n`;
-
+				strResult += `\libFileMap['${result[i].filepath}'] = ${result[i].name};\n`;
 				// mark dep as resolved
 				for (let j = 0; j < result.length; j++) {
 					for (let k = 0; k < result[j].deps.length; k++) {
@@ -195,14 +201,6 @@ ${generatedNote}`;
 		}
 	}
 
-	strResult += `
-/** This is the DTS which is used when the target is ES6 or below */
-export const lib_es5_bundled_dts = lib_dts;
-
-/** This is the DTS which is used by default in monaco-typescript, and when the target is 2015 or above */
-export const lib_es2015_bundled_dts = lib_es2015_dts + "" + lib_dom_dts + "" + lib_webworker_importscripts_dts + "" + lib_scripthost_dts + "";
-`
-
 	var dstPath = path.join(TYPESCRIPT_LIB_DESTINATION, 'lib.ts');
 	fs.writeFileSync(dstPath, strResult);
 }

文件差异内容过多而无法显示
+ 1 - 1
src/lib/lib.ts


+ 27 - 17
src/tsWorker.ts

@@ -5,21 +5,11 @@
 'use strict';
 
 import * as ts from './lib/typescriptServices';
-import { lib_es5_dts, lib_es2015_bundled_dts } from './lib/lib';
+import { libFileMap } from './lib/lib';
 import { IExtraLibs } from './monaco.contribution';
 
 import IWorkerContext = monaco.worker.IWorkerContext;
 
-const DEFAULT_ES5_LIB = {
-	NAME: 'defaultLib:lib.d.ts',
-	CONTENTS: lib_es5_dts
-};
-
-const ES2015_LIB = {
-	NAME: 'defaultLib:lib.es2015.d.ts',
-	CONTENTS: lib_es2015_bundled_dts
-};
-
 export class TypeScriptWorker implements ts.LanguageServiceHost, monaco.languages.typescript.TypeScriptWorker {
 
 	// --- model sync -----------------------
@@ -84,10 +74,8 @@ export class TypeScriptWorker implements ts.LanguageServiceHost, monaco.language
 			// extra lib
 			text = this._extraLibs[fileName].content;
 
-		} else if (fileName === DEFAULT_ES5_LIB.NAME) {
-			text = DEFAULT_ES5_LIB.CONTENTS;
-		} else if (fileName === ES2015_LIB.NAME) {
-			text = ES2015_LIB.CONTENTS;
+		} else if (fileName in libFileMap) {
+			text = libFileMap[fileName];
 		} else {
 			return;
 		}
@@ -126,8 +114,30 @@ export class TypeScriptWorker implements ts.LanguageServiceHost, monaco.language
 	}
 
 	getDefaultLibFileName(options: ts.CompilerOptions): string {
-		// TODO@joh support lib.es7.d.ts
-		return (options.target || ts.ScriptTarget.ES2015) < ts.ScriptTarget.ES2015 ? DEFAULT_ES5_LIB.NAME : ES2015_LIB.NAME;
+		switch (options.target) {
+			case 99 /* ESNext */:
+				const esnext = "lib.esnext.full.d.ts";
+				if (esnext in libFileMap || esnext in this._extraLibs) return esnext
+			case 7 /* ES2020 */:
+			case 6 /* ES2019 */:
+			case 5 /* ES2018 */:
+			case 4 /* ES2017 */:
+			case 3 /* ES2016 */:
+			case 2 /* ES2015 */:
+			default:
+				// Support a dynamic lookup for the ES20XX version based on the target
+				// which is safe unless TC39 changes their numbering system
+				const eslib = `lib.es${2013 + (options.target || 99)}.full.d.ts`;
+				// Note: This also looks in _extraLibs, If you want
+				// to add support for additional target options, you will need to
+				// add the extra dts files to _extraLibs via the API.
+				if (eslib in libFileMap || eslib in this._extraLibs) return eslib
+
+				return "lib.es6.d.ts"; // We don't use lib.es2015.full.d.ts due to breaking change.
+			case 1:
+			case 0:
+				return "lib.d.ts";
+		}
 	}
 
 	isDefaultLibFileName(fileName: string): boolean {

部分文件因为文件数量过多而无法显示