48 lines
		
	
	
		
			970 B
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			970 B
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import chalk from "chalk"
 | 
						|
import process from "process"
 | 
						|
import { isMainThread } from "workerpool"
 | 
						|
 | 
						|
const rootFile = /.*at file:/
 | 
						|
export function trace(msg: string, err: Error) {
 | 
						|
  const stack = err.stack
 | 
						|
 | 
						|
  const lines: string[] = []
 | 
						|
 | 
						|
  lines.push("")
 | 
						|
  lines.push(
 | 
						|
    "\n" +
 | 
						|
      chalk.bgRed.black.bold(" ERROR ") +
 | 
						|
      "\n" +
 | 
						|
      chalk.red(` ${msg}`) +
 | 
						|
      (err.message.length > 0 ? `: ${err.message}` : ""),
 | 
						|
  )
 | 
						|
 | 
						|
  if (!stack) {
 | 
						|
    return
 | 
						|
  }
 | 
						|
 | 
						|
  let reachedEndOfLegibleTrace = false
 | 
						|
  for (const line of stack.split("\n").slice(1)) {
 | 
						|
    if (reachedEndOfLegibleTrace) {
 | 
						|
      break
 | 
						|
    }
 | 
						|
 | 
						|
    if (!line.includes("node_modules")) {
 | 
						|
      lines.push(` ${line}`)
 | 
						|
      if (rootFile.test(line)) {
 | 
						|
        reachedEndOfLegibleTrace = true
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  const traceMsg = lines.join("\n")
 | 
						|
  if (!isMainThread) {
 | 
						|
    // gather lines and throw
 | 
						|
    throw new Error(traceMsg)
 | 
						|
  } else {
 | 
						|
    // print and exit
 | 
						|
    console.error(traceMsg)
 | 
						|
    process.exit(1)
 | 
						|
  }
 | 
						|
}
 |