index.js 1.74 KB
Newer Older
YazhouChen's avatar
YazhouChen committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
/**
 * Constants
 */
var SPLITTER = "\n    at "

/**
 * PostCSS helpers
 */
module.exports = {
  sourceString: sourceString,
  message: formatMessage,
  try: tryCatch
}

/**
 * Returns GNU style source
 *
 * @param {Object} source
 */
function sourceString(source) {
  var message = "<css input>"
  if (source) {
    if (source.input && source.input.file) {
      message = source.input.file
    }
    if (source.start) {
      message += ":" + source.start.line + ":" + source.start.column
    }
  }

  return message
}

/**
 * Returns a GNU style message
 *
 * @param  {String} message
 * @param  {Object} source a PostCSS source object
 * @return {String}
 */
function formatMessage(message, source) {
  return sourceString(source) + ": " + message
}

/**
 * Do something and throw an error with enhanced exception (from given source)
 *
 * @param {Function} fn     [description]
 * @param {[type]}   source [description]
 */
function tryCatch(fn, source) {
  try {
    return fn()
  }
  catch (err) {
    err.originalMessage = err.message
    err.message = formatMessage(err.message, source)

    // if source seems interesting, enhance error
    if (typeof source === "object") {
      // add a stack item if something interesting available
      if ((source.input && source.input.file) || source.start) {
        var stack = err.stack.split(SPLITTER)
        var firstStackItem = stack.shift()
        stack.unshift(sourceString(source))
        stack.unshift(firstStackItem)
        err.stack = stack.join(SPLITTER)
      }

      if (source.input && source.input.file) {
        err.fileName = source.input.file
      }
      if (source.start) {
        err.lineNumber = source.start.line
        err.columnNumber = source.start.column
      }
    }

    throw err
  }
}