summaryrefslogtreecommitdiff
path: root/node_modules/postcss/lib/css-syntax-error.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/postcss/lib/css-syntax-error.js')
-rw-r--r--node_modules/postcss/lib/css-syntax-error.js100
1 files changed, 100 insertions, 0 deletions
diff --git a/node_modules/postcss/lib/css-syntax-error.js b/node_modules/postcss/lib/css-syntax-error.js
new file mode 100644
index 0000000..1693033
--- /dev/null
+++ b/node_modules/postcss/lib/css-syntax-error.js
@@ -0,0 +1,100 @@
+'use strict'
+
+let pico = require('picocolors')
+
+let terminalHighlight = require('./terminal-highlight')
+
+class CssSyntaxError extends Error {
+ constructor(message, line, column, source, file, plugin) {
+ super(message)
+ this.name = 'CssSyntaxError'
+ this.reason = message
+
+ if (file) {
+ this.file = file
+ }
+ if (source) {
+ this.source = source
+ }
+ if (plugin) {
+ this.plugin = plugin
+ }
+ if (typeof line !== 'undefined' && typeof column !== 'undefined') {
+ if (typeof line === 'number') {
+ this.line = line
+ this.column = column
+ } else {
+ this.line = line.line
+ this.column = line.column
+ this.endLine = column.line
+ this.endColumn = column.column
+ }
+ }
+
+ this.setMessage()
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, CssSyntaxError)
+ }
+ }
+
+ setMessage() {
+ this.message = this.plugin ? this.plugin + ': ' : ''
+ this.message += this.file ? this.file : '<css input>'
+ if (typeof this.line !== 'undefined') {
+ this.message += ':' + this.line + ':' + this.column
+ }
+ this.message += ': ' + this.reason
+ }
+
+ showSourceCode(color) {
+ if (!this.source) return ''
+
+ let css = this.source
+ if (color == null) color = pico.isColorSupported
+ if (terminalHighlight) {
+ if (color) css = terminalHighlight(css)
+ }
+
+ let lines = css.split(/\r?\n/)
+ let start = Math.max(this.line - 3, 0)
+ let end = Math.min(this.line + 2, lines.length)
+
+ let maxWidth = String(end).length
+
+ let mark, aside
+ if (color) {
+ let { bold, gray, red } = pico.createColors(true)
+ mark = text => bold(red(text))
+ aside = text => gray(text)
+ } else {
+ mark = aside = str => str
+ }
+
+ return lines
+ .slice(start, end)
+ .map((line, index) => {
+ let number = start + 1 + index
+ let gutter = ' ' + (' ' + number).slice(-maxWidth) + ' | '
+ if (number === this.line) {
+ let spacing =
+ aside(gutter.replace(/\d/g, ' ')) +
+ line.slice(0, this.column - 1).replace(/[^\t]/g, ' ')
+ return mark('>') + aside(gutter) + line + '\n ' + spacing + mark('^')
+ }
+ return ' ' + aside(gutter) + line
+ })
+ .join('\n')
+ }
+
+ toString() {
+ let code = this.showSourceCode()
+ if (code) {
+ code = '\n\n' + code + '\n'
+ }
+ return this.name + ': ' + this.message + code
+ }
+}
+
+module.exports = CssSyntaxError
+CssSyntaxError.default = CssSyntaxError