{"version":3,"file":"smart-array-filter.min.js","sources":["../node_modules/lodash.escaperegexp/index.js","../lib-esm/match/recursiveMatch.js","../lib-esm/match/nativeMatch.js","../lib-esm/match/match.js","../lib-esm/utils/getCheckNumber.js","../lib-esm/utils/getCheckString.js","../lib-esm/utils/convertKeywordsToCriteria.js","../lib-esm/utils/ensureObjectOfRegExps.js","../lib-esm/utils/parseKeywords.js","../lib-esm/index.js"],"sourcesContent":["/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n reHasRegExpChar = RegExp(reRegExpChar.source);\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\nfunction escapeRegExp(string) {\n string = toString(string);\n return (string && reHasRegExpChar.test(string))\n ? string.replace(reRegExpChar, '\\\\$&')\n : string;\n}\n\nmodule.exports = escapeRegExp;\n","import nativeMatch from './nativeMatch';\n/**\n * RecursiveMatch.\n *\n * @param element - String | number | Record.\n * @param criterium - Criterion.\n * @param keys - String[].\n * @param options - Object.\n * @param options.ignorePaths - RegExp[].\n * @returns Boolean.\n */\nexport default function recursiveMatch(element, criterium, keys, options) {\n if (typeof element === 'object') {\n if (Array.isArray(element)) {\n for (const elm of element) {\n if (recursiveMatch(elm, criterium, keys, options)) {\n return true;\n }\n }\n }\n else {\n for (const i in element) {\n keys.push(i);\n const didMatch = recursiveMatch(element[i], criterium, keys, options);\n keys.pop();\n if (didMatch)\n return true;\n }\n }\n }\n else if (criterium.is) {\n // we check for the presence of a key (jpath)\n if (criterium.is.test(keys.join('.'))) {\n return !!element;\n }\n else {\n return false;\n }\n }\n else {\n // need to check if keys match\n const joinedKeys = keys.join('.');\n for (const ignorePath of options.ignorePaths) {\n if (ignorePath.test(joinedKeys))\n return false;\n }\n if (options.includePaths) {\n let included = false;\n for (const includePath of options.includePaths) {\n if (includePath.test(joinedKeys)) {\n included = true;\n break;\n }\n }\n if (!included)\n return false;\n }\n if (criterium.key) {\n if (!criterium.key.test(joinedKeys))\n return false;\n }\n return nativeMatch(element, criterium);\n }\n return false;\n}\n//# sourceMappingURL=recursiveMatch.js.map","/**\n * NativeMatch.\n *\n * @param element - String|number.\n * @param keyword - Criterion.\n * @returns Boolean.\n */\nexport default function nativeMatch(element, keyword) {\n if (typeof element === 'string') {\n return keyword.checkString(element);\n }\n else if (typeof element === 'number') {\n return keyword.checkNumber(element);\n }\n else {\n return false;\n }\n}\n//# sourceMappingURL=nativeMatch.js.map","import recursiveMatch from './recursiveMatch';\n/**\n * Match.\n *\n * @param element - String | number | Record.\n * @param criteria - Criterion[].\n * @param predicate - String.\n * @param options - Object.\n * @param options.ignorePaths - RegExp[].\n * @param options.pathAlias - Records.\n * @returns Boolean.\n */\nexport default function match(element, criteria, predicate, options) {\n if (criteria.length) {\n let found = false;\n for (const criterion of criteria) {\n // match XOR negate\n if (recursiveMatch(element, criterion, [], options)\n ? !criterion.negate\n : criterion.negate) {\n if (predicate === 'OR') {\n return true;\n }\n found = true;\n }\n else if (predicate === 'AND') {\n return false;\n }\n }\n return found;\n }\n return true;\n}\n//# sourceMappingURL=match.js.map","const operators = {\n '<': function lt(values) {\n const value = Number(values[0]);\n return (number) => {\n return number < value;\n };\n },\n '<=': function lte(values) {\n const value = Number(values[0]);\n return (number) => {\n return number <= value;\n };\n },\n '=': function equal(values) {\n const possibleNumbers = values[0]\n .split(',')\n .filter((item) => item)\n .map(Number);\n return (number) => {\n for (let i = 0; i < possibleNumbers.length; i++) {\n if (number === possibleNumbers[i]) {\n return true;\n }\n }\n return false;\n };\n },\n '>=': function gte(values) {\n const value = Number(values[0]);\n return (number) => {\n return number >= value;\n };\n },\n '>': function gt(values) {\n const value = Number(values[0]);\n return (number) => {\n return number > value;\n };\n },\n '..': function range(values) {\n const valueLow = Number(values[0]);\n const valueHigh = Number(values[1]);\n return (number) => number >= valueLow && number <= valueHigh;\n },\n};\n/**\n * @internal\n */\nexport default function getCheckNumber(keyword) {\n const { values, operator } = splitNumberOperator(keyword);\n const checkOperator = operators[operator];\n if (!checkOperator) {\n throw new Error(`unknown operator ${operator}`);\n }\n return checkOperator(values);\n}\n/**\n * @internal\n */\nexport function splitNumberOperator(keyword) {\n const match = /^\\s*\\(?\\s*(?<=|>=|<|=|>|\\.\\.)?(?-?\\d*\\.?\\d+)(?:(?\\.\\.)(?-?\\d*\\.?\\d*))?\\s*\\)?\\s*$/.exec(keyword);\n if (!match) {\n return {\n operator: '=',\n values: [keyword],\n };\n }\n if (!match.groups) {\n throw new Error('unreachable');\n }\n const { startOperator, firstValue, afterDots, secondValue } = match.groups;\n let operator = startOperator;\n let values = firstValue ? [firstValue] : [];\n // ..12\n if (startOperator === '..') {\n operator = '<=';\n }\n // 12..\n else if (!startOperator && afterDots && !secondValue) {\n operator = '>=';\n }\n // 12..14\n else if (afterDots) {\n operator = '..';\n }\n if (secondValue) {\n values.push(secondValue);\n }\n return {\n values,\n operator: operator || '=',\n };\n}\n//# sourceMappingURL=getCheckNumber.js.map","import escapeRegExp from 'lodash.escaperegexp';\nconst operators = {\n '<': function lt(query) {\n return (string) => {\n return string < query[0];\n };\n },\n '<=': function lte(query) {\n return (string) => {\n return string <= query[0];\n };\n },\n '=': function equal(query, insensitive) {\n const possibilities = query[0]\n .split(',')\n .filter((item) => item)\n .map((string) => new RegExp(`^${escapeRegExp(string)}$`, insensitive));\n return (string) => {\n for (const possibility of possibilities) {\n if (possibility.test(string)) {\n return true;\n }\n }\n return false;\n };\n },\n '~': function fuzzy(query, insensitive) {\n const possibilities = query[0]\n .split(',')\n .filter((item) => item)\n .map((string) => new RegExp(escapeRegExp(string), insensitive));\n return (string) => {\n for (const possibility of possibilities) {\n if (possibility.test(string)) {\n return true;\n }\n }\n return false;\n };\n },\n '>=': function lge(query) {\n return (string) => {\n return string >= query[0];\n };\n },\n '>': function lg(query) {\n return (string) => {\n return string > query[0];\n };\n },\n '..': function range(query) {\n return (string) => {\n return string >= query[0] && string <= query[1];\n };\n },\n};\n/**\n * GetCheckString.\n *\n * @param keyword - String.\n * @param insensitive - String.\n * @returns CheckString. (string)=>boolean.\n */\nexport default function getCheckString(keyword, insensitive) {\n const { values, operator } = splitStringOperator(keyword);\n const operatorCheck = operators[operator];\n if (!operatorCheck) {\n throw new Error(`unreachable unknown operator ${operator}`);\n }\n return operatorCheck(values, insensitive);\n}\n/**\n * @internal\n */\nexport function splitStringOperator(keyword) {\n const parts = keyword.split('..');\n const match = /^\\s*\\(?(?<=|<|=|>=|>)?\\s*(?\\S*)\\s*\\)?$/.exec(parts[0]);\n if (!match) {\n // Should never happen\n return {\n operator: '~',\n values: [keyword],\n };\n }\n if (!match.groups) {\n throw new Error('unreachable');\n }\n let { operator, value } = match.groups;\n let secondQuery = parts[1];\n let values = [value];\n if (parts.length > 1) {\n operator = '..';\n if (!secondQuery) {\n operator = '>=';\n }\n else if (!value) {\n values = [secondQuery];\n operator = '<=';\n }\n else {\n values.push(secondQuery);\n }\n }\n return {\n operator: operator || '~',\n values,\n };\n}\n//# sourceMappingURL=getCheckString.js.map","import escapeRegExp from 'lodash.escaperegexp';\nimport getCheckNumber from './getCheckNumber';\nimport getCheckString from './getCheckString';\n/**\n * @internal\n */\nexport default function convertKeywordsToCriteria(keywords, options) {\n const { insensitive, pathAlias } = options;\n return keywords.map((keyword) => {\n const criterion = {};\n if (keyword.startsWith('-')) {\n criterion.negate = true;\n keyword = keyword.substring(1);\n }\n const colon = keyword.indexOf(':');\n if (colon > -1) {\n const value = keyword.substring(colon + 1);\n if (colon > 0) {\n const key = keyword.substring(0, colon);\n if (key === 'is') {\n // a property path exists\n criterion.is = new RegExp(`(^|\\\\.)${escapeRegExp(value)}(\\\\.|$)`, insensitive);\n }\n if (pathAlias[key]) {\n criterion.key = pathAlias[key];\n }\n else {\n criterion.key = new RegExp(`(^|\\\\.)${escapeRegExp(key)}(\\\\.|$)`, insensitive);\n }\n }\n fillCriterion(criterion, value, insensitive);\n }\n else {\n fillCriterion(criterion, keyword, insensitive);\n }\n return criterion;\n });\n}\n/**\n * FillCriterion.\n *\n * @param criterion - Criterion.\n * @param keyword - String.\n * @param insensitive - String.\n */\nfunction fillCriterion(criterion, keyword, insensitive) {\n criterion.checkString = getCheckString(keyword, insensitive);\n criterion.checkNumber = getCheckNumber(keyword);\n}\n//# sourceMappingURL=convertKeywordsToCriteria.js.map","import escapeRegExp from 'lodash.escaperegexp';\n/**\n * EnsureObjectOfRegExps.\n *\n * @param object - { [index: string]: string|RegExp }.\n * @param options - Object.\n * @param options.insensitive - String.\n * @returns - Record.\n */\nexport default function ensureObjectOfRegExps(object, options) {\n const { insensitive } = options;\n const toReturn = {};\n for (const [key, value] of Object.entries(object)) {\n if (value instanceof RegExp) {\n toReturn[key] = value;\n }\n else {\n toReturn[key] = new RegExp(`(^|\\\\.)${escapeRegExp(value)}(\\\\.|$)`, insensitive);\n }\n }\n return toReturn;\n}\n//# sourceMappingURL=ensureObjectOfRegExps.js.map","let separators = /[ ;,\\t\\r\\n]/;\n/**\n * Need to convert a string to an array of keywords taking into account single and boule quotes.\n *\n * @param keywords - String.\n * @returns String[].\n */\nexport default function parseKeywords(keywords) {\n const result = [];\n let inQuotes = false;\n let inSeparator = true;\n let currentWord = [];\n let previous = '';\n for (let i = 0; i < keywords.length; i++) {\n const current = keywords.charAt(i);\n if (inQuotes) {\n if (previous === '\"') {\n // escaped quote\n if (current === '\"') {\n previous = '';\n continue;\n }\n // end of quoted part\n currentWord.pop(); // remove last quote that was added\n inQuotes = false;\n i--;\n continue;\n }\n currentWord.push(current);\n previous = current;\n continue;\n }\n if (inSeparator) {\n // still in separator ?\n if (separators.test(current)) {\n previous = current;\n continue;\n }\n inSeparator = false;\n }\n // start of quoted part\n if (current === '\"') {\n inQuotes = true;\n previous = '';\n continue;\n }\n // start of separator part\n if (separators.test(current)) {\n if (currentWord.length)\n result.push(currentWord.join(''));\n currentWord = [];\n inSeparator = true;\n continue;\n }\n currentWord.push(current);\n previous = '';\n }\n if (previous === '\"')\n currentWord.pop();\n if (currentWord.length)\n result.push(currentWord.join(''));\n return result;\n}\n//# sourceMappingURL=parseKeywords.js.map","import escapeRegExp from 'lodash.escaperegexp';\nimport match from './match/match';\nimport convertKeywordsToCriteria from './utils/convertKeywordsToCriteria';\nimport ensureObjectOfRegExps from './utils/ensureObjectOfRegExps';\nimport parseKeywords from './utils/parseKeywords';\n/**\n *\n * Filter.\n *\n * @param data - Array to filter.\n * @param [options={}] - Object.\n * @param [options.limit=Infinity] - Maximum number of results.\n * @param [options.caseSensitive=false] - By default we ignore case.\n * @param [options.ignorePaths=[]] - Array of jpath to ignore.\n * @param [options.includePaths] - Array of jpath to allow, default everything.\n * @param [options.pathAlias={}] - Key (string), value (string of regexp).\n * @param [options.keywords=[]] - List of keywords used to filter the array.\n * @param [options.index=false] - Returns the indices in the array that match.\n * @param [options.predicate='AND'] - Could be either AND or OR.\n * @returns String[] | number[].\n */\nexport function filter(data, options = {}) {\n let { index = false, predicate = 'AND', ignorePaths: ignorePathsOption = [], includePaths: includePathsOption, pathAlias: pathAliasOption = {}, } = options;\n const limit = options.limit ? options.limit : Infinity;\n const insensitive = options.caseSensitive ? '' : 'i';\n let keywords = options.keywords || [];\n const pathAlias = ensureObjectOfRegExps(pathAliasOption, { insensitive });\n const ignorePaths = ignorePathsOption.map((path) => typeof path === 'string'\n ? new RegExp(`(^|\\\\.)${escapeRegExp(path)}(\\\\.|$)`, insensitive)\n : path);\n const includePaths = includePathsOption\n ? includePathsOption.map((path) => typeof path === 'string'\n ? new RegExp(`(^|\\\\.)${escapeRegExp(path)}(\\\\.|$)`, insensitive)\n : path)\n : undefined;\n if (typeof keywords === 'string') {\n keywords = parseKeywords(keywords);\n }\n const criteria = convertKeywordsToCriteria(keywords, {\n insensitive,\n pathAlias,\n });\n let matched = 0;\n if (index) {\n const result = [];\n for (let i = 0; i < data.length && matched < limit; i++) {\n if (match(data[i], criteria, predicate, {\n ignorePaths,\n includePaths,\n pathAlias,\n })) {\n matched = result.push(i);\n }\n }\n return result;\n }\n else {\n const result = [];\n for (let i = 0; i < data.length && matched < limit; i++) {\n if (match(data[i], criteria, predicate, {\n ignorePaths,\n includePaths,\n pathAlias,\n })) {\n matched = result.push(data[i]);\n }\n }\n return result;\n }\n}\n//# sourceMappingURL=index.js.map"],"names":["symbolTag","reRegExpChar","reHasRegExpChar","RegExp","source","freeGlobal","global","Object","freeSelf","self","root","Function","objectToString","prototype","toString","Symbol","symbolProto","undefined","symbolToString","baseToString","value","isObjectLike","call","isSymbol","result","string","test","replace","recursiveMatch","element","criterium","keys","options","is","join","joinedKeys","ignorePath","ignorePaths","includePaths","included","includePath","key","keyword","checkString","checkNumber","nativeMatch","Array","isArray","elm","i","push","didMatch","pop","match","criteria","predicate","length","found","criterion","negate","operators","values","Number","number","possibleNumbers","split","filter","item","map","valueLow","valueHigh","getCheckNumber","operator","exec","groups","Error","startOperator","firstValue","afterDots","secondValue","splitNumberOperator","checkOperator","query","insensitive","possibilities","escapeRegExp","possibility","getCheckString","parts","secondQuery","splitStringOperator","operatorCheck","convertKeywordsToCriteria","keywords","pathAlias","startsWith","substring","colon","indexOf","fillCriterion","ensureObjectOfRegExps","object","toReturn","entries","separators","parseKeywords","inQuotes","inSeparator","currentWord","previous","current","charAt","data","index","ignorePathsOption","includePathsOption","pathAliasOption","limit","Infinity","caseSensitive","path","matched"],"mappings":"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"}