UNPKG

@marko/compiler

Version:
112 lines (103 loc) 2.92 kB
"use strict";exports.__esModule = true;exports.buildCodeFrameError = buildCodeFrameError;var _babel = require("@marko/compiler/internal/babel"); var _modules = require("@marko/compiler/modules"); var _kleur = _interopRequireDefault(require("kleur")); var _path = _interopRequireDefault(require("path")); var _stripAnsi = require("./strip-ansi");function _interopRequireDefault(e) {return e && e.__esModule ? e : { default: e };} const indent = " "; class CompileError extends Error { constructor(filename, code, loc, label) { const prettyMessage = buildMessage(code, loc, label); const prettyFileName = buildFileName(filename, loc); const message = loc ? `\n${indent}at ${prettyFileName}\n${prettyMessage.replace( /^/gm, indent )}` : `${prettyMessage}\n${indent}at ${prettyFileName}`; const { stackTraceLimit } = Error; Error.stackTraceLimit = loc ? 0 : 3; super(message); Error.captureStackTrace?.(this, buildCodeFrameError); this.name = "CompileError"; Error.stackTraceLimit = stackTraceLimit; Object.defineProperties(this, { loc: { value: loc, enumerable: false, writable: true, configurable: true }, label: { value: label, enumerable: false, writable: true, configurable: true }, frame: { value: prettyMessage, enumerable: false, writable: true, configurable: true }, // Ignore some mutations from Babel. code: { enumerable: false, configurable: true, get: noop, set: noop }, message: { enumerable: true, configurable: true, get() { return message; }, set() { Object.defineProperty(this, "message", { value: message, enumerable: true, writable: true, configurable: true }); } } }); } toJSON() { return this.toString(); } toString() { return `${this.name}: ${(0, _stripAnsi.stripAnsi)(this.message)}`; } } function buildCodeFrameError(filename, code, loc, label) { return new CompileError(filename, code, loc, label); } function buildMessage(code, loc, message) { return loc ? (0, _babel.codeFrameColumns)( code, { start: { line: loc.start.line, column: loc.start.column + 1 }, end: loc.end && loc.start.line === loc.end.line ? { line: loc.end.line, column: loc.end.column + 1 } : undefined }, { highlightCode: true, message } ) : message; } function buildFileName(filename, loc) { return `${_kleur.default.cyan(_path.default.relative(_modules.cwd, filename))}${ loc ? `:${_kleur.default.yellow(loc.start.line)}:${_kleur.default.yellow(loc.start.column + 1)}` : ""}`; } function noop() {}