TypeScript/Jakefile.js

1213 lines
46 KiB
TypeScript
Raw Normal View History

2014-07-13 01:04:16 +02:00
// This file contains the build logic for the public repo
var fs = require("fs");
2014-12-02 00:32:52 +01:00
var os = require("os");
2014-07-13 01:04:16 +02:00
var path = require("path");
var child_process = require("child_process");
2016-08-11 18:53:38 +02:00
var fold = require("travis-fold");
var runTestsInParallel = require("./scripts/mocha-parallel").runTestsInParallel;
var ts = require("./lib/typescript");
2014-07-13 01:04:16 +02:00
// Variables
var compilerDirectory = "src/compiler/";
2015-02-12 04:43:10 +01:00
var serverDirectory = "src/server/";
2014-07-13 01:04:16 +02:00
var harnessDirectory = "src/harness/";
var libraryDirectory = "src/lib/";
2014-07-24 13:53:42 +02:00
var scriptsDirectory = "scripts/";
2016-07-12 02:42:52 +02:00
var unittestsDirectory = "src/harness/unittests/";
var docDirectory = "doc/";
2014-07-13 01:04:16 +02:00
var builtDirectory = "built/";
var builtLocalDirectory = "built/local/";
2015-07-27 19:07:07 +02:00
var LKGDirectory = "lib/";
2014-07-13 01:04:16 +02:00
var copyright = "CopyrightNotice.txt";
var thirdParty = "ThirdPartyNoticeText.txt";
// add node_modules to path so we don't need global modules, prefer the modules by adding them first
var nodeModulesPathPrefix = path.resolve("./node_modules/.bin/") + path.delimiter;
if (process.env.path !== undefined) {
2016-08-19 23:34:14 +02:00
process.env.path = nodeModulesPathPrefix + process.env.path;
2017-03-22 21:01:53 +01:00
}
else if (process.env.PATH !== undefined) {
2016-08-19 23:34:14 +02:00
process.env.PATH = nodeModulesPathPrefix + process.env.PATH;
}
function filesFromConfig(configPath) {
var configText = fs.readFileSync(configPath).toString();
var config = ts.parseConfigFileTextToJson(configPath, configText, /*stripComments*/ true);
if (config.error) {
throw new Error(diagnosticsToString([config.error]));
}
const configFileContent = ts.parseJsonConfigFileContent(config.config, ts.sys, path.dirname(configPath));
if (configFileContent.errors && configFileContent.errors.length) {
throw new Error(diagnosticsToString(configFileContent.errors));
}
return configFileContent.fileNames;
function diagnosticsToString(s) {
return s.map(function(e) { return ts.flattenDiagnosticMessageText(e.messageText, ts.sys.newLine); }).join(ts.sys.newLine);
}
}
function toNs(diff) {
return diff[0] * 1e9 + diff[1];
}
function mark() {
if (!fold.isTravis()) return;
var stamp = process.hrtime();
var id = Math.floor(Math.random() * 0xFFFFFFFF).toString(16);
console.log("travis_time:start:" + id + "\r");
return {
stamp: stamp,
id: id
};
}
function measure(marker) {
if (!fold.isTravis()) return;
var diff = process.hrtime(marker.stamp);
var total = [marker.stamp[0] + diff[0], marker.stamp[1] + diff[1]];
console.log("travis_time:end:" + marker.id + ":start=" + toNs(marker.stamp) + ",finish=" + toNs(total) + ",duration=" + toNs(diff) + "\r");
}
var compilerSources = filesFromConfig("./src/compiler/tsconfig.json");
var servicesSources = filesFromConfig("./src/services/tsconfig.json");
var cancellationTokenSources = filesFromConfig(path.join(serverDirectory, "cancellationToken/tsconfig.json"));
var typingsInstallerSources = filesFromConfig(path.join(serverDirectory, "typingsInstaller/tsconfig.json"));
var watchGuardSources = filesFromConfig(path.join(serverDirectory, "watchGuard/tsconfig.json"));
var serverSources = filesFromConfig(path.join(serverDirectory, "tsconfig.json"))
var languageServiceLibrarySources = filesFromConfig(path.join(serverDirectory, "tsconfig.library.json"));
2015-07-15 02:47:15 +02:00
var harnessCoreSources = [
2014-07-13 01:04:16 +02:00
"harness.ts",
"virtualFileSystem.ts",
2014-07-13 01:04:16 +02:00
"sourceMapRecorder.ts",
2014-07-29 19:37:01 +02:00
"harnessLanguageService.ts",
"fourslash.ts",
2014-07-13 01:04:16 +02:00
"runnerbase.ts",
"compilerRunner.ts",
"typeWriter.ts",
2014-07-29 19:37:01 +02:00
"fourslashRunner.ts",
2014-07-13 01:04:16 +02:00
"projectsRunner.ts",
"loggedIO.ts",
2014-07-13 01:04:16 +02:00
"rwcRunner.ts",
2014-11-17 20:01:05 +01:00
"test262Runner.ts",
2014-07-29 19:37:01 +02:00
"runner.ts"
2014-07-13 01:04:16 +02:00
].map(function (f) {
return path.join(harnessDirectory, f);
2015-07-15 02:47:15 +02:00
});
var harnessSources = harnessCoreSources.concat([
"incrementalParser.ts",
2015-05-28 19:14:18 +02:00
"jsDocParsing.ts",
2014-10-30 01:36:39 +01:00
"services/colorization.ts",
2014-10-25 01:03:59 +02:00
"services/documentRegistry.ts",
"services/preProcessFile.ts",
2015-04-01 02:30:57 +02:00
"services/patternMatcher.ts",
"session.ts",
2015-04-08 07:54:06 +02:00
"versionCache.ts",
"convertToBase64.ts",
2016-03-16 22:09:45 +01:00
"transpile.ts",
"reuseProgramStructure.ts",
"textStorage.ts",
"cachingInServerLSHost.ts",
"moduleResolution.ts",
"tsconfigParsing.ts",
"commandLineParsing.ts",
2016-07-25 23:48:41 +02:00
"configurationExtension.ts",
"convertCompilerOptionsFromJson.ts",
"convertTypeAcquisitionFromJson.ts",
"tsserverProjectSystem.ts",
"compileOnSave.ts",
"typingsInstaller.ts",
"projectErrors.ts",
"matchFiles.ts",
"initializeTSConfig.ts",
2017-01-30 22:40:42 +01:00
"printer.ts",
"textChanges.ts",
"telemetry.ts",
2017-02-07 23:36:15 +01:00
"transform.ts",
"customTransforms.ts",
2014-10-17 03:13:26 +02:00
].map(function (f) {
return path.join(unittestsDirectory, f);
2015-02-12 04:43:10 +01:00
})).concat([
"protocol.ts",
2016-06-25 02:15:36 +02:00
"utilities.ts",
"scriptVersionCache.ts",
2016-06-25 02:15:36 +02:00
"scriptInfo.ts",
"lsHost.ts",
"project.ts",
2016-08-12 20:04:43 +02:00
"typingsCache.ts",
2016-06-25 02:15:36 +02:00
"editorServices.ts",
"session.ts",
2015-02-12 04:43:10 +01:00
].map(function (f) {
return path.join(serverDirectory, f);
2014-10-17 03:13:26 +02:00
}));
2014-07-13 01:04:16 +02:00
var es2015LibrarySources = [
"es2015.core.d.ts",
"es2015.collection.d.ts",
"es2015.generator.d.ts",
"es2015.iterable.d.ts",
"es2015.promise.d.ts",
"es2015.proxy.d.ts",
"es2015.reflect.d.ts",
"es2015.symbol.d.ts",
2016-05-19 22:31:21 +02:00
"es2015.symbol.wellknown.d.ts"
2014-07-13 01:04:16 +02:00
];
2016-08-19 23:34:14 +02:00
var es2015LibrarySourceMap = es2015LibrarySources.map(function (source) {
return { target: "lib." + source, sources: ["header.d.ts", source] };
Modularize ES6 and ES7 library files Separate ES6 library feature-by-feature into smaller files Break ES6 library Remove unused ES6 Rename core to es5 Update building library files in JakeFile separate symbol into its own file separate well-known symbol into its own file remove iterable and symbol component from es6.string.d.ts remove iterable and symbol components from es6.collection.d.ts remove symbol components from es6.math.d.ts remove iterable and symbol components from es6.object.d.ts remove iterable and symbol components from es6.promise.d.ts remove iterable and symbol component from es6.reflect.d.ts remove iterable and symbol components from es6.proxy.d.ts split regexp into its own file remove unused file rename es7 array-include d.ts file Include new lib files into compilation Move symbol.iterable to symbol.wellknown Move functions/methods that use propertyKey back to its original interface Rename dome.es6 to dom.iterable Take dependency on dom.generated.d.ts Rename importcore.d.ts to importes5.d.ts Add es6.d.ts and es7.d.ts that contain /// references to their associated sub-features files Update library compilation Fix harness broken from renaming generated library files Remove intl.d.ts Remove preset lib files Use lib.full.es6.d.ts instead of lib.es6.d.ts Add intl.d.ts to es5.d.ts Remove unused RegexpConstructor interface Separate generator into its own file Update Jakefile Remove iterable-iterator dependence Use lower case for lib filename Include no-default comment Remove newline on top of the file
2016-02-06 02:00:45 +01:00
});
2016-08-19 23:34:14 +02:00
var es2016LibrarySource = ["es2016.array.include.d.ts"];
Modularize ES6 and ES7 library files Separate ES6 library feature-by-feature into smaller files Break ES6 library Remove unused ES6 Rename core to es5 Update building library files in JakeFile separate symbol into its own file separate well-known symbol into its own file remove iterable and symbol component from es6.string.d.ts remove iterable and symbol components from es6.collection.d.ts remove symbol components from es6.math.d.ts remove iterable and symbol components from es6.object.d.ts remove iterable and symbol components from es6.promise.d.ts remove iterable and symbol component from es6.reflect.d.ts remove iterable and symbol components from es6.proxy.d.ts split regexp into its own file remove unused file rename es7 array-include d.ts file Include new lib files into compilation Move symbol.iterable to symbol.wellknown Move functions/methods that use propertyKey back to its original interface Rename dome.es6 to dom.iterable Take dependency on dom.generated.d.ts Rename importcore.d.ts to importes5.d.ts Add es6.d.ts and es7.d.ts that contain /// references to their associated sub-features files Update library compilation Fix harness broken from renaming generated library files Remove intl.d.ts Remove preset lib files Use lib.full.es6.d.ts instead of lib.es6.d.ts Add intl.d.ts to es5.d.ts Remove unused RegexpConstructor interface Separate generator into its own file Update Jakefile Remove iterable-iterator dependence Use lower case for lib filename Include no-default comment Remove newline on top of the file
2016-02-06 02:00:45 +01:00
2016-05-19 22:31:21 +02:00
var es2016LibrarySourceMap = es2016LibrarySource.map(function (source) {
Modularize ES6 and ES7 library files Separate ES6 library feature-by-feature into smaller files Break ES6 library Remove unused ES6 Rename core to es5 Update building library files in JakeFile separate symbol into its own file separate well-known symbol into its own file remove iterable and symbol component from es6.string.d.ts remove iterable and symbol components from es6.collection.d.ts remove symbol components from es6.math.d.ts remove iterable and symbol components from es6.object.d.ts remove iterable and symbol components from es6.promise.d.ts remove iterable and symbol component from es6.reflect.d.ts remove iterable and symbol components from es6.proxy.d.ts split regexp into its own file remove unused file rename es7 array-include d.ts file Include new lib files into compilation Move symbol.iterable to symbol.wellknown Move functions/methods that use propertyKey back to its original interface Rename dome.es6 to dom.iterable Take dependency on dom.generated.d.ts Rename importcore.d.ts to importes5.d.ts Add es6.d.ts and es7.d.ts that contain /// references to their associated sub-features files Update library compilation Fix harness broken from renaming generated library files Remove intl.d.ts Remove preset lib files Use lib.full.es6.d.ts instead of lib.es6.d.ts Add intl.d.ts to es5.d.ts Remove unused RegexpConstructor interface Separate generator into its own file Update Jakefile Remove iterable-iterator dependence Use lower case for lib filename Include no-default comment Remove newline on top of the file
2016-02-06 02:00:45 +01:00
return { target: "lib." + source, sources: ["header.d.ts", source] };
2016-05-19 22:31:21 +02:00
});
Modularize ES6 and ES7 library files Separate ES6 library feature-by-feature into smaller files Break ES6 library Remove unused ES6 Rename core to es5 Update building library files in JakeFile separate symbol into its own file separate well-known symbol into its own file remove iterable and symbol component from es6.string.d.ts remove iterable and symbol components from es6.collection.d.ts remove symbol components from es6.math.d.ts remove iterable and symbol components from es6.object.d.ts remove iterable and symbol components from es6.promise.d.ts remove iterable and symbol component from es6.reflect.d.ts remove iterable and symbol components from es6.proxy.d.ts split regexp into its own file remove unused file rename es7 array-include d.ts file Include new lib files into compilation Move symbol.iterable to symbol.wellknown Move functions/methods that use propertyKey back to its original interface Rename dome.es6 to dom.iterable Take dependency on dom.generated.d.ts Rename importcore.d.ts to importes5.d.ts Add es6.d.ts and es7.d.ts that contain /// references to their associated sub-features files Update library compilation Fix harness broken from renaming generated library files Remove intl.d.ts Remove preset lib files Use lib.full.es6.d.ts instead of lib.es6.d.ts Add intl.d.ts to es5.d.ts Remove unused RegexpConstructor interface Separate generator into its own file Update Jakefile Remove iterable-iterator dependence Use lower case for lib filename Include no-default comment Remove newline on top of the file
2016-02-06 02:00:45 +01:00
2016-05-23 17:41:44 +02:00
var es2017LibrarySource = [
"es2017.object.d.ts",
"es2017.sharedmemory.d.ts",
2017-05-24 18:50:38 +02:00
"es2017.string.d.ts",
"es2017.intl.d.ts"
2016-05-23 17:41:44 +02:00
];
2016-05-19 22:31:21 +02:00
var es2017LibrarySourceMap = es2017LibrarySource.map(function (source) {
return { target: "lib." + source, sources: ["header.d.ts", source] };
2016-05-19 22:31:21 +02:00
});
2016-12-30 23:10:11 +01:00
var esnextLibrarySource = [
"esnext.asynciterable.d.ts"
];
var esnextLibrarySourceMap = esnextLibrarySource.map(function (source) {
return { target: "lib." + source, sources: ["header.d.ts", source] };
});
2016-05-19 22:31:21 +02:00
var hostsLibrarySources = ["dom.generated.d.ts", "webworker.importscripts.d.ts", "scripthost.d.ts"];
Modularize ES6 and ES7 library files Separate ES6 library feature-by-feature into smaller files Break ES6 library Remove unused ES6 Rename core to es5 Update building library files in JakeFile separate symbol into its own file separate well-known symbol into its own file remove iterable and symbol component from es6.string.d.ts remove iterable and symbol components from es6.collection.d.ts remove symbol components from es6.math.d.ts remove iterable and symbol components from es6.object.d.ts remove iterable and symbol components from es6.promise.d.ts remove iterable and symbol component from es6.reflect.d.ts remove iterable and symbol components from es6.proxy.d.ts split regexp into its own file remove unused file rename es7 array-include d.ts file Include new lib files into compilation Move symbol.iterable to symbol.wellknown Move functions/methods that use propertyKey back to its original interface Rename dome.es6 to dom.iterable Take dependency on dom.generated.d.ts Rename importcore.d.ts to importes5.d.ts Add es6.d.ts and es7.d.ts that contain /// references to their associated sub-features files Update library compilation Fix harness broken from renaming generated library files Remove intl.d.ts Remove preset lib files Use lib.full.es6.d.ts instead of lib.es6.d.ts Add intl.d.ts to es5.d.ts Remove unused RegexpConstructor interface Separate generator into its own file Update Jakefile Remove iterable-iterator dependence Use lower case for lib filename Include no-default comment Remove newline on top of the file
2016-02-06 02:00:45 +01:00
var librarySourceMap = [
2016-08-19 23:34:14 +02:00
// Host library
{ target: "lib.dom.d.ts", sources: ["header.d.ts", "dom.generated.d.ts"] },
{ target: "lib.dom.iterable.d.ts", sources: ["header.d.ts", "dom.iterable.d.ts"] },
{ target: "lib.webworker.d.ts", sources: ["header.d.ts", "webworker.generated.d.ts"] },
{ target: "lib.scripthost.d.ts", sources: ["header.d.ts", "scripthost.d.ts"] },
// JavaScript library
{ target: "lib.es5.d.ts", sources: ["header.d.ts", "es5.d.ts"] },
{ target: "lib.es2015.d.ts", sources: ["header.d.ts", "es2015.d.ts"] },
{ target: "lib.es2016.d.ts", sources: ["header.d.ts", "es2016.d.ts"] },
{ target: "lib.es2017.d.ts", sources: ["header.d.ts", "es2017.d.ts"] },
2016-12-30 23:10:11 +01:00
{ target: "lib.esnext.d.ts", sources: ["header.d.ts", "esnext.d.ts"] },
2016-08-19 23:34:14 +02:00
// JavaScript + all host library
{ target: "lib.d.ts", sources: ["header.d.ts", "es5.d.ts"].concat(hostsLibrarySources) },
2017-04-05 22:48:35 +02:00
{ target: "lib.es6.d.ts", sources: ["header.d.ts", "es5.d.ts"].concat(es2015LibrarySources, hostsLibrarySources, "dom.iterable.d.ts") },
{ target: "lib.es2016.full.d.ts", sources: ["header.d.ts", "es2016.d.ts"].concat(hostsLibrarySources, "dom.iterable.d.ts") },
{ target: "lib.es2017.full.d.ts", sources: ["header.d.ts", "es2017.d.ts"].concat(hostsLibrarySources, "dom.iterable.d.ts") },
{ target: "lib.esnext.full.d.ts", sources: ["header.d.ts", "esnext.d.ts"].concat(hostsLibrarySources, "dom.iterable.d.ts") },
2016-12-30 23:10:11 +01:00
].concat(es2015LibrarySourceMap, es2016LibrarySourceMap, es2017LibrarySourceMap, esnextLibrarySourceMap);
Modularize ES6 and ES7 library files Separate ES6 library feature-by-feature into smaller files Break ES6 library Remove unused ES6 Rename core to es5 Update building library files in JakeFile separate symbol into its own file separate well-known symbol into its own file remove iterable and symbol component from es6.string.d.ts remove iterable and symbol components from es6.collection.d.ts remove symbol components from es6.math.d.ts remove iterable and symbol components from es6.object.d.ts remove iterable and symbol components from es6.promise.d.ts remove iterable and symbol component from es6.reflect.d.ts remove iterable and symbol components from es6.proxy.d.ts split regexp into its own file remove unused file rename es7 array-include d.ts file Include new lib files into compilation Move symbol.iterable to symbol.wellknown Move functions/methods that use propertyKey back to its original interface Rename dome.es6 to dom.iterable Take dependency on dom.generated.d.ts Rename importcore.d.ts to importes5.d.ts Add es6.d.ts and es7.d.ts that contain /// references to their associated sub-features files Update library compilation Fix harness broken from renaming generated library files Remove intl.d.ts Remove preset lib files Use lib.full.es6.d.ts instead of lib.es6.d.ts Add intl.d.ts to es5.d.ts Remove unused RegexpConstructor interface Separate generator into its own file Update Jakefile Remove iterable-iterator dependence Use lower case for lib filename Include no-default comment Remove newline on top of the file
2016-02-06 02:00:45 +01:00
2014-07-13 01:04:16 +02:00
var libraryTargets = librarySourceMap.map(function (f) {
return path.join(builtLocalDirectory, f.target);
});
// Prepends the contents of prefixFile to destinationFile
function prependFile(prefixFile, destinationFile) {
if (!fs.existsSync(prefixFile)) {
fail(prefixFile + " does not exist!");
}
if (!fs.existsSync(destinationFile)) {
fail(destinationFile + " failed to be created!");
}
var temp = "temptemp";
2016-08-19 23:34:14 +02:00
jake.cpR(prefixFile, temp, { silent: true });
2014-07-13 01:04:16 +02:00
fs.appendFileSync(temp, fs.readFileSync(destinationFile));
fs.renameSync(temp, destinationFile);
}
// concatenate a list of sourceFiles to a destinationFile
function concatenateFiles(destinationFile, sourceFiles) {
var temp = "temptemp";
// append all files in sequence
var text = "";
for (var i = 0; i < sourceFiles.length; i++) {
2014-07-13 01:04:16 +02:00
if (!fs.existsSync(sourceFiles[i])) {
2016-08-19 23:34:14 +02:00
fail(sourceFiles[i] + " does not exist!");
2014-07-13 01:04:16 +02:00
}
if (i > 0) { text += "\n\n"; }
text += fs.readFileSync(sourceFiles[i]).toString().replace(/\r?\n/g, "\n");
2014-07-13 01:04:16 +02:00
}
fs.writeFileSync(temp, text);
2014-07-13 01:04:16 +02:00
// Move the file to the final destination
fs.renameSync(temp, destinationFile);
}
var useDebugMode = true;
2016-05-19 22:31:21 +02:00
var host = process.env.TYPESCRIPT_HOST || process.env.host || "node";
var compilerFilename = "tsc.js";
2015-09-18 22:13:26 +02:00
var LKGCompiler = path.join(LKGDirectory, compilerFilename);
var builtLocalCompiler = path.join(builtLocalDirectory, compilerFilename);
/* Compiles a file from a list of sources
2014-07-13 01:04:16 +02:00
* @param outFile: the target file name
* @param sources: an array of the names of the source files
* @param prereqs: prerequisite tasks to compiling the file
* @param prefixes: a list of files to prepend to the target file
* @param useBuiltCompiler: true to use the built compiler, false to use the LKG
2016-02-10 09:20:40 +01:00
* @parap {Object} opts - property bag containing auxiliary options
* @param {boolean} opts.noOutFile: true to compile without using --out
* @param {boolean} opts.generateDeclarations: true to compile using --declaration
* @param {string} opts.outDir: value for '--outDir' command line option
* @param {boolean} opts.keepComments: false to compile using --removeComments
* @param {boolean} opts.preserveConstEnums: true if compiler should keep const enums in code
* @param {boolean} opts.noResolve: true if compiler should not include non-rooted files in compilation
* @param {boolean} opts.stripInternal: true if compiler should remove declarations marked as @internal
* @param {boolean} opts.noMapRoot: true if compiler omit mapRoot option
* @param {boolean} opts.inlineSourceMap: true if compiler should inline sourceMap
2016-07-12 01:00:16 +02:00
* @param {Array} opts.types: array of types to include in compilation
* @param callback: a function to execute after the compilation process ends
2014-07-13 01:04:16 +02:00
*/
2016-02-10 09:20:40 +01:00
function compileFile(outFile, sources, prereqs, prefixes, useBuiltCompiler, opts, callback) {
2014-07-13 01:04:16 +02:00
file(outFile, prereqs, function() {
if (process.env.USE_TRANSFORMS === "false") {
useBuiltCompiler = false;
}
var startCompileTime = mark();
2016-02-10 09:20:40 +01:00
opts = opts || {};
2016-07-12 01:00:16 +02:00
var compilerPath = useBuiltCompiler ? builtLocalCompiler : LKGCompiler;
2016-08-19 23:34:14 +02:00
var options = "--noImplicitAny --noImplicitThis --noEmitOnError --types "
2016-07-12 01:00:16 +02:00
if (opts.types) {
options += opts.types.join(",");
}
options += " --pretty";
2015-04-01 03:00:02 +02:00
// Keep comments when specifically requested
// or when in debug mode.
2016-02-10 09:20:40 +01:00
if (!(opts.keepComments || useDebugMode)) {
2015-04-01 03:00:02 +02:00
options += " --removeComments";
}
2016-02-10 09:20:40 +01:00
if (opts.generateDeclarations) {
options += " --declaration";
}
2016-02-10 09:20:40 +01:00
if (opts.preserveConstEnums || useDebugMode) {
options += " --preserveConstEnums";
}
2016-02-10 09:20:40 +01:00
if (opts.outDir) {
options += " --outDir " + opts.outDir;
}
2016-02-10 09:20:40 +01:00
if (!opts.noOutFile) {
options += " --out " + outFile;
2015-10-21 00:14:18 +02:00
}
else {
2016-05-19 22:31:21 +02:00
options += " --module commonjs";
}
2016-08-19 23:34:14 +02:00
if (opts.noResolve) {
options += " --noResolve";
2014-07-13 01:04:16 +02:00
}
2014-08-04 21:06:50 +02:00
2014-07-13 01:04:16 +02:00
if (useDebugMode) {
if (opts.inlineSourceMap) {
options += " --inlineSourceMap --inlineSources";
2017-03-22 21:01:53 +01:00
}
else {
options += " -sourcemap";
if (!opts.noMapRoot) {
options += " -mapRoot file:///" + path.resolve(path.dirname(outFile));
}
}
2017-03-22 21:01:53 +01:00
}
else {
options += " --newLine LF";
2014-07-13 01:04:16 +02:00
}
2016-02-10 09:20:40 +01:00
if (opts.stripInternal) {
2016-05-19 22:31:21 +02:00
options += " --stripInternal";
}
options += " --target es5";
if (opts.lib) {
options += " --lib " + opts.lib
}
else {
options += " --lib es5"
}
options += " --noUnusedLocals --noUnusedParameters";
2016-10-18 16:34:48 +02:00
2015-09-18 22:13:26 +02:00
var cmd = host + " " + compilerPath + " " + options + " ";
cmd = cmd + sources.join(" ");
console.log(cmd + "\n");
var ex = jake.createExec([cmd]);
// Add listeners for output and error
2016-08-19 23:34:14 +02:00
ex.addListener("stdout", function (output) {
process.stdout.write(output);
});
2016-08-19 23:34:14 +02:00
ex.addListener("stderr", function (error) {
process.stderr.write(error);
});
2016-08-19 23:34:14 +02:00
ex.addListener("cmdEnd", function () {
2014-07-13 01:04:16 +02:00
if (!useDebugMode && prefixes && fs.existsSync(outFile)) {
for (var i in prefixes) {
prependFile(prefixes[i], outFile);
}
}
2014-12-02 00:32:52 +01:00
if (callback) {
callback();
}
measure(startCompileTime);
complete();
});
2016-08-19 23:34:14 +02:00
ex.addListener("error", function () {
2014-07-13 01:04:16 +02:00
fs.unlinkSync(outFile);
fail("Compilation of " + outFile + " unsuccessful");
measure(startCompileTime);
2014-07-13 01:04:16 +02:00
});
ex.run();
2016-08-19 23:34:14 +02:00
}, { async: true });
2014-07-13 01:04:16 +02:00
}
// Prerequisite task for built directory and library typings
directory(builtLocalDirectory);
for (var i in libraryTargets) {
(function (i) {
var entry = librarySourceMap[i];
var target = libraryTargets[i];
var sources = [copyright].concat(entry.sources.map(function (s) {
return path.join(libraryDirectory, s);
}));
2016-08-19 23:34:14 +02:00
file(target, [builtLocalDirectory].concat(sources), function () {
2014-07-13 01:04:16 +02:00
concatenateFiles(target, sources);
});
})(i);
}
// Lib target to build the library files
desc("Builds the library targets");
task("lib", libraryTargets);
// Generate diagnostics
var processDiagnosticMessagesJs = path.join(scriptsDirectory, "processDiagnosticMessages.js");
var processDiagnosticMessagesTs = path.join(scriptsDirectory, "processDiagnosticMessages.ts");
var diagnosticMessagesJson = path.join(compilerDirectory, "diagnosticMessages.json");
var diagnosticInfoMapTs = path.join(compilerDirectory, "diagnosticInformationMap.generated.ts");
var generatedDiagnosticMessagesJSON = path.join(compilerDirectory, "diagnosticMessages.generated.json");
var builtGeneratedDiagnosticMessagesJSON = path.join(builtLocalDirectory, "diagnosticMessages.generated.json");
2014-07-13 01:04:16 +02:00
file(processDiagnosticMessagesTs);
2014-07-13 01:04:16 +02:00
// processDiagnosticMessages script
compileFile(processDiagnosticMessagesJs,
2016-08-19 23:34:14 +02:00
[processDiagnosticMessagesTs],
[processDiagnosticMessagesTs],
[],
2014-12-02 00:32:52 +01:00
/*useBuiltCompiler*/ false);
2014-07-13 01:04:16 +02:00
var buildProtocolTs = path.join(scriptsDirectory, "buildProtocol.ts");
var buildProtocolJs = path.join(scriptsDirectory, "buildProtocol.js");
var buildProtocolDts = path.join(builtLocalDirectory, "protocol.d.ts");
var typescriptServicesDts = path.join(builtLocalDirectory, "typescriptServices.d.ts");
file(buildProtocolTs);
compileFile(buildProtocolJs,
[buildProtocolTs],
[buildProtocolTs],
[],
/*useBuiltCompiler*/ false,
2017-03-09 08:10:14 +01:00
{ noOutFile: true, lib: "es6" });
file(buildProtocolDts, [buildProtocolTs, buildProtocolJs, typescriptServicesDts], function() {
var protocolTs = path.join(serverDirectory, "protocol.ts");
var cmd = host + " " + buildProtocolJs + " "+ protocolTs + " " + typescriptServicesDts + " " + buildProtocolDts;
console.log(cmd);
var ex = jake.createExec([cmd]);
// Add listeners for output and error
ex.addListener("stdout", function (output) {
process.stdout.write(output);
});
ex.addListener("stderr", function (error) {
process.stderr.write(error);
});
ex.addListener("cmdEnd", function () {
complete();
});
ex.run();
}, { async: true })
2014-07-13 01:04:16 +02:00
// The generated diagnostics map; built for the compiler and for the 'generate-diagnostics' task
file(diagnosticInfoMapTs, [processDiagnosticMessagesJs, diagnosticMessagesJson], function () {
2016-08-19 23:34:14 +02:00
var cmd = host + " " + processDiagnosticMessagesJs + " " + diagnosticMessagesJson;
console.log(cmd);
var ex = jake.createExec([cmd]);
// Add listeners for output and error
2016-08-19 23:34:14 +02:00
ex.addListener("stdout", function (output) {
process.stdout.write(output);
});
2016-08-19 23:34:14 +02:00
ex.addListener("stderr", function (error) {
process.stderr.write(error);
});
2016-08-19 23:34:14 +02:00
ex.addListener("cmdEnd", function () {
complete();
});
ex.run();
2016-08-19 23:34:14 +02:00
}, { async: true });
2014-07-13 01:04:16 +02:00
2016-08-19 23:34:14 +02:00
file(builtGeneratedDiagnosticMessagesJSON, [generatedDiagnosticMessagesJSON], function () {
2015-10-27 22:16:05 +01:00
if (fs.existsSync(builtLocalDirectory)) {
jake.cpR(generatedDiagnosticMessagesJSON, builtGeneratedDiagnosticMessagesJSON);
}
});
2015-10-27 22:16:05 +01:00
2014-07-13 01:04:16 +02:00
desc("Generates a diagnostic file in TypeScript based on an input JSON file");
2015-07-30 17:00:29 +02:00
task("generate-diagnostics", [diagnosticInfoMapTs]);
2014-07-13 01:04:16 +02:00
// Publish nightly
var configureNightlyJs = path.join(scriptsDirectory, "configureNightly.js");
var configureNightlyTs = path.join(scriptsDirectory, "configureNightly.ts");
var packageJson = "package.json";
var versionFile = path.join(compilerDirectory, "core.ts");
file(configureNightlyTs);
compileFile(/*outfile*/configureNightlyJs,
2016-08-19 23:34:14 +02:00
/*sources*/[configureNightlyTs],
/*prereqs*/[configureNightlyTs],
/*prefixes*/[],
/*useBuiltCompiler*/ false,
2016-08-19 23:34:14 +02:00
{ noOutFile: false, generateDeclarations: false, keepComments: false, noResolve: false, stripInternal: false });
2016-08-19 23:34:14 +02:00
task("setDebugMode", function () {
useDebugMode = true;
});
2016-08-19 23:34:14 +02:00
task("configure-nightly", [configureNightlyJs], function () {
var cmd = host + " " + configureNightlyJs + " " + packageJson + " " + versionFile;
console.log(cmd);
exec(cmd);
}, { async: true });
desc("Configure, build, test, and publish the nightly release.");
task("publish-nightly", ["configure-nightly", "LKG", "clean", "setDebugMode", "runtests"], function () {
var cmd = "npm publish --tag next";
console.log(cmd);
exec(cmd);
});
var importDefinitelyTypedTestsDirectory = path.join(scriptsDirectory, "importDefinitelyTypedTests");
var importDefinitelyTypedTestsJs = path.join(importDefinitelyTypedTestsDirectory, "importDefinitelyTypedTests.js");
var importDefinitelyTypedTestsTs = path.join(importDefinitelyTypedTestsDirectory, "importDefinitelyTypedTests.ts");
2015-09-18 22:13:26 +02:00
file(importDefinitelyTypedTestsTs);
file(importDefinitelyTypedTestsJs, ["tsd-scripts", importDefinitelyTypedTestsTs], function () {
var cmd = host + " " + LKGCompiler + " -p " + importDefinitelyTypedTestsDirectory;
console.log(cmd);
exec(cmd);
2015-09-18 22:13:26 +02:00
}, { async: true });
task("importDefinitelyTypedTests", [importDefinitelyTypedTestsJs], function () {
var cmd = host + " " + importDefinitelyTypedTestsJs + " ./ ../DefinitelyTyped";
console.log(cmd);
exec(cmd);
}, { async: true });
2014-07-13 01:04:16 +02:00
// Local target to build the compiler and services
var tscFile = path.join(builtLocalDirectory, compilerFilename);
compileFile(tscFile, compilerSources, [builtLocalDirectory, copyright].concat(compilerSources), [copyright], /*useBuiltCompiler:*/ false, { noMapRoot: true });
2014-07-13 01:04:16 +02:00
2014-08-07 08:21:53 +02:00
var servicesFile = path.join(builtLocalDirectory, "typescriptServices.js");
var servicesFileInBrowserTest = path.join(builtLocalDirectory, "typescriptServicesInBrowserTest.js");
var standaloneDefinitionsFile = path.join(builtLocalDirectory, "typescriptServices.d.ts");
var nodePackageFile = path.join(builtLocalDirectory, "typescript.js");
var nodeDefinitionsFile = path.join(builtLocalDirectory, "typescript.d.ts");
var nodeStandaloneDefinitionsFile = path.join(builtLocalDirectory, "typescript_standalone.d.ts");
2016-08-19 23:34:14 +02:00
compileFile(servicesFile, servicesSources, [builtLocalDirectory, copyright].concat(servicesSources),
/*prefixes*/[copyright],
/*useBuiltCompiler*/ true,
2016-08-19 23:34:14 +02:00
/*opts*/ {
noOutFile: false,
generateDeclarations: true,
preserveConstEnums: true,
keepComments: true,
noResolve: false,
stripInternal: true
},
/*callback*/ function () {
2016-08-19 23:34:14 +02:00
jake.cpR(servicesFile, nodePackageFile, { silent: true });
2014-12-02 00:32:52 +01:00
2016-08-19 23:34:14 +02:00
prependFile(copyright, standaloneDefinitionsFile);
2016-08-19 23:34:14 +02:00
// Stanalone/web definition file using global 'ts' namespace
jake.cpR(standaloneDefinitionsFile, nodeDefinitionsFile, { silent: true });
var definitionFileContents = fs.readFileSync(nodeDefinitionsFile).toString();
definitionFileContents = definitionFileContents.replace(/^(\s*)(export )?const enum (\S+) {(\s*)$/gm, '$1$2enum $3 {$4');
fs.writeFileSync(standaloneDefinitionsFile, definitionFileContents);
2016-08-19 23:34:14 +02:00
// Official node package definition file, pointed to by 'typings' in package.json
// Created by appending 'export = ts;' at the end of the standalone file to turn it into an external module
var nodeDefinitionsFileContents = definitionFileContents + "\r\nexport = ts;";
fs.writeFileSync(nodeDefinitionsFile, nodeDefinitionsFileContents);
2016-08-19 23:34:14 +02:00
// Node package definition file to be distributed without the package. Created by replacing
// 'ts' namespace with '"typescript"' as a module.
var nodeStandaloneDefinitionsFileContents = definitionFileContents.replace(/declare (namespace|module) ts/g, 'declare module "typescript"');
fs.writeFileSync(nodeStandaloneDefinitionsFile, nodeStandaloneDefinitionsFileContents);
});
compileFile(
servicesFileInBrowserTest,
servicesSources,
[builtLocalDirectory, copyright].concat(servicesSources),
2016-08-19 23:34:14 +02:00
/*prefixes*/[copyright],
/*useBuiltCompiler*/ true,
2016-08-19 23:34:14 +02:00
{
noOutFile: false,
generateDeclarations: true,
preserveConstEnums: true,
keepComments: true,
noResolve: false,
stripInternal: true,
noMapRoot: true,
inlineSourceMap: true
});
2014-07-13 01:04:16 +02:00
file(typescriptServicesDts, [servicesFile]);
2016-06-15 02:30:55 +02:00
var cancellationTokenFile = path.join(builtLocalDirectory, "cancellationToken.js");
compileFile(cancellationTokenFile, cancellationTokenSources, [builtLocalDirectory].concat(cancellationTokenSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true, { types: ["node"], outDir: builtLocalDirectory, noOutFile: true, lib: "es6" });
2016-06-15 02:30:55 +02:00
var typingsInstallerFile = path.join(builtLocalDirectory, "typingsInstaller.js");
compileFile(typingsInstallerFile, typingsInstallerSources, [builtLocalDirectory].concat(typingsInstallerSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true, { types: ["node"], outDir: builtLocalDirectory, noOutFile: false, lib: "es6" });
var watchGuardFile = path.join(builtLocalDirectory, "watchGuard.js");
compileFile(watchGuardFile, watchGuardSources, [builtLocalDirectory].concat(watchGuardSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true, { types: ["node"], outDir: builtLocalDirectory, noOutFile: false, lib: "es6" });
2015-02-16 03:52:17 +01:00
var serverFile = path.join(builtLocalDirectory, "tsserver.js");
compileFile(serverFile, serverSources, [builtLocalDirectory, copyright, cancellationTokenFile, typingsInstallerFile, watchGuardFile].concat(serverSources).concat(servicesSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true, { types: ["node"], preserveConstEnums: true, lib: "es6" });
2016-05-19 22:32:27 +02:00
var tsserverLibraryFile = path.join(builtLocalDirectory, "tsserverlibrary.js");
2016-05-21 21:36:06 +02:00
var tsserverLibraryDefinitionFile = path.join(builtLocalDirectory, "tsserverlibrary.d.ts");
compileFile(
2016-05-19 22:31:21 +02:00
tsserverLibraryFile,
languageServiceLibrarySources,
2016-08-05 23:16:29 +02:00
[builtLocalDirectory, copyright, builtLocalCompiler].concat(languageServiceLibrarySources).concat(libraryTargets),
2016-08-19 23:34:14 +02:00
/*prefixes*/[copyright],
/*useBuiltCompiler*/ true,
2017-02-15 23:41:34 +01:00
{ noOutFile: false, generateDeclarations: true, stripInternal: true, preserveConstEnums: true },
/*callback*/ function () {
prependFile(copyright, tsserverLibraryDefinitionFile);
// Appending exports at the end of the server library
var tsserverLibraryDefinitionFileContents =
2017-01-12 23:01:04 +01:00
fs.readFileSync(tsserverLibraryDefinitionFile).toString() +
"\r\nexport = ts;" +
"\r\nexport as namespace ts;";
fs.writeFileSync(tsserverLibraryDefinitionFile, tsserverLibraryDefinitionFileContents);
});
// Local target to build the language service server library
desc("Builds language service server library");
2016-05-21 21:36:06 +02:00
task("lssl", [tsserverLibraryFile, tsserverLibraryDefinitionFile]);
2016-08-11 18:53:38 +02:00
desc("Emit the start of the build fold");
2016-08-19 23:34:14 +02:00
task("build-fold-start", [], function () {
2016-08-11 18:53:38 +02:00
if (fold.isTravis()) console.log(fold.start("build"));
});
desc("Emit the end of the build fold");
2016-08-19 23:34:14 +02:00
task("build-fold-end", [], function () {
2016-08-11 18:53:38 +02:00
if (fold.isTravis()) console.log(fold.end("build"));
});
2014-07-13 01:04:16 +02:00
// Local target to build the compiler and services
desc("Builds the full compiler and services");
task("local", ["build-fold-start", "generate-diagnostics", "lib", tscFile, servicesFile, nodeDefinitionsFile, serverFile, buildProtocolDts, builtGeneratedDiagnosticMessagesJSON, "lssl", "build-fold-end"]);
2014-07-13 01:04:16 +02:00
// Local target to build only tsc.js
desc("Builds only the compiler");
task("tsc", ["generate-diagnostics", "lib", tscFile]);
2014-07-13 01:04:16 +02:00
// Local target to build the compiler and services
desc("Sets release mode flag");
2016-08-19 23:34:14 +02:00
task("release", function () {
useDebugMode = false;
2014-07-13 01:04:16 +02:00
});
// Set the default task to "local"
task("default", ["local"]);
// Cleans the built directory
desc("Cleans the compiler output, declare files, and tests");
2016-08-19 23:34:14 +02:00
task("clean", function () {
2014-07-13 01:04:16 +02:00
jake.rmRf(builtDirectory);
});
// Generate Markdown spec
var word2mdJs = path.join(scriptsDirectory, "word2md.js");
var word2mdTs = path.join(scriptsDirectory, "word2md.ts");
var specWord = path.join(docDirectory, "TypeScript Language Specification.docx");
var specMd = path.join(docDirectory, "spec.md");
file(word2mdTs);
// word2md script
compileFile(word2mdJs,
2016-08-19 23:34:14 +02:00
[word2mdTs],
[word2mdTs],
[],
2014-12-02 00:32:52 +01:00
/*useBuiltCompiler*/ false);
// The generated spec.md; built for the 'generate-spec' task
file(specMd, [word2mdJs, specWord], function () {
var specWordFullPath = path.resolve(specWord);
var specMDFullPath = path.resolve(specMd);
var cmd = "cscript //nologo " + word2mdJs + ' "' + specWordFullPath + '" ' + '"' + specMDFullPath + '"';
console.log(cmd);
child_process.exec(cmd, function () {
complete();
});
2016-08-19 23:34:14 +02:00
}, { async: true });
desc("Generates a Markdown version of the Language Specification");
2015-07-30 17:00:29 +02:00
task("generate-spec", [specMd]);
2014-07-13 01:04:16 +02:00
// Makes a new LKG. This target does not build anything, but errors if not all the outputs are present in the built/local directory
desc("Makes a new LKG out of the built js files");
2016-08-19 23:34:14 +02:00
task("LKG", ["clean", "release", "local"].concat(libraryTargets), function () {
var expectedFiles = [tscFile, servicesFile, serverFile, nodePackageFile, nodeDefinitionsFile, standaloneDefinitionsFile, tsserverLibraryFile, tsserverLibraryDefinitionFile, cancellationTokenFile, typingsInstallerFile, buildProtocolDts, watchGuardFile].concat(libraryTargets);
2014-07-13 01:04:16 +02:00
var missingFiles = expectedFiles.filter(function (f) {
return !fs.existsSync(f);
});
if (missingFiles.length > 0) {
fail("Cannot replace the LKG unless all built targets are present in directory " + builtLocalDirectory +
2016-08-19 23:34:14 +02:00
". The following files are missing:\n" + missingFiles.join("\n"));
2014-07-13 01:04:16 +02:00
}
// Copy all the targets into the LKG directory
jake.mkdirP(LKGDirectory);
for (i in expectedFiles) {
jake.cpR(expectedFiles[i], LKGDirectory);
}
//var resourceDirectories = fs.readdirSync(builtLocalResourcesDirectory).map(function(p) { return path.join(builtLocalResourcesDirectory, p); });
//resourceDirectories.map(function(d) {
// jake.cpR(d, LKGResourcesDirectory);
//});
});
// Test directory
directory(builtLocalDirectory);
// Task to build the tests infrastructure using the built compiler
var run = path.join(builtLocalDirectory, "run.js");
compileFile(
/*outFile*/ run,
/*source*/ harnessSources,
2016-08-19 23:34:14 +02:00
/*prereqs*/[builtLocalDirectory, tscFile].concat(libraryTargets).concat(servicesSources).concat(harnessSources),
/*prefixes*/[],
/*useBuiltCompiler:*/ true,
/*opts*/ { inlineSourceMap: true, types: ["node", "mocha", "chai"], lib: "es6" });
2014-07-13 01:04:16 +02:00
2016-05-19 22:31:21 +02:00
var internalTests = "internal/";
2014-07-13 01:04:16 +02:00
var localBaseline = "tests/baselines/local/";
var refBaseline = "tests/baselines/reference/";
2015-02-02 21:52:26 +01:00
var localRwcBaseline = path.join(internalTests, "baselines/rwc/local");
var refRwcBaseline = path.join(internalTests, "baselines/rwc/reference");
2014-07-13 01:04:16 +02:00
2015-02-02 21:52:26 +01:00
var localTest262Baseline = path.join(internalTests, "baselines/test262/local");
var refTest262Baseline = path.join(internalTests, "baselines/test262/reference");
2014-11-17 20:01:05 +01:00
2014-07-13 01:04:16 +02:00
desc("Builds the test infrastructure using the built compiler");
task("tests", ["local", run].concat(libraryTargets));
function exec(cmd, completeHandler, errorHandler) {
2016-08-19 23:34:14 +02:00
var ex = jake.createExec([cmd], { windowsVerbatimArguments: true });
// Add listeners for output and error
2016-08-19 23:34:14 +02:00
ex.addListener("stdout", function (output) {
process.stdout.write(output);
});
2016-08-19 23:34:14 +02:00
ex.addListener("stderr", function (error) {
process.stderr.write(error);
});
2016-08-19 23:34:14 +02:00
ex.addListener("cmdEnd", function () {
if (completeHandler) {
completeHandler();
}
complete();
2014-07-13 01:04:16 +02:00
});
2016-08-19 23:34:14 +02:00
ex.addListener("error", function (e, status) {
if (errorHandler) {
errorHandler(e, status);
2017-03-22 21:01:53 +01:00
}
else {
fail("Process exited with code " + status);
}
});
ex.run();
2014-07-13 01:04:16 +02:00
}
function cleanTestDirs() {
// Clean the local baselines directory
if (fs.existsSync(localBaseline)) {
jake.rmRf(localBaseline);
}
// Clean the local Rwc baselines directory
2014-07-13 01:04:16 +02:00
if (fs.existsSync(localRwcBaseline)) {
jake.rmRf(localRwcBaseline);
}
jake.mkdirP(localRwcBaseline);
jake.mkdirP(localTest262Baseline);
2014-07-13 01:04:16 +02:00
jake.mkdirP(localBaseline);
}
// used to pass data from jake command line directly to run.js
function writeTestConfigFile(tests, light, taskConfigsFolder, workerCount, stackTraceLimit) {
var testConfigContents = JSON.stringify({
test: tests ? [tests] : undefined,
light: light,
workerCount: workerCount,
taskConfigsFolder: taskConfigsFolder,
stackTraceLimit: stackTraceLimit
});
2014-09-18 20:49:40 +02:00
fs.writeFileSync('test.config', testConfigContents);
2014-07-13 01:04:16 +02:00
}
function deleteTemporaryProjectOutput() {
2015-02-02 21:52:26 +01:00
if (fs.existsSync(path.join(localBaseline, "projectOutput/"))) {
jake.rmRf(path.join(localBaseline, "projectOutput/"));
}
}
function runConsoleTests(defaultReporter, runInParallel) {
var dirty = process.env.dirty;
2016-04-13 03:40:39 +02:00
if (!dirty) {
cleanTestDirs();
}
var debug = process.env.debug || process.env.d;
2017-02-07 23:36:15 +01:00
var inspect = process.env.inspect;
tests = process.env.test || process.env.tests || process.env.t;
var light = process.env.light || false;
var stackTraceLimit = process.env.stackTraceLimit;
2014-07-13 01:04:16 +02:00
var testConfigFile = 'test.config';
2016-08-19 23:34:14 +02:00
if (fs.existsSync(testConfigFile)) {
2014-07-13 01:04:16 +02:00
fs.unlinkSync(testConfigFile);
}
var workerCount, taskConfigsFolder;
if (runInParallel) {
// generate name to store task configuration files
var prefix = os.tmpdir() + "/ts-tests";
var i = 1;
do {
taskConfigsFolder = prefix + i;
i++;
} while (fs.existsSync(taskConfigsFolder));
fs.mkdirSync(taskConfigsFolder);
workerCount = process.env.workerCount || os.cpus().length;
}
2014-09-03 19:37:32 +02:00
if (tests || light || taskConfigsFolder) {
2016-06-01 03:43:51 +02:00
writeTestConfigFile(tests, light, taskConfigsFolder, workerCount, stackTraceLimit);
2014-07-13 01:04:16 +02:00
}
2014-09-03 19:37:32 +02:00
if (tests && tests.toLocaleLowerCase() === "rwc") {
2016-11-22 02:25:38 +01:00
testTimeout = 800000;
2014-09-03 19:37:32 +02:00
}
2017-02-07 23:36:15 +01:00
var colors = process.env.colors || process.env.color || true;
var reporter = process.env.reporter || process.env.r || defaultReporter;
var bail = process.env.bail || process.env.b;
var lintFlag = process.env.lint !== 'false';
// timeout normally isn't necessary but Travis-CI has been timing out on compiler baselines occasionally
// default timeout is 2sec which really should be enough, but maybe we just need a small amount longer
2016-08-19 23:34:14 +02:00
if (!runInParallel) {
var startTime = mark();
2017-02-07 23:36:15 +01:00
var args = [];
if (inspect) {
args.push("--inspect");
}
if (inspect || debug) {
args.push("--debug-brk");
}
args.push("-R", reporter);
if (tests) {
args.push("-g", `"${tests}"`);
}
if (colors) {
args.push("--colors");
}
else {
args.push("--no-colors");
}
if (bail) {
args.push("--bail");
}
args.push("-t", testTimeout);
args.push(run);
var cmd = "mocha " + args.join(" ");
2015-10-24 01:27:44 +02:00
console.log(cmd);
var savedNodeEnv = process.env.NODE_ENV;
process.env.NODE_ENV = "development";
exec(cmd, function () {
process.env.NODE_ENV = savedNodeEnv;
measure(startTime);
runLinter();
finish();
2016-08-19 23:34:14 +02:00
}, function (e, status) {
process.env.NODE_ENV = savedNodeEnv;
measure(startTime);
finish(status);
});
2016-06-06 20:37:59 +02:00
}
else {
var savedNodeEnv = process.env.NODE_ENV;
process.env.NODE_ENV = "development";
var startTime = mark();
2017-02-07 23:36:15 +01:00
runTestsInParallel(taskConfigsFolder, run, { testTimeout: testTimeout, noColors: !colors }, function (err) {
process.env.NODE_ENV = savedNodeEnv;
measure(startTime);
// last worker clean everything and runs linter in case if there were no errors
deleteTemporaryProjectOutput();
jake.rmRf(taskConfigsFolder);
if (err) {
fail(err);
}
else {
runLinter();
complete();
}
});
}
2016-06-06 20:37:59 +02:00
function failWithStatus(status) {
fail("Process exited with code " + status);
}
2016-06-06 20:37:59 +02:00
function finish(errorStatus) {
deleteTemporaryProjectOutput();
if (errorStatus !== undefined) {
failWithStatus(errorStatus);
}
else {
complete();
}
}
function runLinter() {
2016-06-01 03:43:51 +02:00
if (!lintFlag || dirty) {
return;
}
var lint = jake.Task['lint'];
lint.addListener('complete', function () {
complete();
});
lint.invoke();
}
}
var testTimeout = 20000;
desc("Runs all the tests in parallel using the built run.js file. Optional arguments are: t[ests]=category1|category2|... d[ebug]=true.");
2016-08-19 23:34:14 +02:00
task("runtests-parallel", ["build-rules", "tests", builtLocalDirectory], function () {
runConsoleTests('min', /*runInParallel*/ true);
2016-08-19 23:34:14 +02:00
}, { async: true });
2015-10-24 01:27:44 +02:00
[Transforms] Merge master 06/14/2016 (#9169) * Remove check narrowing only certain types, add test showing issues with this * string literal case test * Reconcile fix with CFA work * Defaultable -> NotNarrowable to align with use * Missed a defaultable in comments * Add test for narrowing to unions of string literals * Rewrite isInStringLiteral to accomodate for unterminated strings * Refactor signatureHelp to expose helper functions * Add support for completion in string literals * Remove unused check * Use const instead of let * Fix error * Formatting changes * Use shorthand properties * Add failing test for #8738 * Sort baseline reference identifier by name * Detects assignment to internal module export clause, fixes #8738 * add SharedArrayBuffer fix * Factor out assignment op check * Add test for composite assignment * Factor out the behaviour and handles x++ and ++x * Handles ES3 default as identifier name * Fix missing else statement * isNameOfExportedDeclarationInNonES6Module * Reorder options alphabetically * Mark diagnostics, and skipDefaultLibCheck as internal * Allow an import of "foo.js" to be matched by a file "foo.ts" * Improve loadModuleFromFile code * Respond to PR comments * Respond to more PR comments * Fix test * Actually merge from master * Revert to old tryLoad implementation * Run fixupParentReferences when parsing isolated jsDocComment * initial revision of unit test support for project system in tsserver * Allow wildcard ("*") patterns in ambient module declarations * Add non-widening forms of null and undefined * Create separate control flows for property declarations with initializers * Add regression test * Allow trailing commas in function parameter and argument lists * Add tests * Remove unused variable * Add null check and CR feedback * Support shorthand ambient module declarations * Revert "Merge pull request #7235 from weswigham/narrow-all-types" This reverts commit ef0f6c8fe4f94a7e294cfe42d7025c9dca6535d5, reversing changes made to 9f087cb62ade7a879e23c229df752fc8f87d679c. * reuse the fixupParentReferences function * Improve typing of && operator with --strictNullChecks * Add test * Respond to PR comments * Respond to PR comments * Add merging tests * Use a function `stringify` to simplify calls to `JSON.stringify(xyz, undefined, 2)` * Update tests * Fix mistake * Include indent in navigation bar protocol Previously navbar01 test had indents when run in the browser but not when run from node. Now they run the same. * Remove unnecessary restrictions in property access narrowing * Fix fourslash test * Add regression test * Consider property declarations to be control flow containers * Adding regression test * Remove restriction on --target es5 and --module es6 * change type definition for Object.create * Fix signature help * Add "implicit any" warning for shorthand ambient modules * Remove trailing whitespace * Support using string values in enums for CompilerOptions in transpile methods * Remove trailing whitespace in jakefile * Make `jake runtests-browser` support test regexes with spaces For example: `jake runtests-browser t="transpile .js files"` now works. * Add another test * factor out isJsxOrTsxExtension * Move to a conformance test * Revert "Revert "Merge pull request #7235 from weswigham/narrow-all-types"" This reverts commit fc3e040c5167868ed623612e8f33fb3beedf73b1. * Use inclusive flag, as originally done, but include almost everything * Add additional tests * Respond to PR comments * Fix typo * add tests for tsserver project system * Fix test * Allow case comparison to undefined and null in strict null checking mode * Remove incorrectly added tests * check if moduleResolution when verifying that program can be reused * more tests for module resolution change and exclude * Fix linting issues * Merge JSDoc of assignments from function expressions * Allow nested assignments in type guards * Add tests * Improve order of parameter's merged jsdoc * Force LF newlines for LKG builds/non debug builds Fixes 6630 * Create intersection types in type guards for unrelated types * Split commentsFunction test into expr/decl And renumber. * Remove TODO comments * Accept new baselines * Add tests * Remove comments * Fix test helper * Recognize relative path using in outDir property (#9025) * Recognize relative path using in outDir property * Add projects tests * Add project .json files * Update baselines * Add comments * Add test case The test passes in 1.8 and fails in master. * Return trace when exception happens * Remove Long-Done TODO AFAIK, the harness sources have been concatenated into `run.js` for as long as I've known. This stops executing them twice (and in turn makes debugging tests much easier, since you no longer have to debug into eval'd code). * Allow primitive type guards with typeof on right Previously, only type guards of the form `typeof x === 'string'` were allowed. Now you can write `'string' === typeof x`. * Primitive type guards are now order independent * Fix comments in tests * Add handleing for classes * Add more tests for target=es5 module=es6 * addExportToArgumentListKind * Accept baseline * Add more tests * Adds progress indicators to the runtests-parallel build task. * Fixed typo * Fix comment * Add test for out-of-range error * Use proper method of not resolving alias * Fix module loading error (commandLineOptions_stringToEnum would be undefined if optionDeclarations wasn't loaded yet) * Update tests * Contextually type return statement in async function * Remove stale files * Undo change * Improve perf * Improve tests * Fix sourcemaps for debugging tests * Allow --sourceRoot with --inlineSources option Fixes #8445 * this in parameter initializers resolves to class Accept baselines now that the test passes. * Add tests for more kinds of import/export * Fix7334 Disallow async in functionExpression and ArrowFunction (#9062) * Error when using async modifier in function-expression and arrow-function when target es5 * Add tests and baselines * Resolve function-this in parameter initialisers when explicitly provided * Allow null/undefined guard with null/undefined on left Also add a test with baselines. * Code review comments * Update more diagnostic messages ES6->2015 Fix #8996 CC @mhegazy. * Fixes an issue with runtests-parallel when global mocha is not installed. * Update LKG * Add tests * fix baselines * Salsa: get members of variables whose initialisers are functions * Test adding members to JS variables whose initialisers are functions * Recommend runtests-parallel in CONTRIBUTING * Allow empty lists on command line * Remove single-comma empty array form * Remove trailing whitespace * Implicit type inclusion changes * Only inlineSourceMap when debugging through jake-browser (#9080) * Only inlineSourceMap when debugging through jake-browser * Address PR: fix typo in opt's property * minor fix: add missing return clause * Use camel-case instead of snake-case (#9134) * Baseline fix, CR comments, lint * CR changes * Add test for jsdoc in navigation bar * Fixes runtests-parallel not reporting failure for failed tests. * Fix decorator metadata emit for rest arg with no type * Add isDefinition to ReferenceEntry Clients can now easily tell if the reference is to a definition or a usage. * Test isDefinition * Add option to bail out of `jake runtests` when one test fails * Absolute-ify paths in both places * Refactor * Add unit test * lint * Added tests. * Accepted baselines. * Emit 'exports.' if the shorthand is a general export. * Accepted baselines. * Emit 'Promise' decorator metadata return type for async methods * Respond to PR comment * Unescape identifiers used in code completion * Make isDefinition required. For the deprecated getOccurrencesAtPosition, isDefinition is always false. * Add more isDefinition tests and fix computed property bug * Fix bug: do unescaping in the right place, so that it only affects escaped javascript identifiers * Use `isLiteralComputedPropertyDeclarationName`
2016-06-15 00:00:40 +02:00
desc("Runs the tests using the built run.js file. Optional arguments are: t[ests]=regex r[eporter]=[list|spec|json|<more>] d[ebug]=true color[s]=false lint=true bail=false dirty=false.");
2015-10-03 01:21:20 +02:00
task("runtests", ["build-rules", "tests", builtLocalDirectory], function() {
runConsoleTests('mocha-fivemat-progress-reporter', /*runInParallel*/ false);
2016-08-19 23:34:14 +02:00
}, { async: true });
2014-07-13 01:04:16 +02:00
2015-07-30 17:00:29 +02:00
desc("Generates code coverage data via instanbul");
2014-07-25 01:03:13 +02:00
task("generate-code-coverage", ["tests", builtLocalDirectory], function () {
var cmd = 'istanbul cover node_modules/mocha/bin/_mocha -- -R min -t ' + testTimeout + ' ' + run;
console.log(cmd);
2014-09-18 20:49:40 +02:00
exec(cmd);
2014-07-25 01:03:13 +02:00
}, { async: true });
2014-07-13 01:04:16 +02:00
// Browser tests
2016-05-19 22:31:21 +02:00
var nodeServerOutFile = "tests/webTestServer.js";
var nodeServerInFile = "tests/webTestServer.ts";
2017-03-07 22:40:15 +01:00
compileFile(nodeServerOutFile, [nodeServerInFile], [builtLocalDirectory, tscFile], [], /*useBuiltCompiler:*/ true, { noOutFile: true, lib: "es6" });
2014-07-13 01:04:16 +02:00
desc("Runs browserify on run.js to produce a file suitable for running tests in the browser");
task("browserify", ["tests", builtLocalDirectory, nodeServerOutFile], function() {
[Transforms] Merge master 06/06/2016 (#8991) * Remove check narrowing only certain types, add test showing issues with this * string literal case test * Reconcile fix with CFA work * Defaultable -> NotNarrowable to align with use * Missed a defaultable in comments * Add test for narrowing to unions of string literals * Rewrite isInStringLiteral to accomodate for unterminated strings * Refactor signatureHelp to expose helper functions * Add support for completion in string literals * Remove unused check * Use const instead of let * Fix error * Formatting changes * Use shorthand properties * Add failing test for #8738 * Sort baseline reference identifier by name * Detects assignment to internal module export clause, fixes #8738 * add SharedArrayBuffer fix * Factor out assignment op check * Add test for composite assignment * Factor out the behaviour and handles x++ and ++x * Handles ES3 default as identifier name * Fix missing else statement * isNameOfExportedDeclarationInNonES6Module * Reorder options alphabetically * Mark diagnostics, and skipDefaultLibCheck as internal * Allow an import of "foo.js" to be matched by a file "foo.ts" * Improve loadModuleFromFile code * Respond to PR comments * Respond to more PR comments * Fix test * Actually merge from master * Revert to old tryLoad implementation * Run fixupParentReferences when parsing isolated jsDocComment * initial revision of unit test support for project system in tsserver * Allow wildcard ("*") patterns in ambient module declarations * Add non-widening forms of null and undefined * Create separate control flows for property declarations with initializers * Add regression test * Allow trailing commas in function parameter and argument lists * Add tests * Remove unused variable * Add null check and CR feedback * Support shorthand ambient module declarations * Revert "Merge pull request #7235 from weswigham/narrow-all-types" This reverts commit ef0f6c8fe4f94a7e294cfe42d7025c9dca6535d5, reversing changes made to 9f087cb62ade7a879e23c229df752fc8f87d679c. * reuse the fixupParentReferences function * Improve typing of && operator with --strictNullChecks * Add test * Respond to PR comments * Respond to PR comments * Add merging tests * Use a function `stringify` to simplify calls to `JSON.stringify(xyz, undefined, 2)` * Update tests * Fix mistake * Include indent in navigation bar protocol Previously navbar01 test had indents when run in the browser but not when run from node. Now they run the same. * Remove unnecessary restrictions in property access narrowing * Fix fourslash test * Add regression test * Consider property declarations to be control flow containers * Adding regression test * Remove restriction on --target es5 and --module es6 * change type definition for Object.create * Fix signature help * Add "implicit any" warning for shorthand ambient modules * Remove trailing whitespace * Support using string values in enums for CompilerOptions in transpile methods * Remove trailing whitespace in jakefile * Make `jake runtests-browser` support test regexes with spaces For example: `jake runtests-browser t="transpile .js files"` now works. * Add another test * factor out isJsxOrTsxExtension * Move to a conformance test * Revert "Revert "Merge pull request #7235 from weswigham/narrow-all-types"" This reverts commit fc3e040c5167868ed623612e8f33fb3beedf73b1. * Use inclusive flag, as originally done, but include almost everything * Add additional tests * Respond to PR comments * Fix typo * add tests for tsserver project system * Fix test * Allow case comparison to undefined and null in strict null checking mode * Remove incorrectly added tests * check if moduleResolution when verifying that program can be reused * more tests for module resolution change and exclude * Fix linting issues * Merge JSDoc of assignments from function expressions * Allow nested assignments in type guards * Add tests * Improve order of parameter's merged jsdoc * Force LF newlines for LKG builds/non debug builds Fixes 6630 * Create intersection types in type guards for unrelated types * Split commentsFunction test into expr/decl And renumber. * Remove TODO comments * Accept new baselines * Add tests * Remove comments * Fix test helper * Recognize relative path using in outDir property (#9025) * Recognize relative path using in outDir property * Add projects tests * Add project .json files * Update baselines * Add comments * Add test case The test passes in 1.8 and fails in master. * Return trace when exception happens * Remove Long-Done TODO AFAIK, the harness sources have been concatenated into `run.js` for as long as I've known. This stops executing them twice (and in turn makes debugging tests much easier, since you no longer have to debug into eval'd code). * Allow primitive type guards with typeof on right Previously, only type guards of the form `typeof x === 'string'` were allowed. Now you can write `'string' === typeof x`. * Primitive type guards are now order independent * Fix comments in tests * Add handleing for classes * Add more tests for target=es5 module=es6 * addExportToArgumentListKind * Accept baseline * Add more tests * wip-fixing transforms * Adds progress indicators to the runtests-parallel build task. * Fixed typo * Fix comment * Add test for out-of-range error * Use proper method of not resolving alias * Fix module loading error (commandLineOptions_stringToEnum would be undefined if optionDeclarations wasn't loaded yet) * Port 8739 * Update tests * Update baselines * Contextually type return statement in async function * Remove stale files * Undo change * Improve perf * Improve tests * Fix sourcemaps for debugging tests * Allow --sourceRoot with --inlineSources option Fixes #8445 * this in parameter initializers resolves to class Accept baselines now that the test passes. * Add tests for more kinds of import/export * Fix7334 Disallow async in functionExpression and ArrowFunction (#9062) * Error when using async modifier in function-expression and arrow-function when target es5 * Add tests and baselines * Resolve function-this in parameter initialisers when explicitly provided * Allow null/undefined guard with null/undefined on left Also add a test with baselines. * Code review comments * Update more diagnostic messages ES6->2015 Fix #8996 CC @mhegazy. * Fixes an issue with runtests-parallel when global mocha is not installed. * Update LKG * Add tests * fix baselines * Recommend runtests-parallel in CONTRIBUTING * Only inlineSourceMap when debugging through jake-browser (#9080) * Only inlineSourceMap when debugging through jake-browser * Address PR: fix typo in opt's property * Manually port tests from PR 8470 * minor fix: add missing return clause * Support using string values in enums for CompilerOptions in transpile methods * Support using string values in enums for CompilerOptions in transpile methods # Conflicts: # tests/cases/unittests/transpile.ts * Fix test helper * Add test for out-of-range error * Fix module loading error (commandLineOptions_stringToEnum would be undefined if optionDeclarations wasn't loaded yet) * Use camel-case instead of snake-case (#9134) * Manually add tests for PR 8988 * Allow wildcard ("*") patterns in ambient module declarations * Respond to PR comments * Add another test * Improve perf * Improve tests * Update baseline from merging with master * Address PR comment * Update baseline * Refactor how we retrieve binding-name cache in module transformer * Temporary accept so we get a clean run-tests result
2016-06-14 20:36:57 +02:00
var cmd = 'browserify built/local/run.js -t ./scripts/browserify-optional -d -o built/local/bundle.js';
2014-07-13 01:04:16 +02:00
exec(cmd);
2016-08-19 23:34:14 +02:00
}, { async: true });
2014-07-13 01:04:16 +02:00
2016-07-28 22:40:05 +02:00
desc("Runs the tests using the built run.js file like 'jake runtests'. Syntax is jake runtests-browser. Additional optional parameters tests=[regex], browser=[chrome|IE]");
2016-08-19 23:34:14 +02:00
task("runtests-browser", ["tests", "browserify", builtLocalDirectory, servicesFileInBrowserTest], function () {
2014-07-13 01:04:16 +02:00
cleanTestDirs();
2016-05-19 22:31:21 +02:00
host = "node";
browser = process.env.browser || process.env.b || (os.platform() === "linux" ? "chrome" : "IE");
tests = process.env.test || process.env.tests || process.env.t;
var light = process.env.light || false;
2014-07-13 01:04:16 +02:00
var testConfigFile = 'test.config';
2016-08-19 23:34:14 +02:00
if (fs.existsSync(testConfigFile)) {
2014-07-13 01:04:16 +02:00
fs.unlinkSync(testConfigFile);
}
2016-08-19 23:34:14 +02:00
if (tests || light) {
writeTestConfigFile(tests, light);
2014-07-13 01:04:16 +02:00
}
tests = tests ? tests : '';
2016-07-28 22:40:05 +02:00
var cmd = host + " tests/webTestServer.js " + browser + " " + JSON.stringify(tests);
console.log(cmd);
2014-07-13 01:04:16 +02:00
exec(cmd);
2016-08-19 23:34:14 +02:00
}, { async: true });
2014-07-13 01:04:16 +02:00
function getDiffTool() {
2016-05-19 22:31:21 +02:00
var program = process.env['DIFF'];
2014-12-04 20:15:00 +01:00
if (!program) {
2015-07-30 17:00:29 +02:00
fail("Add the 'DIFF' environment variable to the path of the program you want to use.");
2014-12-04 20:15:00 +01:00
}
return program;
}
2014-07-13 01:04:16 +02:00
// Baseline Diff
2014-12-04 20:15:00 +01:00
desc("Diffs the compiler baselines using the diff tool specified by the 'DIFF' environment variable");
2014-07-13 01:04:16 +02:00
task('diff', function () {
2016-08-19 23:34:14 +02:00
var cmd = '"' + getDiffTool() + '" ' + refBaseline + ' ' + localBaseline;
2015-07-30 17:00:29 +02:00
console.log(cmd);
2014-07-13 01:04:16 +02:00
exec(cmd);
2016-08-19 23:34:14 +02:00
}, { async: true });
2014-07-13 01:04:16 +02:00
2014-12-04 20:15:00 +01:00
desc("Diffs the RWC baselines using the diff tool specified by the 'DIFF' environment variable");
2014-07-13 01:04:16 +02:00
task('diff-rwc', function () {
2016-08-19 23:34:14 +02:00
var cmd = '"' + getDiffTool() + '" ' + refRwcBaseline + ' ' + localRwcBaseline;
2015-07-30 17:00:29 +02:00
console.log(cmd);
2014-07-13 01:04:16 +02:00
exec(cmd);
2016-08-19 23:34:14 +02:00
}, { async: true });
2014-07-13 01:04:16 +02:00
desc("Builds the test sources and automation in debug mode");
task("tests-debug", ["setDebugMode", "tests"]);
// Makes the test results the new baseline
desc("Makes the most recent test results the new baseline, overwriting the old baseline");
2016-08-19 23:34:14 +02:00
task("baseline-accept", function () {
2016-11-22 02:25:31 +01:00
acceptBaseline(localBaseline, refBaseline);
2016-08-19 23:34:14 +02:00
});
2016-11-22 02:25:31 +01:00
function acceptBaseline(sourceFolder, targetFolder) {
2016-08-19 23:34:14 +02:00
console.log('Accept baselines from ' + sourceFolder + ' to ' + targetFolder);
var deleteEnding = '.delete';
2017-02-14 07:13:48 +01:00
acceptBaselineFolder(sourceFolder, targetFolder);
function acceptBaselineFolder(sourceFolder, targetFolder) {
var files = fs.readdirSync(sourceFolder);
for (var i in files) {
var filename = files[i];
var fullLocalPath = path.join(sourceFolder, filename);
var stat = fs.statSync(fullLocalPath);
if (stat.isFile()) {
if (filename.substr(filename.length - deleteEnding.length) === deleteEnding) {
filename = filename.substr(0, filename.length - deleteEnding.length);
fs.unlinkSync(path.join(targetFolder, filename));
2016-09-09 19:13:18 +02:00
}
2017-03-22 21:01:53 +01:00
else {
2017-02-14 07:13:48 +01:00
var target = path.join(targetFolder, filename);
if (fs.existsSync(target)) {
fs.unlinkSync(target);
}
fs.renameSync(path.join(sourceFolder, filename), target);
2016-09-09 19:13:18 +02:00
}
2017-02-14 07:13:48 +01:00
}
else if (stat.isDirectory()) {
acceptBaselineFolder(fullLocalPath, path.join(targetFolder, filename));
2016-08-19 23:34:14 +02:00
}
2014-07-13 01:04:16 +02:00
}
}
2016-08-19 23:34:14 +02:00
}
2014-07-13 01:04:16 +02:00
desc("Makes the most recent rwc test results the new baseline, overwriting the old baseline");
2016-08-19 23:34:14 +02:00
task("baseline-accept-rwc", function () {
2016-11-22 02:25:31 +01:00
acceptBaseline(localRwcBaseline, refRwcBaseline);
2014-07-13 01:04:16 +02:00
});
2014-11-17 20:01:05 +01:00
desc("Makes the most recent test262 test results the new baseline, overwriting the old baseline");
2016-08-19 23:34:14 +02:00
task("baseline-accept-test262", function () {
2016-11-22 02:25:31 +01:00
acceptBaseline(localTest262Baseline, refTest262Baseline);
2014-11-17 20:01:05 +01:00
});
2014-07-13 01:04:16 +02:00
// Webhost
var webhostPath = "tests/webhost/webtsc.ts";
var webhostJsPath = "tests/webhost/webtsc.js";
2014-12-02 00:32:52 +01:00
compileFile(webhostJsPath, [webhostPath], [tscFile, webhostPath].concat(libraryTargets), [], /*useBuiltCompiler*/true);
2014-07-13 01:04:16 +02:00
desc("Builds the tsc web host");
2016-08-19 23:34:14 +02:00
task("webhost", [webhostJsPath], function () {
jake.cpR(path.join(builtLocalDirectory, "lib.d.ts"), "tests/webhost/", { silent: true });
2014-07-13 01:04:16 +02:00
});
// Perf compiler
var perftscPath = "tests/perftsc.ts";
var perftscJsPath = "built/local/perftsc.js";
compileFile(perftscJsPath, [perftscPath], [tscFile, perftscPath, "tests/perfsys.ts"].concat(libraryTargets), [], /*useBuiltCompiler*/ true);
desc("Builds augmented version of the compiler for perf tests");
task("perftsc", [perftscJsPath]);
// Instrumented compiler
var loggedIOpath = harnessDirectory + 'loggedIO.ts';
var loggedIOJsPath = builtLocalDirectory + 'loggedIO.js';
2016-08-19 23:34:14 +02:00
file(loggedIOJsPath, [builtLocalDirectory, loggedIOpath], function () {
var temp = builtLocalDirectory + 'temp';
jake.mkdirP(temp);
2017-05-25 22:23:00 +02:00
var options = "--target es5 --lib es6 --types --outdir " + temp + ' ' + loggedIOpath;
var cmd = host + " " + LKGDirectory + compilerFilename + " " + options + " ";
console.log(cmd + "\n");
var ex = jake.createExec([cmd]);
2016-08-19 23:34:14 +02:00
ex.addListener("cmdEnd", function () {
fs.renameSync(temp + '/harness/loggedIO.js', loggedIOJsPath);
jake.rmRf(temp);
complete();
});
ex.run();
2016-08-19 23:34:14 +02:00
}, { async: true });
var instrumenterPath = harnessDirectory + 'instrumenter.ts';
var instrumenterJsPath = builtLocalDirectory + 'instrumenter.js';
2017-05-25 22:23:00 +02:00
compileFile(instrumenterJsPath, [instrumenterPath], [tscFile, instrumenterPath].concat(libraryTargets), [], /*useBuiltCompiler*/ true, { lib: "es6", types: ["node"] });
desc("Builds an instrumented tsc.js");
2016-08-19 23:34:14 +02:00
task('tsc-instrumented', [loggedIOJsPath, instrumenterJsPath, tscFile], function () {
var cmd = host + ' ' + instrumenterJsPath + ' record iocapture ' + builtLocalDirectory + compilerFilename;
console.log(cmd);
var ex = jake.createExec([cmd]);
2016-08-19 23:34:14 +02:00
ex.addListener("cmdEnd", function () {
complete();
});
ex.run();
}, { async: true });
desc("Updates the sublime plugin's tsserver");
2016-08-19 23:34:14 +02:00
task("update-sublime", ["local", serverFile], function () {
jake.cpR(serverFile, "../TypeScript-Sublime-Plugin/tsserver/");
jake.cpR(serverFile + ".map", "../TypeScript-Sublime-Plugin/tsserver/");
});
2015-08-26 03:09:32 +02:00
var tslintRuleDir = "scripts/tslint";
2016-05-19 22:31:21 +02:00
var tslintRules = [
2015-08-26 03:09:32 +02:00
"nextLineRule",
"booleanTriviaRule",
"typeOperatorSpacingRule",
2015-12-02 01:19:40 +01:00
"noInOperatorRule",
2016-06-23 21:32:14 +02:00
"noIncrementDecrementRule",
"objectLiteralSurroundingSpaceRule",
"noTypeAssertionWhitespaceRule",
"noBomRule"
2016-05-19 22:31:21 +02:00
];
2016-08-19 23:34:14 +02:00
var tslintRulesFiles = tslintRules.map(function (p) {
2015-08-26 03:09:32 +02:00
return path.join(tslintRuleDir, p + ".ts");
});
2016-08-19 23:34:14 +02:00
var tslintRulesOutFiles = tslintRules.map(function (p) {
2015-08-26 03:09:32 +02:00
return path.join(builtLocalDirectory, "tslint", p + ".js");
});
desc("Compiles tslint rules to js");
2016-08-11 18:53:38 +02:00
task("build-rules", ["build-rules-start"].concat(tslintRulesOutFiles).concat(["build-rules-end"]));
2016-08-19 23:34:14 +02:00
tslintRulesFiles.forEach(function (ruleFile, i) {
2016-02-10 09:20:40 +01:00
compileFile(tslintRulesOutFiles[i], [ruleFile], [ruleFile], [], /*useBuiltCompiler*/ false,
{ noOutFile: true, generateDeclarations: false, outDir: path.join(builtLocalDirectory, "tslint"), lib: "es6" });
2015-08-26 03:09:32 +02:00
});
2016-08-11 18:53:38 +02:00
desc("Emit the start of the build-rules fold");
2016-08-19 23:34:14 +02:00
task("build-rules-start", [], function () {
2016-08-11 18:53:38 +02:00
if (fold.isTravis()) console.log(fold.start("build-rules"));
});
desc("Emit the end of the build-rules fold");
2016-08-19 23:34:14 +02:00
task("build-rules-end", [], function () {
2016-08-11 18:53:38 +02:00
if (fold.isTravis()) console.log(fold.end("build-rules"));
});
2015-10-28 23:42:15 +01:00
var lintTargets = compilerSources
.concat(harnessSources)
2016-05-20 18:40:13 +02:00
// Other harness sources
2016-08-19 23:34:14 +02:00
.concat(["instrumenter.ts"].map(function (f) { return path.join(harnessDirectory, f) }))
.concat(serverSources)
.concat(tslintRulesFiles)
2016-06-23 19:12:14 +02:00
.concat(servicesSources)
2016-08-17 23:47:54 +02:00
.concat(typingsInstallerSources)
.concat(cancellationTokenSources)
2016-07-27 16:26:28 +02:00
.concat(["Gulpfile.ts"])
.concat([nodeServerInFile, perftscPath, "tests/perfsys.ts", webhostPath])
.map(function (p) { return path.resolve(p) });
// keep only unique items
lintTargets = Array.from(new Set(lintTargets));
2015-09-18 06:04:33 +02:00
function sendNextFile(files, child, callback, failures) {
var file = files.pop();
if (file) {
console.log("Linting '" + file + "'.");
2016-08-19 23:34:14 +02:00
child.send({ kind: "file", name: file });
}
else {
2016-08-19 23:34:14 +02:00
child.send({ kind: "close" });
callback(failures);
}
}
function spawnLintWorker(files, callback) {
var child = child_process.fork("./scripts/parallel-lint");
var failures = 0;
2016-08-19 23:34:14 +02:00
child.on("message", function (data) {
switch (data.kind) {
case "result":
if (data.failures > 0) {
failures += data.failures;
console.log(data.output);
}
sendNextFile(files, child, callback, failures);
break;
case "error":
console.error(data.error);
failures++;
sendNextFile(files, child, callback, failures);
break;
}
});
sendNextFile(files, child, callback, failures);
}
2015-09-18 06:04:33 +02:00
2016-05-18 16:41:37 +02:00
desc("Runs tslint on the compiler sources. Optional arguments are: f[iles]=regex");
2017-03-20 16:42:27 +01:00
task("lint", ["build-rules"], () => {
2016-08-11 18:53:38 +02:00
if (fold.isTravis()) console.log(fold.start("lint"));
2017-03-20 16:42:27 +01:00
const fileMatcher = process.env.f || process.env.file || process.env.files;
const files = fileMatcher
? `src/**/${fileMatcher}`
2017-04-07 22:17:50 +02:00
: "Gulpfile.ts 'scripts/tslint/*.ts' 'src/**/*.ts' --exclude src/lib/es5.d.ts --exclude 'src/lib/*.generated.d.ts'";
2017-03-20 16:42:27 +01:00
const cmd = `node node_modules/tslint/bin/tslint ${files} --format stylish`;
console.log("Linting: " + cmd);
jake.exec([cmd], { interactive: true }, () => {
if (fold.isTravis()) console.log(fold.end("lint"));
complete();
2015-09-18 06:04:33 +02:00
});
2017-03-20 16:42:27 +01:00
});