nucleus-ui-builder
Version:
66 lines (65 loc) • 2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return Compiler;
}
});
function _define_property(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
class Compiler {
compile(template, replacements) {
let compiled = ``;
for(let i = 0; i < template.length; i++){
const char = template[i];
if (this.isOpeningBracket(char)) this.bracketStack.push(char);
else if (this.isClosingBracket(char)) {
if (!this.matchesLastOpened(char)) throw new Error(`Unmatched closing bracket: ${char}`);
this.bracketStack.pop();
}
compiled += char;
}
if (this.bracketStack.length > 0) throw new Error(`Unmatched opening bracket(s) detected`);
return compiled.replace(this.placeholderRegex, (_, key)=>{
if (!(key in replacements)) throw new Error(`Missing replacement for: ${key}`);
return replacements[key];
});
}
isOpeningBracket(char) {
return [
`[`,
`{`,
`(`
].includes(char);
}
isClosingBracket(char) {
return [
`]`,
`}`,
`)`
].includes(char);
}
matchesLastOpened(char) {
const lastOpened = this.bracketStack[this.bracketStack.length - 1];
return char === `]` && lastOpened === `[` || char === `}` && lastOpened === `{` || char === `)` && lastOpened === `(`;
}
constructor(){
_define_property(this, "bracketStack", []);
_define_property(this, "placeholderRegex", /\{\{(.*?)}}/g);
}
}
//# sourceMappingURL=compiler.js.map