index.js
1.74 KB
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
}
}