1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 16× 1× 588× 1× 3× 1× 216× 1× 213× 1× 381× 381× 172× 209× 209× 19× 190× 190× 189× 1× 1× | // quote related var singleQuoted = /'[^']*'/ var doubleQuoted = /"[^"]*"/ var quoted = new RegExp(`${singleQuoted.source}|${doubleQuoted.source}`) var quoteBalanced = new RegExp(`(?:${quoted.source}|[^'"])*`) // basic types var integer = /-?\d+/ var number = /-?\d+\.?\d*|\.?\d+/ var bool = /true|false/ // peoperty access var identifier = /[\w-]+/ var subscript = new RegExp(`\\[(?:${quoted.source}|[\\w-\\.]+)\\]`) var literal = new RegExp(`(?:${quoted.source}|${bool.source}|${number.source})`) var variable = new RegExp(`${identifier.source}(?:\\.${identifier.source}|${subscript.source})*`) // range related var rangeLimit = new RegExp(`(?:${variable.source}|${number.source})`) var range = new RegExp(`\\(${rangeLimit.source}\\.\\.${rangeLimit.source}\\)`) var rangeCapture = new RegExp(`\\((${rangeLimit.source})\\.\\.(${rangeLimit.source})\\)`) var value = new RegExp(`(?:${variable.source}|${literal.source}|${range.source})`) // hash related var hash = new RegExp(`(?:${identifier.source})\\s*:\\s*(?:${value.source})`) var hashCapture = new RegExp(`(${identifier.source})\\s*:\\s*(${value.source})`, 'g') // full match var tagLine = new RegExp(`^\\s*(${identifier.source})\\s*([\\s\\S]*)\\s*$`) var literalLine = new RegExp(`^${literal.source}$`, 'i') var variableLine = new RegExp(`^${variable.source}$`) var numberLine = new RegExp(`^${number.source}$`) var boolLine = new RegExp(`^${bool.source}$`, 'i') var quotedLine = new RegExp(`^${quoted.source}$`) var rangeLine = new RegExp(`^${rangeCapture.source}$`) var integerLine = new RegExp(`^${integer.source}$`) // filter related var valueDeclaration = new RegExp(`(?:${identifier.source}\\s*:\\s*)?${value.source}`) var valueList = new RegExp(`${valueDeclaration.source}(\\s*,\\s*${valueDeclaration.source})*`) var filter = new RegExp(`${identifier.source}(?:\\s*:\\s*${valueList.source})?`, 'g') var filterCapture = new RegExp(`(${identifier.source})(?:\\s*:\\s*(${valueList.source}))?`) var filterLine = new RegExp(`^${filterCapture.source}$`) var operators = [ /\s+or\s+/, /\s+and\s+/, /==|!=|<=|>=|<|>|\s+contains\s+/ ] function isInteger (str) { return integerLine.test(str) } function isLiteral (str) { return literalLine.test(str) } function isRange (str) { return rangeLine.test(str) } function isVariable (str) { return variableLine.test(str) } function matchValue (str) { return value.exec(str) } function parseLiteral (str) { var res = str.match(numberLine) if (res) { return Number(str) } res = str.match(boolLine) if (res) { return str.toLowerCase() === 'true' } res = str.match(quotedLine) if (res) { return str.slice(1, -1) } throw new TypeError(`cannot parse '${str}' as literal`) } module.exports = { quoted, number, bool, literal, filter, integer, hash, hashCapture, range, rangeCapture, identifier, value, quoteBalanced, operators, quotedLine, numberLine, boolLine, rangeLine, literalLine, filterLine, tagLine, isLiteral, isVariable, parseLiteral, isRange, matchValue, isInteger } |