Skip to content
This repository has been archived by the owner on Feb 1, 2022. It is now read-only.

Commit

Permalink
fix: show stack trace in errlog
Browse files Browse the repository at this point in the history
  • Loading branch information
jdx committed Jan 28, 2018
1 parent eac6e87 commit baa6749
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 44 deletions.
74 changes: 37 additions & 37 deletions src/errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,18 @@ function bangify(msg: string, c: string): string {
return lines.join('\n')
}

export function getErrorMessage(err: any): string {
export function getErrorMessage(err: any, opts: {stack?: boolean} = {}): string {
const severity = (err['cli-ux'] && err['cli-ux'].severity) || 'error'
const context = err['cli-ux'] && err['cli-ux'].context

function wrap(msg: string): string {
const linewrap = require('@heroku/linewrap')
return linewrap(6, deps.screen.errtermwidth, {
skip: /^\$ .*$/,
skipScheme: 'ansi-color',
})(msg)
}

let message
if (err.body) {
// API error
Expand All @@ -46,54 +57,43 @@ export function getErrorMessage(err: any): string {
}
}
// Unhandled error
if (err.message && err.code) {
message = `${inspect(err.code)}: ${err.message}`
} else if (err.message) {
message = err.message
}
const context = err['cli-ux'] && err['cli-ux'].context
if (err.message) message = err.message
if (context && !_.isEmpty(context)) {
message += '\n' + indent(styledObject(err['cli-ux'].context), 4)
}
return message || inspect(err)
}

function displayError(err: CLIError) {
function wrap(msg: string): string {
const linewrap = require('@heroku/linewrap')
return linewrap(6, deps.screen.errtermwidth, {
skip: /^\$ .*$/,
skipScheme: 'ansi-color',
})(msg)
}

function render(): string {
const severity = (err['cli-ux'] && err['cli-ux'].severity) || 'error'
const msg = [
_.upperFirst(severity === 'warn' ? 'warning' : severity),
': ',
getErrorMessage(err),
].join('')
if (process.env.CI || severity === 'fatal' || config.debug) {
// show stack trace
let stack = err.stack || inspect(err)
stack = clean(stack, {pretty: true})
stack = extract(stack)
return [msg, stack].join('\n')
}
message = message || inspect(err)

message = [
_.upperFirst(severity === 'warn' ? 'warning' : severity),
': ',
message,
].join('')

if (opts.stack || process.env.CI || severity === 'fatal' || config.debug) {
// show stack trace
let stack = err.stack || inspect(err)
stack = clean(stack, {pretty: true})
stack = extract(stack)
message = [message, stack].join('\n')
} else {
let bang = severity === 'warn' ? chalk.yellow(arrow) : chalk.red(arrow)
if (severity === 'warn') bang = chalk.yellow(arrow)
return bangify(wrap(msg), bang)
message = bangify(wrap(message), bang)
}
return message
}

function displayError(err: CLIError) {
const severity = (err['cli-ux'] && err['cli-ux'].severity) || 'error'

function getBang(): string {
if (err['cli-ux'].severity === 'warn') return chalk.yellowBright('!')
if (err['cli-ux'].severity === 'fatal') return chalk.bold.bgRedBright('!!!')
if (severity === 'warn') return chalk.yellowBright('!')
if (severity === 'fatal') return chalk.bold.bgRedBright('!!!')
return chalk.bold.redBright('!')
}

config.action.pause(() => {
console.error(render())
console.error(getErrorMessage(err))
}, getBang())
}

Expand Down
10 changes: 5 additions & 5 deletions src/logger.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import * as fs from 'fs-extra'
import * as _ from 'lodash'
import * as path from 'path'

import {config} from './config'
Expand Down Expand Up @@ -43,16 +42,17 @@ export default (e: IEventEmitter) => {

const handleOutput = (m: Output.Message | Errors.Message) => {
if (!canWrite(m.severity)) return
const msg = m.type === 'error' ? Errors.getErrorMessage(m.error) : Output.render(m)
const output = chomp(_([timestamp(), m.severity.toUpperCase(), msg]).compact().join(' '))
buffer.push(deps.stripAnsi(output))
let msg = m.type === 'error' ? Errors.getErrorMessage(m.error, {stack: true}) : Output.render(m)
msg = deps.stripAnsi(chomp(msg))
let lines = msg.split('\n').map(l => `${timestamp()} ${l}`)
buffer.push(...lines)
flush(50).catch(console.error)
}
e.on('output', handleOutput)

async function flush(waitForMs: number = 0) {
await wait(waitForMs)
flushing = flushing.then(async () => {
await wait(waitForMs)
if (!config.errlog || buffer.length === 0) return
const file = config.errlog
const mylines = buffer
Expand Down
4 changes: 2 additions & 2 deletions test/logger.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ describe('logger', () => {
cli.info('hideme')
cli.error('showerror', {exit: false})
await cli.done()
expect(fs.readFileSync(cli.config.errlog!, 'utf8')).to.contain(' ERROR showerror')
expect(fs.readFileSync(cli.config.errlog!, 'utf8')).to.contain(' Warning: showwarning')
})

fancy
Expand All @@ -34,7 +34,7 @@ describe('logger', () => {
cli.debug('hideme')
cli.error('showerror', {exit: false})
await cli.done()
expect(fs.readFileSync(cli.config.errlog!, 'utf8')).to.contain(' ERROR showerror')
expect(fs.readFileSync(cli.config.errlog!, 'utf8')).to.contain(' Error: showerror')
})

fancy
Expand Down

0 comments on commit baa6749

Please sign in to comment.