aboutsummaryrefslogtreecommitdiff
path: root/node_modules/postcss-message-helpers/index.js
blob: e57cc29f662d35520ebe078727adb1d38c7ce9fa (plain)
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
  }
}