* Use merge2, gulp-if, gulp-newer, and more projects * Add watch task * Working non-inline sourcemaps for runtests * browser tests now also loads sourcemaps from disk * Lazypipes and better services stream management * export interface used by other exported functions * Make goto-definition work for `this` parameter * Add new error for rest parameters * Add error message for rest parameter properties * Fix case when a document contains multiple script blocks with different base indentations. Use the base indent size if it is greater that the indentation of the inherited predecessor * Fix rwc-runner from breaking change in compiler (#9284) * Signatures use JSDoc to determine optionality * Changed implementation to use closure * Updated tests * Fixed linting error * Adding Code of Conduct notice * Don't crash when JS class property is self-referential. Fixes #9293 * Remove stale baselines * For optionality, check question token before JSDoc * Accept rest parameter properties error baselines * Change binding pattern parameter property error * Accept binding pattern properties error baselines * Lint * Port the sync version diagnostics API from tsserverVS-WIP branch to 2.0 * Do copyright without gulp-if and lazypipe * Change test comment and accept baseline * Remove tsd scripts task from gulpfile * Make use of module compiler option explicit, add strip internal to tsconfigs * Remove Signature#thisType and use Signature#thisParameter everywhere * Add Gulpfile lint to jake, fix lints * Change reference tests to verify actual ranges referenced and not just their count * Respond to PR comments * Add new lint rule * Fix object whitespace lints * Fix case of gulpfile dependencies * 1. pass subshell args 2. fix build order in services 1. /bin/sh requires its arguments joined into a single string unlike cmd. 2. services/ depends on a couple of files from server/ but the order was implicit, and changed from jakefile. Now the order is explicit in the tsconfig. * Fix single-quote lint * Check for exactly one space * Fix excess whitespace issues * Add matchFiles test to Gulpfile This was merged while the gulpfile was still in-progress * Fix LKG useDebug task and newLine flag * Update LKG * Clean before LKG in Gulpfile * Fix lint * Correct the api string name * Allow space in exec cmds * Fix typo * Add new APIs to protocol * Fix bug where `exports.` was prepended to namespace export accesses * Remove unnecessary parameter * extract expression into function * Add fourslash tests & address CR comments * Fix 8549: Using variable as Jsx tagname (#9337) * Parse JSXElement's name as property access instead of just entity name. So when one accesses property of the class through this, checker will check correctly * wip - just resolve to any type for now * Resolve string type to anytype and look up property in intrinsicElementsType of Jsx * Add tests and update baselines * Remove unneccessary comment * wip-address PR * Address PR * Add tets and update baselines * Fix linting error * Unused identifiers compiler code (#9200) * Code changes to update references of the Identifiers * Added code for handling function, method and coonstructor level local variables and parameters * Rebased with origin master * Code changes to handle unused private variables, private methods and typed parameters * Code changes to handle namespace level elements * Code changes to handle unimplemented interfaces * Code to optimize the d.ts check * Correct Code change to handle the parameters for methods inside interfaces * Fix for lint error * Remove Trailing whitespace * Code changes to handle interface implementations * Changes to display the error position correctly * Compiler Test Cases * Adding condition to ignore constructor parameters * Removing unnecessary tests * Additional changes for compiler code * Additional changes to handle constructor scenario * Fixing the consolidated case * Changed logic to search for private instead of public * Response to PR Comments * Changed the error code in test cases as result of merge with master * Adding the missing file * Adding the missing file II * Response to PR comments * Code changes for checking unused imports * Test Cases for Unused Imports * Response to PR comments * Code change specific to position of Import Declaration * Code change for handling the position for unused import * New scenarios for handling parameters in lambda function, type parameters in methods, etc. * Additional scenarios based on PR comments * Removing a redundant check * Added ambient check to imports and typeparatmeter reporting * Added one more scenario to handle type parameters * Added new scenario for TypeParameter on Interface * Refactoring the code * Added scenario to handle private class elements declared in constructor. * Minor change to erro reporting * Fix 8355: Fix emit metadata different between transpile and tsc --isolatedModule (#9232) * Instead of returning undefined for unknownSymbol return itself * Add Transpile unittest * Wip - Add project tests * Add project tests and baselines * Update existed tests * Add tests for emitting metadata with module targetting system * Fix 8467: Fix incorrect emit for accessing static property in static propertyDeclaration (#8551) * Fix incorrect emit for accessing static property in static propertyDeclaration * Update tests and baselines * Update function name * Fix when accessing static property inside arrow function * Add tests and baselines * do not format comma/closeparen in jsxelement * format jsx expression * Remove extra baselines * Fixed bugs and linting * Added project tests for node_modules JavaScript searches * Removed old TODO comment * make rules optional * Fixed the regexp for removing full paths * Fix type of the disableSizeLimit option * Update version to 2.0.0 * Remove upper boilerplate from issue template Our issue stats did not improve appreciably when we added the issue template. Reduce upper boilerplate text and try to make it more action-oriented * Remove unused compiler option (#9381) * Update LKG * Added emitHost method to return source from node modules * Marked new method internal * Update issue_template.md * new options should be optional for compatibility * Add getCurrentDirectory to ServerHost * Add nullchecks for typeRoots, remove getCurrentDirectory from ServerHost as it is always the installation location * VarDate interface and relevant Date.prototype members * Port 9396 to release 2.0 * Fix 9363: Object destructuring broken-variables are bound to the wrong object (#9383) * Fix emit incorrect destructuring mapping in var declaration * Add tests and baselines * Add additional tests and baselines * Fix crash in async functions when targetting ES5. When targetting ES5 and with --noImplicitReturns, an async function whose return type could not be determined would cause a compiler crash. * Add This type to lib * Merge master into release-2.0 (#9400) * do not format comma/closeparen in jsxelement * format jsx expression * make rules optional * Remove upper boilerplate from issue template Our issue stats did not improve appreciably when we added the issue template. Reduce upper boilerplate text and try to make it more action-oriented * Update issue_template.md * new options should be optional for compatibility * Add getCurrentDirectory to ServerHost * Add nullchecks for typeRoots, remove getCurrentDirectory from ServerHost as it is always the installation location * VarDate interface and relevant Date.prototype members * Fix 9363: Object destructuring broken-variables are bound to the wrong object (#9383) * Fix emit incorrect destructuring mapping in var declaration * Add tests and baselines * Add additional tests and baselines * Fix #9402: Do not report unused identifier errors for catch variables * getVarDate should be on the Date interface * Defere checking unsed identifier checks * Do not scan nodes preceding formatted region, just skip over them * Don't emit source files found under node_modules * Destructuring assignment removes undefined from type when default value is given * Add nullcheck when calculating indentations for implort clause * Use a deferred list to check for unused identifiers * push checks to checkUnusedIdentifiersDeferred * use isParameterPropertyDeclaration to test for paramter propoerties * runtests-parallel skips empty buckets Previously, it would enter them as buckets with no tests, which would make our test runners run *every* test. This was very obvious on machines with lots of cores. * Report unused identifiers in for statements * Do not check ambients, and overloads * Add tests * Consolidate type reference marking in getTypeFromTypeReference * Handel type aliases * Add tests * Add test * Dont load JavaScript if types packages are present * Renamed API * Use checkExpression, not checkExpressionCached * Do not report unused errors for module augmentations * Consolidate refernce marking in resolveName to allow marking aliases correctelly * add tests * Code review comments * Only mark symbols found in a local symbol table * Show "<unknown>" if the name of a declaration is unavailable * Parse `export default async function` as a declaration * Respond to PR comments * Better name for test * handel private properties correctelly * Port 9426 to release 2.0 * Handel Swtich statements check for locals on for statments only mark private properties * Removed one error to avoid full path issues * Don't emit source files found under node_modules (cherry picked from commit5f8cf1af3e
) * Dont load JavaScript if types packages are present (cherry picked from commit5a45c44eb7
) * Renamed API (cherry picked from commitd8047b607f
) * Removed one error to avoid full path issues (cherry picked from commit5e4f13f342
) * Fix incorrectly-saved quote symbols in ThirdPartyNoticeText.txt * Fix #9458: exclude parameters starting with underscore from unusedParamter checks * change variable name for strict mode * Increase timeout from running RWC. As UWDWeb takes slightly longer now (#9454) * Handle relative paths in tsconfig exclude and include globs * Merge master into release branch 06/30 (#9447) * do not format comma/closeparen in jsxelement * format jsx expression * make rules optional * Remove upper boilerplate from issue template Our issue stats did not improve appreciably when we added the issue template. Reduce upper boilerplate text and try to make it more action-oriented * Update issue_template.md * new options should be optional for compatibility * Add getCurrentDirectory to ServerHost * Add nullchecks for typeRoots, remove getCurrentDirectory from ServerHost as it is always the installation location * VarDate interface and relevant Date.prototype members * Fix 9363: Object destructuring broken-variables are bound to the wrong object (#9383) * Fix emit incorrect destructuring mapping in var declaration * Add tests and baselines * Add additional tests and baselines * Fix crash in async functions when targetting ES5. When targetting ES5 and with --noImplicitReturns, an async function whose return type could not be determined would cause a compiler crash. * Add This type to lib * getVarDate should be on the Date interface * Don't emit source files found under node_modules * Destructuring assignment removes undefined from type when default value is given * Add nullcheck when calculating indentations for implort clause * Add test * Dont load JavaScript if types packages are present * Renamed API * Use checkExpression, not checkExpressionCached * Show "<unknown>" if the name of a declaration is unavailable * Parse `export default async function` as a declaration * Removed one error to avoid full path issues * Fix incorrectly-saved quote symbols in ThirdPartyNoticeText.txt * Improve names of whitespace functions * Handle relative paths in tsconfig exclude and include globs Port 9475 to release 2.0 * add new method getEmitOutputObject to return result of the emit as object with properties instead of json string * fix linter * Fix PromiseLike to be compatible with es6-promise (#9484) * Fix reading files from IOLog because previous our API captures (#9483) * Fix reading files from IOLog because previous our API captures * Refactoring the ioLog * Exclude FlowSwitchClause from flow graph for case expressions * Add regression test * Update LKG * Update language in comment * Add .mailmap file * Add authors script to generate authors from repo * Update AUTHORS.md for release-2.0 * Update script to pass more than one argument * Remove the unused text buffer from ScriptInfo * Fix #9531: account for async as an contextual keyword when parsing export assignments * Update LKG * Swap q from a reference to an import * Fix #9550: exclude 'this' type parameters from unusedParameters checks. * Update comment to reflect new dependency * Avoid putting children tags in jsdoccomment * Parse the result of getDirectories call * Update harness getDirectories implementation for shims * Fix multiple Salsa assignment-declarations Previously, all assignment-declarations needed to be of the same kind: either all `this.p = ...` assignments or `C.prototype.p = ...` assignments. * Test for multiple salsa assignment-declarations * Add test for parsed @typedef tag node shape * Provide a symbol for salsa-inferred class types * Update .mailmap * Fix module tracking * Updated test with relative import * Fixed the node tracking and a harness bug * fixed lint error * Fixed implicit any * Added missing test files * Removed duplicate logic * Update conflicting baseline. PR #9574 added a baseline that #9578 caused to be changed. The two PRs went in so close to each other that the CI build didn't catch the change to the new test's baseline. * Fix type of JSXTagName * Update baselines to use double-quote * Update baselines when emitting metadata decorator * Update baselines for async-await function * Update baselines for comment in capturing down-level for...of and for...in * Add missing Transpile tests * Remove old JS transpile baselines * Passing program as argument in emitWorker * Port PR#9607 transforms * Port new JSDOC tests to use baseline * substitute alias for class expression in statics * Address new lint warnings * Change name for substitution function.
366 lines
No EOL
11 KiB
TypeScript
366 lines
No EOL
11 KiB
TypeScript
var tty = require("tty")
|
|
, readline = require("readline")
|
|
, fs = require("fs")
|
|
, path = require("path")
|
|
, child_process = require("child_process")
|
|
, os = require("os")
|
|
, mocha = require("mocha")
|
|
, Base = mocha.reporters.Base
|
|
, color = Base.color
|
|
, cursor = Base.cursor
|
|
, ms = require("mocha/lib/ms");
|
|
|
|
var isatty = tty.isatty(1) && tty.isatty(2);
|
|
var tapRangePattern = /^(\d+)\.\.(\d+)(?:$|\r\n?|\n)/;
|
|
var tapTestPattern = /^(not\sok|ok)\s+(\d+)\s+(?:-\s+)?(.*)$/;
|
|
var tapCommentPattern = /^#(?: (tests|pass|fail) (\d+)$)?/;
|
|
|
|
exports.runTestsInParallel = runTestsInParallel;
|
|
exports.ProgressBars = ProgressBars;
|
|
|
|
function runTestsInParallel(taskConfigsFolder, run, options, cb) {
|
|
if (options === undefined) options = { };
|
|
|
|
return discoverTests(run, options, function (error) {
|
|
if (error) {
|
|
return cb(error);
|
|
}
|
|
|
|
return runTests(taskConfigsFolder, run, options, cb);
|
|
});
|
|
}
|
|
|
|
function discoverTests(run, options, cb) {
|
|
console.log("Discovering tests...");
|
|
|
|
var cmd = "mocha -R " + require.resolve("./mocha-none-reporter.js") + " " + run;
|
|
var p = spawnProcess(cmd);
|
|
p.on("exit", function (status) {
|
|
if (status) {
|
|
cb(new Error("Process exited with code " + status));
|
|
}
|
|
else {
|
|
cb();
|
|
}
|
|
});
|
|
}
|
|
|
|
function runTests(taskConfigsFolder, run, options, cb) {
|
|
var configFiles = fs.readdirSync(taskConfigsFolder);
|
|
var numPartitions = configFiles.length;
|
|
if (numPartitions <= 0) {
|
|
cb();
|
|
return;
|
|
}
|
|
|
|
console.log("Running tests on " + numPartitions + " threads...");
|
|
|
|
var partitions = Array(numPartitions);
|
|
var progressBars = new ProgressBars();
|
|
progressBars.enable();
|
|
|
|
var counter = numPartitions;
|
|
configFiles.forEach(runTestsInPartition);
|
|
|
|
function runTestsInPartition(file, index) {
|
|
var partition = {
|
|
file: path.join(taskConfigsFolder, file),
|
|
tests: 0,
|
|
passed: 0,
|
|
failed: 0,
|
|
completed: 0,
|
|
current: undefined,
|
|
start: undefined,
|
|
end: undefined,
|
|
failures: []
|
|
};
|
|
partitions[index] = partition;
|
|
|
|
// Set up the progress bar.
|
|
updateProgress(0);
|
|
|
|
// Start the background process.
|
|
var cmd = "mocha -t " + (options.testTimeout || 20000) + " -R tap --no-colors " + run + " --config='" + partition.file + "'";
|
|
var p = spawnProcess(cmd);
|
|
var rl = readline.createInterface({
|
|
input: p.stdout,
|
|
terminal: false
|
|
});
|
|
rl.on("line", onmessage);
|
|
p.on("exit", onexit)
|
|
|
|
function onmessage(line) {
|
|
if (partition.start === undefined) {
|
|
partition.start = Date.now();
|
|
}
|
|
|
|
var rangeMatch = tapRangePattern.exec(line);
|
|
if (rangeMatch) {
|
|
partition.tests = parseInt(rangeMatch[2]);
|
|
return;
|
|
}
|
|
|
|
var testMatch = tapTestPattern.exec(line);
|
|
if (testMatch) {
|
|
var test = {
|
|
result: testMatch[1],
|
|
id: parseInt(testMatch[2]),
|
|
name: testMatch[3],
|
|
output: []
|
|
};
|
|
|
|
partition.current = test;
|
|
partition.completed++;
|
|
|
|
if (test.result === "ok") {
|
|
partition.passed++;
|
|
}
|
|
else {
|
|
partition.failed++;
|
|
partition.failures.push(test);
|
|
}
|
|
|
|
var progress = partition.completed / partition.tests;
|
|
if (progress < 1) {
|
|
updateProgress(progress);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
var commentMatch = tapCommentPattern.exec(line);
|
|
if (commentMatch) {
|
|
switch (commentMatch[1]) {
|
|
case "tests":
|
|
partition.current = undefined;
|
|
partition.tests = parseInt(commentMatch[2]);
|
|
break;
|
|
|
|
case "pass":
|
|
partition.passed = parseInt(commentMatch[2]);
|
|
break;
|
|
|
|
case "fail":
|
|
partition.failed = parseInt(commentMatch[2]);
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if (partition.current) {
|
|
partition.current.output.push(line);
|
|
}
|
|
}
|
|
|
|
function onexit() {
|
|
if (partition.end === undefined) {
|
|
partition.end = Date.now();
|
|
}
|
|
|
|
partition.duration = partition.end - partition.start;
|
|
var summaryColor = partition.failed ? "fail" : "green";
|
|
var summarySymbol = partition.failed ? Base.symbols.err : Base.symbols.ok;
|
|
var summaryTests = (partition.passed === partition.tests ? partition.passed : partition.passed + "/" + partition.tests) + " passing";
|
|
var summaryDuration = "(" + ms(partition.duration) + ")";
|
|
var savedUseColors = Base.useColors;
|
|
Base.useColors = !options.noColors;
|
|
|
|
var summary = color(summaryColor, summarySymbol + " " + summaryTests) + " " + color("light", summaryDuration);
|
|
Base.useColors = savedUseColors;
|
|
|
|
updateProgress(1, summary);
|
|
|
|
signal();
|
|
}
|
|
|
|
function updateProgress(percentComplete, title) {
|
|
var progressColor = "pending";
|
|
if (partition.failed) {
|
|
progressColor = "fail";
|
|
}
|
|
|
|
progressBars.update(
|
|
index,
|
|
percentComplete,
|
|
progressColor,
|
|
title
|
|
);
|
|
}
|
|
}
|
|
|
|
function signal() {
|
|
counter--;
|
|
|
|
if (counter <= 0) {
|
|
var reporter = new Base(),
|
|
stats = reporter.stats,
|
|
failures = reporter.failures;
|
|
|
|
var duration = 0;
|
|
for (var i = 0; i < numPartitions; i++) {
|
|
var partition = partitions[i];
|
|
stats.passes += partition.passed;
|
|
stats.failures += partition.failed;
|
|
stats.tests += partition.tests;
|
|
duration += partition.duration;
|
|
for (var j = 0; j < partition.failures.length; j++) {
|
|
var failure = partition.failures[j];
|
|
failures.push(makeMochaTest(failure));
|
|
}
|
|
}
|
|
|
|
stats.duration = duration;
|
|
progressBars.disable();
|
|
|
|
if (options.noColors) {
|
|
var savedUseColors = Base.useColors;
|
|
Base.useColors = false;
|
|
reporter.epilogue();
|
|
Base.useColors = savedUseColors;
|
|
}
|
|
else {
|
|
reporter.epilogue();
|
|
}
|
|
|
|
if (stats.failures) {
|
|
return cb(new Error("Test failures reported: " + stats.failures));
|
|
}
|
|
else {
|
|
return cb();
|
|
}
|
|
}
|
|
}
|
|
|
|
function makeMochaTest(test) {
|
|
return {
|
|
fullTitle: function() {
|
|
return test.name;
|
|
},
|
|
err: {
|
|
message: test.output[0],
|
|
stack: test.output.join(os.EOL)
|
|
}
|
|
};
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
function spawnProcess(cmd, options) {
|
|
var shell = process.platform === "win32" ? "cmd" : "/bin/sh";
|
|
var prefix = process.platform === "win32" ? "/c" : "-c";
|
|
return child_process.spawn(shell, [prefix, cmd], { windowsVerbatimArguments: true });
|
|
}
|
|
|
|
function ProgressBars(options) {
|
|
if (!options) options = {};
|
|
var open = options.open || '[';
|
|
var close = options.close || ']';
|
|
var complete = options.complete || '▬';
|
|
var incomplete = options.incomplete || Base.symbols.dot;
|
|
var maxWidth = Math.floor(Base.window.width * .30) - open.length - close.length - 2;
|
|
var width = minMax(options.width || maxWidth, 10, maxWidth);
|
|
this._options = {
|
|
open: open,
|
|
complete: complete,
|
|
incomplete: incomplete,
|
|
close: close,
|
|
width: width
|
|
};
|
|
|
|
this._progressBars = [];
|
|
this._lineCount = 0;
|
|
this._enabled = false;
|
|
}
|
|
ProgressBars.prototype = {
|
|
enable: function () {
|
|
if (!this._enabled) {
|
|
process.stdout.write(os.EOL);
|
|
this._enabled = true;
|
|
}
|
|
},
|
|
disable: function () {
|
|
if (this._enabled) {
|
|
process.stdout.write(os.EOL);
|
|
this._enabled = false;
|
|
}
|
|
},
|
|
update: function (index, percentComplete, color, title) {
|
|
percentComplete = minMax(percentComplete, 0, 1);
|
|
|
|
var progressBar = this._progressBars[index] || (this._progressBars[index] = { });
|
|
var width = this._options.width;
|
|
var n = Math.floor(width * percentComplete);
|
|
var i = width - n;
|
|
if (n === progressBar.lastN && title === progressBar.title && color === progressBar.progressColor) {
|
|
return;
|
|
}
|
|
|
|
progressBar.lastN = n;
|
|
progressBar.title = title;
|
|
progressBar.progressColor = color;
|
|
|
|
var progress = " ";
|
|
progress += this._color('progress', this._options.open);
|
|
progress += this._color(color, fill(this._options.complete, n));
|
|
progress += this._color('progress', fill(this._options.incomplete, i));
|
|
progress += this._color('progress', this._options.close);
|
|
|
|
if (title) {
|
|
progress += this._color('progress', ' ' + title);
|
|
}
|
|
|
|
if (progressBar.text !== progress) {
|
|
progressBar.text = progress;
|
|
this._render(index);
|
|
}
|
|
},
|
|
_render: function (index) {
|
|
if (!this._enabled || !isatty) {
|
|
return;
|
|
}
|
|
|
|
cursor.hide();
|
|
readline.moveCursor(process.stdout, -process.stdout.columns, -this._lineCount);
|
|
var lineCount = 0;
|
|
var numProgressBars = this._progressBars.length;
|
|
for (var i = 0; i < numProgressBars; i++) {
|
|
if (i === index) {
|
|
readline.clearLine(process.stdout, 1);
|
|
process.stdout.write(this._progressBars[i].text + os.EOL);
|
|
}
|
|
else {
|
|
readline.moveCursor(process.stdout, -process.stdout.columns, +1);
|
|
}
|
|
|
|
lineCount++;
|
|
}
|
|
|
|
this._lineCount = lineCount;
|
|
cursor.show();
|
|
},
|
|
_color: function (type, text) {
|
|
return type && !this._options.noColors ? color(type, text) : text;
|
|
}
|
|
};
|
|
|
|
function fill(ch, size) {
|
|
var s = "";
|
|
while (s.length < size) {
|
|
s += ch;
|
|
}
|
|
|
|
return s.length > size ? s.substr(0, size) : s;
|
|
}
|
|
|
|
function minMax(value, min, max) {
|
|
if (value < min) return min;
|
|
if (value > max) return max;
|
|
return value;
|
|
} |