"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _path = _interopRequireDefault(require("path")); var _os = _interopRequireDefault(require("os")); var _fs = _interopRequireDefault(require("fs")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // A typical sass error looks like this // const SassError = { // message: "invalid property name", // column: 14, // line: 1, // file: "stdin", // status: 1 // }; /** * Enhances the sass error with additional information about what actually went wrong. * * @param {SassError} error * @param {string} resourcePath */ function formatSassError(error, resourcePath) { // Instruct webpack to hide the JS stack from the console // Usually you're only interested in the SASS stack in this case. // eslint-disable-next-line no-param-reassign error.hideStack = true; // The file property is missing in rare cases. // No improvement in the error is possible. if (!error.file) { return; } let msg = error.message; if (error.file === 'stdin') { // eslint-disable-next-line no-param-reassign error.file = resourcePath; } // node-sass returns UNIX-style paths // eslint-disable-next-line no-param-reassign error.file = _path.default.normalize(error.file); // The 'Current dir' hint of node-sass does not help us, we're providing // additional information by reading the err.file property msg = msg.replace(/\s*Current dir:\s*/, ''); // msg = msg.replace(/(\s*)(stdin)(\s*)/, `$1${err.file}$3`); // eslint-disable-next-line no-param-reassign error.message = `${getFileExcerptIfPossible(error) + msg.charAt(0).toUpperCase() + msg.slice(1) + _os.default.EOL} in ${error.file} (line ${error.line}, column ${error.column})`; } /** * Tries to get an excerpt of the file where the error happened. * Uses err.line and err.column. * * Returns an empty string if the excerpt could not be retrieved. * * @param {SassError} error * @returns {string} */ function getFileExcerptIfPossible(error) { try { const content = _fs.default.readFileSync(error.file, 'utf8'); return `${_os.default.EOL + content.split(/\r?\n/)[error.line - 1] + _os.default.EOL + new Array(error.column - 1).join(' ')}^${_os.default.EOL} `; } catch (ignoreError) { // If anything goes wrong here, we don't want any errors to be reported to the user return ''; } } var _default = formatSassError; exports.default = _default;