TypeScript/Jakefile.js

1032 lines
38 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");
2015-09-18 06:04:33 +02:00
var Linter = require("tslint");
2014-07-13 01:04:16 +02:00
// Variables
var compilerDirectory = "src/compiler/";
var servicesDirectory = "src/services/";
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/";
2014-10-17 03:13:26 +02:00
var unittestsDirectory = "tests/cases/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) {
process.env.path = nodeModulesPathPrefix + process.env.path;
} else if (process.env.PATH !== undefined) {
process.env.PATH = nodeModulesPathPrefix + process.env.PATH;
}
2014-07-13 01:04:16 +02:00
var compilerSources = [
"core.ts",
"sys.ts",
"types.ts",
"scanner.ts",
"parser.ts",
"utilities.ts",
2014-07-13 01:04:16 +02:00
"binder.ts",
"checker.ts",
"sourcemap.ts",
"declarationEmitter.ts",
2014-07-13 01:04:16 +02:00
"emitter.ts",
"program.ts",
2014-07-13 01:04:16 +02:00
"commandLineParser.ts",
2014-08-07 08:21:53 +02:00
"tsc.ts",
2014-07-13 01:04:16 +02:00
"diagnosticInformationMap.generated.ts"
].map(function (f) {
return path.join(compilerDirectory, f);
});
var servicesSources = [
"core.ts",
"sys.ts",
2014-07-13 01:04:16 +02:00
"types.ts",
"scanner.ts",
"parser.ts",
"utilities.ts",
2014-07-13 01:04:16 +02:00
"binder.ts",
"checker.ts",
"sourcemap.ts",
"declarationEmitter.ts",
"emitter.ts",
"program.ts",
"commandLineParser.ts",
"diagnosticInformationMap.generated.ts"
2014-07-13 01:04:16 +02:00
].map(function (f) {
return path.join(compilerDirectory, f);
}).concat([
"breakpoints.ts",
"navigateTo.ts",
"navigationBar.ts",
"outliningElementsCollector.ts",
"patternMatcher.ts",
2014-07-13 01:04:16 +02:00
"services.ts",
"shims.ts",
2014-09-24 04:00:45 +02:00
"signatureHelp.ts",
"utilities.ts",
"formatting/formatting.ts",
"formatting/formattingContext.ts",
"formatting/formattingRequestKind.ts",
"formatting/formattingScanner.ts",
"formatting/references.ts",
"formatting/rule.ts",
"formatting/ruleAction.ts",
"formatting/ruleDescriptor.ts",
"formatting/ruleFlag.ts",
"formatting/ruleOperation.ts",
"formatting/ruleOperationContext.ts",
"formatting/rules.ts",
"formatting/rulesMap.ts",
"formatting/rulesProvider.ts",
"formatting/smartIndenter.ts",
"formatting/tokenRange.ts"
2014-07-13 01:04:16 +02:00
].map(function (f) {
return path.join(servicesDirectory, f);
}));
2015-10-29 00:02:16 +01:00
var serverCoreSources = [
2015-02-12 04:43:10 +01:00
"node.d.ts",
"editorServices.ts",
"protocol.d.ts",
"session.ts",
2015-02-12 04:43:10 +01:00
"server.ts"
].map(function (f) {
return path.join(serverDirectory, f);
2015-10-28 23:42:15 +01:00
});
2015-10-29 00:02:16 +01:00
var serverSources = serverCoreSources.concat(servicesSources);
2015-02-12 04:43:10 +01:00
var languageServiceLibrarySources = [
"editorServices.ts",
"protocol.d.ts",
"session.ts"
].map(function (f) {
return path.join(serverDirectory, f);
2015-06-17 21:39:02 +02:00
}).concat(servicesSources);
2015-07-15 02:47:15 +02:00
var harnessCoreSources = [
2014-07-13 01:04:16 +02:00
"harness.ts",
"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",
"cachingInServerLSHost.ts",
"moduleResolution.ts",
"tsconfigParsing.ts",
"commandLineParsing.ts",
"convertCompilerOptionsFromJson.ts",
"convertTypingOptionsFromJson.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.d.ts",
"session.ts",
2015-02-12 04:43:10 +01:00
"client.ts",
"editorServices.ts",
].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",
"es2015.symbol.wellknown.d.ts",
2014-07-13 01:04:16 +02:00
];
var es2015LibrarySourceMap = es2015LibrarySources.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] };
});
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
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] };
})
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 = [
// 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"] },
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
// JavaScript + all host library
{ target: "lib.d.ts", sources: ["header.d.ts", "es5.d.ts"].concat(hostsLibrarySources), },
{ target: "lib.es6.d.ts", sources: ["header.d.ts", "es5.d.ts"].concat(es2015LibrarySources, hostsLibrarySources, "dom.iterable.d.ts"), },
].concat(es2015LibrarySourceMap, es2016LibrarySourceMap);
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";
jake.cpR(prefixFile, temp, {silent: true});
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";
// Copy the first file to temp
if (!fs.existsSync(sourceFiles[0])) {
fail(sourceFiles[0] + " does not exist!");
}
jake.cpR(sourceFiles[0], temp, {silent: true});
// append all files in sequence
for (var i = 1; i < sourceFiles.length; i++) {
if (!fs.existsSync(sourceFiles[i])) {
fail(sourceFiles[i] + " does not exist!");
}
fs.appendFileSync(temp, fs.readFileSync(sourceFiles[i]));
}
// Move the file to the final destination
fs.renameSync(temp, destinationFile);
}
var useDebugMode = true;
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 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() {
2015-09-18 22:13:26 +02:00
var compilerPath = useBuiltCompiler ? builtLocalCompiler : LKGCompiler;
var options = "--noImplicitAny --noEmitOnError --pretty";
2016-02-10 09:20:40 +01:00
opts = opts || {};
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 {
2015-10-05 19:43:54 +02:00
options += " --module commonjs"
}
2016-02-10 09:20:40 +01: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) {
2016-02-10 09:20:40 +01:00
options += " -sourcemap";
if (!opts.noMapRoot) {
options += " -mapRoot file:///" + path.resolve(path.dirname(outFile));
}
2014-07-13 01:04:16 +02:00
}
2016-02-10 09:20:40 +01:00
if (opts.stripInternal) {
options += " --stripInternal"
}
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
ex.addListener("stdout", function(output) {
process.stdout.write(output);
});
ex.addListener("stderr", function(error) {
process.stderr.write(error);
});
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();
}
complete();
});
ex.addListener("error", function() {
2014-07-13 01:04:16 +02:00
fs.unlinkSync(outFile);
fail("Compilation of " + outFile + " unsuccessful");
2014-07-13 01:04:16 +02:00
});
ex.run();
2014-07-13 01:04:16 +02:00
}, {async: true});
}
// 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);
}));
file(target, [builtLocalDirectory].concat(sources), function() {
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,
[processDiagnosticMessagesTs],
[processDiagnosticMessagesTs],
[],
2014-12-02 00:32:52 +01:00
/*useBuiltCompiler*/ false);
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 () {
2015-09-18 22:13:26 +02:00
var cmd = host + " " + processDiagnosticMessagesJs + " " + diagnosticMessagesJson;
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();
2015-07-30 17:00:29 +02:00
}, {async: true});
2014-07-13 01:04:16 +02:00
2015-10-27 22:16:05 +01:00
file(builtGeneratedDiagnosticMessagesJSON,[generatedDiagnosticMessagesJSON], function() {
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";
2015-07-23 21:53:41 +02:00
var programTs = path.join(compilerDirectory, "program.ts");
file(configureNightlyTs);
compileFile(/*outfile*/configureNightlyJs,
/*sources*/ [configureNightlyTs],
/*prereqs*/ [configureNightlyTs],
/*prefixes*/ [],
/*useBuiltCompiler*/ false,
2016-02-10 09:20:40 +01:00
{ noOutFile: false, generateDeclarations: false, keepComments: false, noResolve: false, stripInternal: false });
task("setDebugMode", function() {
useDebugMode = true;
});
task("configure-nightly", [configureNightlyJs], function() {
2015-09-18 22:13:26 +02:00
var cmd = host + " " + configureNightlyJs + " " + packageJson + " " + programTs;
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 scriptsTsdJson = path.join(scriptsDirectory, "tsd.json");
file(scriptsTsdJson);
task("tsd-scripts", [scriptsTsdJson], function () {
var cmd = "tsd --config " + scriptsTsdJson + " install";
console.log(cmd)
exec(cmd);
}, { async: true })
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);
2014-08-07 08:21:53 +02:00
compileFile(tscFile, compilerSources, [builtLocalDirectory, copyright].concat(compilerSources), [copyright], /*useBuiltCompiler:*/ false);
2014-07-13 01:04:16 +02:00
2014-08-07 08:21:53 +02:00
var servicesFile = path.join(builtLocalDirectory, "typescriptServices.js");
2016-02-10 09:20:40 +01:00
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");
compileFile(servicesFile, servicesSources,[builtLocalDirectory, copyright].concat(servicesSources),
/*prefixes*/ [copyright],
/*useBuiltCompiler*/ true,
2016-02-10 09:20:40 +01:00
{ noOutFile: false, generateDeclarations: true, preserveConstEnums: true, keepComments: true, noResolve: false, stripInternal: true },
/*callback*/ function () {
jake.cpR(servicesFile, nodePackageFile, {silent: true});
2014-12-02 00:32:52 +01:00
prependFile(copyright, standaloneDefinitionsFile);
// Stanalone/web definition file using global 'ts' namespace
jake.cpR(standaloneDefinitionsFile, nodeDefinitionsFile, {silent: true});
var definitionFileContents = fs.readFileSync(nodeDefinitionsFile).toString();
2015-10-27 21:48:37 +01:00
definitionFileContents = definitionFileContents.replace(/^(\s*)(export )?const enum (\S+) {(\s*)$/gm, '$1$2enum $3 {$4');
fs.writeFileSync(standaloneDefinitionsFile, definitionFileContents);
// 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);
// 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);
});
2016-02-10 09:20:40 +01:00
compileFile(servicesFileInBrowserTest, servicesSources,[builtLocalDirectory, copyright].concat(servicesSources),
/*prefixes*/ [copyright],
/*useBuiltCompiler*/ true,
{ noOutFile: false, generateDeclarations: true, preserveConstEnums: true, keepComments: true, noResolve: false, stripInternal: true, noMapRoot: true },
/*callback*/ function () {
var content = fs.readFileSync(servicesFileInBrowserTest).toString();
var i = content.lastIndexOf("\n");
fs.writeFileSync(servicesFileInBrowserTest, content.substring(0, i) + "\r\n//# sourceURL=../built/local/typeScriptServices.js" + content.substring(i));
});
2014-07-13 01:04:16 +02:00
2015-02-16 03:52:17 +01:00
var serverFile = path.join(builtLocalDirectory, "tsserver.js");
2015-02-12 04:43:10 +01:00
compileFile(serverFile, serverSources,[builtLocalDirectory, copyright].concat(serverSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true);
var lsslFile = path.join(builtLocalDirectory, "tslssl.js");
compileFile(
lsslFile,
languageServiceLibrarySources,
2015-06-17 21:39:02 +02:00
[builtLocalDirectory, copyright].concat(languageServiceLibrarySources),
/*prefixes*/ [copyright],
/*useBuiltCompiler*/ true,
2016-02-10 09:20:40 +01:00
{ noOutFile: false, generateDeclarations: true });
// Local target to build the language service server library
desc("Builds language service server library");
task("lssl", [lsslFile]);
2014-07-13 01:04:16 +02:00
// Local target to build the compiler and services
desc("Builds the full compiler and services");
2015-10-27 22:16:05 +01:00
task("local", ["generate-diagnostics", "lib", tscFile, servicesFile, nodeDefinitionsFile, serverFile, builtGeneratedDiagnosticMessagesJSON]);
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");
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");
task("clean", function() {
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,
[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();
});
2015-07-30 17:00:29 +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");
task("LKG", ["clean", "release", "local"].concat(libraryTargets), function() {
2015-04-09 23:20:34 +02:00
var expectedFiles = [tscFile, servicesFile, serverFile, nodePackageFile, nodeDefinitionsFile, standaloneDefinitionsFile].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 +
". The following files are missing:\n" + missingFiles.join("\n"));
}
// 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");
2014-08-07 08:21:53 +02:00
compileFile(run, harnessSources, [builtLocalDirectory, tscFile].concat(libraryTargets).concat(harnessSources), [], /*useBuiltCompiler:*/ true);
2014-07-13 01:04:16 +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) {
var ex = jake.createExec([cmd], {windowsVerbatimArguments: true});
// Add listeners for output and error
ex.addListener("stdout", function(output) {
process.stdout.write(output);
});
ex.addListener("stderr", function(error) {
process.stderr.write(error);
});
2014-07-13 01:04:16 +02:00
ex.addListener("cmdEnd", function() {
if (completeHandler) {
completeHandler();
}
complete();
2014-07-13 01:04:16 +02:00
});
ex.addListener("error", function(e, status) {
if(errorHandler) {
errorHandler(e, status);
} 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, testConfigFile) {
2014-07-13 01:04:16 +02:00
console.log('Running test(s): ' + tests);
var testConfigContents = JSON.stringify({ test: [tests], light: light });
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, defaultSubsets) {
2014-07-13 01:04:16 +02:00
cleanTestDirs();
var debug = process.env.debug || process.env.d;
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';
if(fs.existsSync(testConfigFile)) {
fs.unlinkSync(testConfigFile);
}
2014-09-03 19:37:32 +02:00
if (tests || light) {
writeTestConfigFile(tests, light, testConfigFile);
2014-07-13 01:04:16 +02:00
}
2014-09-03 19:37:32 +02:00
if (tests && tests.toLocaleLowerCase() === "rwc") {
2015-02-19 22:52:50 +01:00
testTimeout = 100000;
2014-09-03 19:37:32 +02:00
}
2014-07-13 01:04:16 +02:00
colors = process.env.colors || process.env.color
colors = colors ? ' --no-colors ' : ' --colors ';
reporter = process.env.reporter || process.env.r || defaultReporter;
// 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
var subsetRegexes;
if(defaultSubsets.length === 0) {
subsetRegexes = [tests]
}
else {
var subsets = tests ? tests.split("|") : defaultSubsets;
subsetRegexes = subsets.map(function (sub) { return "^" + sub + ".*$"; });
subsetRegexes.push("^(?!" + subsets.join("|") + ").*$");
}
subsetRegexes.forEach(function (subsetRegex, i) {
tests = subsetRegex ? ' -g "' + subsetRegex + '"' : '';
2015-10-24 01:27:44 +02:00
var cmd = "mocha" + (debug ? " --debug-brk" : "") + " -R " + reporter + tests + colors + ' -t ' + testTimeout + ' ' + run;
console.log(cmd);
exec(cmd, function () {
2015-10-24 01:27:44 +02:00
deleteTemporaryProjectOutput();
if (i === 0) {
var lint = jake.Task['lint'];
lint.addListener('complete', function () {
complete();
});
lint.invoke();
}
else {
complete();
}
2015-10-02 21:45:33 +02:00
});
});
}
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.");
task("runtests-parallel", ["build-rules", "tests", builtLocalDirectory], function() {
runConsoleTests('min', ['compiler', 'conformance', 'Projects', 'fourslash']);
2015-10-24 01:27:44 +02:00
}, {async: true});
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.");
2015-10-03 01:21:20 +02:00
task("runtests", ["build-rules", "tests", builtLocalDirectory], function() {
runConsoleTests('mocha-fivemat-progress-reporter', []);
2014-07-13 01:04:16 +02:00
}, {async: true});
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
var nodeServerOutFile = 'tests/webTestServer.js'
var nodeServerInFile = 'tests/webTestServer.ts'
2016-02-10 09:20:40 +01:00
compileFile(nodeServerOutFile, [nodeServerInFile], [builtLocalDirectory, tscFile], [], /*useBuiltCompiler:*/ true, { noOutFile: true });
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() {
var cmd = 'browserify built/local/run.js -o built/local/bundle.js';
exec(cmd);
}, {async: true});
desc("Runs the tests using the built run.js file like 'jake runtests'. Syntax is jake runtests-browser. Additional optional parameters tests=[regex], port=, browser=[chrome|IE]");
2016-02-10 09:20:40 +01:00
task("runtests-browser", ["tests", "browserify", builtLocalDirectory, servicesFileInBrowserTest], function() {
2014-07-13 01:04:16 +02:00
cleanTestDirs();
host = "node"
port = process.env.port || process.env.p || '8888';
browser = process.env.browser || process.env.b || "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';
if(fs.existsSync(testConfigFile)) {
fs.unlinkSync(testConfigFile);
}
if(tests || light) {
writeTestConfigFile(tests, light, testConfigFile);
2014-07-13 01:04:16 +02:00
}
tests = tests ? tests : '';
var cmd = host + " tests/webTestServer.js " + port + " " + browser + " " + tests
console.log(cmd);
2014-07-13 01:04:16 +02:00
exec(cmd);
}, {async: true});
function getDiffTool() {
2014-12-04 20:15:00 +01:00
var program = process.env['DIFF']
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 () {
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);
}, {async: true});
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 () {
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);
}, {async: true});
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");
task("baseline-accept", function(hardOrSoft) {
if (!hardOrSoft || hardOrSoft == "hard") {
jake.rmRf(refBaseline);
fs.renameSync(localBaseline, refBaseline);
}
else if (hardOrSoft == "soft") {
var files = jake.readdirR(localBaseline);
for (var i in files) {
jake.cpR(files[i], refBaseline);
}
jake.rmRf(path.join(refBaseline, "local"));
}
});
desc("Makes the most recent rwc test results the new baseline, overwriting the old baseline");
task("baseline-accept-rwc", function() {
jake.rmRf(refRwcBaseline);
fs.renameSync(localRwcBaseline, refRwcBaseline);
});
2014-11-17 20:01:05 +01:00
desc("Makes the most recent test262 test results the new baseline, overwriting the old baseline");
task("baseline-accept-test262", function() {
jake.rmRf(refTest262Baseline);
fs.renameSync(localTest262Baseline, refTest262Baseline);
});
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");
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';
file(loggedIOJsPath, [builtLocalDirectory, loggedIOpath], function() {
var temp = builtLocalDirectory + 'temp';
jake.mkdirP(temp);
var options = "--outdir " + temp + ' ' + loggedIOpath;
var cmd = host + " " + LKGDirectory + compilerFilename + " " + options + " ";
console.log(cmd + "\n");
var ex = jake.createExec([cmd]);
ex.addListener("cmdEnd", function() {
fs.renameSync(temp + '/harness/loggedIO.js', loggedIOJsPath);
jake.rmRf(temp);
complete();
});
ex.run();
}, {async: true});
var instrumenterPath = harnessDirectory + 'instrumenter.ts';
var instrumenterJsPath = builtLocalDirectory + 'instrumenter.js';
compileFile(instrumenterJsPath, [instrumenterPath], [tscFile, instrumenterPath].concat(libraryTargets), [], /*useBuiltCompiler*/ true);
desc("Builds an instrumented tsc.js");
task('tsc-instrumented', [loggedIOJsPath, instrumenterJsPath, tscFile], function() {
var cmd = host + ' ' + instrumenterJsPath + ' record iocapture ' + builtLocalDirectory + compilerFilename;
console.log(cmd);
var ex = jake.createExec([cmd]);
ex.addListener("cmdEnd", function() {
complete();
});
ex.run();
}, { async: true });
desc("Updates the sublime plugin's tsserver");
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";
var tslintRules = ([
"nextLineRule",
2015-11-04 20:02:43 +01:00
"preferConstRule",
"booleanTriviaRule",
"typeOperatorSpacingRule",
2015-12-02 01:19:40 +01:00
"noInOperatorRule",
"noIncrementDecrementRule"
2015-08-26 03:09:32 +02:00
]);
var tslintRulesFiles = tslintRules.map(function(p) {
return path.join(tslintRuleDir, p + ".ts");
});
var tslintRulesOutFiles = tslintRules.map(function(p) {
return path.join(builtLocalDirectory, "tslint", p + ".js");
});
desc("Compiles tslint rules to js");
task("build-rules", tslintRulesOutFiles);
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")});
2015-08-26 03:09:32 +02:00
});
2015-09-18 06:04:33 +02:00
function getLinterOptions() {
return {
configuration: require("./tslint.json"),
formatter: "prose",
formattersDirectory: undefined,
rulesDirectory: "built/local/tslint"
};
}
function lintFileContents(options, path, contents) {
var ll = new Linter(path, contents, options);
2016-01-14 19:14:25 +01:00
console.log("Linting '" + path + "'.")
2015-09-18 06:04:33 +02:00
return ll.lint();
}
function lintFile(options, path) {
var contents = fs.readFileSync(path, "utf8");
return lintFileContents(options, path, contents);
}
function lintFileAsync(options, path, cb) {
fs.readFile(path, "utf8", function(err, contents) {
if (err) {
return cb(err);
}
var result = lintFileContents(options, path, contents);
cb(undefined, result);
});
}
2015-12-28 22:58:20 +01:00
var servicesLintTargets = [
"navigateTo.ts",
2016-01-08 05:13:41 +01:00
"outliningElementsCollector.ts",
2015-12-28 23:21:03 +01:00
"patternMatcher.ts",
2016-01-08 05:13:41 +01:00
"services.ts",
"shims.ts",
"jsTyping.ts"
2015-12-28 22:58:20 +01:00
].map(function (s) {
2015-12-28 22:50:58 +01:00
return path.join(servicesDirectory, s);
});
2015-10-28 23:42:15 +01:00
var lintTargets = compilerSources
.concat(harnessCoreSources)
2015-11-21 01:28:58 +01:00
.concat(serverCoreSources)
.concat(tslintRulesFiles)
2015-12-28 22:50:58 +01:00
.concat(servicesLintTargets);
2015-09-18 06:04:33 +02:00
desc("Runs tslint on the compiler sources");
2015-08-26 03:09:32 +02:00
task("lint", ["build-rules"], function() {
2015-09-18 06:04:33 +02:00
var lintOptions = getLinterOptions();
2015-12-02 00:05:08 +01:00
var failed = 0;
2015-07-23 22:59:41 +02:00
for (var i in lintTargets) {
2015-09-18 06:04:33 +02:00
var result = lintFile(lintOptions, lintTargets[i]);
if (result.failureCount > 0) {
console.log(result.output);
2015-12-02 00:05:08 +01:00
failed += result.failureCount;
2015-09-18 06:04:33 +02:00
}
}
2015-12-02 00:05:08 +01:00
if (failed > 0) {
fail('Linter errors.', failed);
}
2015-09-18 06:04:33 +02:00
});
2015-09-25 20:32:08 +02:00
/**
* This is required because file watches on Windows get fires _twice_
* when a file changes on some node/windows version configuations
* (node v4 and win 10, for example). By not running a lint for a file
* which already has a pending lint, we avoid duplicating our work.
* (And avoid printing duplicate results!)
*/
2015-09-18 06:04:33 +02:00
var lintSemaphores = {};
function lintWatchFile(filename) {
fs.watch(filename, {persistent: true}, function(event) {
if (event !== "change") {
return;
}
2015-09-18 06:04:33 +02:00
if (!lintSemaphores[filename]) {
lintSemaphores[filename] = true;
lintFileAsync(getLinterOptions(), filename, function(err, result) {
delete lintSemaphores[filename];
if (err) {
console.log(err);
return;
}
if (result.failureCount > 0) {
console.log("***Lint failure***");
for (var i = 0; i < result.failures.length; i++) {
var failure = result.failures[i];
2015-09-21 21:48:08 +02:00
var start = failure.startPosition.lineAndCharacter;
var end = failure.endPosition.lineAndCharacter;
console.log("warning " + filename + " (" + (start.line + 1) + "," + (start.character + 1) + "," + (end.line + 1) + "," + (end.character + 1) + "): " + failure.failure);
2015-09-18 06:04:33 +02:00
}
2015-09-21 21:48:08 +02:00
console.log("*** Total " + result.failureCount + " failures.");
2015-09-18 06:04:33 +02:00
}
});
}
});
}
desc("Watches files for changes to rerun a lint pass");
task("lint-server", ["build-rules"], function() {
2015-09-21 21:48:08 +02:00
console.log("Watching ./src for changes to linted files");
for (var i = 0; i < lintTargets.length; i++) {
2015-09-18 06:04:33 +02:00
lintWatchFile(lintTargets[i]);
}
});