@ui5/linter
Version:
A static code analysis tool for UI5
59 lines • 2.26 kB
JavaScript
import { SaxEventType, Tag as SaxTag, Text as SaxText } from "sax-wasm";
import { taskStart } from "../../utils/perf.js";
import Parser from "./Parser.js";
import { getLogger } from "@ui5/logger";
import { MESSAGE } from "../messages.js";
import { loadApiExtract } from "../../utils/ApiExtract.js";
import { parseXml, initSaxWasm } from "../../utils/xmlParser.js";
const log = getLogger("linter:xmlTemplate:transpiler");
let apiExtract;
export default async function transpileXml(resourcePath, contentStream, context, controllerByIdInfo) {
await init();
try {
const taskEnd = taskStart("Transpile XML", resourcePath, true);
const res = await transpileXmlToJs(resourcePath, contentStream, context, controllerByIdInfo);
taskEnd();
if (!res.source) {
log.verbose(`XML transpiler returned no result for ${resourcePath}`);
return res;
}
return res;
}
catch (err) {
const message = err instanceof Error ? err.message : String(err);
context.addLintingMessage(resourcePath, MESSAGE.PARSING_ERROR, { message });
}
}
let initializing;
async function init() {
// eslint-disable-next-line @typescript-eslint/no-misused-promises
if (initializing) {
return initializing;
}
const taskEnd = taskStart("XML Transpiler initialization");
return initializing = Promise.all([
loadApiExtract(),
initSaxWasm(),
]).then(([apiExtractRes]) => {
apiExtract = apiExtractRes;
taskEnd();
});
}
async function transpileXmlToJs(resourcePath, contentStream, context, controllerByIdInfo) {
const parser = new Parser(resourcePath, apiExtract, context, controllerByIdInfo);
await parseXml(contentStream, (event, data) => {
if (data instanceof SaxTag) {
if (event === SaxEventType.OpenTag) {
parser.pushTag(data.toJSON());
}
else if (event === SaxEventType.CloseTag) {
parser.popTag(data.toJSON());
}
}
else if (data instanceof SaxText && event === SaxEventType.Comment) {
parser.parseComment(data.toJSON());
}
});
return parser.generate();
}
//# sourceMappingURL=transpiler.js.map