@marko/compiler
Version:
Marko template to JS compiler.
112 lines (103 loc) • 2.92 kB
JavaScript
;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() {}