all files / liquidjs/src/ lexical.js

100% Statements 53/53
100% Branches 6/6
100% Functions 6/6
100% Lines 53/53
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                                        16×     588×         216×     213×     381× 381× 172×   209× 209× 19×   190× 190× 189×                                                                
// 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
}