parcel-transformer-lezer
Version:
A Parcel transformer for [@lezer/generator](https://github.com/lezer-parser/generator).
78 lines (73 loc) • 1.5 kB
JavaScript
const { Transformer } = require("@parcel/plugin");
const { default: ThrowableDiagnostic } = require("@parcel/diagnostic");
// @ts-ignore
const lezer = require("@lezer/generator");
module.exports = new Transformer({
async transform({ asset, logger }) {
let parser, terms;
try {
({ parser, terms } = lezer.buildParserFile(await asset.getCode(), {
moduleStyle: "es",
warn: (/** @type {string} */ message) => {
let diagnostic = parseError(asset.filePath, message);
logger.warn(diagnostic || { message });
},
}));
} catch (/** @type {any} */ e) {
let diagnostic = parseError(asset.filePath, e.message);
if (diagnostic) {
throw new ThrowableDiagnostic({
diagnostic,
});
} else {
throw e;
}
}
asset.type = "js";
asset.setCode(`
export {parser} from "parser";
export * from "terms";
`);
return [
asset,
{
type: "js",
uniqueKey: "parser",
content: parser,
},
{
type: "js",
uniqueKey: "terms",
content: terms,
},
];
},
});
/**
* @param {string} filePath
* @param {string} message
*/
function parseError(filePath, message) {
let match = message.match(/(.*)\((\d+):(\d+)\)$/s);
if (match) {
let [, msg, line, col] = match;
let pos = {
line: Number(line),
column: Number(col) + 1,
};
return {
message: msg,
codeFrames: [
{
filePath: filePath,
codeHighlights: [
{
start: pos,
end: pos,
},
],
},
],
};
}
}