273 lines
24 KiB
JavaScript
273 lines
24 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
exports.__esModule = true;
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
var _supportsColor = require('supports-color');
|
||
|
|
||
|
var _supportsColor2 = _interopRequireDefault(_supportsColor);
|
||
|
|
||
|
var _chalk = require('chalk');
|
||
|
|
||
|
var _chalk2 = _interopRequireDefault(_chalk);
|
||
|
|
||
|
var _terminalHighlight = require('./terminal-highlight');
|
||
|
|
||
|
var _terminalHighlight2 = _interopRequireDefault(_terminalHighlight);
|
||
|
|
||
|
var _warnOnce = require('./warn-once');
|
||
|
|
||
|
var _warnOnce2 = _interopRequireDefault(_warnOnce);
|
||
|
|
||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
|
||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
|
||
|
/**
|
||
|
* The CSS parser throws this error for broken CSS.
|
||
|
*
|
||
|
* Custom parsers can throw this error for broken custom syntax using
|
||
|
* the {@link Node#error} method.
|
||
|
*
|
||
|
* PostCSS will use the input source map to detect the original error location.
|
||
|
* If you wrote a Sass file, compiled it to CSS and then parsed it with PostCSS,
|
||
|
* PostCSS will show the original position in the Sass file.
|
||
|
*
|
||
|
* If you need the position in the PostCSS input
|
||
|
* (e.g., to debug the previous compiler), use `error.input.file`.
|
||
|
*
|
||
|
* @example
|
||
|
* // Catching and checking syntax error
|
||
|
* try {
|
||
|
* postcss.parse('a{')
|
||
|
* } catch (error) {
|
||
|
* if ( error.name === 'CssSyntaxError' ) {
|
||
|
* error //=> CssSyntaxError
|
||
|
* }
|
||
|
* }
|
||
|
*
|
||
|
* @example
|
||
|
* // Raising error from plugin
|
||
|
* throw node.error('Unknown variable', { plugin: 'postcss-vars' });
|
||
|
*/
|
||
|
var CssSyntaxError = function () {
|
||
|
|
||
|
/**
|
||
|
* @param {string} message - error message
|
||
|
* @param {number} [line] - source line of the error
|
||
|
* @param {number} [column] - source column of the error
|
||
|
* @param {string} [source] - source code of the broken file
|
||
|
* @param {string} [file] - absolute path to the broken file
|
||
|
* @param {string} [plugin] - PostCSS plugin name, if error came from plugin
|
||
|
*/
|
||
|
function CssSyntaxError(message, line, column, source, file, plugin) {
|
||
|
_classCallCheck(this, CssSyntaxError);
|
||
|
|
||
|
/**
|
||
|
* @member {string} - Always equal to `'CssSyntaxError'`. You should
|
||
|
* always check error type
|
||
|
* by `error.name === 'CssSyntaxError'` instead of
|
||
|
* `error instanceof CssSyntaxError`, because
|
||
|
* npm could have several PostCSS versions.
|
||
|
*
|
||
|
* @example
|
||
|
* if ( error.name === 'CssSyntaxError' ) {
|
||
|
* error //=> CssSyntaxError
|
||
|
* }
|
||
|
*/
|
||
|
this.name = 'CssSyntaxError';
|
||
|
/**
|
||
|
* @member {string} - Error message.
|
||
|
*
|
||
|
* @example
|
||
|
* error.message //=> 'Unclosed block'
|
||
|
*/
|
||
|
this.reason = message;
|
||
|
|
||
|
if (file) {
|
||
|
/**
|
||
|
* @member {string} - Absolute path to the broken file.
|
||
|
*
|
||
|
* @example
|
||
|
* error.file //=> 'a.sass'
|
||
|
* error.input.file //=> 'a.css'
|
||
|
*/
|
||
|
this.file = file;
|
||
|
}
|
||
|
if (source) {
|
||
|
/**
|
||
|
* @member {string} - Source code of the broken file.
|
||
|
*
|
||
|
* @example
|
||
|
* error.source //=> 'a { b {} }'
|
||
|
* error.input.column //=> 'a b { }'
|
||
|
*/
|
||
|
this.source = source;
|
||
|
}
|
||
|
if (plugin) {
|
||
|
/**
|
||
|
* @member {string} - Plugin name, if error came from plugin.
|
||
|
*
|
||
|
* @example
|
||
|
* error.plugin //=> 'postcss-vars'
|
||
|
*/
|
||
|
this.plugin = plugin;
|
||
|
}
|
||
|
if (typeof line !== 'undefined' && typeof column !== 'undefined') {
|
||
|
/**
|
||
|
* @member {number} - Source line of the error.
|
||
|
*
|
||
|
* @example
|
||
|
* error.line //=> 2
|
||
|
* error.input.line //=> 4
|
||
|
*/
|
||
|
this.line = line;
|
||
|
/**
|
||
|
* @member {number} - Source column of the error.
|
||
|
*
|
||
|
* @example
|
||
|
* error.column //=> 1
|
||
|
* error.input.column //=> 4
|
||
|
*/
|
||
|
this.column = column;
|
||
|
}
|
||
|
|
||
|
this.setMessage();
|
||
|
|
||
|
if (Error.captureStackTrace) {
|
||
|
Error.captureStackTrace(this, CssSyntaxError);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CssSyntaxError.prototype.setMessage = function setMessage() {
|
||
|
/**
|
||
|
* @member {string} - Full error text in the GNU error format
|
||
|
* with plugin, file, line and column.
|
||
|
*
|
||
|
* @example
|
||
|
* error.message //=> 'a.css:1:1: Unclosed block'
|
||
|
*/
|
||
|
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;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Returns a few lines of CSS source that caused the error.
|
||
|
*
|
||
|
* If the CSS has an input source map without `sourceContent`,
|
||
|
* this method will return an empty string.
|
||
|
*
|
||
|
* @param {boolean} [color] whether arrow will be colored red by terminal
|
||
|
* color codes. By default, PostCSS will detect
|
||
|
* color support by `process.stdout.isTTY`
|
||
|
* and `process.env.NODE_DISABLE_COLORS`.
|
||
|
*
|
||
|
* @example
|
||
|
* error.showSourceCode() //=> " 4 | }
|
||
|
* // 5 | a {
|
||
|
* // > 6 | bad
|
||
|
* // | ^
|
||
|
* // 7 | }
|
||
|
* // 8 | b {"
|
||
|
*
|
||
|
* @return {string} few lines of CSS source that caused the error
|
||
|
*/
|
||
|
|
||
|
|
||
|
CssSyntaxError.prototype.showSourceCode = function showSourceCode(color) {
|
||
|
var _this = this;
|
||
|
|
||
|
if (!this.source) return '';
|
||
|
|
||
|
var css = this.source;
|
||
|
if (typeof color === 'undefined') color = _supportsColor2.default;
|
||
|
if (color) css = (0, _terminalHighlight2.default)(css);
|
||
|
|
||
|
var lines = css.split(/\r?\n/);
|
||
|
var start = Math.max(this.line - 3, 0);
|
||
|
var end = Math.min(this.line + 2, lines.length);
|
||
|
|
||
|
var maxWidth = String(end).length;
|
||
|
var colors = new _chalk2.default.constructor({ enabled: true });
|
||
|
|
||
|
function mark(text) {
|
||
|
if (color) {
|
||
|
return colors.red.bold(text);
|
||
|
} else {
|
||
|
return text;
|
||
|
}
|
||
|
}
|
||
|
function aside(text) {
|
||
|
if (color) {
|
||
|
return colors.gray(text);
|
||
|
} else {
|
||
|
return text;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return lines.slice(start, end).map(function (line, index) {
|
||
|
var number = start + 1 + index;
|
||
|
var gutter = ' ' + (' ' + number).slice(-maxWidth) + ' | ';
|
||
|
if (number === _this.line) {
|
||
|
var spacing = aside(gutter.replace(/\d/g, ' ')) + line.slice(0, _this.column - 1).replace(/[^\t]/g, ' ');
|
||
|
return mark('>') + aside(gutter) + line + '\n ' + spacing + mark('^');
|
||
|
} else {
|
||
|
return ' ' + aside(gutter) + line;
|
||
|
}
|
||
|
}).join('\n');
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Returns error position, message and source code of the broken part.
|
||
|
*
|
||
|
* @example
|
||
|
* error.toString() //=> "CssSyntaxError: app.css:1:1: Unclosed block
|
||
|
* // > 1 | a {
|
||
|
* // | ^"
|
||
|
*
|
||
|
* @return {string} error position, message and source code
|
||
|
*/
|
||
|
|
||
|
|
||
|
CssSyntaxError.prototype.toString = function toString() {
|
||
|
var code = this.showSourceCode();
|
||
|
if (code) {
|
||
|
code = '\n\n' + code + '\n';
|
||
|
}
|
||
|
return this.name + ': ' + this.message + code;
|
||
|
};
|
||
|
|
||
|
_createClass(CssSyntaxError, [{
|
||
|
key: 'generated',
|
||
|
get: function get() {
|
||
|
(0, _warnOnce2.default)('CssSyntaxError#generated is deprecated. Use input instead.');
|
||
|
return this.input;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @memberof CssSyntaxError#
|
||
|
* @member {Input} input - Input object with PostCSS internal information
|
||
|
* about input file. If input has source map
|
||
|
* from previous tool, PostCSS will use origin
|
||
|
* (for example, Sass) source. You can use this
|
||
|
* object to get PostCSS input source.
|
||
|
*
|
||
|
* @example
|
||
|
* error.input.file //=> 'a.css'
|
||
|
* error.file //=> 'a.sass'
|
||
|
*/
|
||
|
|
||
|
}]);
|
||
|
|
||
|
return CssSyntaxError;
|
||
|
}();
|
||
|
|
||
|
exports.default = CssSyntaxError;
|
||
|
module.exports = exports['default'];
|
||
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNzcy1zeW50YXgtZXJyb3IuZXM2Il0sIm5hbWVzIjpbIkNzc1N5bnRheEVycm9yIiwibWVzc2FnZSIsImxpbmUiLCJjb2x1bW4iLCJzb3VyY2UiLCJmaWxlIiwicGx1Z2luIiwibmFtZSIsInJlYXNvbiIsInNldE1lc3NhZ2UiLCJFcnJvciIsImNhcHR1cmVTdGFja1RyYWNlIiwic2hvd1NvdXJjZUNvZGUiLCJjb2xvciIsImNzcyIsImxpbmVzIiwic3BsaXQiLCJzdGFydCIsIk1hdGgiLCJtYXgiLCJlbmQiLCJtaW4iLCJsZW5ndGgiLCJtYXhXaWR0aCIsIlN0cmluZyIsImNvbG9ycyIsImNvbnN0cnVjdG9yIiwiZW5hYmxlZCIsIm1hcmsiLCJ0ZXh0IiwicmVkIiwiYm9sZCIsImFzaWRlIiwiZ3JheSIsInNsaWNlIiwibWFwIiwiaW5kZXgiLCJudW1iZXIiLCJndXR0ZXIiLCJzcGFjaW5nIiwicmVwbGFjZSIsImpvaW4iLCJ0b1N0cmluZyIsImNvZGUiLCJpbnB1dCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUVBOzs7O0FBQ0E7Ozs7Ozs7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTJCTUEsYzs7QUFFRjs7Ozs7Ozs7QUFRQSw0QkFBWUMsT0FBWixFQUFxQkMsSUFBckIsRUFBMkJDLE1BQTNCLEVBQW1DQyxNQUFuQyxFQUEyQ0MsSUFBM0MsRUFBaURDLE1BQWpELEVBQXlEO0FBQUE7O0FBQ3JEOzs7Ozs7Ozs7Ozs7QUFZQSxhQUFLQyxJQUFMLEdBQWMsZ0JBQWQ7QUFDQTs7Ozs7O0FBTUEsYUFBS0MsTUFBTCxHQUFjUCxPQUFkOztBQUVBLFlBQUtJLElBQUwsRUFBWTtBQUNSOzs7Ozs7O0FBT0EsaUJBQUtBLElBQUwsR0FBWUEsSUFBWjtBQUNIO0FBQ0QsWUFBS0QsTUFBTCxFQUFjO0FBQ1Y7Ozs7Ozs7QUFPQSxpQkFBS0EsTUFBTCxHQUFjQSxNQUFkO0FBQ0g7QUFDRCxZQUFLRSxNQUFMLEVBQWM7QUFDVjs7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
|