@html-eslint/template-parser
Version:
HTML parser for template literals
95 lines (88 loc) • 2.6 kB
JavaScript
/**
* @typedef {import("./types").TemplateHTMLVisitor} TemplateHTMLVisitor
* @typedef {import("./types").TemplateHTMLVisitorKeys} TemplateHTMLVisitorKeys
* @typedef {import("es-html-parser").AnyNode} AnyNode
*/
const { NodeTypes } = require("es-html-parser");
/**
* @type {TemplateHTMLVisitorKeys}
*/
const visitorKeys = {
[]: ["children"],
[]: ["key", "startWrapper", "endWrapper", "value"],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: ["open", "close", "value"],
[]: [],
[]: [],
[]: [],
[]: ["open", "close", "attributes"],
[]: ["startWrapper", "value", "endWrapper"],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [
"attributes",
"openStart",
"openEnd",
"close",
"value",
],
[]: [],
[]: [
"attributes",
"openStart",
"openEnd",
"close",
"value",
],
[]: [],
[]: ["openStart", "openEnd", "close", "children", "attributes"],
[]: [],
[]: [],
[]: [],
[]: [],
[]: [],
};
/**
*
* @param {AnyNode} node
* @param {TemplateHTMLVisitor} visitors
* @param {AnyNode | null} parent
*/
function traverse(node, visitors, parent) {
// @ts-ignore
const enterVisitor = visitors[node.type];
// @ts-ignore
node.parent = parent;
enterVisitor && enterVisitor(node);
const nextKeys = visitorKeys[node.type];
nextKeys.forEach((key) => {
// @ts-ignore
const next = node[key];
if (Array.isArray(next)) {
next.forEach((n) => traverse(n, visitors, node));
} else if (next) {
traverse(next, visitors, node);
}
});
// @ts-ignore
const exitVisitor = visitors[`${node.type}:exit`];
exitVisitor && exitVisitor(node);
}
module.exports = {
traverse,
};