diff --git a/lib/reporters/mini.js b/lib/reporters/mini.js index 7e8a4d853..09c8cd6c6 100644 --- a/lib/reporters/mini.js +++ b/lib/reporters/mini.js @@ -254,6 +254,11 @@ class MiniReporter { } writeErr(evt) { + if (evt.err.name === 'TSError' && evt.err.object && evt.err.object.diagnosticText) { + this.lineWriter.writeLine(colors.errorStack(trimOffNewlines(evt.err.object.diagnosticText))); + return; + } + if (evt.err.source) { this.lineWriter.writeLine(colors.errorSource(`${evt.err.source.file}:${evt.err.source.line}`)); const excerpt = codeExcerpt(evt.err.source, {maxWidth: this.lineWriter.columns - 2}); diff --git a/lib/reporters/verbose.js b/lib/reporters/verbose.js index c5e0a553d..93ee13bfe 100644 --- a/lib/reporters/verbose.js +++ b/lib/reporters/verbose.js @@ -198,6 +198,11 @@ class VerboseReporter { } writeErr(evt) { + if (evt.err.name === 'TSError' && evt.err.object && evt.err.object.diagnosticText) { + this.lineWriter.writeLine(colors.errorStack(trimOffNewlines(evt.err.object.diagnosticText))); + return; + } + if (evt.err.source) { this.lineWriter.writeLine(colors.errorSource(`${evt.err.source.file}:${evt.err.source.line}`)); const excerpt = codeExcerpt(evt.err.source, {maxWidth: this.reportStream.columns - 2}); diff --git a/test/fixture/report/typescript/build-error.ts b/test/fixture/report/typescript/build-error.ts new file mode 100644 index 000000000..ee3699e6a --- /dev/null +++ b/test/fixture/report/typescript/build-error.ts @@ -0,0 +1,2 @@ +trigger.a.build.error(); +lets.do.another(); diff --git a/test/fixture/report/typescript/package.json b/test/fixture/report/typescript/package.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/test/fixture/report/typescript/package.json @@ -0,0 +1 @@ +{} diff --git a/test/fixture/report/typescript/tsconfig.json b/test/fixture/report/typescript/tsconfig.json new file mode 100644 index 000000000..2b6ea3f2f --- /dev/null +++ b/test/fixture/report/typescript/tsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "strict": true + } +} diff --git a/test/helper/report.js b/test/helper/report.js index 844978da5..a4c2e1fab 100644 --- a/test/helper/report.js +++ b/test/helper/report.js @@ -63,6 +63,7 @@ exports.assert = (t, logFile, buffer, stripOptions) => { exports.sanitizers = { cwd: str => replaceString(str, process.cwd(), '~'), + lineEndings: str => replaceString(str, '\r\n', '\n'), posix: str => replaceString(str, '\\', '/'), slow: str => str.replace(/(slow.+?)\(\d+m?s\)/g, '$1 (000ms)'), // At least in Appveyor with Node.js 6, IPC can overtake stdout/stderr. This @@ -80,7 +81,7 @@ exports.sanitizers = { const run = (type, reporter) => { const projectDir = path.join(__dirname, '../fixture/report', type.toLowerCase()); - const api = createApi({ + const options = { extensions: { all: ['js'], enhancementsOnly: [], @@ -90,7 +91,7 @@ const run = (type, reporter) => { failWithoutAssertions: false, serial: type === 'failFast' || type === 'failFast2', require: [], - cacheEnable: true, + cacheEnabled: true, compileEnhancements: true, match: [], babelConfig: {testOptions: {}}, @@ -101,11 +102,21 @@ const run = (type, reporter) => { updateSnapshots: false, snapshotDir: false, color: true - }); + }; + let pattern = '*.js'; + + if (type === 'typescript') { + options.extensions.all.push('ts'); + options.extensions.enhancementsOnly.push('ts'); + options.compileEnhancements = false; + options.require = ['ts-node/register']; + pattern = '*.ts'; + } + const api = createApi(options); api.on('run', plan => reporter.startRun(plan)); - const files = globby.sync('*.js', {cwd: projectDir}).sort(); + const files = globby.sync(pattern, {cwd: projectDir}).sort(); if (type !== 'watch') { return api.run(files).then(() => { reporter.endRun(); @@ -129,3 +140,4 @@ exports.failFast = reporter => run('failFast', reporter); exports.failFast2 = reporter => run('failFast2', reporter); exports.only = reporter => run('only', reporter); exports.watch = reporter => run('watch', reporter); +exports.typescript = reporter => run('typescript', reporter); diff --git a/test/reporters/mini.js b/test/reporters/mini.js index df67cfc74..5c570b73e 100644 --- a/test/reporters/mini.js +++ b/test/reporters/mini.js @@ -8,14 +8,14 @@ const TTYStream = require('../helper/tty-stream'); const report = require('../helper/report'); const MiniReporter = require('../../lib/reporters/mini'); -const run = type => t => { +const run = (type, sanitizers = []) => t => { t.plan(1); const logFile = path.join(__dirname, `mini.${type.toLowerCase()}.log`); const tty = new TTYStream({ columns: 200, - sanitizers: [report.sanitizers.cwd, report.sanitizers.posix, report.sanitizers.unreliableProcessIO, report.sanitizers.version] + sanitizers: [...sanitizers, report.sanitizers.cwd, report.sanitizers.posix, report.sanitizers.unreliableProcessIO, report.sanitizers.version] }); const reporter = new MiniReporter({ spinner: { @@ -41,3 +41,4 @@ test('mini reporter - failFast run', run('failFast')); test('mini reporter - second failFast run', run('failFast2')); test('mini reporter - only run', run('only')); test('mini reporter - watch mode run', run('watch')); +test('mini reporter - typescript', run('typescript', [report.sanitizers.lineEndings])); diff --git a/test/reporters/mini.typescript.log b/test/reporters/mini.typescript.log new file mode 100644 index 000000000..95230dc1a --- /dev/null +++ b/test/reporters/mini.typescript.log @@ -0,0 +1,14 @@ +[?25l---tty-stream-chunk-separator + +---tty-stream-chunk-separator +* ---tty-stream-chunk-separator +---tty-stream-chunk-separator +[?25h + 1 uncaught exception + + Uncaught exception in test/fixture/report/typescript/build-error.ts + + build-error.ts(1,1): error TS2304: Cannot find name 'trigger'. + build-error.ts(2,1): error TS2304: Cannot find name 'lets'. + +---tty-stream-chunk-separator diff --git a/test/reporters/tap.js b/test/reporters/tap.js index 50ae82653..8ff833e3b 100644 --- a/test/reporters/tap.js +++ b/test/reporters/tap.js @@ -8,14 +8,14 @@ const TTYStream = require('../helper/tty-stream'); const report = require('../helper/report'); const TapReporter = require('../../lib/reporters/tap'); -const run = type => t => { +const run = (type, sanitizers = []) => t => { t.plan(1); const logFile = path.join(__dirname, `tap.${type.toLowerCase()}.log`); const tty = new TTYStream({ columns: 200, - sanitizers: [report.sanitizers.cwd, report.sanitizers.posix, report.sanitizers.unreliableProcessIO] + sanitizers: [...sanitizers, report.sanitizers.cwd, report.sanitizers.posix, report.sanitizers.unreliableProcessIO] }); const reporter = new TapReporter({ reportStream: tty, diff --git a/test/reporters/verbose.js b/test/reporters/verbose.js index 577924349..f0ab9dc02 100644 --- a/test/reporters/verbose.js +++ b/test/reporters/verbose.js @@ -8,14 +8,14 @@ const TTYStream = require('../helper/tty-stream'); const report = require('../helper/report'); const VerboseReporter = require('../../lib/reporters/verbose'); -const run = type => t => { +const run = (type, sanitizers = []) => t => { t.plan(1); const logFile = path.join(__dirname, `verbose.${type.toLowerCase()}.log`); const tty = new TTYStream({ columns: 200, - sanitizers: [report.sanitizers.cwd, report.sanitizers.posix, report.sanitizers.slow, report.sanitizers.unreliableProcessIO, report.sanitizers.version] + sanitizers: [...sanitizers, report.sanitizers.cwd, report.sanitizers.posix, report.sanitizers.slow, report.sanitizers.unreliableProcessIO, report.sanitizers.version] }); const reporter = new VerboseReporter({ reportStream: tty, @@ -36,3 +36,4 @@ test('verbose reporter - failFast run', run('failFast')); test('verbose reporter - second failFast run', run('failFast2')); test('verbose reporter - only run', run('only')); test('verbose reporter - watch mode run', run('watch')); +test('verbose reporter - typescript', run('typescript', [report.sanitizers.lineEndings])); diff --git a/test/reporters/verbose.typescript.log b/test/reporters/verbose.typescript.log new file mode 100644 index 000000000..962f1d962 --- /dev/null +++ b/test/reporters/verbose.typescript.log @@ -0,0 +1,14 @@ + +---tty-stream-chunk-separator + Uncaught exception in test/fixture/report/typescript/build-error.ts + + build-error.ts(1,1): error TS2304: Cannot find name 'trigger'. + build-error.ts(2,1): error TS2304: Cannot find name 'lets'. + +---tty-stream-chunk-separator + ✖ test/fixture/report/typescript/build-error.ts exited with a non-zero exit code: 1 +---tty-stream-chunk-separator + + 1 uncaught exception + +---tty-stream-chunk-separator