diff --git a/dist/datasource-zabbix/specs/utils_specs.js b/dist/datasource-zabbix/specs/utils_specs.js index 41ab76c..c540db2 100644 --- a/dist/datasource-zabbix/specs/utils_specs.js +++ b/dist/datasource-zabbix/specs/utils_specs.js @@ -88,4 +88,54 @@ describe('Utils', () => { done(); }); }); + + describe('splitTemplateQuery()', () => { + + // Backward compatibility + it('should properly split query in old format', (done) => { + let test_cases = [ + { + query: `/alu/./tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9{2}/`, + expected: ['/alu/', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9{2}/'] + }, + { + query: `a.b.c.d`, + expected: ['a', 'b', 'c', 'd'] + } + ]; + + _.each(test_cases, test_case => { + let splitQuery = utils.splitTemplateQuery(test_case.query); + expect(splitQuery).to.eql(test_case.expected); + }); + done(); + }); + + it('should properly split query', (done) => { + let test_cases = [ + { + query: `{alu}{/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]*/}`, + expected: ['alu', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]*/'] + }, + { + query: `{alu}{/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]{2}/}`, + expected: ['alu', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]{2}/'] + }, + { + query: `{a}{b}{c}{d}`, + expected: ['a', 'b', 'c', 'd'] + }, + { + query: `{a}{b.c.d}`, + expected: ['a', 'b.c.d'] + } + ]; + + _.each(test_cases, test_case => { + let splitQuery = utils.splitTemplateQuery(test_case.query); + expect(splitQuery).to.eql(test_case.expected); + }); + done(); + }); + }); }); diff --git a/dist/datasource-zabbix/utils.js b/dist/datasource-zabbix/utils.js index d634a22..54ec09e 100644 --- a/dist/datasource-zabbix/utils.js +++ b/dist/datasource-zabbix/utils.js @@ -99,7 +99,7 @@ System.register(['lodash', 'moment'], function (_export, _context) { * {group}{host.com} -> [group, host.com] */ function splitTemplateQuery(query) { - var splitPattern = /{[^{}]*}/g; + var splitPattern = /\{[^\{\}]*\}|\{\/.*\/\}/g; var split = void 0; if (isContainsBraces(query)) { @@ -117,7 +117,8 @@ System.register(['lodash', 'moment'], function (_export, _context) { _export('splitTemplateQuery', splitTemplateQuery); function isContainsBraces(query) { - return query.includes('{') && query.includes('}'); + var bracesPattern = /^\{.+\}$/; + return bracesPattern.test(query); } // Pattern for testing regex diff --git a/dist/datasource-zabbix/utils.js.map b/dist/datasource-zabbix/utils.js.map index b0d851e..c668b1f 100644 --- a/dist/datasource-zabbix/utils.js.map +++ b/dist/datasource-zabbix/utils.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/datasource-zabbix/utils.js"],"names":["expandItemName","name","key","key_params_str","substring","indexOf","lastIndexOf","key_params","splitKeyParams","i","length","replace","paramStr","params","quoted","in_array","split_symbol","param","_","forEach","symbol","push","containsMacro","itemName","MACRO_PATTERN","test","replaceMacro","item","macros","item_macros","match","host_macros","filter","m","hostid","macro_def","find","macro","value","macro_value","macro_regex","RegExp","escapeMacro","splitTemplateQuery","query","splitPattern","split","isContainsBraces","result","map","trim","part","includes","isRegex","str","regexPattern","isTemplateVariable","templateVariables","variablePattern","variables","variable","buildRegex","matches","pattern","flags","undefined","escapeRegex","parseInterval","interval","intervalPattern","momentInterval","exec","moment","duration","Number","valueOf","parseTimeShiftInterval","formatAcknowledges","acknowledges","formatted_acknowledges","each","ack","timestamp","unix","clock","format","alias","surname","message","concat","convertToZabbixAPIUrl","url","zabbixAPIUrlPattern","trimSlashPattern","callOnce","func","promiseKeeper","Promise","resolve","apply","arguments","then","contains"],"mappings":"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","file":"utils.js","sourcesContent":["import _ from 'lodash';\nimport moment from 'moment';\n\n/**\n * Expand Zabbix item name\n *\n * @param {string} name item name, ie \"CPU $2 time\"\n * @param {string} key item key, ie system.cpu.util[,system,avg1]\n * @return {string} expanded name, ie \"CPU system time\"\n */\nexport function expandItemName(name, key) {\n\n // extract params from key:\n // \"system.cpu.util[,system,avg1]\" --> [\"\", \"system\", \"avg1\"]\n let key_params_str = key.substring(key.indexOf('[') + 1, key.lastIndexOf(']'));\n let key_params = splitKeyParams(key_params_str);\n\n // replace item parameters\n for (let i = key_params.length; i >= 1; i--) {\n name = name.replace('$' + i, key_params[i - 1]);\n }\n return name;\n}\n\nfunction splitKeyParams(paramStr) {\n let params = [];\n let quoted = false;\n let in_array = false;\n let split_symbol = ',';\n let param = '';\n\n _.forEach(paramStr, symbol => {\n if (symbol === '\"' && in_array) {\n param += symbol;\n } else if (symbol === '\"' && quoted) {\n quoted = false;\n } else if (symbol === '\"' && !quoted) {\n quoted = true;\n } else if (symbol === '[' && !quoted) {\n in_array = true;\n } else if (symbol === ']' && !quoted) {\n in_array = false;\n } else if (symbol === split_symbol && !quoted && !in_array) {\n params.push(param);\n param = '';\n } else {\n param += symbol;\n }\n });\n\n params.push(param);\n return params;\n}\n\nconst MACRO_PATTERN = /{\\$[A-Z0-9_\\.]+}/g;\n\nexport function containsMacro(itemName) {\n return MACRO_PATTERN.test(itemName);\n}\n\nexport function replaceMacro(item, macros) {\n let itemName = item.name;\n let item_macros = itemName.match(MACRO_PATTERN);\n _.forEach(item_macros, macro => {\n let host_macros = _.filter(macros, m => {\n if (m.hostid) {\n return m.hostid === item.hostid;\n } else {\n // Add global macros\n return true;\n }\n });\n\n let macro_def = _.find(host_macros, { macro: macro });\n if (macro_def && macro_def.value) {\n let macro_value = macro_def.value;\n let macro_regex = new RegExp(escapeMacro(macro));\n itemName = itemName.replace(macro_regex, macro_value);\n }\n });\n\n return itemName;\n}\n\nfunction escapeMacro(macro) {\n macro = macro.replace(/\\$/, '\\\\\\$');\n return macro;\n}\n\n/**\n * Split template query to parts of zabbix entities\n * group.host.app.item -> [group, host, app, item]\n * {group}{host.com} -> [group, host.com]\n */\nexport function splitTemplateQuery(query) {\n let splitPattern = /{[^{}]*}/g;\n let split;\n\n if (isContainsBraces(query)) {\n let result = query.match(splitPattern);\n split = _.map(result, part => {\n return _.trim(part, '{}');\n });\n } else {\n split = query.split('.');\n }\n\n return split;\n}\n\nfunction isContainsBraces(query) {\n return query.includes('{') && query.includes('}');\n}\n\n// Pattern for testing regex\nexport const regexPattern = /^\\/(.*)\\/([gmi]*)$/m;\n\nexport function isRegex(str) {\n return regexPattern.test(str);\n}\n\nexport function isTemplateVariable(str, templateVariables) {\n var variablePattern = /^\\$\\w+/;\n if (variablePattern.test(str)) {\n var variables = _.map(templateVariables, variable => {\n return '$' + variable.name;\n });\n return _.includes(variables, str);\n } else {\n return false;\n }\n}\n\nexport function buildRegex(str) {\n var matches = str.match(regexPattern);\n var pattern = matches[1];\n var flags = matches[2] !== \"\" ? matches[2] : undefined;\n return new RegExp(pattern, flags);\n}\n\n// Need for template variables replace\n// From Grafana's templateSrv.js\nexport function escapeRegex(value) {\n return value.replace(/[\\\\^$*+?.()|[\\]{}\\/]/g, '\\\\$&');\n}\n\nexport function parseInterval(interval) {\n var intervalPattern = /(^[\\d]+)(y|M|w|d|h|m|s)/g;\n var momentInterval = intervalPattern.exec(interval);\n return moment.duration(Number(momentInterval[1]), momentInterval[2]).valueOf();\n}\n\nexport function parseTimeShiftInterval(interval) {\n let intervalPattern = /^([\\+\\-]*)([\\d]+)(y|M|w|d|h|m|s)/g;\n let momentInterval = intervalPattern.exec(interval);\n let duration = 0;\n\n if (momentInterval[1] === '+') {\n duration = 0 - moment.duration(Number(momentInterval[2]), momentInterval[3]).valueOf();\n } else {\n duration = moment.duration(Number(momentInterval[2]), momentInterval[3]).valueOf();\n }\n\n return duration;\n}\n\n/**\n * Format acknowledges.\n *\n * @param {array} acknowledges array of Zabbix acknowledge objects\n * @return {string} HTML-formatted table\n */\nexport function formatAcknowledges(acknowledges) {\n if (acknowledges.length) {\n var formatted_acknowledges = '

Acknowledges:
'\n + '';\n _.each(_.map(acknowledges, function (ack) {\n var timestamp = moment.unix(ack.clock);\n return '';\n }), function (ack) {\n formatted_acknowledges = formatted_acknowledges.concat(ack);\n });\n formatted_acknowledges = formatted_acknowledges.concat('
TimeUserComments
' + timestamp.format(\"DD MMM YYYY HH:mm:ss\") + '' + ack.alias\n + ' (' + ack.name + ' ' + ack.surname + ')' + '' + ack.message + '
');\n return formatted_acknowledges;\n } else {\n return '';\n }\n}\n\nexport function convertToZabbixAPIUrl(url) {\n var zabbixAPIUrlPattern = /.*api_jsonrpc.php$/;\n var trimSlashPattern = /(.*?)[\\/]*$/;\n if (url.match(zabbixAPIUrlPattern)) {\n return url;\n } else {\n return url.replace(trimSlashPattern, \"$1\");\n }\n}\n\n/**\n * Wrap function to prevent multiple calls\n * when waiting for result.\n */\nexport function callOnce(func, promiseKeeper) {\n return function() {\n if (!promiseKeeper) {\n promiseKeeper = Promise.resolve(\n func.apply(this, arguments)\n .then(result => {\n promiseKeeper = null;\n return result;\n })\n );\n }\n return promiseKeeper;\n };\n}\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.includes) {\n _.includes = _.contains;\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/datasource-zabbix/utils.js"],"names":["expandItemName","name","key","key_params_str","substring","indexOf","lastIndexOf","key_params","splitKeyParams","i","length","replace","paramStr","params","quoted","in_array","split_symbol","param","_","forEach","symbol","push","containsMacro","itemName","MACRO_PATTERN","test","replaceMacro","item","macros","item_macros","match","host_macros","filter","m","hostid","macro_def","find","macro","value","macro_value","macro_regex","RegExp","escapeMacro","splitTemplateQuery","query","splitPattern","split","isContainsBraces","result","map","trim","part","bracesPattern","isRegex","str","regexPattern","isTemplateVariable","templateVariables","variablePattern","variables","variable","includes","buildRegex","matches","pattern","flags","undefined","escapeRegex","parseInterval","interval","intervalPattern","momentInterval","exec","moment","duration","Number","valueOf","parseTimeShiftInterval","formatAcknowledges","acknowledges","formatted_acknowledges","each","ack","timestamp","unix","clock","format","alias","surname","message","concat","convertToZabbixAPIUrl","url","zabbixAPIUrlPattern","trimSlashPattern","callOnce","func","promiseKeeper","Promise","resolve","apply","arguments","then","contains"],"mappings":"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","file":"utils.js","sourcesContent":["import _ from 'lodash';\nimport moment from 'moment';\n\n/**\n * Expand Zabbix item name\n *\n * @param {string} name item name, ie \"CPU $2 time\"\n * @param {string} key item key, ie system.cpu.util[,system,avg1]\n * @return {string} expanded name, ie \"CPU system time\"\n */\nexport function expandItemName(name, key) {\n\n // extract params from key:\n // \"system.cpu.util[,system,avg1]\" --> [\"\", \"system\", \"avg1\"]\n let key_params_str = key.substring(key.indexOf('[') + 1, key.lastIndexOf(']'));\n let key_params = splitKeyParams(key_params_str);\n\n // replace item parameters\n for (let i = key_params.length; i >= 1; i--) {\n name = name.replace('$' + i, key_params[i - 1]);\n }\n return name;\n}\n\nfunction splitKeyParams(paramStr) {\n let params = [];\n let quoted = false;\n let in_array = false;\n let split_symbol = ',';\n let param = '';\n\n _.forEach(paramStr, symbol => {\n if (symbol === '\"' && in_array) {\n param += symbol;\n } else if (symbol === '\"' && quoted) {\n quoted = false;\n } else if (symbol === '\"' && !quoted) {\n quoted = true;\n } else if (symbol === '[' && !quoted) {\n in_array = true;\n } else if (symbol === ']' && !quoted) {\n in_array = false;\n } else if (symbol === split_symbol && !quoted && !in_array) {\n params.push(param);\n param = '';\n } else {\n param += symbol;\n }\n });\n\n params.push(param);\n return params;\n}\n\nconst MACRO_PATTERN = /{\\$[A-Z0-9_\\.]+}/g;\n\nexport function containsMacro(itemName) {\n return MACRO_PATTERN.test(itemName);\n}\n\nexport function replaceMacro(item, macros) {\n let itemName = item.name;\n let item_macros = itemName.match(MACRO_PATTERN);\n _.forEach(item_macros, macro => {\n let host_macros = _.filter(macros, m => {\n if (m.hostid) {\n return m.hostid === item.hostid;\n } else {\n // Add global macros\n return true;\n }\n });\n\n let macro_def = _.find(host_macros, { macro: macro });\n if (macro_def && macro_def.value) {\n let macro_value = macro_def.value;\n let macro_regex = new RegExp(escapeMacro(macro));\n itemName = itemName.replace(macro_regex, macro_value);\n }\n });\n\n return itemName;\n}\n\nfunction escapeMacro(macro) {\n macro = macro.replace(/\\$/, '\\\\\\$');\n return macro;\n}\n\n/**\n * Split template query to parts of zabbix entities\n * group.host.app.item -> [group, host, app, item]\n * {group}{host.com} -> [group, host.com]\n */\nexport function splitTemplateQuery(query) {\n let splitPattern = /\\{[^\\{\\}]*\\}|\\{\\/.*\\/\\}/g;\n let split;\n\n if (isContainsBraces(query)) {\n let result = query.match(splitPattern);\n split = _.map(result, part => {\n return _.trim(part, '{}');\n });\n } else {\n split = query.split('.');\n }\n\n return split;\n}\n\nfunction isContainsBraces(query) {\n let bracesPattern = /^\\{.+\\}$/;\n return bracesPattern.test(query);\n}\n\n// Pattern for testing regex\nexport const regexPattern = /^\\/(.*)\\/([gmi]*)$/m;\n\nexport function isRegex(str) {\n return regexPattern.test(str);\n}\n\nexport function isTemplateVariable(str, templateVariables) {\n var variablePattern = /^\\$\\w+/;\n if (variablePattern.test(str)) {\n var variables = _.map(templateVariables, variable => {\n return '$' + variable.name;\n });\n return _.includes(variables, str);\n } else {\n return false;\n }\n}\n\nexport function buildRegex(str) {\n var matches = str.match(regexPattern);\n var pattern = matches[1];\n var flags = matches[2] !== \"\" ? matches[2] : undefined;\n return new RegExp(pattern, flags);\n}\n\n// Need for template variables replace\n// From Grafana's templateSrv.js\nexport function escapeRegex(value) {\n return value.replace(/[\\\\^$*+?.()|[\\]{}\\/]/g, '\\\\$&');\n}\n\nexport function parseInterval(interval) {\n var intervalPattern = /(^[\\d]+)(y|M|w|d|h|m|s)/g;\n var momentInterval = intervalPattern.exec(interval);\n return moment.duration(Number(momentInterval[1]), momentInterval[2]).valueOf();\n}\n\nexport function parseTimeShiftInterval(interval) {\n let intervalPattern = /^([\\+\\-]*)([\\d]+)(y|M|w|d|h|m|s)/g;\n let momentInterval = intervalPattern.exec(interval);\n let duration = 0;\n\n if (momentInterval[1] === '+') {\n duration = 0 - moment.duration(Number(momentInterval[2]), momentInterval[3]).valueOf();\n } else {\n duration = moment.duration(Number(momentInterval[2]), momentInterval[3]).valueOf();\n }\n\n return duration;\n}\n\n/**\n * Format acknowledges.\n *\n * @param {array} acknowledges array of Zabbix acknowledge objects\n * @return {string} HTML-formatted table\n */\nexport function formatAcknowledges(acknowledges) {\n if (acknowledges.length) {\n var formatted_acknowledges = '

Acknowledges:
'\n + '';\n _.each(_.map(acknowledges, function (ack) {\n var timestamp = moment.unix(ack.clock);\n return '';\n }), function (ack) {\n formatted_acknowledges = formatted_acknowledges.concat(ack);\n });\n formatted_acknowledges = formatted_acknowledges.concat('
TimeUserComments
' + timestamp.format(\"DD MMM YYYY HH:mm:ss\") + '' + ack.alias\n + ' (' + ack.name + ' ' + ack.surname + ')' + '' + ack.message + '
');\n return formatted_acknowledges;\n } else {\n return '';\n }\n}\n\nexport function convertToZabbixAPIUrl(url) {\n var zabbixAPIUrlPattern = /.*api_jsonrpc.php$/;\n var trimSlashPattern = /(.*?)[\\/]*$/;\n if (url.match(zabbixAPIUrlPattern)) {\n return url;\n } else {\n return url.replace(trimSlashPattern, \"$1\");\n }\n}\n\n/**\n * Wrap function to prevent multiple calls\n * when waiting for result.\n */\nexport function callOnce(func, promiseKeeper) {\n return function() {\n if (!promiseKeeper) {\n promiseKeeper = Promise.resolve(\n func.apply(this, arguments)\n .then(result => {\n promiseKeeper = null;\n return result;\n })\n );\n }\n return promiseKeeper;\n };\n}\n\n// Fix for backward compatibility with lodash 2.4\nif (!_.includes) {\n _.includes = _.contains;\n}\n"]} \ No newline at end of file diff --git a/dist/test/datasource-zabbix/specs/utils_specs.js b/dist/test/datasource-zabbix/specs/utils_specs.js index 01147dc..c381ca8 100644 --- a/dist/test/datasource-zabbix/specs/utils_specs.js +++ b/dist/test/datasource-zabbix/specs/utils_specs.js @@ -86,4 +86,46 @@ describe('Utils', function () { done(); }); }); + + describe('splitTemplateQuery()', function () { + + // Backward compatibility + it('should properly split query in old format', function (done) { + var test_cases = [{ + query: '/alu/./tw-(nyc|que|brx|dwt|brk)-sta_(w|d)*-alu-[0-9{2}/', + expected: ['/alu/', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9{2}/'] + }, { + query: 'a.b.c.d', + expected: ['a', 'b', 'c', 'd'] + }]; + + _lodash2.default.each(test_cases, function (test_case) { + var splitQuery = utils.splitTemplateQuery(test_case.query); + expect(splitQuery).to.eql(test_case.expected); + }); + done(); + }); + + it('should properly split query', function (done) { + var test_cases = [{ + query: '{alu}{/tw-(nyc|que|brx|dwt|brk)-sta_(w|d)*-alu-[0-9]*/}', + expected: ['alu', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]*/'] + }, { + query: '{alu}{/tw-(nyc|que|brx|dwt|brk)-sta_(w|d)*-alu-[0-9]{2}/}', + expected: ['alu', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]{2}/'] + }, { + query: '{a}{b}{c}{d}', + expected: ['a', 'b', 'c', 'd'] + }, { + query: '{a}{b.c.d}', + expected: ['a', 'b.c.d'] + }]; + + _lodash2.default.each(test_cases, function (test_case) { + var splitQuery = utils.splitTemplateQuery(test_case.query); + expect(splitQuery).to.eql(test_case.expected); + }); + done(); + }); + }); }); diff --git a/dist/test/datasource-zabbix/utils.js b/dist/test/datasource-zabbix/utils.js index 432ca98..0ecad3d 100644 --- a/dist/test/datasource-zabbix/utils.js +++ b/dist/test/datasource-zabbix/utils.js @@ -120,7 +120,7 @@ function escapeMacro(macro) { * {group}{host.com} -> [group, host.com] */ function splitTemplateQuery(query) { - var splitPattern = /{[^{}]*}/g; + var splitPattern = /\{[^\{\}]*\}|\{\/.*\/\}/g; var split = void 0; if (isContainsBraces(query)) { @@ -136,7 +136,8 @@ function splitTemplateQuery(query) { } function isContainsBraces(query) { - return query.includes('{') && query.includes('}'); + var bracesPattern = /^\{.+\}$/; + return bracesPattern.test(query); } // Pattern for testing regex diff --git a/src/datasource-zabbix/specs/utils_specs.js b/src/datasource-zabbix/specs/utils_specs.js index 41ab76c..c540db2 100644 --- a/src/datasource-zabbix/specs/utils_specs.js +++ b/src/datasource-zabbix/specs/utils_specs.js @@ -88,4 +88,54 @@ describe('Utils', () => { done(); }); }); + + describe('splitTemplateQuery()', () => { + + // Backward compatibility + it('should properly split query in old format', (done) => { + let test_cases = [ + { + query: `/alu/./tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9{2}/`, + expected: ['/alu/', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9{2}/'] + }, + { + query: `a.b.c.d`, + expected: ['a', 'b', 'c', 'd'] + } + ]; + + _.each(test_cases, test_case => { + let splitQuery = utils.splitTemplateQuery(test_case.query); + expect(splitQuery).to.eql(test_case.expected); + }); + done(); + }); + + it('should properly split query', (done) => { + let test_cases = [ + { + query: `{alu}{/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]*/}`, + expected: ['alu', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]*/'] + }, + { + query: `{alu}{/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]{2}/}`, + expected: ['alu', '/tw-(nyc|que|brx|dwt|brk)-sta_(\w|\d)*-alu-[0-9]{2}/'] + }, + { + query: `{a}{b}{c}{d}`, + expected: ['a', 'b', 'c', 'd'] + }, + { + query: `{a}{b.c.d}`, + expected: ['a', 'b.c.d'] + } + ]; + + _.each(test_cases, test_case => { + let splitQuery = utils.splitTemplateQuery(test_case.query); + expect(splitQuery).to.eql(test_case.expected); + }); + done(); + }); + }); }); diff --git a/src/datasource-zabbix/utils.js b/src/datasource-zabbix/utils.js index bed8fbf..669d1c8 100644 --- a/src/datasource-zabbix/utils.js +++ b/src/datasource-zabbix/utils.js @@ -93,7 +93,7 @@ function escapeMacro(macro) { * {group}{host.com} -> [group, host.com] */ export function splitTemplateQuery(query) { - let splitPattern = /{[^{}]*}/g; + let splitPattern = /\{[^\{\}]*\}|\{\/.*\/\}/g; let split; if (isContainsBraces(query)) { @@ -109,7 +109,8 @@ export function splitTemplateQuery(query) { } function isContainsBraces(query) { - return query.includes('{') && query.includes('}'); + let bracesPattern = /^\{.+\}$/; + return bracesPattern.test(query); } // Pattern for testing regex