diff --git a/.gitignore b/.gitignore index 3453a867c..facff9c4b 100644 --- a/.gitignore +++ b/.gitignore @@ -9,10 +9,7 @@ node_modules/ package-lock.json -dist/*.d.ts -dist/*.js -dist/*.map -docs/.vuepress/dist +dist/ RELEASE_NOTE*.md playground/ diff --git a/dist/fuse.basic.common.js b/dist/fuse.basic.common.js deleted file mode 100644 index fbf285ecd..000000000 --- a/dist/fuse.basic.common.js +++ /dev/null @@ -1,1469 +0,0 @@ -/** - * Fuse.js v6.6.2-beta.7 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2022 Kiro Risk (http://kiro.me) - * All Rights Reserved. Apache Software License 2.0 - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -'use strict'; - -function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - enumerableOnly && (symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - })), keys.push.apply(keys, symbols); - } - - return keys; -} - -function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = null != arguments[i] ? arguments[i] : {}; - i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { - _defineProperty(target, key, source[key]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { - Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); - }); - } - - return target; -} - -function _typeof(obj) { - "@babel/helpers - typeof"; - - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; -} - -function _defineProperty(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; -} - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function isArray(value) { - return !Array.isArray ? getTag(value) === '[object Array]' : Array.isArray(value); -} // Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js - -var INFINITY = 1 / 0; -function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value; - } - - var result = value + ''; - return result == '0' && 1 / value == -INFINITY ? '-0' : result; -} -function toString(value) { - return value == null ? '' : baseToString(value); -} -function isString(value) { - return typeof value === 'string'; -} -function isNumber(value) { - return typeof value === 'number'; -} // Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js - -function isBoolean(value) { - return value === true || value === false || isObjectLike(value) && getTag(value) == '[object Boolean]'; -} -function isObject(value) { - return _typeof(value) === 'object'; -} // Checks if `value` is object-like. - -function isObjectLike(value) { - return isObject(value) && value !== null; -} -function isDefined(value) { - return value !== undefined && value !== null; -} -function isBlank(value) { - return !value.trim().length; -} // Gets the `toStringTag` of `value`. -// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js - -function getTag(value) { - return value == null ? value === undefined ? '[object Undefined]' : '[object Null]' : Object.prototype.toString.call(value); -} - -var EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available'; -var LOGICAL_SEARCH_UNAVAILABLE = 'Logical search is not available'; -var INCORRECT_INDEX_TYPE = "Incorrect 'index' type"; -var LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = function LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key) { - return "Invalid value for key ".concat(key); -}; -var PATTERN_LENGTH_TOO_LARGE = function PATTERN_LENGTH_TOO_LARGE(max) { - return "Pattern length exceeds max of ".concat(max, "."); -}; -var MISSING_KEY_PROPERTY = function MISSING_KEY_PROPERTY(name) { - return "Missing ".concat(name, " property in key"); -}; -var INVALID_KEY_WEIGHT_VALUE = function INVALID_KEY_WEIGHT_VALUE(key) { - return "Property 'weight' in key '".concat(key, "' must be a positive integer"); -}; - -var hasOwn = Object.prototype.hasOwnProperty; - -var KeyStore = /*#__PURE__*/function () { - function KeyStore(keys) { - var _this = this; - - _classCallCheck(this, KeyStore); - - this._keys = []; - this._keyMap = {}; - var totalWeight = 0; - keys.forEach(function (key) { - var obj = createKey(key); - - _this._keys.push(obj); - - _this._keyMap[obj.id] = obj; - totalWeight += obj.weight; - }); // Normalize weights so that their sum is equal to 1 - - this._keys.forEach(function (key) { - key.weight /= totalWeight; - }); - } - - _createClass(KeyStore, [{ - key: "get", - value: function get(keyId) { - return this._keyMap[keyId]; - } - }, { - key: "keys", - value: function keys() { - return this._keys; - } - }, { - key: "toJSON", - value: function toJSON() { - return JSON.stringify(this._keys); - } - }]); - - return KeyStore; -}(); -function createKey(key) { - var path = null; - var id = null; - var src = null; - var weight = 1; - var getFn = null; - - if (isString(key) || isArray(key)) { - src = key; - path = createKeyPath(key); - id = createKeyId(key); - } else { - if (!hasOwn.call(key, 'name')) { - throw new Error(MISSING_KEY_PROPERTY('name')); - } - - var name = key.name; - src = name; - - if (hasOwn.call(key, 'weight')) { - weight = key.weight; - - if (weight <= 0) { - throw new Error(INVALID_KEY_WEIGHT_VALUE(name)); - } - } - - path = createKeyPath(name); - id = createKeyId(name); - getFn = key.getFn; - } - - return { - path: path, - id: id, - weight: weight, - src: src, - getFn: getFn - }; -} -function createKeyPath(key) { - return isArray(key) ? key : key.split('.'); -} -function createKeyId(key) { - return isArray(key) ? key.join('.') : key; -} - -function get(obj, path) { - var list = []; - var arr = false; - - var deepGet = function deepGet(obj, path, index) { - if (!isDefined(obj)) { - return; - } - - if (!path[index]) { - // If there's no path left, we've arrived at the object we care about. - list.push(obj); - } else { - var key = path[index]; - var value = obj[key]; - - if (!isDefined(value)) { - return; - } // If we're at the last value in the path, and if it's a string/number/bool, - // add it to the list - - - if (index === path.length - 1 && (isString(value) || isNumber(value) || isBoolean(value))) { - list.push(toString(value)); - } else if (isArray(value)) { - arr = true; // Search each item in the array. - - for (var i = 0, len = value.length; i < len; i += 1) { - deepGet(value[i], path, index + 1); - } - } else if (path.length) { - // An object. Recurse further. - deepGet(value, path, index + 1); - } - } - }; // Backwards compatibility (since path used to be a string) - - - deepGet(obj, isString(path) ? path.split('.') : path, 0); - return arr ? list : list[0]; -} - -var MatchOptions = { - // Whether the matches should be included in the result set. When `true`, each record in the result - // set will include the indices of the matched characters. - // These can consequently be used for highlighting purposes. - includeMatches: false, - // When `true`, the matching function will continue to the end of a search pattern even if - // a perfect match has already been located in the string. - findAllMatches: false, - // Minimum number of characters that must be matched before a result is considered a match - minMatchCharLength: 1 -}; -var BasicOptions = { - // When `true`, the algorithm continues searching to the end of the input even if a perfect - // match is found before the end of the same input. - isCaseSensitive: false, - // When true, the matching function will continue to the end of a search pattern even if - includeScore: false, - // List of properties that will be searched. This also supports nested properties. - keys: [], - // Whether to sort the result list, by score - shouldSort: true, - // Default sort function: sort by ascending score, ascending index - sortFn: function sortFn(a, b) { - return a.score === b.score ? a.idx < b.idx ? -1 : 1 : a.score < b.score ? -1 : 1; - } -}; -var FuzzyOptions = { - // Approximately where in the text is the pattern expected to be found? - location: 0, - // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match - // (of both letters and location), a threshold of '1.0' would match anything. - threshold: 0.6, - // Determines how close the match must be to the fuzzy location (specified above). - // An exact letter match which is 'distance' characters away from the fuzzy location - // would score as a complete mismatch. A distance of '0' requires the match be at - // the exact location specified, a threshold of '1000' would require a perfect match - // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold. - distance: 100 -}; -var AdvancedOptions = { - // When `true`, it enables the use of unix-like search commands - useExtendedSearch: false, - // The get function to use when fetching an object's properties. - // The default will search nested paths *ie foo.bar.baz* - getFn: get, - // When `true`, search will ignore `location` and `distance`, so it won't matter - // where in the string the pattern appears. - // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score - ignoreLocation: false, - // When `true`, the calculation for the relevance score (used for sorting) will - // ignore the field-length norm. - // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm - ignoreFieldNorm: false, - // The weight to determine how much field length norm effects scoring. - fieldNormWeight: 1 -}; -var Config = _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, BasicOptions), MatchOptions), FuzzyOptions), AdvancedOptions); - -var SPACE = /[^ ]+/g; // Field-length norm: the shorter the field, the higher the weight. -// Set to 3 decimals to reduce index size. - -function norm() { - var weight = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; - var mantissa = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3; - var cache = new Map(); - var m = Math.pow(10, mantissa); - return { - get: function get(value) { - var numTokens = value.match(SPACE).length; - - if (cache.has(numTokens)) { - return cache.get(numTokens); - } // Default function is 1/sqrt(x), weight makes that variable - - - var norm = 1 / Math.pow(numTokens, 0.5 * weight); // In place of `toFixed(mantissa)`, for faster computation - - var n = parseFloat(Math.round(norm * m) / m); - cache.set(numTokens, n); - return n; - }, - clear: function clear() { - cache.clear(); - } - }; -} - -var FuseIndex = /*#__PURE__*/function () { - function FuseIndex() { - var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, - _ref$getFn = _ref.getFn, - getFn = _ref$getFn === void 0 ? Config.getFn : _ref$getFn, - _ref$fieldNormWeight = _ref.fieldNormWeight, - fieldNormWeight = _ref$fieldNormWeight === void 0 ? Config.fieldNormWeight : _ref$fieldNormWeight; - - _classCallCheck(this, FuseIndex); - - this.norm = norm(fieldNormWeight, 3); - this.getFn = getFn; - this.isCreated = false; - this.setIndexRecords(); - } - - _createClass(FuseIndex, [{ - key: "setSources", - value: function setSources() { - var docs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - this.docs = docs; - } - }, { - key: "setIndexRecords", - value: function setIndexRecords() { - var records = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - this.records = records; - } - }, { - key: "setKeys", - value: function setKeys() { - var _this = this; - - var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - this.keys = keys; - this._keysMap = {}; - keys.forEach(function (key, idx) { - _this._keysMap[key.id] = idx; - }); - } - }, { - key: "create", - value: function create() { - var _this2 = this; - - if (this.isCreated || !this.docs.length) { - return; - } - - this.isCreated = true; // List is Array - - if (isString(this.docs[0])) { - this.docs.forEach(function (doc, docIndex) { - _this2._addString(doc, docIndex); - }); - } else { - // List is Array - this.docs.forEach(function (doc, docIndex) { - _this2._addObject(doc, docIndex); - }); - } - - this.norm.clear(); - } // Adds a doc to the end of the index - - }, { - key: "add", - value: function add(doc) { - var idx = this.size(); - - if (isString(doc)) { - this._addString(doc, idx); - } else { - this._addObject(doc, idx); - } - } // Removes the doc at the specified index of the index - - }, { - key: "removeAt", - value: function removeAt(idx) { - this.records.splice(idx, 1); // Change ref index of every subsquent doc - - for (var i = idx, len = this.size(); i < len; i += 1) { - this.records[i].i -= 1; - } - } - }, { - key: "getValueForItemAtKeyId", - value: function getValueForItemAtKeyId(item, keyId) { - return item[this._keysMap[keyId]]; - } - }, { - key: "size", - value: function size() { - return this.records.length; - } - }, { - key: "_addString", - value: function _addString(doc, docIndex) { - if (!isDefined(doc) || isBlank(doc)) { - return; - } - - var record = { - v: doc, - i: docIndex, - n: this.norm.get(doc) - }; - this.records.push(record); - } - }, { - key: "_addObject", - value: function _addObject(doc, docIndex) { - var _this3 = this; - - var record = { - i: docIndex, - $: {} - }; // Iterate over every key (i.e, path), and fetch the value at that key - - this.keys.forEach(function (key, keyIndex) { - var value = key.getFn ? key.getFn(doc) : _this3.getFn(doc, key.path); - - if (!isDefined(value)) { - return; - } - - if (isArray(value)) { - (function () { - var subRecords = []; - var stack = [{ - nestedArrIndex: -1, - value: value - }]; - - while (stack.length) { - var _stack$pop = stack.pop(), - nestedArrIndex = _stack$pop.nestedArrIndex, - _value = _stack$pop.value; - - if (!isDefined(_value)) { - continue; - } - - if (isString(_value) && !isBlank(_value)) { - var subRecord = { - v: _value, - i: nestedArrIndex, - n: _this3.norm.get(_value) - }; - subRecords.push(subRecord); - } else if (isArray(_value)) { - _value.forEach(function (item, k) { - stack.push({ - nestedArrIndex: k, - value: item - }); - }); - } else ; - } - - record.$[keyIndex] = subRecords; - })(); - } else if (isString(value) && !isBlank(value)) { - var subRecord = { - v: value, - n: _this3.norm.get(value) - }; - record.$[keyIndex] = subRecord; - } - }); - this.records.push(record); - } - }, { - key: "toJSON", - value: function toJSON() { - return { - keys: this.keys, - records: this.records - }; - } - }]); - - return FuseIndex; -}(); -function createIndex(keys, docs) { - var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - _ref2$getFn = _ref2.getFn, - getFn = _ref2$getFn === void 0 ? Config.getFn : _ref2$getFn, - _ref2$fieldNormWeight = _ref2.fieldNormWeight, - fieldNormWeight = _ref2$fieldNormWeight === void 0 ? Config.fieldNormWeight : _ref2$fieldNormWeight; - - var myIndex = new FuseIndex({ - getFn: getFn, - fieldNormWeight: fieldNormWeight - }); - myIndex.setKeys(keys.map(createKey)); - myIndex.setSources(docs); - myIndex.create(); - return myIndex; -} -function parseIndex(data) { - var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref3$getFn = _ref3.getFn, - getFn = _ref3$getFn === void 0 ? Config.getFn : _ref3$getFn, - _ref3$fieldNormWeight = _ref3.fieldNormWeight, - fieldNormWeight = _ref3$fieldNormWeight === void 0 ? Config.fieldNormWeight : _ref3$fieldNormWeight; - - var keys = data.keys, - records = data.records; - var myIndex = new FuseIndex({ - getFn: getFn, - fieldNormWeight: fieldNormWeight - }); - myIndex.setKeys(keys); - myIndex.setIndexRecords(records); - return myIndex; -} - -function computeScore$1(pattern) { - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$errors = _ref.errors, - errors = _ref$errors === void 0 ? 0 : _ref$errors, - _ref$currentLocation = _ref.currentLocation, - currentLocation = _ref$currentLocation === void 0 ? 0 : _ref$currentLocation, - _ref$expectedLocation = _ref.expectedLocation, - expectedLocation = _ref$expectedLocation === void 0 ? 0 : _ref$expectedLocation, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - var accuracy = errors / pattern.length; - - if (ignoreLocation) { - return accuracy; - } - - var proximity = Math.abs(expectedLocation - currentLocation); - - if (!distance) { - // Dodge divide by zero error. - return proximity ? 1.0 : accuracy; - } - - return accuracy + proximity / distance; -} - -function convertMaskToIndices() { - var matchmask = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - var minMatchCharLength = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Config.minMatchCharLength; - var indices = []; - var start = -1; - var end = -1; - var i = 0; - - for (var len = matchmask.length; i < len; i += 1) { - var match = matchmask[i]; - - if (match && start === -1) { - start = i; - } else if (!match && start !== -1) { - end = i - 1; - - if (end - start + 1 >= minMatchCharLength) { - indices.push([start, end]); - } - - start = -1; - } - } // (i-1 - start) + 1 => i - start - - - if (matchmask[i - 1] && i - start >= minMatchCharLength) { - indices.push([start, i - 1]); - } - - return indices; -} - -// Machine word size -var MAX_BITS = 32; - -function search(text, pattern, patternAlphabet) { - var _ref = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}, - _ref$location = _ref.location, - location = _ref$location === void 0 ? Config.location : _ref$location, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$threshold = _ref.threshold, - threshold = _ref$threshold === void 0 ? Config.threshold : _ref$threshold, - _ref$findAllMatches = _ref.findAllMatches, - findAllMatches = _ref$findAllMatches === void 0 ? Config.findAllMatches : _ref$findAllMatches, - _ref$minMatchCharLeng = _ref.minMatchCharLength, - minMatchCharLength = _ref$minMatchCharLeng === void 0 ? Config.minMatchCharLength : _ref$minMatchCharLeng, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - if (pattern.length > MAX_BITS) { - throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS)); - } - - var patternLen = pattern.length; // Set starting location at beginning text and initialize the alphabet. - - var textLen = text.length; // Handle the case when location > text.length - - var expectedLocation = Math.max(0, Math.min(location, textLen)); // Highest score beyond which we give up. - - var currentThreshold = threshold; // Is there a nearby exact match? (speedup) - - var bestLocation = expectedLocation; // Performance: only computer matches when the minMatchCharLength > 1 - // OR if `includeMatches` is true. - - var computeMatches = minMatchCharLength > 1 || includeMatches; // A mask of the matches, used for building the indices - - var matchMask = computeMatches ? Array(textLen) : []; - var index; // Get all exact matches, here for speed up - - while ((index = text.indexOf(pattern, bestLocation)) > -1) { - var score = computeScore$1(pattern, { - currentLocation: index, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - currentThreshold = Math.min(score, currentThreshold); - bestLocation = index + patternLen; - - if (computeMatches) { - var i = 0; - - while (i < patternLen) { - matchMask[index + i] = 1; - i += 1; - } - } - } // Reset the best location - - - bestLocation = -1; - var lastBitArr = []; - var finalScore = 1; - var binMax = patternLen + textLen; - var mask = 1 << patternLen - 1; - - for (var _i = 0; _i < patternLen; _i += 1) { - // Scan for the best match; each iteration allows for one more error. - // Run a binary search to determine how far from the match location we can stray - // at this error level. - var binMin = 0; - var binMid = binMax; - - while (binMin < binMid) { - var _score2 = computeScore$1(pattern, { - errors: _i, - currentLocation: expectedLocation + binMid, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - - if (_score2 <= currentThreshold) { - binMin = binMid; - } else { - binMax = binMid; - } - - binMid = Math.floor((binMax - binMin) / 2 + binMin); - } // Use the result from this iteration as the maximum for the next. - - - binMax = binMid; - var start = Math.max(1, expectedLocation - binMid + 1); - var finish = findAllMatches ? textLen : Math.min(expectedLocation + binMid, textLen) + patternLen; // Initialize the bit array - - var bitArr = Array(finish + 2); - bitArr[finish + 1] = (1 << _i) - 1; - - for (var j = finish; j >= start; j -= 1) { - var currentLocation = j - 1; - var charMatch = patternAlphabet[text.charAt(currentLocation)]; - - if (computeMatches) { - // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`) - matchMask[currentLocation] = +!!charMatch; - } // First pass: exact match - - - bitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch; // Subsequent passes: fuzzy match - - if (_i) { - bitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1]; - } - - if (bitArr[j] & mask) { - finalScore = computeScore$1(pattern, { - errors: _i, - currentLocation: currentLocation, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); // This match will almost certainly be better than any existing match. - // But check anyway. - - if (finalScore <= currentThreshold) { - // Indeed it is - currentThreshold = finalScore; - bestLocation = currentLocation; // Already passed `loc`, downhill from here on in. - - if (bestLocation <= expectedLocation) { - break; - } // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`. - - - start = Math.max(1, 2 * expectedLocation - bestLocation); - } - } - } // No hope for a (better) match at greater error levels. - - - var _score = computeScore$1(pattern, { - errors: _i + 1, - currentLocation: expectedLocation, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - - if (_score > currentThreshold) { - break; - } - - lastBitArr = bitArr; - } - - var result = { - isMatch: bestLocation >= 0, - // Count exact matches (those with a score of 0) to be "almost" exact - score: Math.max(0.001, finalScore) - }; - - if (computeMatches) { - var indices = convertMaskToIndices(matchMask, minMatchCharLength); - - if (!indices.length) { - result.isMatch = false; - } else if (includeMatches) { - result.indices = indices; - } - } - - return result; -} - -function createPatternAlphabet(pattern) { - var mask = {}; - - for (var i = 0, len = pattern.length; i < len; i += 1) { - var _char = pattern.charAt(i); - - mask[_char] = (mask[_char] || 0) | 1 << len - i - 1; - } - - return mask; -} - -var BitapSearch = /*#__PURE__*/function () { - function BitapSearch(pattern) { - var _this = this; - - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$location = _ref.location, - location = _ref$location === void 0 ? Config.location : _ref$location, - _ref$threshold = _ref.threshold, - threshold = _ref$threshold === void 0 ? Config.threshold : _ref$threshold, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$findAllMatches = _ref.findAllMatches, - findAllMatches = _ref$findAllMatches === void 0 ? Config.findAllMatches : _ref$findAllMatches, - _ref$minMatchCharLeng = _ref.minMatchCharLength, - minMatchCharLength = _ref$minMatchCharLeng === void 0 ? Config.minMatchCharLength : _ref$minMatchCharLeng, - _ref$isCaseSensitive = _ref.isCaseSensitive, - isCaseSensitive = _ref$isCaseSensitive === void 0 ? Config.isCaseSensitive : _ref$isCaseSensitive, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - _classCallCheck(this, BitapSearch); - - this.options = { - location: location, - threshold: threshold, - distance: distance, - includeMatches: includeMatches, - findAllMatches: findAllMatches, - minMatchCharLength: minMatchCharLength, - isCaseSensitive: isCaseSensitive, - ignoreLocation: ignoreLocation - }; - this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); - this.chunks = []; - - if (!this.pattern.length) { - return; - } - - var addChunk = function addChunk(pattern, startIndex) { - _this.chunks.push({ - pattern: pattern, - alphabet: createPatternAlphabet(pattern), - startIndex: startIndex - }); - }; - - var len = this.pattern.length; - - if (len > MAX_BITS) { - var i = 0; - var remainder = len % MAX_BITS; - var end = len - remainder; - - while (i < end) { - addChunk(this.pattern.substr(i, MAX_BITS), i); - i += MAX_BITS; - } - - if (remainder) { - var startIndex = len - MAX_BITS; - addChunk(this.pattern.substr(startIndex), startIndex); - } - } else { - addChunk(this.pattern, 0); - } - } - - _createClass(BitapSearch, [{ - key: "searchIn", - value: function searchIn(text) { - var _this$options = this.options, - isCaseSensitive = _this$options.isCaseSensitive, - includeMatches = _this$options.includeMatches; - - if (!isCaseSensitive) { - text = text.toLowerCase(); - } // Exact match - - - if (this.pattern === text) { - var _result = { - isMatch: true, - score: 0 - }; - - if (includeMatches) { - _result.indices = [[0, text.length - 1]]; - } - - return _result; - } // Otherwise, use Bitap algorithm - - - var _this$options2 = this.options, - location = _this$options2.location, - distance = _this$options2.distance, - threshold = _this$options2.threshold, - findAllMatches = _this$options2.findAllMatches, - minMatchCharLength = _this$options2.minMatchCharLength, - ignoreLocation = _this$options2.ignoreLocation; - var allIndices = []; - var totalScore = 0; - var hasMatches = false; - this.chunks.forEach(function (_ref2) { - var pattern = _ref2.pattern, - alphabet = _ref2.alphabet, - startIndex = _ref2.startIndex; - - var _search = search(text, pattern, alphabet, { - location: location + startIndex, - distance: distance, - threshold: threshold, - findAllMatches: findAllMatches, - minMatchCharLength: minMatchCharLength, - includeMatches: includeMatches, - ignoreLocation: ignoreLocation - }), - isMatch = _search.isMatch, - score = _search.score, - indices = _search.indices; - - if (isMatch) { - hasMatches = true; - } - - totalScore += score; - - if (isMatch && indices) { - allIndices = [].concat(_toConsumableArray(allIndices), _toConsumableArray(indices)); - } - }); - var result = { - isMatch: hasMatches, - score: hasMatches ? totalScore / this.chunks.length : 1 - }; - - if (hasMatches && includeMatches) { - result.indices = allIndices; - } - - return result; - } - }]); - - return BitapSearch; -}(); - -var registeredSearchers = []; -function createSearcher(pattern, options) { - for (var i = 0, len = registeredSearchers.length; i < len; i += 1) { - var searcherClass = registeredSearchers[i]; - - if (searcherClass.condition(pattern, options)) { - return new searcherClass(pattern, options); - } - } - - return new BitapSearch(pattern, options); -} - -var LogicalOperator = { - AND: '$and', - OR: '$or' -}; -var KeyType = { - PATH: '$path', - PATTERN: '$val' -}; - -var isExpression = function isExpression(query) { - return !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]); -}; - -var isPath = function isPath(query) { - return !!query[KeyType.PATH]; -}; - -var isLeaf = function isLeaf(query) { - return !isArray(query) && isObject(query) && !isExpression(query); -}; - -var convertToExplicit = function convertToExplicit(query) { - return _defineProperty({}, LogicalOperator.AND, Object.keys(query).map(function (key) { - return _defineProperty({}, key, query[key]); - })); -}; // When `auto` is `true`, the parse function will infer and initialize and add -// the appropriate `Searcher` instance - - -function parse(query, options) { - var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - _ref3$auto = _ref3.auto, - auto = _ref3$auto === void 0 ? true : _ref3$auto; - - var next = function next(query) { - var keys = Object.keys(query); - var isQueryPath = isPath(query); - - if (!isQueryPath && keys.length > 1 && !isExpression(query)) { - return next(convertToExplicit(query)); - } - - if (isLeaf(query)) { - var key = isQueryPath ? query[KeyType.PATH] : keys[0]; - var pattern = isQueryPath ? query[KeyType.PATTERN] : query[key]; - - if (!isString(pattern)) { - throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key)); - } - - var obj = { - keyId: createKeyId(key), - pattern: pattern - }; - - if (auto) { - obj.searcher = createSearcher(pattern, options); - } - - return obj; - } - - var node = { - children: [], - operator: keys[0] - }; - keys.forEach(function (key) { - var value = query[key]; - - if (isArray(value)) { - value.forEach(function (item) { - node.children.push(next(item)); - }); - } - }); - return node; - }; - - if (!isExpression(query)) { - query = convertToExplicit(query); - } - - return next(query); -} - -function computeScore(results, _ref) { - var _ref$ignoreFieldNorm = _ref.ignoreFieldNorm, - ignoreFieldNorm = _ref$ignoreFieldNorm === void 0 ? Config.ignoreFieldNorm : _ref$ignoreFieldNorm; - results.forEach(function (result) { - var totalScore = 1; - result.matches.forEach(function (_ref2) { - var key = _ref2.key, - norm = _ref2.norm, - score = _ref2.score; - var weight = key ? key.weight : null; - totalScore *= Math.pow(score === 0 && weight ? Number.EPSILON : score, (weight || 1) * (ignoreFieldNorm ? 1 : norm)); - }); - result.score = totalScore; - }); -} - -function transformMatches(result, data) { - var matches = result.matches; - data.matches = []; - - if (!isDefined(matches)) { - return; - } - - matches.forEach(function (match) { - if (!isDefined(match.indices) || !match.indices.length) { - return; - } - - var indices = match.indices, - value = match.value; - var obj = { - indices: indices, - value: value - }; - - if (match.key) { - obj.key = match.key.src; - } - - if (match.idx > -1) { - obj.refIndex = match.idx; - } - - data.matches.push(obj); - }); -} - -function transformScore(result, data) { - data.score = result.score; -} - -function format(results, docs) { - var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$includeScore = _ref.includeScore, - includeScore = _ref$includeScore === void 0 ? Config.includeScore : _ref$includeScore; - - var transformers = []; - if (includeMatches) transformers.push(transformMatches); - if (includeScore) transformers.push(transformScore); - return results.map(function (result) { - var idx = result.idx; - var data = { - item: docs[idx], - refIndex: idx - }; - - if (transformers.length) { - transformers.forEach(function (transformer) { - transformer(result, data); - }); - } - - return data; - }); -} - -var Fuse$1 = /*#__PURE__*/function () { - function Fuse(docs) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var index = arguments.length > 2 ? arguments[2] : undefined; - - _classCallCheck(this, Fuse); - - this.options = _objectSpread2(_objectSpread2({}, Config), options); - - if (this.options.useExtendedSearch && !false) { - throw new Error(EXTENDED_SEARCH_UNAVAILABLE); - } - - this._keyStore = new KeyStore(this.options.keys); - this.setCollection(docs, index); - } - - _createClass(Fuse, [{ - key: "setCollection", - value: function setCollection(docs, index) { - this._docs = docs; - - if (index && !(index instanceof FuseIndex)) { - throw new Error(INCORRECT_INDEX_TYPE); - } - - this._myIndex = index || createIndex(this.options.keys, this._docs, { - getFn: this.options.getFn, - fieldNormWeight: this.options.fieldNormWeight - }); - } - }, { - key: "add", - value: function add(doc) { - if (!isDefined(doc)) { - return; - } - - this._docs.push(doc); - - this._myIndex.add(doc); - } - }, { - key: "remove", - value: function remove() { - var predicate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function - /* doc, idx */ - () { - return false; - }; - var results = []; - - for (var i = 0, len = this._docs.length; i < len; i += 1) { - var doc = this._docs[i]; - - if (predicate(doc, i)) { - this.removeAt(i); - i -= 1; - len -= 1; - results.push(doc); - } - } - - return results; - } - }, { - key: "removeAt", - value: function removeAt(idx) { - this._docs.splice(idx, 1); - - this._myIndex.removeAt(idx); - } - }, { - key: "getIndex", - value: function getIndex() { - return this._myIndex; - } - }, { - key: "search", - value: function search(query) { - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$limit = _ref.limit, - limit = _ref$limit === void 0 ? -1 : _ref$limit, - _ref$keys = _ref.keys, - keys = _ref$keys === void 0 ? [] : _ref$keys; - - var _this$options = this.options, - includeMatches = _this$options.includeMatches, - includeScore = _this$options.includeScore, - shouldSort = _this$options.shouldSort, - sortFn = _this$options.sortFn, - ignoreFieldNorm = _this$options.ignoreFieldNorm; - var results = isString(query) ? isString(this._docs[0]) ? this._searchStringList(query) : this._searchObjectList(query, keys) : this._searchLogical(query); - computeScore(results, { - ignoreFieldNorm: ignoreFieldNorm - }); - - if (shouldSort) { - results.sort(sortFn); - } - - if (isNumber(limit) && limit > -1) { - results = results.slice(0, limit); - } - - return format(results, this._docs, { - includeMatches: includeMatches, - includeScore: includeScore - }); - } - }, { - key: "_searchStringList", - value: function _searchStringList(query) { - var searcher = createSearcher(query, this.options); - var records = this._myIndex.records; - var results = []; // Iterate over every string in the index - - records.forEach(function (_ref2) { - var text = _ref2.v, - idx = _ref2.i, - norm = _ref2.n; - - if (!isDefined(text)) { - return; - } - - var _searcher$searchIn = searcher.searchIn(text), - isMatch = _searcher$searchIn.isMatch, - score = _searcher$searchIn.score, - indices = _searcher$searchIn.indices; - - if (isMatch) { - results.push({ - item: text, - idx: idx, - matches: [{ - score: score, - value: text, - norm: norm, - indices: indices - }] - }); - } - }); - return results; - } - }, { - key: "_searchLogical", - value: function _searchLogical(query) { - - { - throw new Error(LOGICAL_SEARCH_UNAVAILABLE); - } - } - }, { - key: "_searchObjectList", - value: function _searchObjectList(query, searchKeys) { - var _this2 = this; - - var searcher = createSearcher(query, this.options); - var _this$_myIndex = this._myIndex, - keys = _this$_myIndex.keys, - records = _this$_myIndex.records; - var results = []; // List is Array - - records.forEach(function (_ref5) { - var item = _ref5.$, - idx = _ref5.i; - - if (!isDefined(item)) { - return; - } - - var matches = []; // Iterate over every key (i.e, path), and fetch the value at that key - - keys.forEach(function (key, keyIndex) { - if (searchKeys.length > 0 && !searchKeys.includes(key.id)) return; - matches.push.apply(matches, _toConsumableArray(_this2._findMatches({ - key: key, - value: item[keyIndex], - searcher: searcher - }))); - }); - - if (matches.length) { - results.push({ - idx: idx, - item: item, - matches: matches - }); - } - }); - return results; - } - }, { - key: "_findMatches", - value: function _findMatches(_ref6) { - var key = _ref6.key, - value = _ref6.value, - searcher = _ref6.searcher; - - if (!isDefined(value)) { - return []; - } - - var matches = []; - - if (isArray(value)) { - value.forEach(function (_ref7) { - var text = _ref7.v, - idx = _ref7.i, - norm = _ref7.n; - - if (!isDefined(text)) { - return; - } - - var _searcher$searchIn2 = searcher.searchIn(text), - isMatch = _searcher$searchIn2.isMatch, - score = _searcher$searchIn2.score, - indices = _searcher$searchIn2.indices; - - if (isMatch) { - matches.push({ - score: score, - key: key, - value: text, - idx: idx, - norm: norm, - indices: indices - }); - } - }); - } else { - var text = value.v, - norm = value.n; - - var _searcher$searchIn3 = searcher.searchIn(text), - isMatch = _searcher$searchIn3.isMatch, - score = _searcher$searchIn3.score, - indices = _searcher$searchIn3.indices; - - if (isMatch) { - matches.push({ - score: score, - key: key, - value: text, - norm: norm, - indices: indices - }); - } - } - - return matches; - } - }]); - - return Fuse; -}(); - -Fuse$1.version = '6.6.2-beta.7'; -Fuse$1.createIndex = createIndex; -Fuse$1.parseIndex = parseIndex; -Fuse$1.config = Config; - -{ - Fuse$1.parseQuery = parse; -} - -var Fuse = Fuse$1; - -module.exports = Fuse; diff --git a/dist/fuse.basic.esm.js b/dist/fuse.basic.esm.js deleted file mode 100644 index a753696b6..000000000 --- a/dist/fuse.basic.esm.js +++ /dev/null @@ -1,1260 +0,0 @@ -/** - * Fuse.js v6.6.2-beta.7 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2022 Kiro Risk (http://kiro.me) - * All Rights Reserved. Apache Software License 2.0 - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -function isArray(value) { - return !Array.isArray - ? getTag(value) === '[object Array]' - : Array.isArray(value) -} - -// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js -const INFINITY = 1 / 0; -function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value - } - let result = value + ''; - return result == '0' && 1 / value == -INFINITY ? '-0' : result -} - -function toString(value) { - return value == null ? '' : baseToString(value) -} - -function isString(value) { - return typeof value === 'string' -} - -function isNumber(value) { - return typeof value === 'number' -} - -// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js -function isBoolean(value) { - return ( - value === true || - value === false || - (isObjectLike(value) && getTag(value) == '[object Boolean]') - ) -} - -function isObject(value) { - return typeof value === 'object' -} - -// Checks if `value` is object-like. -function isObjectLike(value) { - return isObject(value) && value !== null -} - -function isDefined(value) { - return value !== undefined && value !== null -} - -function isBlank(value) { - return !value.trim().length -} - -// Gets the `toStringTag` of `value`. -// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js -function getTag(value) { - return value == null - ? value === undefined - ? '[object Undefined]' - : '[object Null]' - : Object.prototype.toString.call(value) -} - -const EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available'; - -const LOGICAL_SEARCH_UNAVAILABLE = 'Logical search is not available'; - -const INCORRECT_INDEX_TYPE = "Incorrect 'index' type"; - -const LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) => - `Invalid value for key ${key}`; - -const PATTERN_LENGTH_TOO_LARGE = (max) => - `Pattern length exceeds max of ${max}.`; - -const MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`; - -const INVALID_KEY_WEIGHT_VALUE = (key) => - `Property 'weight' in key '${key}' must be a positive integer`; - -const hasOwn = Object.prototype.hasOwnProperty; - -class KeyStore { - constructor(keys) { - this._keys = []; - this._keyMap = {}; - - let totalWeight = 0; - - keys.forEach((key) => { - let obj = createKey(key); - - this._keys.push(obj); - this._keyMap[obj.id] = obj; - - totalWeight += obj.weight; - }); - - // Normalize weights so that their sum is equal to 1 - this._keys.forEach((key) => { - key.weight /= totalWeight; - }); - } - get(keyId) { - return this._keyMap[keyId] - } - keys() { - return this._keys - } - toJSON() { - return JSON.stringify(this._keys) - } -} - -function createKey(key) { - let path = null; - let id = null; - let src = null; - let weight = 1; - let getFn = null; - - if (isString(key) || isArray(key)) { - src = key; - path = createKeyPath(key); - id = createKeyId(key); - } else { - if (!hasOwn.call(key, 'name')) { - throw new Error(MISSING_KEY_PROPERTY('name')) - } - - const name = key.name; - src = name; - - if (hasOwn.call(key, 'weight')) { - weight = key.weight; - - if (weight <= 0) { - throw new Error(INVALID_KEY_WEIGHT_VALUE(name)) - } - } - - path = createKeyPath(name); - id = createKeyId(name); - getFn = key.getFn; - } - - return { path, id, weight, src, getFn } -} - -function createKeyPath(key) { - return isArray(key) ? key : key.split('.') -} - -function createKeyId(key) { - return isArray(key) ? key.join('.') : key -} - -function get(obj, path) { - let list = []; - let arr = false; - - const deepGet = (obj, path, index) => { - if (!isDefined(obj)) { - return - } - if (!path[index]) { - // If there's no path left, we've arrived at the object we care about. - list.push(obj); - } else { - let key = path[index]; - - const value = obj[key]; - - if (!isDefined(value)) { - return - } - - // If we're at the last value in the path, and if it's a string/number/bool, - // add it to the list - if ( - index === path.length - 1 && - (isString(value) || isNumber(value) || isBoolean(value)) - ) { - list.push(toString(value)); - } else if (isArray(value)) { - arr = true; - // Search each item in the array. - for (let i = 0, len = value.length; i < len; i += 1) { - deepGet(value[i], path, index + 1); - } - } else if (path.length) { - // An object. Recurse further. - deepGet(value, path, index + 1); - } - } - }; - - // Backwards compatibility (since path used to be a string) - deepGet(obj, isString(path) ? path.split('.') : path, 0); - - return arr ? list : list[0] -} - -const MatchOptions = { - // Whether the matches should be included in the result set. When `true`, each record in the result - // set will include the indices of the matched characters. - // These can consequently be used for highlighting purposes. - includeMatches: false, - // When `true`, the matching function will continue to the end of a search pattern even if - // a perfect match has already been located in the string. - findAllMatches: false, - // Minimum number of characters that must be matched before a result is considered a match - minMatchCharLength: 1 -}; - -const BasicOptions = { - // When `true`, the algorithm continues searching to the end of the input even if a perfect - // match is found before the end of the same input. - isCaseSensitive: false, - // When true, the matching function will continue to the end of a search pattern even if - includeScore: false, - // List of properties that will be searched. This also supports nested properties. - keys: [], - // Whether to sort the result list, by score - shouldSort: true, - // Default sort function: sort by ascending score, ascending index - sortFn: (a, b) => - a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1 -}; - -const FuzzyOptions = { - // Approximately where in the text is the pattern expected to be found? - location: 0, - // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match - // (of both letters and location), a threshold of '1.0' would match anything. - threshold: 0.6, - // Determines how close the match must be to the fuzzy location (specified above). - // An exact letter match which is 'distance' characters away from the fuzzy location - // would score as a complete mismatch. A distance of '0' requires the match be at - // the exact location specified, a threshold of '1000' would require a perfect match - // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold. - distance: 100 -}; - -const AdvancedOptions = { - // When `true`, it enables the use of unix-like search commands - useExtendedSearch: false, - // The get function to use when fetching an object's properties. - // The default will search nested paths *ie foo.bar.baz* - getFn: get, - // When `true`, search will ignore `location` and `distance`, so it won't matter - // where in the string the pattern appears. - // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score - ignoreLocation: false, - // When `true`, the calculation for the relevance score (used for sorting) will - // ignore the field-length norm. - // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm - ignoreFieldNorm: false, - // The weight to determine how much field length norm effects scoring. - fieldNormWeight: 1 -}; - -var Config = { - ...BasicOptions, - ...MatchOptions, - ...FuzzyOptions, - ...AdvancedOptions -}; - -const SPACE = /[^ ]+/g; - -// Field-length norm: the shorter the field, the higher the weight. -// Set to 3 decimals to reduce index size. -function norm(weight = 1, mantissa = 3) { - const cache = new Map(); - const m = Math.pow(10, mantissa); - - return { - get(value) { - const numTokens = value.match(SPACE).length; - - if (cache.has(numTokens)) { - return cache.get(numTokens) - } - - // Default function is 1/sqrt(x), weight makes that variable - const norm = 1 / Math.pow(numTokens, 0.5 * weight); - - // In place of `toFixed(mantissa)`, for faster computation - const n = parseFloat(Math.round(norm * m) / m); - - cache.set(numTokens, n); - - return n - }, - clear() { - cache.clear(); - } - } -} - -class FuseIndex { - constructor({ - getFn = Config.getFn, - fieldNormWeight = Config.fieldNormWeight - } = {}) { - this.norm = norm(fieldNormWeight, 3); - this.getFn = getFn; - this.isCreated = false; - - this.setIndexRecords(); - } - setSources(docs = []) { - this.docs = docs; - } - setIndexRecords(records = []) { - this.records = records; - } - setKeys(keys = []) { - this.keys = keys; - this._keysMap = {}; - keys.forEach((key, idx) => { - this._keysMap[key.id] = idx; - }); - } - create() { - if (this.isCreated || !this.docs.length) { - return - } - - this.isCreated = true; - - // List is Array - if (isString(this.docs[0])) { - this.docs.forEach((doc, docIndex) => { - this._addString(doc, docIndex); - }); - } else { - // List is Array - this.docs.forEach((doc, docIndex) => { - this._addObject(doc, docIndex); - }); - } - - this.norm.clear(); - } - // Adds a doc to the end of the index - add(doc) { - const idx = this.size(); - - if (isString(doc)) { - this._addString(doc, idx); - } else { - this._addObject(doc, idx); - } - } - // Removes the doc at the specified index of the index - removeAt(idx) { - this.records.splice(idx, 1); - - // Change ref index of every subsquent doc - for (let i = idx, len = this.size(); i < len; i += 1) { - this.records[i].i -= 1; - } - } - getValueForItemAtKeyId(item, keyId) { - return item[this._keysMap[keyId]] - } - size() { - return this.records.length - } - _addString(doc, docIndex) { - if (!isDefined(doc) || isBlank(doc)) { - return - } - - let record = { - v: doc, - i: docIndex, - n: this.norm.get(doc) - }; - - this.records.push(record); - } - _addObject(doc, docIndex) { - let record = { i: docIndex, $: {} }; - - // Iterate over every key (i.e, path), and fetch the value at that key - this.keys.forEach((key, keyIndex) => { - let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path); - - if (!isDefined(value)) { - return - } - - if (isArray(value)) { - let subRecords = []; - const stack = [{ nestedArrIndex: -1, value }]; - - while (stack.length) { - const { nestedArrIndex, value } = stack.pop(); - - if (!isDefined(value)) { - continue - } - - if (isString(value) && !isBlank(value)) { - let subRecord = { - v: value, - i: nestedArrIndex, - n: this.norm.get(value) - }; - - subRecords.push(subRecord); - } else if (isArray(value)) { - value.forEach((item, k) => { - stack.push({ - nestedArrIndex: k, - value: item - }); - }); - } else ; - } - record.$[keyIndex] = subRecords; - } else if (isString(value) && !isBlank(value)) { - let subRecord = { - v: value, - n: this.norm.get(value) - }; - - record.$[keyIndex] = subRecord; - } - }); - - this.records.push(record); - } - toJSON() { - return { - keys: this.keys, - records: this.records - } - } -} - -function createIndex( - keys, - docs, - { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {} -) { - const myIndex = new FuseIndex({ getFn, fieldNormWeight }); - myIndex.setKeys(keys.map(createKey)); - myIndex.setSources(docs); - myIndex.create(); - return myIndex -} - -function parseIndex( - data, - { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {} -) { - const { keys, records } = data; - const myIndex = new FuseIndex({ getFn, fieldNormWeight }); - myIndex.setKeys(keys); - myIndex.setIndexRecords(records); - return myIndex -} - -function computeScore$1( - pattern, - { - errors = 0, - currentLocation = 0, - expectedLocation = 0, - distance = Config.distance, - ignoreLocation = Config.ignoreLocation - } = {} -) { - const accuracy = errors / pattern.length; - - if (ignoreLocation) { - return accuracy - } - - const proximity = Math.abs(expectedLocation - currentLocation); - - if (!distance) { - // Dodge divide by zero error. - return proximity ? 1.0 : accuracy - } - - return accuracy + proximity / distance -} - -function convertMaskToIndices( - matchmask = [], - minMatchCharLength = Config.minMatchCharLength -) { - let indices = []; - let start = -1; - let end = -1; - let i = 0; - - for (let len = matchmask.length; i < len; i += 1) { - let match = matchmask[i]; - if (match && start === -1) { - start = i; - } else if (!match && start !== -1) { - end = i - 1; - if (end - start + 1 >= minMatchCharLength) { - indices.push([start, end]); - } - start = -1; - } - } - - // (i-1 - start) + 1 => i - start - if (matchmask[i - 1] && i - start >= minMatchCharLength) { - indices.push([start, i - 1]); - } - - return indices -} - -// Machine word size -const MAX_BITS = 32; - -function search( - text, - pattern, - patternAlphabet, - { - location = Config.location, - distance = Config.distance, - threshold = Config.threshold, - findAllMatches = Config.findAllMatches, - minMatchCharLength = Config.minMatchCharLength, - includeMatches = Config.includeMatches, - ignoreLocation = Config.ignoreLocation - } = {} -) { - if (pattern.length > MAX_BITS) { - throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS)) - } - - const patternLen = pattern.length; - // Set starting location at beginning text and initialize the alphabet. - const textLen = text.length; - // Handle the case when location > text.length - const expectedLocation = Math.max(0, Math.min(location, textLen)); - // Highest score beyond which we give up. - let currentThreshold = threshold; - // Is there a nearby exact match? (speedup) - let bestLocation = expectedLocation; - - // Performance: only computer matches when the minMatchCharLength > 1 - // OR if `includeMatches` is true. - const computeMatches = minMatchCharLength > 1 || includeMatches; - // A mask of the matches, used for building the indices - const matchMask = computeMatches ? Array(textLen) : []; - - let index; - - // Get all exact matches, here for speed up - while ((index = text.indexOf(pattern, bestLocation)) > -1) { - let score = computeScore$1(pattern, { - currentLocation: index, - expectedLocation, - distance, - ignoreLocation - }); - - currentThreshold = Math.min(score, currentThreshold); - bestLocation = index + patternLen; - - if (computeMatches) { - let i = 0; - while (i < patternLen) { - matchMask[index + i] = 1; - i += 1; - } - } - } - - // Reset the best location - bestLocation = -1; - - let lastBitArr = []; - let finalScore = 1; - let binMax = patternLen + textLen; - - const mask = 1 << (patternLen - 1); - - for (let i = 0; i < patternLen; i += 1) { - // Scan for the best match; each iteration allows for one more error. - // Run a binary search to determine how far from the match location we can stray - // at this error level. - let binMin = 0; - let binMid = binMax; - - while (binMin < binMid) { - const score = computeScore$1(pattern, { - errors: i, - currentLocation: expectedLocation + binMid, - expectedLocation, - distance, - ignoreLocation - }); - - if (score <= currentThreshold) { - binMin = binMid; - } else { - binMax = binMid; - } - - binMid = Math.floor((binMax - binMin) / 2 + binMin); - } - - // Use the result from this iteration as the maximum for the next. - binMax = binMid; - - let start = Math.max(1, expectedLocation - binMid + 1); - let finish = findAllMatches - ? textLen - : Math.min(expectedLocation + binMid, textLen) + patternLen; - - // Initialize the bit array - let bitArr = Array(finish + 2); - - bitArr[finish + 1] = (1 << i) - 1; - - for (let j = finish; j >= start; j -= 1) { - let currentLocation = j - 1; - let charMatch = patternAlphabet[text.charAt(currentLocation)]; - - if (computeMatches) { - // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`) - matchMask[currentLocation] = +!!charMatch; - } - - // First pass: exact match - bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch; - - // Subsequent passes: fuzzy match - if (i) { - bitArr[j] |= - ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1]; - } - - if (bitArr[j] & mask) { - finalScore = computeScore$1(pattern, { - errors: i, - currentLocation, - expectedLocation, - distance, - ignoreLocation - }); - - // This match will almost certainly be better than any existing match. - // But check anyway. - if (finalScore <= currentThreshold) { - // Indeed it is - currentThreshold = finalScore; - bestLocation = currentLocation; - - // Already passed `loc`, downhill from here on in. - if (bestLocation <= expectedLocation) { - break - } - - // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`. - start = Math.max(1, 2 * expectedLocation - bestLocation); - } - } - } - - // No hope for a (better) match at greater error levels. - const score = computeScore$1(pattern, { - errors: i + 1, - currentLocation: expectedLocation, - expectedLocation, - distance, - ignoreLocation - }); - - if (score > currentThreshold) { - break - } - - lastBitArr = bitArr; - } - - const result = { - isMatch: bestLocation >= 0, - // Count exact matches (those with a score of 0) to be "almost" exact - score: Math.max(0.001, finalScore) - }; - - if (computeMatches) { - const indices = convertMaskToIndices(matchMask, minMatchCharLength); - if (!indices.length) { - result.isMatch = false; - } else if (includeMatches) { - result.indices = indices; - } - } - - return result -} - -function createPatternAlphabet(pattern) { - let mask = {}; - - for (let i = 0, len = pattern.length; i < len; i += 1) { - const char = pattern.charAt(i); - mask[char] = (mask[char] || 0) | (1 << (len - i - 1)); - } - - return mask -} - -class BitapSearch { - constructor( - pattern, - { - location = Config.location, - threshold = Config.threshold, - distance = Config.distance, - includeMatches = Config.includeMatches, - findAllMatches = Config.findAllMatches, - minMatchCharLength = Config.minMatchCharLength, - isCaseSensitive = Config.isCaseSensitive, - ignoreLocation = Config.ignoreLocation - } = {} - ) { - this.options = { - location, - threshold, - distance, - includeMatches, - findAllMatches, - minMatchCharLength, - isCaseSensitive, - ignoreLocation - }; - - this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); - - this.chunks = []; - - if (!this.pattern.length) { - return - } - - const addChunk = (pattern, startIndex) => { - this.chunks.push({ - pattern, - alphabet: createPatternAlphabet(pattern), - startIndex - }); - }; - - const len = this.pattern.length; - - if (len > MAX_BITS) { - let i = 0; - const remainder = len % MAX_BITS; - const end = len - remainder; - - while (i < end) { - addChunk(this.pattern.substr(i, MAX_BITS), i); - i += MAX_BITS; - } - - if (remainder) { - const startIndex = len - MAX_BITS; - addChunk(this.pattern.substr(startIndex), startIndex); - } - } else { - addChunk(this.pattern, 0); - } - } - - searchIn(text) { - const { isCaseSensitive, includeMatches } = this.options; - - if (!isCaseSensitive) { - text = text.toLowerCase(); - } - - // Exact match - if (this.pattern === text) { - let result = { - isMatch: true, - score: 0 - }; - - if (includeMatches) { - result.indices = [[0, text.length - 1]]; - } - - return result - } - - // Otherwise, use Bitap algorithm - const { - location, - distance, - threshold, - findAllMatches, - minMatchCharLength, - ignoreLocation - } = this.options; - - let allIndices = []; - let totalScore = 0; - let hasMatches = false; - - this.chunks.forEach(({ pattern, alphabet, startIndex }) => { - const { isMatch, score, indices } = search(text, pattern, alphabet, { - location: location + startIndex, - distance, - threshold, - findAllMatches, - minMatchCharLength, - includeMatches, - ignoreLocation - }); - - if (isMatch) { - hasMatches = true; - } - - totalScore += score; - - if (isMatch && indices) { - allIndices = [...allIndices, ...indices]; - } - }); - - let result = { - isMatch: hasMatches, - score: hasMatches ? totalScore / this.chunks.length : 1 - }; - - if (hasMatches && includeMatches) { - result.indices = allIndices; - } - - return result - } -} - -const registeredSearchers = []; - -function createSearcher(pattern, options) { - for (let i = 0, len = registeredSearchers.length; i < len; i += 1) { - let searcherClass = registeredSearchers[i]; - if (searcherClass.condition(pattern, options)) { - return new searcherClass(pattern, options) - } - } - - return new BitapSearch(pattern, options) -} - -const LogicalOperator = { - AND: '$and', - OR: '$or' -}; - -const KeyType = { - PATH: '$path', - PATTERN: '$val' -}; - -const isExpression = (query) => - !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]); - -const isPath = (query) => !!query[KeyType.PATH]; - -const isLeaf = (query) => - !isArray(query) && isObject(query) && !isExpression(query); - -const convertToExplicit = (query) => ({ - [LogicalOperator.AND]: Object.keys(query).map((key) => ({ - [key]: query[key] - })) -}); - -// When `auto` is `true`, the parse function will infer and initialize and add -// the appropriate `Searcher` instance -function parse(query, options, { auto = true } = {}) { - const next = (query) => { - let keys = Object.keys(query); - - const isQueryPath = isPath(query); - - if (!isQueryPath && keys.length > 1 && !isExpression(query)) { - return next(convertToExplicit(query)) - } - - if (isLeaf(query)) { - const key = isQueryPath ? query[KeyType.PATH] : keys[0]; - - const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key]; - - if (!isString(pattern)) { - throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key)) - } - - const obj = { - keyId: createKeyId(key), - pattern - }; - - if (auto) { - obj.searcher = createSearcher(pattern, options); - } - - return obj - } - - let node = { - children: [], - operator: keys[0] - }; - - keys.forEach((key) => { - const value = query[key]; - - if (isArray(value)) { - value.forEach((item) => { - node.children.push(next(item)); - }); - } - }); - - return node - }; - - if (!isExpression(query)) { - query = convertToExplicit(query); - } - - return next(query) -} - -// Practical scoring function -function computeScore( - results, - { ignoreFieldNorm = Config.ignoreFieldNorm } -) { - results.forEach((result) => { - let totalScore = 1; - - result.matches.forEach(({ key, norm, score }) => { - const weight = key ? key.weight : null; - - totalScore *= Math.pow( - score === 0 && weight ? Number.EPSILON : score, - (weight || 1) * (ignoreFieldNorm ? 1 : norm) - ); - }); - - result.score = totalScore; - }); -} - -function transformMatches(result, data) { - const matches = result.matches; - data.matches = []; - - if (!isDefined(matches)) { - return - } - - matches.forEach((match) => { - if (!isDefined(match.indices) || !match.indices.length) { - return - } - - const { indices, value } = match; - - let obj = { - indices, - value - }; - - if (match.key) { - obj.key = match.key.src; - } - - if (match.idx > -1) { - obj.refIndex = match.idx; - } - - data.matches.push(obj); - }); -} - -function transformScore(result, data) { - data.score = result.score; -} - -function format( - results, - docs, - { - includeMatches = Config.includeMatches, - includeScore = Config.includeScore - } = {} -) { - const transformers = []; - - if (includeMatches) transformers.push(transformMatches); - if (includeScore) transformers.push(transformScore); - - return results.map((result) => { - const { idx } = result; - - const data = { - item: docs[idx], - refIndex: idx - }; - - if (transformers.length) { - transformers.forEach((transformer) => { - transformer(result, data); - }); - } - - return data - }) -} - -class Fuse { - constructor(docs, options = {}, index) { - this.options = { ...Config, ...options }; - - if ( - this.options.useExtendedSearch && - !false - ) { - throw new Error(EXTENDED_SEARCH_UNAVAILABLE) - } - - this._keyStore = new KeyStore(this.options.keys); - - this.setCollection(docs, index); - } - - setCollection(docs, index) { - this._docs = docs; - - if (index && !(index instanceof FuseIndex)) { - throw new Error(INCORRECT_INDEX_TYPE) - } - - this._myIndex = - index || - createIndex(this.options.keys, this._docs, { - getFn: this.options.getFn, - fieldNormWeight: this.options.fieldNormWeight - }); - } - - add(doc) { - if (!isDefined(doc)) { - return - } - - this._docs.push(doc); - this._myIndex.add(doc); - } - - remove(predicate = (/* doc, idx */) => false) { - const results = []; - - for (let i = 0, len = this._docs.length; i < len; i += 1) { - const doc = this._docs[i]; - if (predicate(doc, i)) { - this.removeAt(i); - i -= 1; - len -= 1; - - results.push(doc); - } - } - - return results - } - - removeAt(idx) { - this._docs.splice(idx, 1); - this._myIndex.removeAt(idx); - } - - getIndex() { - return this._myIndex - } - - search(query, { limit = -1, keys = [] } = {}) { - const { - includeMatches, - includeScore, - shouldSort, - sortFn, - ignoreFieldNorm - } = this.options; - - let results = isString(query) - ? isString(this._docs[0]) - ? this._searchStringList(query) - : this._searchObjectList(query, keys) - : this._searchLogical(query); - - computeScore(results, { ignoreFieldNorm }); - - if (shouldSort) { - results.sort(sortFn); - } - - if (isNumber(limit) && limit > -1) { - results = results.slice(0, limit); - } - - return format(results, this._docs, { - includeMatches, - includeScore - }) - } - - _searchStringList(query) { - const searcher = createSearcher(query, this.options); - const { records } = this._myIndex; - const results = []; - - // Iterate over every string in the index - records.forEach(({ v: text, i: idx, n: norm }) => { - if (!isDefined(text)) { - return - } - - const { isMatch, score, indices } = searcher.searchIn(text); - - if (isMatch) { - results.push({ - item: text, - idx, - matches: [{ score, value: text, norm, indices }] - }); - } - }); - - return results - } - - _searchLogical(query) { - { - throw new Error(LOGICAL_SEARCH_UNAVAILABLE) - } - } - - _searchObjectList(query, searchKeys) { - const searcher = createSearcher(query, this.options); - const { keys, records } = this._myIndex; - const results = []; - - // List is Array - records.forEach(({ $: item, i: idx }) => { - if (!isDefined(item)) { - return - } - - let matches = []; - - // Iterate over every key (i.e, path), and fetch the value at that key - keys.forEach((key, keyIndex) => { - if (searchKeys.length > 0 && !searchKeys.includes(key.id)) return - matches.push( - ...this._findMatches({ - key, - value: item[keyIndex], - searcher - }) - ); - }); - - if (matches.length) { - results.push({ - idx, - item, - matches - }); - } - }); - - return results - } - _findMatches({ key, value, searcher }) { - if (!isDefined(value)) { - return [] - } - - let matches = []; - - if (isArray(value)) { - value.forEach(({ v: text, i: idx, n: norm }) => { - if (!isDefined(text)) { - return - } - - const { isMatch, score, indices } = searcher.searchIn(text); - - if (isMatch) { - matches.push({ - score, - key, - value: text, - idx, - norm, - indices - }); - } - }); - } else { - const { v: text, n: norm } = value; - - const { isMatch, score, indices } = searcher.searchIn(text); - - if (isMatch) { - matches.push({ score, key, value: text, norm, indices }); - } - } - - return matches - } -} - -Fuse.version = '6.6.2-beta.7'; -Fuse.createIndex = createIndex; -Fuse.parseIndex = parseIndex; -Fuse.config = Config; - -{ - Fuse.parseQuery = parse; -} - -export { Fuse as default }; diff --git a/dist/fuse.basic.esm.min.js b/dist/fuse.basic.esm.min.js deleted file mode 100644 index 9636eba06..000000000 --- a/dist/fuse.basic.esm.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Fuse.js v6.6.2-beta.7 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2022 Kiro Risk (http://kiro.me) - * All Rights Reserved. Apache Software License 2.0 - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ -function e(e){return Array.isArray?Array.isArray(e):"[object Array]"===o(e)}function t(e){return"string"==typeof e}function n(e){return"number"==typeof e}function i(e){return!0===e||!1===e||function(e){return function(e){return"object"==typeof e}(e)&&null!==e}(e)&&"[object Boolean]"==o(e)}function s(e){return null!=e}function r(e){return!e.trim().length}function o(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const c=Object.prototype.hasOwnProperty;class h{constructor(e){this._keys=[],this._keyMap={};let t=0;e.forEach((e=>{let n=a(e);this._keys.push(n),this._keyMap[n.id]=n,t+=n.weight})),this._keys.forEach((e=>{e.weight/=t}))}get(e){return this._keyMap[e]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function a(n){let i=null,s=null,r=null,o=1,h=null;if(t(n)||e(n))r=n,i=l(n),s=d(n);else{if(!c.call(n,"name"))throw new Error((e=>`Missing ${e} property in key`)("name"));const e=n.name;if(r=e,c.call(n,"weight")&&(o=n.weight,o<=0))throw new Error((e=>`Property 'weight' in key '${e}' must be a positive integer`)(e));i=l(e),s=d(e),h=n.getFn}return{path:i,id:s,weight:o,src:r,getFn:h}}function l(t){return e(t)?t:t.split(".")}function d(t){return e(t)?t.join("."):t}var u={isCaseSensitive:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(e,t)=>e.score===t.score?e.idx{if(s(r))if(o[l]){const d=r[o[l]];if(!s(d))return;if(l===o.length-1&&(t(d)||n(d)||i(d)))c.push(function(e){return null==e?"":function(e){if("string"==typeof e)return e;let t=e+"";return"0"==t&&1/e==-1/0?"-0":t}(e)}(d));else if(e(d)){h=!0;for(let e=0,t=d.length;e{this._keysMap[e.id]=t}))}create(){!this.isCreated&&this.docs.length&&(this.isCreated=!0,t(this.docs[0])?this.docs.forEach(((e,t)=>{this._addString(e,t)})):this.docs.forEach(((e,t)=>{this._addObject(e,t)})),this.norm.clear())}add(e){const n=this.size();t(e)?this._addString(e,n):this._addObject(e,n)}removeAt(e){this.records.splice(e,1);for(let t=e,n=this.size();t{let h=i.getFn?i.getFn(n):this.getFn(n,i.path);if(s(h))if(e(h)){let n=[];const i=[{nestedArrIndex:-1,value:h}];for(;i.length;){const{nestedArrIndex:o,value:c}=i.pop();if(s(c))if(t(c)&&!r(c)){let e={v:c,i:o,n:this.norm.get(c)};n.push(e)}else e(c)&&c.forEach(((e,t)=>{i.push({nestedArrIndex:t,value:e})}))}o.$[c]=n}else if(t(h)&&!r(h)){let e={v:h,n:this.norm.get(h)};o.$[c]=e}})),this.records.push(o)}toJSON(){return{keys:this.keys,records:this.records}}}function p(e,t,{getFn:n=u.getFn,fieldNormWeight:i=u.fieldNormWeight}={}){const s=new g({getFn:n,fieldNormWeight:i});return s.setKeys(e.map(a)),s.setSources(t),s.create(),s}function m(e,{errors:t=0,currentLocation:n=0,expectedLocation:i=0,distance:s=u.distance,ignoreLocation:r=u.ignoreLocation}={}){const o=t/e.length;if(r)return o;const c=Math.abs(i-n);return s?o+c/s:c?1:o}function y(e,t,n,{location:i=u.location,distance:s=u.distance,threshold:r=u.threshold,findAllMatches:o=u.findAllMatches,minMatchCharLength:c=u.minMatchCharLength,includeMatches:h=u.includeMatches,ignoreLocation:a=u.ignoreLocation}={}){if(t.length>32)throw new Error(`Pattern length exceeds max of ${32}.`);const l=t.length,d=e.length,f=Math.max(0,Math.min(i,d));let g=r,p=f;const y=c>1||h,M=y?Array(d):[];let x;for(;(x=e.indexOf(t,p))>-1;){let e=m(t,{currentLocation:x,expectedLocation:f,distance:s,ignoreLocation:a});if(g=Math.min(e,g),p=x+l,y){let e=0;for(;e=h;r-=1){let o=r-1,c=n[e.charAt(o)];if(y&&(M[o]=+!!c),x[r]=(x[r+1]<<1|1)&c,i&&(x[r]|=(L[r+1]|L[r])<<1|1|L[r+1]),x[r]&v&&(_=m(t,{errors:i,currentLocation:o,expectedLocation:f,distance:s,ignoreLocation:a}),_<=g)){if(g=_,p=o,p<=f)break;h=Math.max(1,2*f-p)}}if(m(t,{errors:i+1,currentLocation:f,expectedLocation:f,distance:s,ignoreLocation:a})>g)break;L=x}const w={isMatch:p>=0,score:Math.max(.001,_)};if(y){const e=function(e=[],t=u.minMatchCharLength){let n=[],i=-1,s=-1,r=0;for(let o=e.length;r=t&&n.push([i,s]),i=-1)}return e[r-1]&&r-i>=t&&n.push([i,r-1]),n}(M,c);e.length?h&&(w.indices=e):w.isMatch=!1}return w}function M(e){let t={};for(let n=0,i=e.length;n{this.chunks.push({pattern:e,alphabet:M(e),startIndex:t})},l=this.pattern.length;if(l>32){let e=0;const t=l%32,n=l-t;for(;e{const{isMatch:g,score:p,indices:m}=y(e,t,u,{location:i+f,distance:s,threshold:r,findAllMatches:o,minMatchCharLength:c,includeMatches:n,ignoreLocation:h});g&&(d=!0),l+=p,g&&m&&(a=[...a,...m])}));let u={isMatch:d,score:d?l/this.chunks.length:1};return d&&n&&(u.indices=a),u}}const L=[];function _(e,t){for(let n=0,i=L.length;n{if(!s(e.indices)||!e.indices.length)return;const{indices:n,value:i}=e;let r={indices:n,value:i};e.key&&(r.key=e.key.src),e.idx>-1&&(r.refIndex=e.idx),t.matches.push(r)}))}function v(e,t){t.score=e.score}class w{constructor(e,t={},n){if(this.options={...u,...t},this.options.useExtendedSearch)throw new Error("Extended search is not available");this._keyStore=new h(this.options.keys),this.setCollection(e,n)}setCollection(e,t){if(this._docs=e,t&&!(t instanceof g))throw new Error("Incorrect 'index' type");this._myIndex=t||p(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(e){s(e)&&(this._docs.push(e),this._myIndex.add(e))}remove(e=(()=>!1)){const t=[];for(let n=0,i=this._docs.length;n{let n=1;e.matches.forEach((({key:e,norm:i,score:s})=>{const r=e?e.weight:null;n*=Math.pow(0===s&&r?Number.EPSILON:s,(r||1)*(t?1:i))})),e.score=n}))}(l,{ignoreFieldNorm:a}),c&&l.sort(h),n(i)&&i>-1&&(l=l.slice(0,i)),function(e,t,{includeMatches:n=u.includeMatches,includeScore:i=u.includeScore}={}){const s=[];return n&&s.push(k),i&&s.push(v),e.map((e=>{const{idx:n}=e,i={item:t[n],refIndex:n};return s.length&&s.forEach((t=>{t(e,i)})),i}))}(l,this._docs,{includeMatches:r,includeScore:o})}_searchStringList(e){const t=_(e,this.options),{records:n}=this._myIndex,i=[];return n.forEach((({v:e,i:n,n:r})=>{if(!s(e))return;const{isMatch:o,score:c,indices:h}=t.searchIn(e);o&&i.push({item:e,idx:n,matches:[{score:c,value:e,norm:r,indices:h}]})})),i}_searchLogical(e){throw new Error("Logical search is not available")}_searchObjectList(e,t){const n=_(e,this.options),{keys:i,records:r}=this._myIndex,o=[];return r.forEach((({$:e,i:r})=>{if(!s(e))return;let c=[];i.forEach(((i,s)=>{t.length>0&&!t.includes(i.id)||c.push(...this._findMatches({key:i,value:e[s],searcher:n}))})),c.length&&o.push({idx:r,item:e,matches:c})})),o}_findMatches({key:t,value:n,searcher:i}){if(!s(n))return[];let r=[];if(e(n))n.forEach((({v:e,i:n,n:o})=>{if(!s(e))return;const{isMatch:c,score:h,indices:a}=i.searchIn(e);c&&r.push({score:h,key:t,value:e,idx:n,norm:o,indices:a})}));else{const{v:e,n:s}=n,{isMatch:o,score:c,indices:h}=i.searchIn(e);o&&r.push({score:c,key:t,value:e,norm:s,indices:h})}return r}}w.version="6.6.2-beta.7",w.createIndex=p,w.parseIndex=function(e,{getFn:t=u.getFn,fieldNormWeight:n=u.fieldNormWeight}={}){const{keys:i,records:s}=e,r=new g({getFn:t,fieldNormWeight:n});return r.setKeys(i),r.setIndexRecords(s),r},w.config=u;export{w as default}; \ No newline at end of file diff --git a/dist/fuse.basic.js b/dist/fuse.basic.js deleted file mode 100644 index 91a9a351c..000000000 --- a/dist/fuse.basic.js +++ /dev/null @@ -1,1475 +0,0 @@ -/** - * Fuse.js v6.6.2-beta.7 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2022 Kiro Risk (http://kiro.me) - * All Rights Reserved. Apache Software License 2.0 - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Fuse = factory()); -})(this, (function () { 'use strict'; - - function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - enumerableOnly && (symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - })), keys.push.apply(keys, symbols); - } - - return keys; - } - - function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = null != arguments[i] ? arguments[i] : {}; - i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { - _defineProperty(target, key, source[key]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { - Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); - }); - } - - return target; - } - - function _typeof(obj) { - "@babel/helpers - typeof"; - - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); - } - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; - } - - function _defineProperty(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; - } - - function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); - } - - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); - } - - function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); - } - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; - } - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - function isArray(value) { - return !Array.isArray ? getTag(value) === '[object Array]' : Array.isArray(value); - } // Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js - - var INFINITY = 1 / 0; - function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value; - } - - var result = value + ''; - return result == '0' && 1 / value == -INFINITY ? '-0' : result; - } - function toString(value) { - return value == null ? '' : baseToString(value); - } - function isString(value) { - return typeof value === 'string'; - } - function isNumber(value) { - return typeof value === 'number'; - } // Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js - - function isBoolean(value) { - return value === true || value === false || isObjectLike(value) && getTag(value) == '[object Boolean]'; - } - function isObject(value) { - return _typeof(value) === 'object'; - } // Checks if `value` is object-like. - - function isObjectLike(value) { - return isObject(value) && value !== null; - } - function isDefined(value) { - return value !== undefined && value !== null; - } - function isBlank(value) { - return !value.trim().length; - } // Gets the `toStringTag` of `value`. - // Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js - - function getTag(value) { - return value == null ? value === undefined ? '[object Undefined]' : '[object Null]' : Object.prototype.toString.call(value); - } - - var EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available'; - var LOGICAL_SEARCH_UNAVAILABLE = 'Logical search is not available'; - var INCORRECT_INDEX_TYPE = "Incorrect 'index' type"; - var LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = function LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key) { - return "Invalid value for key ".concat(key); - }; - var PATTERN_LENGTH_TOO_LARGE = function PATTERN_LENGTH_TOO_LARGE(max) { - return "Pattern length exceeds max of ".concat(max, "."); - }; - var MISSING_KEY_PROPERTY = function MISSING_KEY_PROPERTY(name) { - return "Missing ".concat(name, " property in key"); - }; - var INVALID_KEY_WEIGHT_VALUE = function INVALID_KEY_WEIGHT_VALUE(key) { - return "Property 'weight' in key '".concat(key, "' must be a positive integer"); - }; - - var hasOwn = Object.prototype.hasOwnProperty; - - var KeyStore = /*#__PURE__*/function () { - function KeyStore(keys) { - var _this = this; - - _classCallCheck(this, KeyStore); - - this._keys = []; - this._keyMap = {}; - var totalWeight = 0; - keys.forEach(function (key) { - var obj = createKey(key); - - _this._keys.push(obj); - - _this._keyMap[obj.id] = obj; - totalWeight += obj.weight; - }); // Normalize weights so that their sum is equal to 1 - - this._keys.forEach(function (key) { - key.weight /= totalWeight; - }); - } - - _createClass(KeyStore, [{ - key: "get", - value: function get(keyId) { - return this._keyMap[keyId]; - } - }, { - key: "keys", - value: function keys() { - return this._keys; - } - }, { - key: "toJSON", - value: function toJSON() { - return JSON.stringify(this._keys); - } - }]); - - return KeyStore; - }(); - function createKey(key) { - var path = null; - var id = null; - var src = null; - var weight = 1; - var getFn = null; - - if (isString(key) || isArray(key)) { - src = key; - path = createKeyPath(key); - id = createKeyId(key); - } else { - if (!hasOwn.call(key, 'name')) { - throw new Error(MISSING_KEY_PROPERTY('name')); - } - - var name = key.name; - src = name; - - if (hasOwn.call(key, 'weight')) { - weight = key.weight; - - if (weight <= 0) { - throw new Error(INVALID_KEY_WEIGHT_VALUE(name)); - } - } - - path = createKeyPath(name); - id = createKeyId(name); - getFn = key.getFn; - } - - return { - path: path, - id: id, - weight: weight, - src: src, - getFn: getFn - }; - } - function createKeyPath(key) { - return isArray(key) ? key : key.split('.'); - } - function createKeyId(key) { - return isArray(key) ? key.join('.') : key; - } - - function get(obj, path) { - var list = []; - var arr = false; - - var deepGet = function deepGet(obj, path, index) { - if (!isDefined(obj)) { - return; - } - - if (!path[index]) { - // If there's no path left, we've arrived at the object we care about. - list.push(obj); - } else { - var key = path[index]; - var value = obj[key]; - - if (!isDefined(value)) { - return; - } // If we're at the last value in the path, and if it's a string/number/bool, - // add it to the list - - - if (index === path.length - 1 && (isString(value) || isNumber(value) || isBoolean(value))) { - list.push(toString(value)); - } else if (isArray(value)) { - arr = true; // Search each item in the array. - - for (var i = 0, len = value.length; i < len; i += 1) { - deepGet(value[i], path, index + 1); - } - } else if (path.length) { - // An object. Recurse further. - deepGet(value, path, index + 1); - } - } - }; // Backwards compatibility (since path used to be a string) - - - deepGet(obj, isString(path) ? path.split('.') : path, 0); - return arr ? list : list[0]; - } - - var MatchOptions = { - // Whether the matches should be included in the result set. When `true`, each record in the result - // set will include the indices of the matched characters. - // These can consequently be used for highlighting purposes. - includeMatches: false, - // When `true`, the matching function will continue to the end of a search pattern even if - // a perfect match has already been located in the string. - findAllMatches: false, - // Minimum number of characters that must be matched before a result is considered a match - minMatchCharLength: 1 - }; - var BasicOptions = { - // When `true`, the algorithm continues searching to the end of the input even if a perfect - // match is found before the end of the same input. - isCaseSensitive: false, - // When true, the matching function will continue to the end of a search pattern even if - includeScore: false, - // List of properties that will be searched. This also supports nested properties. - keys: [], - // Whether to sort the result list, by score - shouldSort: true, - // Default sort function: sort by ascending score, ascending index - sortFn: function sortFn(a, b) { - return a.score === b.score ? a.idx < b.idx ? -1 : 1 : a.score < b.score ? -1 : 1; - } - }; - var FuzzyOptions = { - // Approximately where in the text is the pattern expected to be found? - location: 0, - // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match - // (of both letters and location), a threshold of '1.0' would match anything. - threshold: 0.6, - // Determines how close the match must be to the fuzzy location (specified above). - // An exact letter match which is 'distance' characters away from the fuzzy location - // would score as a complete mismatch. A distance of '0' requires the match be at - // the exact location specified, a threshold of '1000' would require a perfect match - // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold. - distance: 100 - }; - var AdvancedOptions = { - // When `true`, it enables the use of unix-like search commands - useExtendedSearch: false, - // The get function to use when fetching an object's properties. - // The default will search nested paths *ie foo.bar.baz* - getFn: get, - // When `true`, search will ignore `location` and `distance`, so it won't matter - // where in the string the pattern appears. - // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score - ignoreLocation: false, - // When `true`, the calculation for the relevance score (used for sorting) will - // ignore the field-length norm. - // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm - ignoreFieldNorm: false, - // The weight to determine how much field length norm effects scoring. - fieldNormWeight: 1 - }; - var Config = _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, BasicOptions), MatchOptions), FuzzyOptions), AdvancedOptions); - - var SPACE = /[^ ]+/g; // Field-length norm: the shorter the field, the higher the weight. - // Set to 3 decimals to reduce index size. - - function norm() { - var weight = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; - var mantissa = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3; - var cache = new Map(); - var m = Math.pow(10, mantissa); - return { - get: function get(value) { - var numTokens = value.match(SPACE).length; - - if (cache.has(numTokens)) { - return cache.get(numTokens); - } // Default function is 1/sqrt(x), weight makes that variable - - - var norm = 1 / Math.pow(numTokens, 0.5 * weight); // In place of `toFixed(mantissa)`, for faster computation - - var n = parseFloat(Math.round(norm * m) / m); - cache.set(numTokens, n); - return n; - }, - clear: function clear() { - cache.clear(); - } - }; - } - - var FuseIndex = /*#__PURE__*/function () { - function FuseIndex() { - var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, - _ref$getFn = _ref.getFn, - getFn = _ref$getFn === void 0 ? Config.getFn : _ref$getFn, - _ref$fieldNormWeight = _ref.fieldNormWeight, - fieldNormWeight = _ref$fieldNormWeight === void 0 ? Config.fieldNormWeight : _ref$fieldNormWeight; - - _classCallCheck(this, FuseIndex); - - this.norm = norm(fieldNormWeight, 3); - this.getFn = getFn; - this.isCreated = false; - this.setIndexRecords(); - } - - _createClass(FuseIndex, [{ - key: "setSources", - value: function setSources() { - var docs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - this.docs = docs; - } - }, { - key: "setIndexRecords", - value: function setIndexRecords() { - var records = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - this.records = records; - } - }, { - key: "setKeys", - value: function setKeys() { - var _this = this; - - var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - this.keys = keys; - this._keysMap = {}; - keys.forEach(function (key, idx) { - _this._keysMap[key.id] = idx; - }); - } - }, { - key: "create", - value: function create() { - var _this2 = this; - - if (this.isCreated || !this.docs.length) { - return; - } - - this.isCreated = true; // List is Array - - if (isString(this.docs[0])) { - this.docs.forEach(function (doc, docIndex) { - _this2._addString(doc, docIndex); - }); - } else { - // List is Array - this.docs.forEach(function (doc, docIndex) { - _this2._addObject(doc, docIndex); - }); - } - - this.norm.clear(); - } // Adds a doc to the end of the index - - }, { - key: "add", - value: function add(doc) { - var idx = this.size(); - - if (isString(doc)) { - this._addString(doc, idx); - } else { - this._addObject(doc, idx); - } - } // Removes the doc at the specified index of the index - - }, { - key: "removeAt", - value: function removeAt(idx) { - this.records.splice(idx, 1); // Change ref index of every subsquent doc - - for (var i = idx, len = this.size(); i < len; i += 1) { - this.records[i].i -= 1; - } - } - }, { - key: "getValueForItemAtKeyId", - value: function getValueForItemAtKeyId(item, keyId) { - return item[this._keysMap[keyId]]; - } - }, { - key: "size", - value: function size() { - return this.records.length; - } - }, { - key: "_addString", - value: function _addString(doc, docIndex) { - if (!isDefined(doc) || isBlank(doc)) { - return; - } - - var record = { - v: doc, - i: docIndex, - n: this.norm.get(doc) - }; - this.records.push(record); - } - }, { - key: "_addObject", - value: function _addObject(doc, docIndex) { - var _this3 = this; - - var record = { - i: docIndex, - $: {} - }; // Iterate over every key (i.e, path), and fetch the value at that key - - this.keys.forEach(function (key, keyIndex) { - var value = key.getFn ? key.getFn(doc) : _this3.getFn(doc, key.path); - - if (!isDefined(value)) { - return; - } - - if (isArray(value)) { - (function () { - var subRecords = []; - var stack = [{ - nestedArrIndex: -1, - value: value - }]; - - while (stack.length) { - var _stack$pop = stack.pop(), - nestedArrIndex = _stack$pop.nestedArrIndex, - _value = _stack$pop.value; - - if (!isDefined(_value)) { - continue; - } - - if (isString(_value) && !isBlank(_value)) { - var subRecord = { - v: _value, - i: nestedArrIndex, - n: _this3.norm.get(_value) - }; - subRecords.push(subRecord); - } else if (isArray(_value)) { - _value.forEach(function (item, k) { - stack.push({ - nestedArrIndex: k, - value: item - }); - }); - } else ; - } - - record.$[keyIndex] = subRecords; - })(); - } else if (isString(value) && !isBlank(value)) { - var subRecord = { - v: value, - n: _this3.norm.get(value) - }; - record.$[keyIndex] = subRecord; - } - }); - this.records.push(record); - } - }, { - key: "toJSON", - value: function toJSON() { - return { - keys: this.keys, - records: this.records - }; - } - }]); - - return FuseIndex; - }(); - function createIndex(keys, docs) { - var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - _ref2$getFn = _ref2.getFn, - getFn = _ref2$getFn === void 0 ? Config.getFn : _ref2$getFn, - _ref2$fieldNormWeight = _ref2.fieldNormWeight, - fieldNormWeight = _ref2$fieldNormWeight === void 0 ? Config.fieldNormWeight : _ref2$fieldNormWeight; - - var myIndex = new FuseIndex({ - getFn: getFn, - fieldNormWeight: fieldNormWeight - }); - myIndex.setKeys(keys.map(createKey)); - myIndex.setSources(docs); - myIndex.create(); - return myIndex; - } - function parseIndex(data) { - var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref3$getFn = _ref3.getFn, - getFn = _ref3$getFn === void 0 ? Config.getFn : _ref3$getFn, - _ref3$fieldNormWeight = _ref3.fieldNormWeight, - fieldNormWeight = _ref3$fieldNormWeight === void 0 ? Config.fieldNormWeight : _ref3$fieldNormWeight; - - var keys = data.keys, - records = data.records; - var myIndex = new FuseIndex({ - getFn: getFn, - fieldNormWeight: fieldNormWeight - }); - myIndex.setKeys(keys); - myIndex.setIndexRecords(records); - return myIndex; - } - - function computeScore$1(pattern) { - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$errors = _ref.errors, - errors = _ref$errors === void 0 ? 0 : _ref$errors, - _ref$currentLocation = _ref.currentLocation, - currentLocation = _ref$currentLocation === void 0 ? 0 : _ref$currentLocation, - _ref$expectedLocation = _ref.expectedLocation, - expectedLocation = _ref$expectedLocation === void 0 ? 0 : _ref$expectedLocation, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - var accuracy = errors / pattern.length; - - if (ignoreLocation) { - return accuracy; - } - - var proximity = Math.abs(expectedLocation - currentLocation); - - if (!distance) { - // Dodge divide by zero error. - return proximity ? 1.0 : accuracy; - } - - return accuracy + proximity / distance; - } - - function convertMaskToIndices() { - var matchmask = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - var minMatchCharLength = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Config.minMatchCharLength; - var indices = []; - var start = -1; - var end = -1; - var i = 0; - - for (var len = matchmask.length; i < len; i += 1) { - var match = matchmask[i]; - - if (match && start === -1) { - start = i; - } else if (!match && start !== -1) { - end = i - 1; - - if (end - start + 1 >= minMatchCharLength) { - indices.push([start, end]); - } - - start = -1; - } - } // (i-1 - start) + 1 => i - start - - - if (matchmask[i - 1] && i - start >= minMatchCharLength) { - indices.push([start, i - 1]); - } - - return indices; - } - - // Machine word size - var MAX_BITS = 32; - - function search(text, pattern, patternAlphabet) { - var _ref = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}, - _ref$location = _ref.location, - location = _ref$location === void 0 ? Config.location : _ref$location, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$threshold = _ref.threshold, - threshold = _ref$threshold === void 0 ? Config.threshold : _ref$threshold, - _ref$findAllMatches = _ref.findAllMatches, - findAllMatches = _ref$findAllMatches === void 0 ? Config.findAllMatches : _ref$findAllMatches, - _ref$minMatchCharLeng = _ref.minMatchCharLength, - minMatchCharLength = _ref$minMatchCharLeng === void 0 ? Config.minMatchCharLength : _ref$minMatchCharLeng, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - if (pattern.length > MAX_BITS) { - throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS)); - } - - var patternLen = pattern.length; // Set starting location at beginning text and initialize the alphabet. - - var textLen = text.length; // Handle the case when location > text.length - - var expectedLocation = Math.max(0, Math.min(location, textLen)); // Highest score beyond which we give up. - - var currentThreshold = threshold; // Is there a nearby exact match? (speedup) - - var bestLocation = expectedLocation; // Performance: only computer matches when the minMatchCharLength > 1 - // OR if `includeMatches` is true. - - var computeMatches = minMatchCharLength > 1 || includeMatches; // A mask of the matches, used for building the indices - - var matchMask = computeMatches ? Array(textLen) : []; - var index; // Get all exact matches, here for speed up - - while ((index = text.indexOf(pattern, bestLocation)) > -1) { - var score = computeScore$1(pattern, { - currentLocation: index, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - currentThreshold = Math.min(score, currentThreshold); - bestLocation = index + patternLen; - - if (computeMatches) { - var i = 0; - - while (i < patternLen) { - matchMask[index + i] = 1; - i += 1; - } - } - } // Reset the best location - - - bestLocation = -1; - var lastBitArr = []; - var finalScore = 1; - var binMax = patternLen + textLen; - var mask = 1 << patternLen - 1; - - for (var _i = 0; _i < patternLen; _i += 1) { - // Scan for the best match; each iteration allows for one more error. - // Run a binary search to determine how far from the match location we can stray - // at this error level. - var binMin = 0; - var binMid = binMax; - - while (binMin < binMid) { - var _score2 = computeScore$1(pattern, { - errors: _i, - currentLocation: expectedLocation + binMid, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - - if (_score2 <= currentThreshold) { - binMin = binMid; - } else { - binMax = binMid; - } - - binMid = Math.floor((binMax - binMin) / 2 + binMin); - } // Use the result from this iteration as the maximum for the next. - - - binMax = binMid; - var start = Math.max(1, expectedLocation - binMid + 1); - var finish = findAllMatches ? textLen : Math.min(expectedLocation + binMid, textLen) + patternLen; // Initialize the bit array - - var bitArr = Array(finish + 2); - bitArr[finish + 1] = (1 << _i) - 1; - - for (var j = finish; j >= start; j -= 1) { - var currentLocation = j - 1; - var charMatch = patternAlphabet[text.charAt(currentLocation)]; - - if (computeMatches) { - // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`) - matchMask[currentLocation] = +!!charMatch; - } // First pass: exact match - - - bitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch; // Subsequent passes: fuzzy match - - if (_i) { - bitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1]; - } - - if (bitArr[j] & mask) { - finalScore = computeScore$1(pattern, { - errors: _i, - currentLocation: currentLocation, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); // This match will almost certainly be better than any existing match. - // But check anyway. - - if (finalScore <= currentThreshold) { - // Indeed it is - currentThreshold = finalScore; - bestLocation = currentLocation; // Already passed `loc`, downhill from here on in. - - if (bestLocation <= expectedLocation) { - break; - } // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`. - - - start = Math.max(1, 2 * expectedLocation - bestLocation); - } - } - } // No hope for a (better) match at greater error levels. - - - var _score = computeScore$1(pattern, { - errors: _i + 1, - currentLocation: expectedLocation, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - - if (_score > currentThreshold) { - break; - } - - lastBitArr = bitArr; - } - - var result = { - isMatch: bestLocation >= 0, - // Count exact matches (those with a score of 0) to be "almost" exact - score: Math.max(0.001, finalScore) - }; - - if (computeMatches) { - var indices = convertMaskToIndices(matchMask, minMatchCharLength); - - if (!indices.length) { - result.isMatch = false; - } else if (includeMatches) { - result.indices = indices; - } - } - - return result; - } - - function createPatternAlphabet(pattern) { - var mask = {}; - - for (var i = 0, len = pattern.length; i < len; i += 1) { - var _char = pattern.charAt(i); - - mask[_char] = (mask[_char] || 0) | 1 << len - i - 1; - } - - return mask; - } - - var BitapSearch = /*#__PURE__*/function () { - function BitapSearch(pattern) { - var _this = this; - - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$location = _ref.location, - location = _ref$location === void 0 ? Config.location : _ref$location, - _ref$threshold = _ref.threshold, - threshold = _ref$threshold === void 0 ? Config.threshold : _ref$threshold, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$findAllMatches = _ref.findAllMatches, - findAllMatches = _ref$findAllMatches === void 0 ? Config.findAllMatches : _ref$findAllMatches, - _ref$minMatchCharLeng = _ref.minMatchCharLength, - minMatchCharLength = _ref$minMatchCharLeng === void 0 ? Config.minMatchCharLength : _ref$minMatchCharLeng, - _ref$isCaseSensitive = _ref.isCaseSensitive, - isCaseSensitive = _ref$isCaseSensitive === void 0 ? Config.isCaseSensitive : _ref$isCaseSensitive, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - _classCallCheck(this, BitapSearch); - - this.options = { - location: location, - threshold: threshold, - distance: distance, - includeMatches: includeMatches, - findAllMatches: findAllMatches, - minMatchCharLength: minMatchCharLength, - isCaseSensitive: isCaseSensitive, - ignoreLocation: ignoreLocation - }; - this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); - this.chunks = []; - - if (!this.pattern.length) { - return; - } - - var addChunk = function addChunk(pattern, startIndex) { - _this.chunks.push({ - pattern: pattern, - alphabet: createPatternAlphabet(pattern), - startIndex: startIndex - }); - }; - - var len = this.pattern.length; - - if (len > MAX_BITS) { - var i = 0; - var remainder = len % MAX_BITS; - var end = len - remainder; - - while (i < end) { - addChunk(this.pattern.substr(i, MAX_BITS), i); - i += MAX_BITS; - } - - if (remainder) { - var startIndex = len - MAX_BITS; - addChunk(this.pattern.substr(startIndex), startIndex); - } - } else { - addChunk(this.pattern, 0); - } - } - - _createClass(BitapSearch, [{ - key: "searchIn", - value: function searchIn(text) { - var _this$options = this.options, - isCaseSensitive = _this$options.isCaseSensitive, - includeMatches = _this$options.includeMatches; - - if (!isCaseSensitive) { - text = text.toLowerCase(); - } // Exact match - - - if (this.pattern === text) { - var _result = { - isMatch: true, - score: 0 - }; - - if (includeMatches) { - _result.indices = [[0, text.length - 1]]; - } - - return _result; - } // Otherwise, use Bitap algorithm - - - var _this$options2 = this.options, - location = _this$options2.location, - distance = _this$options2.distance, - threshold = _this$options2.threshold, - findAllMatches = _this$options2.findAllMatches, - minMatchCharLength = _this$options2.minMatchCharLength, - ignoreLocation = _this$options2.ignoreLocation; - var allIndices = []; - var totalScore = 0; - var hasMatches = false; - this.chunks.forEach(function (_ref2) { - var pattern = _ref2.pattern, - alphabet = _ref2.alphabet, - startIndex = _ref2.startIndex; - - var _search = search(text, pattern, alphabet, { - location: location + startIndex, - distance: distance, - threshold: threshold, - findAllMatches: findAllMatches, - minMatchCharLength: minMatchCharLength, - includeMatches: includeMatches, - ignoreLocation: ignoreLocation - }), - isMatch = _search.isMatch, - score = _search.score, - indices = _search.indices; - - if (isMatch) { - hasMatches = true; - } - - totalScore += score; - - if (isMatch && indices) { - allIndices = [].concat(_toConsumableArray(allIndices), _toConsumableArray(indices)); - } - }); - var result = { - isMatch: hasMatches, - score: hasMatches ? totalScore / this.chunks.length : 1 - }; - - if (hasMatches && includeMatches) { - result.indices = allIndices; - } - - return result; - } - }]); - - return BitapSearch; - }(); - - var registeredSearchers = []; - function createSearcher(pattern, options) { - for (var i = 0, len = registeredSearchers.length; i < len; i += 1) { - var searcherClass = registeredSearchers[i]; - - if (searcherClass.condition(pattern, options)) { - return new searcherClass(pattern, options); - } - } - - return new BitapSearch(pattern, options); - } - - var LogicalOperator = { - AND: '$and', - OR: '$or' - }; - var KeyType = { - PATH: '$path', - PATTERN: '$val' - }; - - var isExpression = function isExpression(query) { - return !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]); - }; - - var isPath = function isPath(query) { - return !!query[KeyType.PATH]; - }; - - var isLeaf = function isLeaf(query) { - return !isArray(query) && isObject(query) && !isExpression(query); - }; - - var convertToExplicit = function convertToExplicit(query) { - return _defineProperty({}, LogicalOperator.AND, Object.keys(query).map(function (key) { - return _defineProperty({}, key, query[key]); - })); - }; // When `auto` is `true`, the parse function will infer and initialize and add - // the appropriate `Searcher` instance - - - function parse(query, options) { - var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - _ref3$auto = _ref3.auto, - auto = _ref3$auto === void 0 ? true : _ref3$auto; - - var next = function next(query) { - var keys = Object.keys(query); - var isQueryPath = isPath(query); - - if (!isQueryPath && keys.length > 1 && !isExpression(query)) { - return next(convertToExplicit(query)); - } - - if (isLeaf(query)) { - var key = isQueryPath ? query[KeyType.PATH] : keys[0]; - var pattern = isQueryPath ? query[KeyType.PATTERN] : query[key]; - - if (!isString(pattern)) { - throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key)); - } - - var obj = { - keyId: createKeyId(key), - pattern: pattern - }; - - if (auto) { - obj.searcher = createSearcher(pattern, options); - } - - return obj; - } - - var node = { - children: [], - operator: keys[0] - }; - keys.forEach(function (key) { - var value = query[key]; - - if (isArray(value)) { - value.forEach(function (item) { - node.children.push(next(item)); - }); - } - }); - return node; - }; - - if (!isExpression(query)) { - query = convertToExplicit(query); - } - - return next(query); - } - - function computeScore(results, _ref) { - var _ref$ignoreFieldNorm = _ref.ignoreFieldNorm, - ignoreFieldNorm = _ref$ignoreFieldNorm === void 0 ? Config.ignoreFieldNorm : _ref$ignoreFieldNorm; - results.forEach(function (result) { - var totalScore = 1; - result.matches.forEach(function (_ref2) { - var key = _ref2.key, - norm = _ref2.norm, - score = _ref2.score; - var weight = key ? key.weight : null; - totalScore *= Math.pow(score === 0 && weight ? Number.EPSILON : score, (weight || 1) * (ignoreFieldNorm ? 1 : norm)); - }); - result.score = totalScore; - }); - } - - function transformMatches(result, data) { - var matches = result.matches; - data.matches = []; - - if (!isDefined(matches)) { - return; - } - - matches.forEach(function (match) { - if (!isDefined(match.indices) || !match.indices.length) { - return; - } - - var indices = match.indices, - value = match.value; - var obj = { - indices: indices, - value: value - }; - - if (match.key) { - obj.key = match.key.src; - } - - if (match.idx > -1) { - obj.refIndex = match.idx; - } - - data.matches.push(obj); - }); - } - - function transformScore(result, data) { - data.score = result.score; - } - - function format(results, docs) { - var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$includeScore = _ref.includeScore, - includeScore = _ref$includeScore === void 0 ? Config.includeScore : _ref$includeScore; - - var transformers = []; - if (includeMatches) transformers.push(transformMatches); - if (includeScore) transformers.push(transformScore); - return results.map(function (result) { - var idx = result.idx; - var data = { - item: docs[idx], - refIndex: idx - }; - - if (transformers.length) { - transformers.forEach(function (transformer) { - transformer(result, data); - }); - } - - return data; - }); - } - - var Fuse$1 = /*#__PURE__*/function () { - function Fuse(docs) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var index = arguments.length > 2 ? arguments[2] : undefined; - - _classCallCheck(this, Fuse); - - this.options = _objectSpread2(_objectSpread2({}, Config), options); - - if (this.options.useExtendedSearch && !false) { - throw new Error(EXTENDED_SEARCH_UNAVAILABLE); - } - - this._keyStore = new KeyStore(this.options.keys); - this.setCollection(docs, index); - } - - _createClass(Fuse, [{ - key: "setCollection", - value: function setCollection(docs, index) { - this._docs = docs; - - if (index && !(index instanceof FuseIndex)) { - throw new Error(INCORRECT_INDEX_TYPE); - } - - this._myIndex = index || createIndex(this.options.keys, this._docs, { - getFn: this.options.getFn, - fieldNormWeight: this.options.fieldNormWeight - }); - } - }, { - key: "add", - value: function add(doc) { - if (!isDefined(doc)) { - return; - } - - this._docs.push(doc); - - this._myIndex.add(doc); - } - }, { - key: "remove", - value: function remove() { - var predicate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function - /* doc, idx */ - () { - return false; - }; - var results = []; - - for (var i = 0, len = this._docs.length; i < len; i += 1) { - var doc = this._docs[i]; - - if (predicate(doc, i)) { - this.removeAt(i); - i -= 1; - len -= 1; - results.push(doc); - } - } - - return results; - } - }, { - key: "removeAt", - value: function removeAt(idx) { - this._docs.splice(idx, 1); - - this._myIndex.removeAt(idx); - } - }, { - key: "getIndex", - value: function getIndex() { - return this._myIndex; - } - }, { - key: "search", - value: function search(query) { - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$limit = _ref.limit, - limit = _ref$limit === void 0 ? -1 : _ref$limit, - _ref$keys = _ref.keys, - keys = _ref$keys === void 0 ? [] : _ref$keys; - - var _this$options = this.options, - includeMatches = _this$options.includeMatches, - includeScore = _this$options.includeScore, - shouldSort = _this$options.shouldSort, - sortFn = _this$options.sortFn, - ignoreFieldNorm = _this$options.ignoreFieldNorm; - var results = isString(query) ? isString(this._docs[0]) ? this._searchStringList(query) : this._searchObjectList(query, keys) : this._searchLogical(query); - computeScore(results, { - ignoreFieldNorm: ignoreFieldNorm - }); - - if (shouldSort) { - results.sort(sortFn); - } - - if (isNumber(limit) && limit > -1) { - results = results.slice(0, limit); - } - - return format(results, this._docs, { - includeMatches: includeMatches, - includeScore: includeScore - }); - } - }, { - key: "_searchStringList", - value: function _searchStringList(query) { - var searcher = createSearcher(query, this.options); - var records = this._myIndex.records; - var results = []; // Iterate over every string in the index - - records.forEach(function (_ref2) { - var text = _ref2.v, - idx = _ref2.i, - norm = _ref2.n; - - if (!isDefined(text)) { - return; - } - - var _searcher$searchIn = searcher.searchIn(text), - isMatch = _searcher$searchIn.isMatch, - score = _searcher$searchIn.score, - indices = _searcher$searchIn.indices; - - if (isMatch) { - results.push({ - item: text, - idx: idx, - matches: [{ - score: score, - value: text, - norm: norm, - indices: indices - }] - }); - } - }); - return results; - } - }, { - key: "_searchLogical", - value: function _searchLogical(query) { - - { - throw new Error(LOGICAL_SEARCH_UNAVAILABLE); - } - } - }, { - key: "_searchObjectList", - value: function _searchObjectList(query, searchKeys) { - var _this2 = this; - - var searcher = createSearcher(query, this.options); - var _this$_myIndex = this._myIndex, - keys = _this$_myIndex.keys, - records = _this$_myIndex.records; - var results = []; // List is Array - - records.forEach(function (_ref5) { - var item = _ref5.$, - idx = _ref5.i; - - if (!isDefined(item)) { - return; - } - - var matches = []; // Iterate over every key (i.e, path), and fetch the value at that key - - keys.forEach(function (key, keyIndex) { - if (searchKeys.length > 0 && !searchKeys.includes(key.id)) return; - matches.push.apply(matches, _toConsumableArray(_this2._findMatches({ - key: key, - value: item[keyIndex], - searcher: searcher - }))); - }); - - if (matches.length) { - results.push({ - idx: idx, - item: item, - matches: matches - }); - } - }); - return results; - } - }, { - key: "_findMatches", - value: function _findMatches(_ref6) { - var key = _ref6.key, - value = _ref6.value, - searcher = _ref6.searcher; - - if (!isDefined(value)) { - return []; - } - - var matches = []; - - if (isArray(value)) { - value.forEach(function (_ref7) { - var text = _ref7.v, - idx = _ref7.i, - norm = _ref7.n; - - if (!isDefined(text)) { - return; - } - - var _searcher$searchIn2 = searcher.searchIn(text), - isMatch = _searcher$searchIn2.isMatch, - score = _searcher$searchIn2.score, - indices = _searcher$searchIn2.indices; - - if (isMatch) { - matches.push({ - score: score, - key: key, - value: text, - idx: idx, - norm: norm, - indices: indices - }); - } - }); - } else { - var text = value.v, - norm = value.n; - - var _searcher$searchIn3 = searcher.searchIn(text), - isMatch = _searcher$searchIn3.isMatch, - score = _searcher$searchIn3.score, - indices = _searcher$searchIn3.indices; - - if (isMatch) { - matches.push({ - score: score, - key: key, - value: text, - norm: norm, - indices: indices - }); - } - } - - return matches; - } - }]); - - return Fuse; - }(); - - Fuse$1.version = '6.6.2-beta.7'; - Fuse$1.createIndex = createIndex; - Fuse$1.parseIndex = parseIndex; - Fuse$1.config = Config; - - { - Fuse$1.parseQuery = parse; - } - - var Fuse = Fuse$1; - - return Fuse; - -})); diff --git a/dist/fuse.basic.min.js b/dist/fuse.basic.min.js deleted file mode 100644 index f489aacb4..000000000 --- a/dist/fuse.basic.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Fuse.js v6.6.2-beta.7 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2022 Kiro Risk (http://kiro.me) - * All Rights Reserved. Apache Software License 2.0 - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ -var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(_).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),a=parseFloat(Math.round(o*r)/r);return n.set(i,a),a},clear:function(){n.clear()}}}var O=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?L.getFn:n,o=t.fieldNormWeight,a=void 0===o?L.fieldNormWeight:o;r(this,e),this.norm=S(a,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,u(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();u(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?L.getFn:r,o=n.fieldNormWeight,a=void 0===o?L.fieldNormWeight:o,c=new O({getFn:i,fieldNormWeight:a});return c.setKeys(e.map(k)),c.setSources(t),c.create(),c}function j(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,a=t.expectedLocation,c=void 0===a?0:a,s=t.distance,h=void 0===s?L.distance:s,u=t.ignoreLocation,l=void 0===u?L.ignoreLocation:u,d=r/e.length;if(l)return d;var f=Math.abs(c-o);return h?d+f/h:f?1:d}function E(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:L.minMatchCharLength,n=[],r=-1,i=-1,o=0,a=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}var I=32;function F(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,a=void 0===o?L.location:o,c=i.threshold,s=void 0===c?L.threshold:c,h=i.distance,u=void 0===h?L.distance:h,l=i.includeMatches,d=void 0===l?L.includeMatches:l,f=i.findAllMatches,v=void 0===f?L.findAllMatches:f,g=i.minMatchCharLength,y=void 0===g?L.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?L.isCaseSensitive:p,b=i.ignoreLocation,k=void 0===b?L.ignoreLocation:b;if(r(this,e),this.options={location:a,threshold:s,distance:u,includeMatches:d,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:k},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var M=function(e,t){n.chunks.push({pattern:e,alphabet:F(e),startIndex:t})},w=this.pattern.length;if(w>I){for(var x=0,_=w%I,S=w-_;x3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?L.location:i,a=r.distance,c=void 0===a?L.distance:a,s=r.threshold,h=void 0===s?L.threshold:s,u=r.findAllMatches,l=void 0===u?L.findAllMatches:u,d=r.minMatchCharLength,f=void 0===d?L.minMatchCharLength:d,v=r.includeMatches,g=void 0===v?L.includeMatches:v,y=r.ignoreLocation,m=void 0===y?L.ignoreLocation:y;if(t.length>I)throw new Error(p(I));for(var b,k=t.length,M=e.length,w=Math.max(0,Math.min(o,M)),x=h,_=w,S=f>1||g,O=S?Array(M):[];(b=e.indexOf(t,_))>-1;){var A=j(t,{currentLocation:b,expectedLocation:w,distance:c,ignoreLocation:m});if(x=Math.min(A,x),_=b+k,S)for(var F=0;F=T;R-=1){var U=R-1,B=n[e.charAt(U)];if(S&&(O[U]=+!!B),J[R]=(J[R+1]<<1|1)&B,$&&(J[R]|=(C[R+1]|C[R])<<1|1|C[R+1]),J[R]&W&&(N=j(t,{errors:$,currentLocation:U,expectedLocation:w,distance:c,ignoreLocation:m}))<=x){if(x=N,(_=U)<=w)break;T=Math.max(1,2*w-_)}}if(j(t,{errors:$+1,currentLocation:w,expectedLocation:w,distance:c,ignoreLocation:m})>x)break;C=J}var V={isMatch:_>=0,score:Math.max(.001,N)};if(S){var q=E(O,f);q.length?g&&(V.indices=q):V.isMatch=!1}return V}(e,n,i,{location:a+o,distance:s,threshold:h,findAllMatches:u,minMatchCharLength:l,includeMatches:r,ignoreLocation:d}),m=y.isMatch,b=y.score,k=y.indices;m&&(g=!0),v+=b,m&&k&&(f=[].concat(c(f),c(k)))}));var y={isMatch:g,score:g?v/this.chunks.length:1};return g&&r&&(y.indices=f),y}}]),e}(),N=[];function P(e,t){for(var n=0,r=N.length;n-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function D(e,t){t.score=e.score}function K(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?L.includeMatches:r,o=n.includeScore,a=void 0===o?L.includeScore:o,c=[];return i&&c.push($),a&&c.push(D),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return c.length&&c.forEach((function(t){t(e,r)})),r}))}var T=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;if(r(this,e),this.options=t(t({},L),i),this.options.useExtendedSearch)throw new Error(y);this._keyStore=new b(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof O))throw new Error("Incorrect 'index' type");this._myIndex=t||A(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){f(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=t.keys,o=void 0===i?[]:i,a=this.options,c=a.includeMatches,s=a.includeScore,h=a.shouldSort,d=a.sortFn,f=a.ignoreFieldNorm,v=u(e)?u(this._docs[0])?this._searchStringList(e):this._searchObjectList(e,o):this._searchLogical(e);return W(v,{ignoreFieldNorm:f}),h&&v.sort(d),l(r)&&r>-1&&(v=v.slice(0,r)),K(v,this._docs,{includeMatches:c,includeScore:s})}},{key:"_searchStringList",value:function(e){var t=P(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(f(n)){var a=t.searchIn(n),c=a.isMatch,s=a.score,h=a.indices;c&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:h}]})}})),r}},{key:"_searchLogical",value:function(e){throw new Error("Logical search is not available")}},{key:"_searchObjectList",value:function(e,t){var n=this,r=P(e,this.options),i=this._myIndex,o=i.keys,a=i.records,s=[];return a.forEach((function(e){var i=e.$,a=e.i;if(f(i)){var h=[];o.forEach((function(e,o){t.length>0&&!t.includes(e.id)||h.push.apply(h,c(n._findMatches({key:e,value:i[o],searcher:r})))})),h.length&&s.push({idx:a,item:i,matches:h})}})),s}},{key:"_findMatches",value:function(e){var t=e.key,n=e.value,r=e.searcher;if(!f(n))return[];var i=[];if(h(n))n.forEach((function(e){var n=e.v,o=e.i,a=e.n;if(f(n)){var c=r.searchIn(n),s=c.isMatch,h=c.score,u=c.indices;s&&i.push({score:h,key:t,value:n,idx:o,norm:a,indices:u})}}));else{var o=n.v,a=n.n,c=r.searchIn(o),s=c.isMatch,u=c.score,l=c.indices;s&&i.push({score:u,key:t,value:o,norm:a,indices:l})}return i}}]),e}();return T.version="6.6.2-beta.7",T.createIndex=A,T.parseIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?L.getFn:n,i=t.fieldNormWeight,o=void 0===i?L.fieldNormWeight:i,a=e.keys,c=e.records,s=new O({getFn:r,fieldNormWeight:o});return s.setKeys(a),s.setIndexRecords(c),s},T.config=L,T},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t(); \ No newline at end of file diff --git a/dist/fuse.common.js b/dist/fuse.common.js deleted file mode 100644 index f43f2cdf4..000000000 --- a/dist/fuse.common.js +++ /dev/null @@ -1,2236 +0,0 @@ -/** - * Fuse.js v6.6.2-beta.7 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2022 Kiro Risk (http://kiro.me) - * All Rights Reserved. Apache Software License 2.0 - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -'use strict'; - -function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - enumerableOnly && (symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - })), keys.push.apply(keys, symbols); - } - - return keys; -} - -function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = null != arguments[i] ? arguments[i] : {}; - i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { - _defineProperty(target, key, source[key]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { - Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); - }); - } - - return target; -} - -function _typeof(obj) { - "@babel/helpers - typeof"; - - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; -} - -function _defineProperty(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; -} - -function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - - Object.defineProperty(subClass, "prototype", { - value: Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }), - writable: false - }); - if (superClass) _setPrototypeOf(subClass, superClass); -} - -function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); -} - -function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); -} - -function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - - try { - Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); - return true; - } catch (e) { - return false; - } -} - -function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; -} - -function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } else if (call !== void 0) { - throw new TypeError("Derived constructors may only return object or undefined"); - } - - return _assertThisInitialized(self); -} - -function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); - - return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), - result; - - if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; - - result = Reflect.construct(Super, arguments, NewTarget); - } else { - result = Super.apply(this, arguments); - } - - return _possibleConstructorReturn(this, result); - }; -} - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function isArray(value) { - return !Array.isArray ? getTag(value) === '[object Array]' : Array.isArray(value); -} // Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js - -var INFINITY = 1 / 0; -function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value; - } - - var result = value + ''; - return result == '0' && 1 / value == -INFINITY ? '-0' : result; -} -function toString(value) { - return value == null ? '' : baseToString(value); -} -function isString(value) { - return typeof value === 'string'; -} -function isNumber(value) { - return typeof value === 'number'; -} // Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js - -function isBoolean(value) { - return value === true || value === false || isObjectLike(value) && getTag(value) == '[object Boolean]'; -} -function isObject(value) { - return _typeof(value) === 'object'; -} // Checks if `value` is object-like. - -function isObjectLike(value) { - return isObject(value) && value !== null; -} -function isDefined(value) { - return value !== undefined && value !== null; -} -function isBlank(value) { - return !value.trim().length; -} // Gets the `toStringTag` of `value`. -// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js - -function getTag(value) { - return value == null ? value === undefined ? '[object Undefined]' : '[object Null]' : Object.prototype.toString.call(value); -} - -var EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available'; -var INCORRECT_INDEX_TYPE = "Incorrect 'index' type"; -var LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = function LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key) { - return "Invalid value for key ".concat(key); -}; -var PATTERN_LENGTH_TOO_LARGE = function PATTERN_LENGTH_TOO_LARGE(max) { - return "Pattern length exceeds max of ".concat(max, "."); -}; -var MISSING_KEY_PROPERTY = function MISSING_KEY_PROPERTY(name) { - return "Missing ".concat(name, " property in key"); -}; -var INVALID_KEY_WEIGHT_VALUE = function INVALID_KEY_WEIGHT_VALUE(key) { - return "Property 'weight' in key '".concat(key, "' must be a positive integer"); -}; - -var hasOwn = Object.prototype.hasOwnProperty; - -var KeyStore = /*#__PURE__*/function () { - function KeyStore(keys) { - var _this = this; - - _classCallCheck(this, KeyStore); - - this._keys = []; - this._keyMap = {}; - var totalWeight = 0; - keys.forEach(function (key) { - var obj = createKey(key); - - _this._keys.push(obj); - - _this._keyMap[obj.id] = obj; - totalWeight += obj.weight; - }); // Normalize weights so that their sum is equal to 1 - - this._keys.forEach(function (key) { - key.weight /= totalWeight; - }); - } - - _createClass(KeyStore, [{ - key: "get", - value: function get(keyId) { - return this._keyMap[keyId]; - } - }, { - key: "keys", - value: function keys() { - return this._keys; - } - }, { - key: "toJSON", - value: function toJSON() { - return JSON.stringify(this._keys); - } - }]); - - return KeyStore; -}(); -function createKey(key) { - var path = null; - var id = null; - var src = null; - var weight = 1; - var getFn = null; - - if (isString(key) || isArray(key)) { - src = key; - path = createKeyPath(key); - id = createKeyId(key); - } else { - if (!hasOwn.call(key, 'name')) { - throw new Error(MISSING_KEY_PROPERTY('name')); - } - - var name = key.name; - src = name; - - if (hasOwn.call(key, 'weight')) { - weight = key.weight; - - if (weight <= 0) { - throw new Error(INVALID_KEY_WEIGHT_VALUE(name)); - } - } - - path = createKeyPath(name); - id = createKeyId(name); - getFn = key.getFn; - } - - return { - path: path, - id: id, - weight: weight, - src: src, - getFn: getFn - }; -} -function createKeyPath(key) { - return isArray(key) ? key : key.split('.'); -} -function createKeyId(key) { - return isArray(key) ? key.join('.') : key; -} - -function get(obj, path) { - var list = []; - var arr = false; - - var deepGet = function deepGet(obj, path, index) { - if (!isDefined(obj)) { - return; - } - - if (!path[index]) { - // If there's no path left, we've arrived at the object we care about. - list.push(obj); - } else { - var key = path[index]; - var value = obj[key]; - - if (!isDefined(value)) { - return; - } // If we're at the last value in the path, and if it's a string/number/bool, - // add it to the list - - - if (index === path.length - 1 && (isString(value) || isNumber(value) || isBoolean(value))) { - list.push(toString(value)); - } else if (isArray(value)) { - arr = true; // Search each item in the array. - - for (var i = 0, len = value.length; i < len; i += 1) { - deepGet(value[i], path, index + 1); - } - } else if (path.length) { - // An object. Recurse further. - deepGet(value, path, index + 1); - } - } - }; // Backwards compatibility (since path used to be a string) - - - deepGet(obj, isString(path) ? path.split('.') : path, 0); - return arr ? list : list[0]; -} - -var MatchOptions = { - // Whether the matches should be included in the result set. When `true`, each record in the result - // set will include the indices of the matched characters. - // These can consequently be used for highlighting purposes. - includeMatches: false, - // When `true`, the matching function will continue to the end of a search pattern even if - // a perfect match has already been located in the string. - findAllMatches: false, - // Minimum number of characters that must be matched before a result is considered a match - minMatchCharLength: 1 -}; -var BasicOptions = { - // When `true`, the algorithm continues searching to the end of the input even if a perfect - // match is found before the end of the same input. - isCaseSensitive: false, - // When true, the matching function will continue to the end of a search pattern even if - includeScore: false, - // List of properties that will be searched. This also supports nested properties. - keys: [], - // Whether to sort the result list, by score - shouldSort: true, - // Default sort function: sort by ascending score, ascending index - sortFn: function sortFn(a, b) { - return a.score === b.score ? a.idx < b.idx ? -1 : 1 : a.score < b.score ? -1 : 1; - } -}; -var FuzzyOptions = { - // Approximately where in the text is the pattern expected to be found? - location: 0, - // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match - // (of both letters and location), a threshold of '1.0' would match anything. - threshold: 0.6, - // Determines how close the match must be to the fuzzy location (specified above). - // An exact letter match which is 'distance' characters away from the fuzzy location - // would score as a complete mismatch. A distance of '0' requires the match be at - // the exact location specified, a threshold of '1000' would require a perfect match - // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold. - distance: 100 -}; -var AdvancedOptions = { - // When `true`, it enables the use of unix-like search commands - useExtendedSearch: false, - // The get function to use when fetching an object's properties. - // The default will search nested paths *ie foo.bar.baz* - getFn: get, - // When `true`, search will ignore `location` and `distance`, so it won't matter - // where in the string the pattern appears. - // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score - ignoreLocation: false, - // When `true`, the calculation for the relevance score (used for sorting) will - // ignore the field-length norm. - // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm - ignoreFieldNorm: false, - // The weight to determine how much field length norm effects scoring. - fieldNormWeight: 1 -}; -var Config = _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, BasicOptions), MatchOptions), FuzzyOptions), AdvancedOptions); - -var SPACE = /[^ ]+/g; // Field-length norm: the shorter the field, the higher the weight. -// Set to 3 decimals to reduce index size. - -function norm() { - var weight = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; - var mantissa = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3; - var cache = new Map(); - var m = Math.pow(10, mantissa); - return { - get: function get(value) { - var numTokens = value.match(SPACE).length; - - if (cache.has(numTokens)) { - return cache.get(numTokens); - } // Default function is 1/sqrt(x), weight makes that variable - - - var norm = 1 / Math.pow(numTokens, 0.5 * weight); // In place of `toFixed(mantissa)`, for faster computation - - var n = parseFloat(Math.round(norm * m) / m); - cache.set(numTokens, n); - return n; - }, - clear: function clear() { - cache.clear(); - } - }; -} - -var FuseIndex = /*#__PURE__*/function () { - function FuseIndex() { - var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, - _ref$getFn = _ref.getFn, - getFn = _ref$getFn === void 0 ? Config.getFn : _ref$getFn, - _ref$fieldNormWeight = _ref.fieldNormWeight, - fieldNormWeight = _ref$fieldNormWeight === void 0 ? Config.fieldNormWeight : _ref$fieldNormWeight; - - _classCallCheck(this, FuseIndex); - - this.norm = norm(fieldNormWeight, 3); - this.getFn = getFn; - this.isCreated = false; - this.setIndexRecords(); - } - - _createClass(FuseIndex, [{ - key: "setSources", - value: function setSources() { - var docs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - this.docs = docs; - } - }, { - key: "setIndexRecords", - value: function setIndexRecords() { - var records = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - this.records = records; - } - }, { - key: "setKeys", - value: function setKeys() { - var _this = this; - - var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - this.keys = keys; - this._keysMap = {}; - keys.forEach(function (key, idx) { - _this._keysMap[key.id] = idx; - }); - } - }, { - key: "create", - value: function create() { - var _this2 = this; - - if (this.isCreated || !this.docs.length) { - return; - } - - this.isCreated = true; // List is Array - - if (isString(this.docs[0])) { - this.docs.forEach(function (doc, docIndex) { - _this2._addString(doc, docIndex); - }); - } else { - // List is Array - this.docs.forEach(function (doc, docIndex) { - _this2._addObject(doc, docIndex); - }); - } - - this.norm.clear(); - } // Adds a doc to the end of the index - - }, { - key: "add", - value: function add(doc) { - var idx = this.size(); - - if (isString(doc)) { - this._addString(doc, idx); - } else { - this._addObject(doc, idx); - } - } // Removes the doc at the specified index of the index - - }, { - key: "removeAt", - value: function removeAt(idx) { - this.records.splice(idx, 1); // Change ref index of every subsquent doc - - for (var i = idx, len = this.size(); i < len; i += 1) { - this.records[i].i -= 1; - } - } - }, { - key: "getValueForItemAtKeyId", - value: function getValueForItemAtKeyId(item, keyId) { - return item[this._keysMap[keyId]]; - } - }, { - key: "size", - value: function size() { - return this.records.length; - } - }, { - key: "_addString", - value: function _addString(doc, docIndex) { - if (!isDefined(doc) || isBlank(doc)) { - return; - } - - var record = { - v: doc, - i: docIndex, - n: this.norm.get(doc) - }; - this.records.push(record); - } - }, { - key: "_addObject", - value: function _addObject(doc, docIndex) { - var _this3 = this; - - var record = { - i: docIndex, - $: {} - }; // Iterate over every key (i.e, path), and fetch the value at that key - - this.keys.forEach(function (key, keyIndex) { - var value = key.getFn ? key.getFn(doc) : _this3.getFn(doc, key.path); - - if (!isDefined(value)) { - return; - } - - if (isArray(value)) { - (function () { - var subRecords = []; - var stack = [{ - nestedArrIndex: -1, - value: value - }]; - - while (stack.length) { - var _stack$pop = stack.pop(), - nestedArrIndex = _stack$pop.nestedArrIndex, - _value = _stack$pop.value; - - if (!isDefined(_value)) { - continue; - } - - if (isString(_value) && !isBlank(_value)) { - var subRecord = { - v: _value, - i: nestedArrIndex, - n: _this3.norm.get(_value) - }; - subRecords.push(subRecord); - } else if (isArray(_value)) { - _value.forEach(function (item, k) { - stack.push({ - nestedArrIndex: k, - value: item - }); - }); - } else ; - } - - record.$[keyIndex] = subRecords; - })(); - } else if (isString(value) && !isBlank(value)) { - var subRecord = { - v: value, - n: _this3.norm.get(value) - }; - record.$[keyIndex] = subRecord; - } - }); - this.records.push(record); - } - }, { - key: "toJSON", - value: function toJSON() { - return { - keys: this.keys, - records: this.records - }; - } - }]); - - return FuseIndex; -}(); -function createIndex(keys, docs) { - var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - _ref2$getFn = _ref2.getFn, - getFn = _ref2$getFn === void 0 ? Config.getFn : _ref2$getFn, - _ref2$fieldNormWeight = _ref2.fieldNormWeight, - fieldNormWeight = _ref2$fieldNormWeight === void 0 ? Config.fieldNormWeight : _ref2$fieldNormWeight; - - var myIndex = new FuseIndex({ - getFn: getFn, - fieldNormWeight: fieldNormWeight - }); - myIndex.setKeys(keys.map(createKey)); - myIndex.setSources(docs); - myIndex.create(); - return myIndex; -} -function parseIndex(data) { - var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref3$getFn = _ref3.getFn, - getFn = _ref3$getFn === void 0 ? Config.getFn : _ref3$getFn, - _ref3$fieldNormWeight = _ref3.fieldNormWeight, - fieldNormWeight = _ref3$fieldNormWeight === void 0 ? Config.fieldNormWeight : _ref3$fieldNormWeight; - - var keys = data.keys, - records = data.records; - var myIndex = new FuseIndex({ - getFn: getFn, - fieldNormWeight: fieldNormWeight - }); - myIndex.setKeys(keys); - myIndex.setIndexRecords(records); - return myIndex; -} - -function computeScore$1(pattern) { - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$errors = _ref.errors, - errors = _ref$errors === void 0 ? 0 : _ref$errors, - _ref$currentLocation = _ref.currentLocation, - currentLocation = _ref$currentLocation === void 0 ? 0 : _ref$currentLocation, - _ref$expectedLocation = _ref.expectedLocation, - expectedLocation = _ref$expectedLocation === void 0 ? 0 : _ref$expectedLocation, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - var accuracy = errors / pattern.length; - - if (ignoreLocation) { - return accuracy; - } - - var proximity = Math.abs(expectedLocation - currentLocation); - - if (!distance) { - // Dodge divide by zero error. - return proximity ? 1.0 : accuracy; - } - - return accuracy + proximity / distance; -} - -function convertMaskToIndices() { - var matchmask = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - var minMatchCharLength = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Config.minMatchCharLength; - var indices = []; - var start = -1; - var end = -1; - var i = 0; - - for (var len = matchmask.length; i < len; i += 1) { - var match = matchmask[i]; - - if (match && start === -1) { - start = i; - } else if (!match && start !== -1) { - end = i - 1; - - if (end - start + 1 >= minMatchCharLength) { - indices.push([start, end]); - } - - start = -1; - } - } // (i-1 - start) + 1 => i - start - - - if (matchmask[i - 1] && i - start >= minMatchCharLength) { - indices.push([start, i - 1]); - } - - return indices; -} - -// Machine word size -var MAX_BITS = 32; - -function search(text, pattern, patternAlphabet) { - var _ref = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}, - _ref$location = _ref.location, - location = _ref$location === void 0 ? Config.location : _ref$location, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$threshold = _ref.threshold, - threshold = _ref$threshold === void 0 ? Config.threshold : _ref$threshold, - _ref$findAllMatches = _ref.findAllMatches, - findAllMatches = _ref$findAllMatches === void 0 ? Config.findAllMatches : _ref$findAllMatches, - _ref$minMatchCharLeng = _ref.minMatchCharLength, - minMatchCharLength = _ref$minMatchCharLeng === void 0 ? Config.minMatchCharLength : _ref$minMatchCharLeng, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - if (pattern.length > MAX_BITS) { - throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS)); - } - - var patternLen = pattern.length; // Set starting location at beginning text and initialize the alphabet. - - var textLen = text.length; // Handle the case when location > text.length - - var expectedLocation = Math.max(0, Math.min(location, textLen)); // Highest score beyond which we give up. - - var currentThreshold = threshold; // Is there a nearby exact match? (speedup) - - var bestLocation = expectedLocation; // Performance: only computer matches when the minMatchCharLength > 1 - // OR if `includeMatches` is true. - - var computeMatches = minMatchCharLength > 1 || includeMatches; // A mask of the matches, used for building the indices - - var matchMask = computeMatches ? Array(textLen) : []; - var index; // Get all exact matches, here for speed up - - while ((index = text.indexOf(pattern, bestLocation)) > -1) { - var score = computeScore$1(pattern, { - currentLocation: index, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - currentThreshold = Math.min(score, currentThreshold); - bestLocation = index + patternLen; - - if (computeMatches) { - var i = 0; - - while (i < patternLen) { - matchMask[index + i] = 1; - i += 1; - } - } - } // Reset the best location - - - bestLocation = -1; - var lastBitArr = []; - var finalScore = 1; - var binMax = patternLen + textLen; - var mask = 1 << patternLen - 1; - - for (var _i = 0; _i < patternLen; _i += 1) { - // Scan for the best match; each iteration allows for one more error. - // Run a binary search to determine how far from the match location we can stray - // at this error level. - var binMin = 0; - var binMid = binMax; - - while (binMin < binMid) { - var _score2 = computeScore$1(pattern, { - errors: _i, - currentLocation: expectedLocation + binMid, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - - if (_score2 <= currentThreshold) { - binMin = binMid; - } else { - binMax = binMid; - } - - binMid = Math.floor((binMax - binMin) / 2 + binMin); - } // Use the result from this iteration as the maximum for the next. - - - binMax = binMid; - var start = Math.max(1, expectedLocation - binMid + 1); - var finish = findAllMatches ? textLen : Math.min(expectedLocation + binMid, textLen) + patternLen; // Initialize the bit array - - var bitArr = Array(finish + 2); - bitArr[finish + 1] = (1 << _i) - 1; - - for (var j = finish; j >= start; j -= 1) { - var currentLocation = j - 1; - var charMatch = patternAlphabet[text.charAt(currentLocation)]; - - if (computeMatches) { - // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`) - matchMask[currentLocation] = +!!charMatch; - } // First pass: exact match - - - bitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch; // Subsequent passes: fuzzy match - - if (_i) { - bitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1]; - } - - if (bitArr[j] & mask) { - finalScore = computeScore$1(pattern, { - errors: _i, - currentLocation: currentLocation, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); // This match will almost certainly be better than any existing match. - // But check anyway. - - if (finalScore <= currentThreshold) { - // Indeed it is - currentThreshold = finalScore; - bestLocation = currentLocation; // Already passed `loc`, downhill from here on in. - - if (bestLocation <= expectedLocation) { - break; - } // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`. - - - start = Math.max(1, 2 * expectedLocation - bestLocation); - } - } - } // No hope for a (better) match at greater error levels. - - - var _score = computeScore$1(pattern, { - errors: _i + 1, - currentLocation: expectedLocation, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - - if (_score > currentThreshold) { - break; - } - - lastBitArr = bitArr; - } - - var result = { - isMatch: bestLocation >= 0, - // Count exact matches (those with a score of 0) to be "almost" exact - score: Math.max(0.001, finalScore) - }; - - if (computeMatches) { - var indices = convertMaskToIndices(matchMask, minMatchCharLength); - - if (!indices.length) { - result.isMatch = false; - } else if (includeMatches) { - result.indices = indices; - } - } - - return result; -} - -function createPatternAlphabet(pattern) { - var mask = {}; - - for (var i = 0, len = pattern.length; i < len; i += 1) { - var _char = pattern.charAt(i); - - mask[_char] = (mask[_char] || 0) | 1 << len - i - 1; - } - - return mask; -} - -var BitapSearch = /*#__PURE__*/function () { - function BitapSearch(pattern) { - var _this = this; - - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$location = _ref.location, - location = _ref$location === void 0 ? Config.location : _ref$location, - _ref$threshold = _ref.threshold, - threshold = _ref$threshold === void 0 ? Config.threshold : _ref$threshold, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$findAllMatches = _ref.findAllMatches, - findAllMatches = _ref$findAllMatches === void 0 ? Config.findAllMatches : _ref$findAllMatches, - _ref$minMatchCharLeng = _ref.minMatchCharLength, - minMatchCharLength = _ref$minMatchCharLeng === void 0 ? Config.minMatchCharLength : _ref$minMatchCharLeng, - _ref$isCaseSensitive = _ref.isCaseSensitive, - isCaseSensitive = _ref$isCaseSensitive === void 0 ? Config.isCaseSensitive : _ref$isCaseSensitive, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - _classCallCheck(this, BitapSearch); - - this.options = { - location: location, - threshold: threshold, - distance: distance, - includeMatches: includeMatches, - findAllMatches: findAllMatches, - minMatchCharLength: minMatchCharLength, - isCaseSensitive: isCaseSensitive, - ignoreLocation: ignoreLocation - }; - this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); - this.chunks = []; - - if (!this.pattern.length) { - return; - } - - var addChunk = function addChunk(pattern, startIndex) { - _this.chunks.push({ - pattern: pattern, - alphabet: createPatternAlphabet(pattern), - startIndex: startIndex - }); - }; - - var len = this.pattern.length; - - if (len > MAX_BITS) { - var i = 0; - var remainder = len % MAX_BITS; - var end = len - remainder; - - while (i < end) { - addChunk(this.pattern.substr(i, MAX_BITS), i); - i += MAX_BITS; - } - - if (remainder) { - var startIndex = len - MAX_BITS; - addChunk(this.pattern.substr(startIndex), startIndex); - } - } else { - addChunk(this.pattern, 0); - } - } - - _createClass(BitapSearch, [{ - key: "searchIn", - value: function searchIn(text) { - var _this$options = this.options, - isCaseSensitive = _this$options.isCaseSensitive, - includeMatches = _this$options.includeMatches; - - if (!isCaseSensitive) { - text = text.toLowerCase(); - } // Exact match - - - if (this.pattern === text) { - var _result = { - isMatch: true, - score: 0 - }; - - if (includeMatches) { - _result.indices = [[0, text.length - 1]]; - } - - return _result; - } // Otherwise, use Bitap algorithm - - - var _this$options2 = this.options, - location = _this$options2.location, - distance = _this$options2.distance, - threshold = _this$options2.threshold, - findAllMatches = _this$options2.findAllMatches, - minMatchCharLength = _this$options2.minMatchCharLength, - ignoreLocation = _this$options2.ignoreLocation; - var allIndices = []; - var totalScore = 0; - var hasMatches = false; - this.chunks.forEach(function (_ref2) { - var pattern = _ref2.pattern, - alphabet = _ref2.alphabet, - startIndex = _ref2.startIndex; - - var _search = search(text, pattern, alphabet, { - location: location + startIndex, - distance: distance, - threshold: threshold, - findAllMatches: findAllMatches, - minMatchCharLength: minMatchCharLength, - includeMatches: includeMatches, - ignoreLocation: ignoreLocation - }), - isMatch = _search.isMatch, - score = _search.score, - indices = _search.indices; - - if (isMatch) { - hasMatches = true; - } - - totalScore += score; - - if (isMatch && indices) { - allIndices = [].concat(_toConsumableArray(allIndices), _toConsumableArray(indices)); - } - }); - var result = { - isMatch: hasMatches, - score: hasMatches ? totalScore / this.chunks.length : 1 - }; - - if (hasMatches && includeMatches) { - result.indices = allIndices; - } - - return result; - } - }]); - - return BitapSearch; -}(); - -var BaseMatch = /*#__PURE__*/function () { - function BaseMatch(pattern) { - _classCallCheck(this, BaseMatch); - - this.pattern = pattern; - } - - _createClass(BaseMatch, [{ - key: "search", - value: function - /*text*/ - search() {} - }], [{ - key: "isMultiMatch", - value: function isMultiMatch(pattern) { - return getMatch(pattern, this.multiRegex); - } - }, { - key: "isSingleMatch", - value: function isSingleMatch(pattern) { - return getMatch(pattern, this.singleRegex); - } - }]); - - return BaseMatch; -}(); - -function getMatch(pattern, exp) { - var matches = pattern.match(exp); - return matches ? matches[1] : null; -} - -var ExactMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(ExactMatch, _BaseMatch); - - var _super = _createSuper(ExactMatch); - - function ExactMatch(pattern) { - _classCallCheck(this, ExactMatch); - - return _super.call(this, pattern); - } - - _createClass(ExactMatch, [{ - key: "search", - value: function search(text) { - var isMatch = text === this.pattern; - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: [0, this.pattern.length - 1] - }; - } - }], [{ - key: "type", - get: function get() { - return 'exact'; - } - }, { - key: "multiRegex", - get: function get() { - return /^="(.*)"$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^=(.*)$/; - } - }]); - - return ExactMatch; -}(BaseMatch); - -var InverseExactMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(InverseExactMatch, _BaseMatch); - - var _super = _createSuper(InverseExactMatch); - - function InverseExactMatch(pattern) { - _classCallCheck(this, InverseExactMatch); - - return _super.call(this, pattern); - } - - _createClass(InverseExactMatch, [{ - key: "search", - value: function search(text) { - var index = text.indexOf(this.pattern); - var isMatch = index === -1; - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: [0, text.length - 1] - }; - } - }], [{ - key: "type", - get: function get() { - return 'inverse-exact'; - } - }, { - key: "multiRegex", - get: function get() { - return /^!"(.*)"$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^!(.*)$/; - } - }]); - - return InverseExactMatch; -}(BaseMatch); - -var PrefixExactMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(PrefixExactMatch, _BaseMatch); - - var _super = _createSuper(PrefixExactMatch); - - function PrefixExactMatch(pattern) { - _classCallCheck(this, PrefixExactMatch); - - return _super.call(this, pattern); - } - - _createClass(PrefixExactMatch, [{ - key: "search", - value: function search(text) { - var isMatch = text.startsWith(this.pattern); - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: [0, this.pattern.length - 1] - }; - } - }], [{ - key: "type", - get: function get() { - return 'prefix-exact'; - } - }, { - key: "multiRegex", - get: function get() { - return /^\^"(.*)"$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^\^(.*)$/; - } - }]); - - return PrefixExactMatch; -}(BaseMatch); - -var InversePrefixExactMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(InversePrefixExactMatch, _BaseMatch); - - var _super = _createSuper(InversePrefixExactMatch); - - function InversePrefixExactMatch(pattern) { - _classCallCheck(this, InversePrefixExactMatch); - - return _super.call(this, pattern); - } - - _createClass(InversePrefixExactMatch, [{ - key: "search", - value: function search(text) { - var isMatch = !text.startsWith(this.pattern); - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: [0, text.length - 1] - }; - } - }], [{ - key: "type", - get: function get() { - return 'inverse-prefix-exact'; - } - }, { - key: "multiRegex", - get: function get() { - return /^!\^"(.*)"$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^!\^(.*)$/; - } - }]); - - return InversePrefixExactMatch; -}(BaseMatch); - -var SuffixExactMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(SuffixExactMatch, _BaseMatch); - - var _super = _createSuper(SuffixExactMatch); - - function SuffixExactMatch(pattern) { - _classCallCheck(this, SuffixExactMatch); - - return _super.call(this, pattern); - } - - _createClass(SuffixExactMatch, [{ - key: "search", - value: function search(text) { - var isMatch = text.endsWith(this.pattern); - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: [text.length - this.pattern.length, text.length - 1] - }; - } - }], [{ - key: "type", - get: function get() { - return 'suffix-exact'; - } - }, { - key: "multiRegex", - get: function get() { - return /^"(.*)"\$$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^(.*)\$$/; - } - }]); - - return SuffixExactMatch; -}(BaseMatch); - -var InverseSuffixExactMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(InverseSuffixExactMatch, _BaseMatch); - - var _super = _createSuper(InverseSuffixExactMatch); - - function InverseSuffixExactMatch(pattern) { - _classCallCheck(this, InverseSuffixExactMatch); - - return _super.call(this, pattern); - } - - _createClass(InverseSuffixExactMatch, [{ - key: "search", - value: function search(text) { - var isMatch = !text.endsWith(this.pattern); - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: [0, text.length - 1] - }; - } - }], [{ - key: "type", - get: function get() { - return 'inverse-suffix-exact'; - } - }, { - key: "multiRegex", - get: function get() { - return /^!"(.*)"\$$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^!(.*)\$$/; - } - }]); - - return InverseSuffixExactMatch; -}(BaseMatch); - -var FuzzyMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(FuzzyMatch, _BaseMatch); - - var _super = _createSuper(FuzzyMatch); - - function FuzzyMatch(pattern) { - var _this; - - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$location = _ref.location, - location = _ref$location === void 0 ? Config.location : _ref$location, - _ref$threshold = _ref.threshold, - threshold = _ref$threshold === void 0 ? Config.threshold : _ref$threshold, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$findAllMatches = _ref.findAllMatches, - findAllMatches = _ref$findAllMatches === void 0 ? Config.findAllMatches : _ref$findAllMatches, - _ref$minMatchCharLeng = _ref.minMatchCharLength, - minMatchCharLength = _ref$minMatchCharLeng === void 0 ? Config.minMatchCharLength : _ref$minMatchCharLeng, - _ref$isCaseSensitive = _ref.isCaseSensitive, - isCaseSensitive = _ref$isCaseSensitive === void 0 ? Config.isCaseSensitive : _ref$isCaseSensitive, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - _classCallCheck(this, FuzzyMatch); - - _this = _super.call(this, pattern); - _this._bitapSearch = new BitapSearch(pattern, { - location: location, - threshold: threshold, - distance: distance, - includeMatches: includeMatches, - findAllMatches: findAllMatches, - minMatchCharLength: minMatchCharLength, - isCaseSensitive: isCaseSensitive, - ignoreLocation: ignoreLocation - }); - return _this; - } - - _createClass(FuzzyMatch, [{ - key: "search", - value: function search(text) { - return this._bitapSearch.searchIn(text); - } - }], [{ - key: "type", - get: function get() { - return 'fuzzy'; - } - }, { - key: "multiRegex", - get: function get() { - return /^"(.*)"$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^(.*)$/; - } - }]); - - return FuzzyMatch; -}(BaseMatch); - -var IncludeMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(IncludeMatch, _BaseMatch); - - var _super = _createSuper(IncludeMatch); - - function IncludeMatch(pattern) { - _classCallCheck(this, IncludeMatch); - - return _super.call(this, pattern); - } - - _createClass(IncludeMatch, [{ - key: "search", - value: function search(text) { - var location = 0; - var index; - var indices = []; - var patternLen = this.pattern.length; // Get all exact matches - - while ((index = text.indexOf(this.pattern, location)) > -1) { - location = index + patternLen; - indices.push([index, location - 1]); - } - - var isMatch = !!indices.length; - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: indices - }; - } - }], [{ - key: "type", - get: function get() { - return 'include'; - } - }, { - key: "multiRegex", - get: function get() { - return /^'"(.*)"$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^'(.*)$/; - } - }]); - - return IncludeMatch; -}(BaseMatch); - -var searchers = [ExactMatch, IncludeMatch, PrefixExactMatch, InversePrefixExactMatch, InverseSuffixExactMatch, SuffixExactMatch, InverseExactMatch, FuzzyMatch]; -var searchersLen = searchers.length; // Regex to split by spaces, but keep anything in quotes together - -var SPACE_RE = / +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/; -var OR_TOKEN = '|'; // Return a 2D array representation of the query, for simpler parsing. -// Example: -// "^core go$ | rb$ | py$ xy$" => [["^core", "go$"], ["rb$"], ["py$", "xy$"]] - -function parseQuery(pattern) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - return pattern.split(OR_TOKEN).map(function (item) { - var query = item.trim().split(SPACE_RE).filter(function (item) { - return item && !!item.trim(); - }); - var results = []; - - for (var i = 0, len = query.length; i < len; i += 1) { - var queryItem = query[i]; // 1. Handle multiple query match (i.e, once that are quoted, like `"hello world"`) - - var found = false; - var idx = -1; - - while (!found && ++idx < searchersLen) { - var searcher = searchers[idx]; - var token = searcher.isMultiMatch(queryItem); - - if (token) { - results.push(new searcher(token, options)); - found = true; - } - } - - if (found) { - continue; - } // 2. Handle single query matches (i.e, once that are *not* quoted) - - - idx = -1; - - while (++idx < searchersLen) { - var _searcher = searchers[idx]; - - var _token = _searcher.isSingleMatch(queryItem); - - if (_token) { - results.push(new _searcher(_token, options)); - break; - } - } - } - - return results; - }); -} - -// to a singl match - -var MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]); -/** - * Command-like searching - * ====================== - * - * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`, - * search in a given text. - * - * Search syntax: - * - * | Token | Match type | Description | - * | ----------- | -------------------------- | -------------------------------------- | - * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` | - * | `=scheme` | exact-match | Items that are `scheme` | - * | `'python` | include-match | Items that include `python` | - * | `!ruby` | inverse-exact-match | Items that do not include `ruby` | - * | `^java` | prefix-exact-match | Items that start with `java` | - * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` | - * | `.js$` | suffix-exact-match | Items that end with `.js` | - * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` | - * - * A single pipe character acts as an OR operator. For example, the following - * query matches entries that start with `core` and end with either`go`, `rb`, - * or`py`. - * - * ``` - * ^core go$ | rb$ | py$ - * ``` - */ - -var ExtendedSearch = /*#__PURE__*/function () { - function ExtendedSearch(pattern) { - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$isCaseSensitive = _ref.isCaseSensitive, - isCaseSensitive = _ref$isCaseSensitive === void 0 ? Config.isCaseSensitive : _ref$isCaseSensitive, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$minMatchCharLeng = _ref.minMatchCharLength, - minMatchCharLength = _ref$minMatchCharLeng === void 0 ? Config.minMatchCharLength : _ref$minMatchCharLeng, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation, - _ref$findAllMatches = _ref.findAllMatches, - findAllMatches = _ref$findAllMatches === void 0 ? Config.findAllMatches : _ref$findAllMatches, - _ref$location = _ref.location, - location = _ref$location === void 0 ? Config.location : _ref$location, - _ref$threshold = _ref.threshold, - threshold = _ref$threshold === void 0 ? Config.threshold : _ref$threshold, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance; - - _classCallCheck(this, ExtendedSearch); - - this.query = null; - this.options = { - isCaseSensitive: isCaseSensitive, - includeMatches: includeMatches, - minMatchCharLength: minMatchCharLength, - findAllMatches: findAllMatches, - ignoreLocation: ignoreLocation, - location: location, - threshold: threshold, - distance: distance - }; - this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); - this.query = parseQuery(this.pattern, this.options); - } - - _createClass(ExtendedSearch, [{ - key: "searchIn", - value: function searchIn(text) { - var query = this.query; - - if (!query) { - return { - isMatch: false, - score: 1 - }; - } - - var _this$options = this.options, - includeMatches = _this$options.includeMatches, - isCaseSensitive = _this$options.isCaseSensitive; - text = isCaseSensitive ? text : text.toLowerCase(); - var numMatches = 0; - var allIndices = []; - var totalScore = 0; // ORs - - for (var i = 0, qLen = query.length; i < qLen; i += 1) { - var searchers = query[i]; // Reset indices - - allIndices.length = 0; - numMatches = 0; // ANDs - - for (var j = 0, pLen = searchers.length; j < pLen; j += 1) { - var searcher = searchers[j]; - - var _searcher$search = searcher.search(text), - isMatch = _searcher$search.isMatch, - indices = _searcher$search.indices, - score = _searcher$search.score; - - if (isMatch) { - numMatches += 1; - totalScore += score; - - if (includeMatches) { - var type = searcher.constructor.type; - - if (MultiMatchSet.has(type)) { - allIndices = [].concat(_toConsumableArray(allIndices), _toConsumableArray(indices)); - } else { - allIndices.push(indices); - } - } - } else { - totalScore = 0; - numMatches = 0; - allIndices.length = 0; - break; - } - } // OR condition, so if TRUE, return - - - if (numMatches) { - var result = { - isMatch: true, - score: totalScore / numMatches - }; - - if (includeMatches) { - result.indices = allIndices; - } - - return result; - } - } // Nothing was matched - - - return { - isMatch: false, - score: 1 - }; - } - }], [{ - key: "condition", - value: function condition(_, options) { - return options.useExtendedSearch; - } - }]); - - return ExtendedSearch; -}(); - -var registeredSearchers = []; -function register() { - registeredSearchers.push.apply(registeredSearchers, arguments); -} -function createSearcher(pattern, options) { - for (var i = 0, len = registeredSearchers.length; i < len; i += 1) { - var searcherClass = registeredSearchers[i]; - - if (searcherClass.condition(pattern, options)) { - return new searcherClass(pattern, options); - } - } - - return new BitapSearch(pattern, options); -} - -var LogicalOperator = { - AND: '$and', - OR: '$or' -}; -var KeyType = { - PATH: '$path', - PATTERN: '$val' -}; - -var isExpression = function isExpression(query) { - return !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]); -}; - -var isPath = function isPath(query) { - return !!query[KeyType.PATH]; -}; - -var isLeaf = function isLeaf(query) { - return !isArray(query) && isObject(query) && !isExpression(query); -}; - -var convertToExplicit = function convertToExplicit(query) { - return _defineProperty({}, LogicalOperator.AND, Object.keys(query).map(function (key) { - return _defineProperty({}, key, query[key]); - })); -}; // When `auto` is `true`, the parse function will infer and initialize and add -// the appropriate `Searcher` instance - - -function parse(query, options) { - var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - _ref3$auto = _ref3.auto, - auto = _ref3$auto === void 0 ? true : _ref3$auto; - - var next = function next(query) { - var keys = Object.keys(query); - var isQueryPath = isPath(query); - - if (!isQueryPath && keys.length > 1 && !isExpression(query)) { - return next(convertToExplicit(query)); - } - - if (isLeaf(query)) { - var key = isQueryPath ? query[KeyType.PATH] : keys[0]; - var pattern = isQueryPath ? query[KeyType.PATTERN] : query[key]; - - if (!isString(pattern)) { - throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key)); - } - - var obj = { - keyId: createKeyId(key), - pattern: pattern - }; - - if (auto) { - obj.searcher = createSearcher(pattern, options); - } - - return obj; - } - - var node = { - children: [], - operator: keys[0] - }; - keys.forEach(function (key) { - var value = query[key]; - - if (isArray(value)) { - value.forEach(function (item) { - node.children.push(next(item)); - }); - } - }); - return node; - }; - - if (!isExpression(query)) { - query = convertToExplicit(query); - } - - return next(query); -} - -function computeScore(results, _ref) { - var _ref$ignoreFieldNorm = _ref.ignoreFieldNorm, - ignoreFieldNorm = _ref$ignoreFieldNorm === void 0 ? Config.ignoreFieldNorm : _ref$ignoreFieldNorm; - results.forEach(function (result) { - var totalScore = 1; - result.matches.forEach(function (_ref2) { - var key = _ref2.key, - norm = _ref2.norm, - score = _ref2.score; - var weight = key ? key.weight : null; - totalScore *= Math.pow(score === 0 && weight ? Number.EPSILON : score, (weight || 1) * (ignoreFieldNorm ? 1 : norm)); - }); - result.score = totalScore; - }); -} - -function transformMatches(result, data) { - var matches = result.matches; - data.matches = []; - - if (!isDefined(matches)) { - return; - } - - matches.forEach(function (match) { - if (!isDefined(match.indices) || !match.indices.length) { - return; - } - - var indices = match.indices, - value = match.value; - var obj = { - indices: indices, - value: value - }; - - if (match.key) { - obj.key = match.key.src; - } - - if (match.idx > -1) { - obj.refIndex = match.idx; - } - - data.matches.push(obj); - }); -} - -function transformScore(result, data) { - data.score = result.score; -} - -function format(results, docs) { - var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$includeScore = _ref.includeScore, - includeScore = _ref$includeScore === void 0 ? Config.includeScore : _ref$includeScore; - - var transformers = []; - if (includeMatches) transformers.push(transformMatches); - if (includeScore) transformers.push(transformScore); - return results.map(function (result) { - var idx = result.idx; - var data = { - item: docs[idx], - refIndex: idx - }; - - if (transformers.length) { - transformers.forEach(function (transformer) { - transformer(result, data); - }); - } - - return data; - }); -} - -var Fuse$1 = /*#__PURE__*/function () { - function Fuse(docs) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var index = arguments.length > 2 ? arguments[2] : undefined; - - _classCallCheck(this, Fuse); - - this.options = _objectSpread2(_objectSpread2({}, Config), options); - - if (this.options.useExtendedSearch && !true) { - throw new Error(EXTENDED_SEARCH_UNAVAILABLE); - } - - this._keyStore = new KeyStore(this.options.keys); - this.setCollection(docs, index); - } - - _createClass(Fuse, [{ - key: "setCollection", - value: function setCollection(docs, index) { - this._docs = docs; - - if (index && !(index instanceof FuseIndex)) { - throw new Error(INCORRECT_INDEX_TYPE); - } - - this._myIndex = index || createIndex(this.options.keys, this._docs, { - getFn: this.options.getFn, - fieldNormWeight: this.options.fieldNormWeight - }); - } - }, { - key: "add", - value: function add(doc) { - if (!isDefined(doc)) { - return; - } - - this._docs.push(doc); - - this._myIndex.add(doc); - } - }, { - key: "remove", - value: function remove() { - var predicate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function - /* doc, idx */ - () { - return false; - }; - var results = []; - - for (var i = 0, len = this._docs.length; i < len; i += 1) { - var doc = this._docs[i]; - - if (predicate(doc, i)) { - this.removeAt(i); - i -= 1; - len -= 1; - results.push(doc); - } - } - - return results; - } - }, { - key: "removeAt", - value: function removeAt(idx) { - this._docs.splice(idx, 1); - - this._myIndex.removeAt(idx); - } - }, { - key: "getIndex", - value: function getIndex() { - return this._myIndex; - } - }, { - key: "search", - value: function search(query) { - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$limit = _ref.limit, - limit = _ref$limit === void 0 ? -1 : _ref$limit, - _ref$keys = _ref.keys, - keys = _ref$keys === void 0 ? [] : _ref$keys; - - var _this$options = this.options, - includeMatches = _this$options.includeMatches, - includeScore = _this$options.includeScore, - shouldSort = _this$options.shouldSort, - sortFn = _this$options.sortFn, - ignoreFieldNorm = _this$options.ignoreFieldNorm; - var results = isString(query) ? isString(this._docs[0]) ? this._searchStringList(query) : this._searchObjectList(query, keys) : this._searchLogical(query); - computeScore(results, { - ignoreFieldNorm: ignoreFieldNorm - }); - - if (shouldSort) { - results.sort(sortFn); - } - - if (isNumber(limit) && limit > -1) { - results = results.slice(0, limit); - } - - return format(results, this._docs, { - includeMatches: includeMatches, - includeScore: includeScore - }); - } - }, { - key: "_searchStringList", - value: function _searchStringList(query) { - var searcher = createSearcher(query, this.options); - var records = this._myIndex.records; - var results = []; // Iterate over every string in the index - - records.forEach(function (_ref2) { - var text = _ref2.v, - idx = _ref2.i, - norm = _ref2.n; - - if (!isDefined(text)) { - return; - } - - var _searcher$searchIn = searcher.searchIn(text), - isMatch = _searcher$searchIn.isMatch, - score = _searcher$searchIn.score, - indices = _searcher$searchIn.indices; - - if (isMatch) { - results.push({ - item: text, - idx: idx, - matches: [{ - score: score, - value: text, - norm: norm, - indices: indices - }] - }); - } - }); - return results; - } - }, { - key: "_searchLogical", - value: function _searchLogical(query) { - var _this = this; - - var expression = parse(query, this.options); - - var evaluate = function evaluate(node, item, idx) { - if (!node.children) { - var keyId = node.keyId, - searcher = node.searcher; - - var matches = _this._findMatches({ - key: _this._keyStore.get(keyId), - value: _this._myIndex.getValueForItemAtKeyId(item, keyId), - searcher: searcher - }); - - if (matches && matches.length) { - return [{ - idx: idx, - item: item, - matches: matches - }]; - } - - return []; - } - - var res = []; - - for (var i = 0, len = node.children.length; i < len; i += 1) { - var child = node.children[i]; - var result = evaluate(child, item, idx); - - if (result.length) { - res.push.apply(res, _toConsumableArray(result)); - } else if (node.operator === LogicalOperator.AND) { - return []; - } - } - - return res; - }; - - var records = this._myIndex.records; - var resultMap = {}; - var results = []; - records.forEach(function (_ref3) { - var item = _ref3.$, - idx = _ref3.i; - - if (isDefined(item)) { - var expResults = evaluate(expression, item, idx); - - if (expResults.length) { - // Dedupe when adding - if (!resultMap[idx]) { - resultMap[idx] = { - idx: idx, - item: item, - matches: [] - }; - results.push(resultMap[idx]); - } - - expResults.forEach(function (_ref4) { - var _resultMap$idx$matche; - - var matches = _ref4.matches; - - (_resultMap$idx$matche = resultMap[idx].matches).push.apply(_resultMap$idx$matche, _toConsumableArray(matches)); - }); - } - } - }); - return results; - } - }, { - key: "_searchObjectList", - value: function _searchObjectList(query, searchKeys) { - var _this2 = this; - - var searcher = createSearcher(query, this.options); - var _this$_myIndex = this._myIndex, - keys = _this$_myIndex.keys, - records = _this$_myIndex.records; - var results = []; // List is Array - - records.forEach(function (_ref5) { - var item = _ref5.$, - idx = _ref5.i; - - if (!isDefined(item)) { - return; - } - - var matches = []; // Iterate over every key (i.e, path), and fetch the value at that key - - keys.forEach(function (key, keyIndex) { - if (searchKeys.length > 0 && !searchKeys.includes(key.id)) return; - matches.push.apply(matches, _toConsumableArray(_this2._findMatches({ - key: key, - value: item[keyIndex], - searcher: searcher - }))); - }); - - if (matches.length) { - results.push({ - idx: idx, - item: item, - matches: matches - }); - } - }); - return results; - } - }, { - key: "_findMatches", - value: function _findMatches(_ref6) { - var key = _ref6.key, - value = _ref6.value, - searcher = _ref6.searcher; - - if (!isDefined(value)) { - return []; - } - - var matches = []; - - if (isArray(value)) { - value.forEach(function (_ref7) { - var text = _ref7.v, - idx = _ref7.i, - norm = _ref7.n; - - if (!isDefined(text)) { - return; - } - - var _searcher$searchIn2 = searcher.searchIn(text), - isMatch = _searcher$searchIn2.isMatch, - score = _searcher$searchIn2.score, - indices = _searcher$searchIn2.indices; - - if (isMatch) { - matches.push({ - score: score, - key: key, - value: text, - idx: idx, - norm: norm, - indices: indices - }); - } - }); - } else { - var text = value.v, - norm = value.n; - - var _searcher$searchIn3 = searcher.searchIn(text), - isMatch = _searcher$searchIn3.isMatch, - score = _searcher$searchIn3.score, - indices = _searcher$searchIn3.indices; - - if (isMatch) { - matches.push({ - score: score, - key: key, - value: text, - norm: norm, - indices: indices - }); - } - } - - return matches; - } - }]); - - return Fuse; -}(); - -Fuse$1.version = '6.6.2-beta.7'; -Fuse$1.createIndex = createIndex; -Fuse$1.parseIndex = parseIndex; -Fuse$1.config = Config; - -{ - Fuse$1.parseQuery = parse; -} - -{ - register(ExtendedSearch); -} - -var Fuse = Fuse$1; - -module.exports = Fuse; diff --git a/dist/fuse.d.ts b/dist/fuse.d.ts deleted file mode 100644 index 1ea4bff96..000000000 --- a/dist/fuse.d.ts +++ /dev/null @@ -1,329 +0,0 @@ -// Type definitions for Fuse.js v6.6.2-beta.7 -// TypeScript v4.5.4 - -export default Fuse -export as namespace Fuse - -declare class Fuse { - constructor( - list: ReadonlyArray, - options?: Fuse.IFuseOptions, - index?: Fuse.FuseIndex - ) - /** - * Search function for the Fuse instance. - * - * ```typescript - * const list: MyType[] = [myType1, myType2, etc...] - - * const options: Fuse.IFuseOptions = { - * keys: ['key1', 'key2'] - * } - * - * const myFuse = new Fuse(list, options) - * let result = myFuse.search('pattern') - * ``` - * - * @param pattern The pattern to search - * @param options `Fuse.FuseSearchOptions` - * @returns An array of search results - */ - search( - pattern: string | Fuse.Expression, - options?: Fuse.FuseSearchOptions - ): Fuse.FuseResult[] - - setCollection(docs: ReadonlyArray, index?: Fuse.FuseIndex): void - - /** - * Adds a doc to the end the list. - */ - add(doc: T): void - - /** - * Removes all documents from the list which the predicate returns truthy for, - * and returns an array of the removed docs. - * The predicate is invoked with two arguments: (doc, index). - */ - remove(predicate: (doc: T, idx: number) => boolean): T[] - - /** - * Removes the doc at the specified index. - */ - removeAt(idx: number): void - - /** - * Returns the generated Fuse index - */ - getIndex(): Fuse.FuseIndex - - /** - * Return the current version. - */ - static version: string - - /** - * Use this method to pre-generate the index from the list, and pass it - * directly into the Fuse instance. - * - * _Note that Fuse will automatically index the table if one isn't provided - * during instantiation._ - * - * ```typescript - * const list: MyType[] = [myType1, myType2, etc...] - * - * const index = Fuse.createIndex( - * keys: ['key1', 'key2'] - * list: list - * ) - * - * const options: Fuse.IFuseOptions = { - * keys: ['key1', 'key2'] - * } - * - * const myFuse = new Fuse(list, options, index) - * ``` - * @param keys The keys to index - * @param list The list from which to create an index - * @param options? - * @returns An indexed list - */ - static createIndex( - keys: Array>, - list: ReadonlyArray, - options?: Fuse.FuseIndexOptions - ): Fuse.FuseIndex - - static parseIndex( - index: any, - options?: Fuse.FuseIndexOptions - ): Fuse.FuseIndex -} - -declare namespace Fuse { - export class FuseIndex { - constructor(options?: FuseIndexOptions) - setSources(docs: ReadonlyArray): void - setKeys(keys: ReadonlyArray): void - setIndexRecords(records: FuseIndexRecords): void - create(): void - add(doc: T): void - toJSON(): { - keys: ReadonlyArray - records: FuseIndexRecords - } - } - - type FuseGetFunction = ( - obj: T, - path: string | string[] - ) => ReadonlyArray | string - - export type FuseIndexOptions = { - getFn: FuseGetFunction - } - - // { - // title: { '$': "Old Man's War" }, - // 'author.firstName': { '$': 'Codenar' } - // } - // - // OR - // - // { - // tags: [ - // { $: 'nonfiction', idx: 0 }, - // { $: 'web development', idx: 1 }, - // ] - // } - export type FuseSortFunctionItem = { - [key: string]: { $: string } | { $: string; idx: number }[] - } - - // { - // score: 0.001, - // key: 'author.firstName', - // value: 'Codenar', - // indices: [ [ 0, 3 ] ] - // } - export type FuseSortFunctionMatch = { - score: number - key: string - value: string - indices: ReadonlyArray[] - } - - // { - // score: 0, - // key: 'tags', - // value: 'nonfiction', - // idx: 1, - // indices: [ [ 0, 9 ] ] - // } - export type FuseSortFunctionMatchList = FuseSortFunctionMatch & { - idx: number - } - - export type FuseSortFunctionArg = { - idx: number - item: FuseSortFunctionItem - score: number - matches?: (FuseSortFunctionMatch | FuseSortFunctionMatchList)[] - } - - export type FuseSortFunction = ( - a: FuseSortFunctionArg, - b: FuseSortFunctionArg - ) => number - - // title: { - // '$': "Old Man's War", - // 'n': 0.5773502691896258 - // } - type RecordEntryObject = { - /** The text value */ - v: string - /** The field-length norm */ - n: number - } - - // 'author.tags.name': [{ - // 'v': 'pizza lover', - // 'i': 2, - // 'n: 0.7071067811865475 - // } - type RecordEntryArrayItem = ReadonlyArray - - // TODO: this makes it difficult to infer the type. Need to think more about this - type RecordEntry = { [key: string]: RecordEntryObject | RecordEntryArrayItem } - - // { - // i: 0, - // '$': { - // '0': { v: "Old Man's War", n: 0.5773502691896258 }, - // '1': { v: 'Codenar', n: 1 }, - // '2': [ - // { v: 'pizza lover', i: 2, n: 0.7071067811865475 }, - // { v: 'helo wold', i: 1, n: 0.7071067811865475 }, - // { v: 'hello world', i: 0, n: 0.7071067811865475 } - // ] - // } - // } - type FuseIndexObjectRecord = { - /** The index of the record in the source list */ - i: number - $: RecordEntry - } - - // { - // keys: null, - // list: [ - // { v: 'one', i: 0, n: 1 }, - // { v: 'two', i: 1, n: 1 }, - // { v: 'three', i: 2, n: 1 } - // ] - // } - type FuseIndexStringRecord = { - /** The index of the record in the source list */ - i: number - /** The text value */ - v: string - /** The field-length norm */ - n: number - } - - type FuseIndexRecords = - | ReadonlyArray - | ReadonlyArray - - // { - // name: 'title', - // weight: 0.7 - // } - export type FuseOptionKeyObject = { - name: string | string[] - weight?: number - getFn?: (obj: T) => ReadonlyArray | string - } - - export type FuseOptionKey = FuseOptionKeyObject | string | string[] - - export interface IFuseOptions { - /** Indicates whether comparisons should be case sensitive. */ - isCaseSensitive?: boolean - /** Determines how close the match must be to the fuzzy location (specified by `location`). An exact letter match which is `distance` characters away from the fuzzy location would score as a complete mismatch. A `distance` of `0` requires the match be at the exact `location` specified. A distance of `1000` would require a perfect match to be within `800` characters of the `location` to be found using a `threshold` of `0.8`. */ - distance?: number - /** When true, the matching function will continue to the end of a search pattern even if a perfect match has already been located in the string. */ - findAllMatches?: boolean - /** The function to use to retrieve an object's value at the provided path. The default will also search nested paths. */ - getFn?: FuseGetFunction - /** When `true`, search will ignore `location` and `distance`, so it won't matter where in the string the pattern appears. */ - ignoreLocation?: boolean - /** When `true`, the calculation for the relevance score (used for sorting) will ignore the `field-length norm`. */ - ignoreFieldNorm?: boolean - /** Determines how much the `field-length norm` affects scoring. A value of `0` is equivalent to ignoring the field-length norm. A value of `0.5` will greatly reduce the effect of field-length norm, while a value of `2.0` will greatly increase it. */ - fieldNormWeight?: number - /** Whether the matches should be included in the result set. When `true`, each record in the result set will include the indices of the matched characters. These can consequently be used for highlighting purposes. */ - includeMatches?: boolean - /** Whether the score should be included in the result set. A score of `0`indicates a perfect match, while a score of `1` indicates a complete mismatch. */ - includeScore?: boolean - /** List of keys that will be searched. This supports nested paths, weighted search, searching in arrays of `strings` and `objects`. */ - keys?: Array> - /** Determines approximately where in the text is the pattern expected to be found. */ - location?: number - /** Only the matches whose length exceeds this value will be returned. (For instance, if you want to ignore single character matches in the result, set it to `2`). */ - minMatchCharLength?: number - /** Whether to sort the result list, by score. */ - shouldSort?: boolean - /** The function to use to sort all the results. The default will sort by ascending relevance score, ascending index. */ - sortFn?: FuseSortFunction - /** At what point does the match algorithm give up. A threshold of `0.0` requires a perfect match (of both letters and location), a threshold of `1.0` would match anything. */ - threshold?: number - /** When `true`, it enables the use of unix-like search commands. See [example](/examples.html#extended-search). */ - useExtendedSearch?: boolean - } - - /** - * Denotes the start/end indices of a match - * - * @example - * - * ```ts - * const startIndex = 0; - * const endIndex = 5; - * - * const range: RangeTuple = [startIndex, endIndex]; - * ``` - */ - type RangeTuple = [number, number] - - export type FuseResultMatch = { - indices: ReadonlyArray - key?: string - refIndex?: number - value?: string - } - - export type FuseSearchOptions = { - limit?: number - keys?: string[] - } - - export type FuseResult = { - item: T - refIndex: number - score?: number - matches?: ReadonlyArray - } - - export type Expression = - | { [key: string]: string } - | { - $path: ReadonlyArray - $val: string - } - | { $and?: Expression[] } - | { $or?: Expression[] } - - export const config: Required> -} diff --git a/dist/fuse.esm.js b/dist/fuse.esm.js deleted file mode 100644 index d5a3dbaba..000000000 --- a/dist/fuse.esm.js +++ /dev/null @@ -1,1779 +0,0 @@ -/** - * Fuse.js v6.6.2-beta.7 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2022 Kiro Risk (http://kiro.me) - * All Rights Reserved. Apache Software License 2.0 - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -function isArray(value) { - return !Array.isArray - ? getTag(value) === '[object Array]' - : Array.isArray(value) -} - -// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js -const INFINITY = 1 / 0; -function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value - } - let result = value + ''; - return result == '0' && 1 / value == -INFINITY ? '-0' : result -} - -function toString(value) { - return value == null ? '' : baseToString(value) -} - -function isString(value) { - return typeof value === 'string' -} - -function isNumber(value) { - return typeof value === 'number' -} - -// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js -function isBoolean(value) { - return ( - value === true || - value === false || - (isObjectLike(value) && getTag(value) == '[object Boolean]') - ) -} - -function isObject(value) { - return typeof value === 'object' -} - -// Checks if `value` is object-like. -function isObjectLike(value) { - return isObject(value) && value !== null -} - -function isDefined(value) { - return value !== undefined && value !== null -} - -function isBlank(value) { - return !value.trim().length -} - -// Gets the `toStringTag` of `value`. -// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js -function getTag(value) { - return value == null - ? value === undefined - ? '[object Undefined]' - : '[object Null]' - : Object.prototype.toString.call(value) -} - -const EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available'; - -const INCORRECT_INDEX_TYPE = "Incorrect 'index' type"; - -const LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) => - `Invalid value for key ${key}`; - -const PATTERN_LENGTH_TOO_LARGE = (max) => - `Pattern length exceeds max of ${max}.`; - -const MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`; - -const INVALID_KEY_WEIGHT_VALUE = (key) => - `Property 'weight' in key '${key}' must be a positive integer`; - -const hasOwn = Object.prototype.hasOwnProperty; - -class KeyStore { - constructor(keys) { - this._keys = []; - this._keyMap = {}; - - let totalWeight = 0; - - keys.forEach((key) => { - let obj = createKey(key); - - this._keys.push(obj); - this._keyMap[obj.id] = obj; - - totalWeight += obj.weight; - }); - - // Normalize weights so that their sum is equal to 1 - this._keys.forEach((key) => { - key.weight /= totalWeight; - }); - } - get(keyId) { - return this._keyMap[keyId] - } - keys() { - return this._keys - } - toJSON() { - return JSON.stringify(this._keys) - } -} - -function createKey(key) { - let path = null; - let id = null; - let src = null; - let weight = 1; - let getFn = null; - - if (isString(key) || isArray(key)) { - src = key; - path = createKeyPath(key); - id = createKeyId(key); - } else { - if (!hasOwn.call(key, 'name')) { - throw new Error(MISSING_KEY_PROPERTY('name')) - } - - const name = key.name; - src = name; - - if (hasOwn.call(key, 'weight')) { - weight = key.weight; - - if (weight <= 0) { - throw new Error(INVALID_KEY_WEIGHT_VALUE(name)) - } - } - - path = createKeyPath(name); - id = createKeyId(name); - getFn = key.getFn; - } - - return { path, id, weight, src, getFn } -} - -function createKeyPath(key) { - return isArray(key) ? key : key.split('.') -} - -function createKeyId(key) { - return isArray(key) ? key.join('.') : key -} - -function get(obj, path) { - let list = []; - let arr = false; - - const deepGet = (obj, path, index) => { - if (!isDefined(obj)) { - return - } - if (!path[index]) { - // If there's no path left, we've arrived at the object we care about. - list.push(obj); - } else { - let key = path[index]; - - const value = obj[key]; - - if (!isDefined(value)) { - return - } - - // If we're at the last value in the path, and if it's a string/number/bool, - // add it to the list - if ( - index === path.length - 1 && - (isString(value) || isNumber(value) || isBoolean(value)) - ) { - list.push(toString(value)); - } else if (isArray(value)) { - arr = true; - // Search each item in the array. - for (let i = 0, len = value.length; i < len; i += 1) { - deepGet(value[i], path, index + 1); - } - } else if (path.length) { - // An object. Recurse further. - deepGet(value, path, index + 1); - } - } - }; - - // Backwards compatibility (since path used to be a string) - deepGet(obj, isString(path) ? path.split('.') : path, 0); - - return arr ? list : list[0] -} - -const MatchOptions = { - // Whether the matches should be included in the result set. When `true`, each record in the result - // set will include the indices of the matched characters. - // These can consequently be used for highlighting purposes. - includeMatches: false, - // When `true`, the matching function will continue to the end of a search pattern even if - // a perfect match has already been located in the string. - findAllMatches: false, - // Minimum number of characters that must be matched before a result is considered a match - minMatchCharLength: 1 -}; - -const BasicOptions = { - // When `true`, the algorithm continues searching to the end of the input even if a perfect - // match is found before the end of the same input. - isCaseSensitive: false, - // When true, the matching function will continue to the end of a search pattern even if - includeScore: false, - // List of properties that will be searched. This also supports nested properties. - keys: [], - // Whether to sort the result list, by score - shouldSort: true, - // Default sort function: sort by ascending score, ascending index - sortFn: (a, b) => - a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1 -}; - -const FuzzyOptions = { - // Approximately where in the text is the pattern expected to be found? - location: 0, - // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match - // (of both letters and location), a threshold of '1.0' would match anything. - threshold: 0.6, - // Determines how close the match must be to the fuzzy location (specified above). - // An exact letter match which is 'distance' characters away from the fuzzy location - // would score as a complete mismatch. A distance of '0' requires the match be at - // the exact location specified, a threshold of '1000' would require a perfect match - // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold. - distance: 100 -}; - -const AdvancedOptions = { - // When `true`, it enables the use of unix-like search commands - useExtendedSearch: false, - // The get function to use when fetching an object's properties. - // The default will search nested paths *ie foo.bar.baz* - getFn: get, - // When `true`, search will ignore `location` and `distance`, so it won't matter - // where in the string the pattern appears. - // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score - ignoreLocation: false, - // When `true`, the calculation for the relevance score (used for sorting) will - // ignore the field-length norm. - // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm - ignoreFieldNorm: false, - // The weight to determine how much field length norm effects scoring. - fieldNormWeight: 1 -}; - -var Config = { - ...BasicOptions, - ...MatchOptions, - ...FuzzyOptions, - ...AdvancedOptions -}; - -const SPACE = /[^ ]+/g; - -// Field-length norm: the shorter the field, the higher the weight. -// Set to 3 decimals to reduce index size. -function norm(weight = 1, mantissa = 3) { - const cache = new Map(); - const m = Math.pow(10, mantissa); - - return { - get(value) { - const numTokens = value.match(SPACE).length; - - if (cache.has(numTokens)) { - return cache.get(numTokens) - } - - // Default function is 1/sqrt(x), weight makes that variable - const norm = 1 / Math.pow(numTokens, 0.5 * weight); - - // In place of `toFixed(mantissa)`, for faster computation - const n = parseFloat(Math.round(norm * m) / m); - - cache.set(numTokens, n); - - return n - }, - clear() { - cache.clear(); - } - } -} - -class FuseIndex { - constructor({ - getFn = Config.getFn, - fieldNormWeight = Config.fieldNormWeight - } = {}) { - this.norm = norm(fieldNormWeight, 3); - this.getFn = getFn; - this.isCreated = false; - - this.setIndexRecords(); - } - setSources(docs = []) { - this.docs = docs; - } - setIndexRecords(records = []) { - this.records = records; - } - setKeys(keys = []) { - this.keys = keys; - this._keysMap = {}; - keys.forEach((key, idx) => { - this._keysMap[key.id] = idx; - }); - } - create() { - if (this.isCreated || !this.docs.length) { - return - } - - this.isCreated = true; - - // List is Array - if (isString(this.docs[0])) { - this.docs.forEach((doc, docIndex) => { - this._addString(doc, docIndex); - }); - } else { - // List is Array - this.docs.forEach((doc, docIndex) => { - this._addObject(doc, docIndex); - }); - } - - this.norm.clear(); - } - // Adds a doc to the end of the index - add(doc) { - const idx = this.size(); - - if (isString(doc)) { - this._addString(doc, idx); - } else { - this._addObject(doc, idx); - } - } - // Removes the doc at the specified index of the index - removeAt(idx) { - this.records.splice(idx, 1); - - // Change ref index of every subsquent doc - for (let i = idx, len = this.size(); i < len; i += 1) { - this.records[i].i -= 1; - } - } - getValueForItemAtKeyId(item, keyId) { - return item[this._keysMap[keyId]] - } - size() { - return this.records.length - } - _addString(doc, docIndex) { - if (!isDefined(doc) || isBlank(doc)) { - return - } - - let record = { - v: doc, - i: docIndex, - n: this.norm.get(doc) - }; - - this.records.push(record); - } - _addObject(doc, docIndex) { - let record = { i: docIndex, $: {} }; - - // Iterate over every key (i.e, path), and fetch the value at that key - this.keys.forEach((key, keyIndex) => { - let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path); - - if (!isDefined(value)) { - return - } - - if (isArray(value)) { - let subRecords = []; - const stack = [{ nestedArrIndex: -1, value }]; - - while (stack.length) { - const { nestedArrIndex, value } = stack.pop(); - - if (!isDefined(value)) { - continue - } - - if (isString(value) && !isBlank(value)) { - let subRecord = { - v: value, - i: nestedArrIndex, - n: this.norm.get(value) - }; - - subRecords.push(subRecord); - } else if (isArray(value)) { - value.forEach((item, k) => { - stack.push({ - nestedArrIndex: k, - value: item - }); - }); - } else ; - } - record.$[keyIndex] = subRecords; - } else if (isString(value) && !isBlank(value)) { - let subRecord = { - v: value, - n: this.norm.get(value) - }; - - record.$[keyIndex] = subRecord; - } - }); - - this.records.push(record); - } - toJSON() { - return { - keys: this.keys, - records: this.records - } - } -} - -function createIndex( - keys, - docs, - { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {} -) { - const myIndex = new FuseIndex({ getFn, fieldNormWeight }); - myIndex.setKeys(keys.map(createKey)); - myIndex.setSources(docs); - myIndex.create(); - return myIndex -} - -function parseIndex( - data, - { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {} -) { - const { keys, records } = data; - const myIndex = new FuseIndex({ getFn, fieldNormWeight }); - myIndex.setKeys(keys); - myIndex.setIndexRecords(records); - return myIndex -} - -function computeScore$1( - pattern, - { - errors = 0, - currentLocation = 0, - expectedLocation = 0, - distance = Config.distance, - ignoreLocation = Config.ignoreLocation - } = {} -) { - const accuracy = errors / pattern.length; - - if (ignoreLocation) { - return accuracy - } - - const proximity = Math.abs(expectedLocation - currentLocation); - - if (!distance) { - // Dodge divide by zero error. - return proximity ? 1.0 : accuracy - } - - return accuracy + proximity / distance -} - -function convertMaskToIndices( - matchmask = [], - minMatchCharLength = Config.minMatchCharLength -) { - let indices = []; - let start = -1; - let end = -1; - let i = 0; - - for (let len = matchmask.length; i < len; i += 1) { - let match = matchmask[i]; - if (match && start === -1) { - start = i; - } else if (!match && start !== -1) { - end = i - 1; - if (end - start + 1 >= minMatchCharLength) { - indices.push([start, end]); - } - start = -1; - } - } - - // (i-1 - start) + 1 => i - start - if (matchmask[i - 1] && i - start >= minMatchCharLength) { - indices.push([start, i - 1]); - } - - return indices -} - -// Machine word size -const MAX_BITS = 32; - -function search( - text, - pattern, - patternAlphabet, - { - location = Config.location, - distance = Config.distance, - threshold = Config.threshold, - findAllMatches = Config.findAllMatches, - minMatchCharLength = Config.minMatchCharLength, - includeMatches = Config.includeMatches, - ignoreLocation = Config.ignoreLocation - } = {} -) { - if (pattern.length > MAX_BITS) { - throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS)) - } - - const patternLen = pattern.length; - // Set starting location at beginning text and initialize the alphabet. - const textLen = text.length; - // Handle the case when location > text.length - const expectedLocation = Math.max(0, Math.min(location, textLen)); - // Highest score beyond which we give up. - let currentThreshold = threshold; - // Is there a nearby exact match? (speedup) - let bestLocation = expectedLocation; - - // Performance: only computer matches when the minMatchCharLength > 1 - // OR if `includeMatches` is true. - const computeMatches = minMatchCharLength > 1 || includeMatches; - // A mask of the matches, used for building the indices - const matchMask = computeMatches ? Array(textLen) : []; - - let index; - - // Get all exact matches, here for speed up - while ((index = text.indexOf(pattern, bestLocation)) > -1) { - let score = computeScore$1(pattern, { - currentLocation: index, - expectedLocation, - distance, - ignoreLocation - }); - - currentThreshold = Math.min(score, currentThreshold); - bestLocation = index + patternLen; - - if (computeMatches) { - let i = 0; - while (i < patternLen) { - matchMask[index + i] = 1; - i += 1; - } - } - } - - // Reset the best location - bestLocation = -1; - - let lastBitArr = []; - let finalScore = 1; - let binMax = patternLen + textLen; - - const mask = 1 << (patternLen - 1); - - for (let i = 0; i < patternLen; i += 1) { - // Scan for the best match; each iteration allows for one more error. - // Run a binary search to determine how far from the match location we can stray - // at this error level. - let binMin = 0; - let binMid = binMax; - - while (binMin < binMid) { - const score = computeScore$1(pattern, { - errors: i, - currentLocation: expectedLocation + binMid, - expectedLocation, - distance, - ignoreLocation - }); - - if (score <= currentThreshold) { - binMin = binMid; - } else { - binMax = binMid; - } - - binMid = Math.floor((binMax - binMin) / 2 + binMin); - } - - // Use the result from this iteration as the maximum for the next. - binMax = binMid; - - let start = Math.max(1, expectedLocation - binMid + 1); - let finish = findAllMatches - ? textLen - : Math.min(expectedLocation + binMid, textLen) + patternLen; - - // Initialize the bit array - let bitArr = Array(finish + 2); - - bitArr[finish + 1] = (1 << i) - 1; - - for (let j = finish; j >= start; j -= 1) { - let currentLocation = j - 1; - let charMatch = patternAlphabet[text.charAt(currentLocation)]; - - if (computeMatches) { - // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`) - matchMask[currentLocation] = +!!charMatch; - } - - // First pass: exact match - bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch; - - // Subsequent passes: fuzzy match - if (i) { - bitArr[j] |= - ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1]; - } - - if (bitArr[j] & mask) { - finalScore = computeScore$1(pattern, { - errors: i, - currentLocation, - expectedLocation, - distance, - ignoreLocation - }); - - // This match will almost certainly be better than any existing match. - // But check anyway. - if (finalScore <= currentThreshold) { - // Indeed it is - currentThreshold = finalScore; - bestLocation = currentLocation; - - // Already passed `loc`, downhill from here on in. - if (bestLocation <= expectedLocation) { - break - } - - // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`. - start = Math.max(1, 2 * expectedLocation - bestLocation); - } - } - } - - // No hope for a (better) match at greater error levels. - const score = computeScore$1(pattern, { - errors: i + 1, - currentLocation: expectedLocation, - expectedLocation, - distance, - ignoreLocation - }); - - if (score > currentThreshold) { - break - } - - lastBitArr = bitArr; - } - - const result = { - isMatch: bestLocation >= 0, - // Count exact matches (those with a score of 0) to be "almost" exact - score: Math.max(0.001, finalScore) - }; - - if (computeMatches) { - const indices = convertMaskToIndices(matchMask, minMatchCharLength); - if (!indices.length) { - result.isMatch = false; - } else if (includeMatches) { - result.indices = indices; - } - } - - return result -} - -function createPatternAlphabet(pattern) { - let mask = {}; - - for (let i = 0, len = pattern.length; i < len; i += 1) { - const char = pattern.charAt(i); - mask[char] = (mask[char] || 0) | (1 << (len - i - 1)); - } - - return mask -} - -class BitapSearch { - constructor( - pattern, - { - location = Config.location, - threshold = Config.threshold, - distance = Config.distance, - includeMatches = Config.includeMatches, - findAllMatches = Config.findAllMatches, - minMatchCharLength = Config.minMatchCharLength, - isCaseSensitive = Config.isCaseSensitive, - ignoreLocation = Config.ignoreLocation - } = {} - ) { - this.options = { - location, - threshold, - distance, - includeMatches, - findAllMatches, - minMatchCharLength, - isCaseSensitive, - ignoreLocation - }; - - this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); - - this.chunks = []; - - if (!this.pattern.length) { - return - } - - const addChunk = (pattern, startIndex) => { - this.chunks.push({ - pattern, - alphabet: createPatternAlphabet(pattern), - startIndex - }); - }; - - const len = this.pattern.length; - - if (len > MAX_BITS) { - let i = 0; - const remainder = len % MAX_BITS; - const end = len - remainder; - - while (i < end) { - addChunk(this.pattern.substr(i, MAX_BITS), i); - i += MAX_BITS; - } - - if (remainder) { - const startIndex = len - MAX_BITS; - addChunk(this.pattern.substr(startIndex), startIndex); - } - } else { - addChunk(this.pattern, 0); - } - } - - searchIn(text) { - const { isCaseSensitive, includeMatches } = this.options; - - if (!isCaseSensitive) { - text = text.toLowerCase(); - } - - // Exact match - if (this.pattern === text) { - let result = { - isMatch: true, - score: 0 - }; - - if (includeMatches) { - result.indices = [[0, text.length - 1]]; - } - - return result - } - - // Otherwise, use Bitap algorithm - const { - location, - distance, - threshold, - findAllMatches, - minMatchCharLength, - ignoreLocation - } = this.options; - - let allIndices = []; - let totalScore = 0; - let hasMatches = false; - - this.chunks.forEach(({ pattern, alphabet, startIndex }) => { - const { isMatch, score, indices } = search(text, pattern, alphabet, { - location: location + startIndex, - distance, - threshold, - findAllMatches, - minMatchCharLength, - includeMatches, - ignoreLocation - }); - - if (isMatch) { - hasMatches = true; - } - - totalScore += score; - - if (isMatch && indices) { - allIndices = [...allIndices, ...indices]; - } - }); - - let result = { - isMatch: hasMatches, - score: hasMatches ? totalScore / this.chunks.length : 1 - }; - - if (hasMatches && includeMatches) { - result.indices = allIndices; - } - - return result - } -} - -class BaseMatch { - constructor(pattern) { - this.pattern = pattern; - } - static isMultiMatch(pattern) { - return getMatch(pattern, this.multiRegex) - } - static isSingleMatch(pattern) { - return getMatch(pattern, this.singleRegex) - } - search(/*text*/) {} -} - -function getMatch(pattern, exp) { - const matches = pattern.match(exp); - return matches ? matches[1] : null -} - -// Token: 'file - -class ExactMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'exact' - } - static get multiRegex() { - return /^="(.*)"$/ - } - static get singleRegex() { - return /^=(.*)$/ - } - search(text) { - const isMatch = text === this.pattern; - - return { - isMatch, - score: isMatch ? 0 : 1, - indices: [0, this.pattern.length - 1] - } - } -} - -// Token: !fire - -class InverseExactMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'inverse-exact' - } - static get multiRegex() { - return /^!"(.*)"$/ - } - static get singleRegex() { - return /^!(.*)$/ - } - search(text) { - const index = text.indexOf(this.pattern); - const isMatch = index === -1; - - return { - isMatch, - score: isMatch ? 0 : 1, - indices: [0, text.length - 1] - } - } -} - -// Token: ^file - -class PrefixExactMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'prefix-exact' - } - static get multiRegex() { - return /^\^"(.*)"$/ - } - static get singleRegex() { - return /^\^(.*)$/ - } - search(text) { - const isMatch = text.startsWith(this.pattern); - - return { - isMatch, - score: isMatch ? 0 : 1, - indices: [0, this.pattern.length - 1] - } - } -} - -// Token: !^fire - -class InversePrefixExactMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'inverse-prefix-exact' - } - static get multiRegex() { - return /^!\^"(.*)"$/ - } - static get singleRegex() { - return /^!\^(.*)$/ - } - search(text) { - const isMatch = !text.startsWith(this.pattern); - - return { - isMatch, - score: isMatch ? 0 : 1, - indices: [0, text.length - 1] - } - } -} - -// Token: .file$ - -class SuffixExactMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'suffix-exact' - } - static get multiRegex() { - return /^"(.*)"\$$/ - } - static get singleRegex() { - return /^(.*)\$$/ - } - search(text) { - const isMatch = text.endsWith(this.pattern); - - return { - isMatch, - score: isMatch ? 0 : 1, - indices: [text.length - this.pattern.length, text.length - 1] - } - } -} - -// Token: !.file$ - -class InverseSuffixExactMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'inverse-suffix-exact' - } - static get multiRegex() { - return /^!"(.*)"\$$/ - } - static get singleRegex() { - return /^!(.*)\$$/ - } - search(text) { - const isMatch = !text.endsWith(this.pattern); - return { - isMatch, - score: isMatch ? 0 : 1, - indices: [0, text.length - 1] - } - } -} - -class FuzzyMatch extends BaseMatch { - constructor( - pattern, - { - location = Config.location, - threshold = Config.threshold, - distance = Config.distance, - includeMatches = Config.includeMatches, - findAllMatches = Config.findAllMatches, - minMatchCharLength = Config.minMatchCharLength, - isCaseSensitive = Config.isCaseSensitive, - ignoreLocation = Config.ignoreLocation - } = {} - ) { - super(pattern); - this._bitapSearch = new BitapSearch(pattern, { - location, - threshold, - distance, - includeMatches, - findAllMatches, - minMatchCharLength, - isCaseSensitive, - ignoreLocation - }); - } - static get type() { - return 'fuzzy' - } - static get multiRegex() { - return /^"(.*)"$/ - } - static get singleRegex() { - return /^(.*)$/ - } - search(text) { - return this._bitapSearch.searchIn(text) - } -} - -// Token: 'file - -class IncludeMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'include' - } - static get multiRegex() { - return /^'"(.*)"$/ - } - static get singleRegex() { - return /^'(.*)$/ - } - search(text) { - let location = 0; - let index; - - const indices = []; - const patternLen = this.pattern.length; - - // Get all exact matches - while ((index = text.indexOf(this.pattern, location)) > -1) { - location = index + patternLen; - indices.push([index, location - 1]); - } - - const isMatch = !!indices.length; - - return { - isMatch, - score: isMatch ? 0 : 1, - indices - } - } -} - -// ❗Order is important. DO NOT CHANGE. -const searchers = [ - ExactMatch, - IncludeMatch, - PrefixExactMatch, - InversePrefixExactMatch, - InverseSuffixExactMatch, - SuffixExactMatch, - InverseExactMatch, - FuzzyMatch -]; - -const searchersLen = searchers.length; - -// Regex to split by spaces, but keep anything in quotes together -const SPACE_RE = / +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/; -const OR_TOKEN = '|'; - -// Return a 2D array representation of the query, for simpler parsing. -// Example: -// "^core go$ | rb$ | py$ xy$" => [["^core", "go$"], ["rb$"], ["py$", "xy$"]] -function parseQuery(pattern, options = {}) { - return pattern.split(OR_TOKEN).map((item) => { - let query = item - .trim() - .split(SPACE_RE) - .filter((item) => item && !!item.trim()); - - let results = []; - for (let i = 0, len = query.length; i < len; i += 1) { - const queryItem = query[i]; - - // 1. Handle multiple query match (i.e, once that are quoted, like `"hello world"`) - let found = false; - let idx = -1; - while (!found && ++idx < searchersLen) { - const searcher = searchers[idx]; - let token = searcher.isMultiMatch(queryItem); - if (token) { - results.push(new searcher(token, options)); - found = true; - } - } - - if (found) { - continue - } - - // 2. Handle single query matches (i.e, once that are *not* quoted) - idx = -1; - while (++idx < searchersLen) { - const searcher = searchers[idx]; - let token = searcher.isSingleMatch(queryItem); - if (token) { - results.push(new searcher(token, options)); - break - } - } - } - - return results - }) -} - -// These extended matchers can return an array of matches, as opposed -// to a singl match -const MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]); - -/** - * Command-like searching - * ====================== - * - * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`, - * search in a given text. - * - * Search syntax: - * - * | Token | Match type | Description | - * | ----------- | -------------------------- | -------------------------------------- | - * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` | - * | `=scheme` | exact-match | Items that are `scheme` | - * | `'python` | include-match | Items that include `python` | - * | `!ruby` | inverse-exact-match | Items that do not include `ruby` | - * | `^java` | prefix-exact-match | Items that start with `java` | - * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` | - * | `.js$` | suffix-exact-match | Items that end with `.js` | - * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` | - * - * A single pipe character acts as an OR operator. For example, the following - * query matches entries that start with `core` and end with either`go`, `rb`, - * or`py`. - * - * ``` - * ^core go$ | rb$ | py$ - * ``` - */ -class ExtendedSearch { - constructor( - pattern, - { - isCaseSensitive = Config.isCaseSensitive, - includeMatches = Config.includeMatches, - minMatchCharLength = Config.minMatchCharLength, - ignoreLocation = Config.ignoreLocation, - findAllMatches = Config.findAllMatches, - location = Config.location, - threshold = Config.threshold, - distance = Config.distance - } = {} - ) { - this.query = null; - this.options = { - isCaseSensitive, - includeMatches, - minMatchCharLength, - findAllMatches, - ignoreLocation, - location, - threshold, - distance - }; - - this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); - this.query = parseQuery(this.pattern, this.options); - } - - static condition(_, options) { - return options.useExtendedSearch - } - - searchIn(text) { - const query = this.query; - - if (!query) { - return { - isMatch: false, - score: 1 - } - } - - const { includeMatches, isCaseSensitive } = this.options; - - text = isCaseSensitive ? text : text.toLowerCase(); - - let numMatches = 0; - let allIndices = []; - let totalScore = 0; - - // ORs - for (let i = 0, qLen = query.length; i < qLen; i += 1) { - const searchers = query[i]; - - // Reset indices - allIndices.length = 0; - numMatches = 0; - - // ANDs - for (let j = 0, pLen = searchers.length; j < pLen; j += 1) { - const searcher = searchers[j]; - const { isMatch, indices, score } = searcher.search(text); - - if (isMatch) { - numMatches += 1; - totalScore += score; - if (includeMatches) { - const type = searcher.constructor.type; - if (MultiMatchSet.has(type)) { - allIndices = [...allIndices, ...indices]; - } else { - allIndices.push(indices); - } - } - } else { - totalScore = 0; - numMatches = 0; - allIndices.length = 0; - break - } - } - - // OR condition, so if TRUE, return - if (numMatches) { - let result = { - isMatch: true, - score: totalScore / numMatches - }; - - if (includeMatches) { - result.indices = allIndices; - } - - return result - } - } - - // Nothing was matched - return { - isMatch: false, - score: 1 - } - } -} - -const registeredSearchers = []; - -function register(...args) { - registeredSearchers.push(...args); -} - -function createSearcher(pattern, options) { - for (let i = 0, len = registeredSearchers.length; i < len; i += 1) { - let searcherClass = registeredSearchers[i]; - if (searcherClass.condition(pattern, options)) { - return new searcherClass(pattern, options) - } - } - - return new BitapSearch(pattern, options) -} - -const LogicalOperator = { - AND: '$and', - OR: '$or' -}; - -const KeyType = { - PATH: '$path', - PATTERN: '$val' -}; - -const isExpression = (query) => - !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]); - -const isPath = (query) => !!query[KeyType.PATH]; - -const isLeaf = (query) => - !isArray(query) && isObject(query) && !isExpression(query); - -const convertToExplicit = (query) => ({ - [LogicalOperator.AND]: Object.keys(query).map((key) => ({ - [key]: query[key] - })) -}); - -// When `auto` is `true`, the parse function will infer and initialize and add -// the appropriate `Searcher` instance -function parse(query, options, { auto = true } = {}) { - const next = (query) => { - let keys = Object.keys(query); - - const isQueryPath = isPath(query); - - if (!isQueryPath && keys.length > 1 && !isExpression(query)) { - return next(convertToExplicit(query)) - } - - if (isLeaf(query)) { - const key = isQueryPath ? query[KeyType.PATH] : keys[0]; - - const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key]; - - if (!isString(pattern)) { - throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key)) - } - - const obj = { - keyId: createKeyId(key), - pattern - }; - - if (auto) { - obj.searcher = createSearcher(pattern, options); - } - - return obj - } - - let node = { - children: [], - operator: keys[0] - }; - - keys.forEach((key) => { - const value = query[key]; - - if (isArray(value)) { - value.forEach((item) => { - node.children.push(next(item)); - }); - } - }); - - return node - }; - - if (!isExpression(query)) { - query = convertToExplicit(query); - } - - return next(query) -} - -// Practical scoring function -function computeScore( - results, - { ignoreFieldNorm = Config.ignoreFieldNorm } -) { - results.forEach((result) => { - let totalScore = 1; - - result.matches.forEach(({ key, norm, score }) => { - const weight = key ? key.weight : null; - - totalScore *= Math.pow( - score === 0 && weight ? Number.EPSILON : score, - (weight || 1) * (ignoreFieldNorm ? 1 : norm) - ); - }); - - result.score = totalScore; - }); -} - -function transformMatches(result, data) { - const matches = result.matches; - data.matches = []; - - if (!isDefined(matches)) { - return - } - - matches.forEach((match) => { - if (!isDefined(match.indices) || !match.indices.length) { - return - } - - const { indices, value } = match; - - let obj = { - indices, - value - }; - - if (match.key) { - obj.key = match.key.src; - } - - if (match.idx > -1) { - obj.refIndex = match.idx; - } - - data.matches.push(obj); - }); -} - -function transformScore(result, data) { - data.score = result.score; -} - -function format( - results, - docs, - { - includeMatches = Config.includeMatches, - includeScore = Config.includeScore - } = {} -) { - const transformers = []; - - if (includeMatches) transformers.push(transformMatches); - if (includeScore) transformers.push(transformScore); - - return results.map((result) => { - const { idx } = result; - - const data = { - item: docs[idx], - refIndex: idx - }; - - if (transformers.length) { - transformers.forEach((transformer) => { - transformer(result, data); - }); - } - - return data - }) -} - -class Fuse { - constructor(docs, options = {}, index) { - this.options = { ...Config, ...options }; - - if ( - this.options.useExtendedSearch && - !true - ) { - throw new Error(EXTENDED_SEARCH_UNAVAILABLE) - } - - this._keyStore = new KeyStore(this.options.keys); - - this.setCollection(docs, index); - } - - setCollection(docs, index) { - this._docs = docs; - - if (index && !(index instanceof FuseIndex)) { - throw new Error(INCORRECT_INDEX_TYPE) - } - - this._myIndex = - index || - createIndex(this.options.keys, this._docs, { - getFn: this.options.getFn, - fieldNormWeight: this.options.fieldNormWeight - }); - } - - add(doc) { - if (!isDefined(doc)) { - return - } - - this._docs.push(doc); - this._myIndex.add(doc); - } - - remove(predicate = (/* doc, idx */) => false) { - const results = []; - - for (let i = 0, len = this._docs.length; i < len; i += 1) { - const doc = this._docs[i]; - if (predicate(doc, i)) { - this.removeAt(i); - i -= 1; - len -= 1; - - results.push(doc); - } - } - - return results - } - - removeAt(idx) { - this._docs.splice(idx, 1); - this._myIndex.removeAt(idx); - } - - getIndex() { - return this._myIndex - } - - search(query, { limit = -1, keys = [] } = {}) { - const { - includeMatches, - includeScore, - shouldSort, - sortFn, - ignoreFieldNorm - } = this.options; - - let results = isString(query) - ? isString(this._docs[0]) - ? this._searchStringList(query) - : this._searchObjectList(query, keys) - : this._searchLogical(query); - - computeScore(results, { ignoreFieldNorm }); - - if (shouldSort) { - results.sort(sortFn); - } - - if (isNumber(limit) && limit > -1) { - results = results.slice(0, limit); - } - - return format(results, this._docs, { - includeMatches, - includeScore - }) - } - - _searchStringList(query) { - const searcher = createSearcher(query, this.options); - const { records } = this._myIndex; - const results = []; - - // Iterate over every string in the index - records.forEach(({ v: text, i: idx, n: norm }) => { - if (!isDefined(text)) { - return - } - - const { isMatch, score, indices } = searcher.searchIn(text); - - if (isMatch) { - results.push({ - item: text, - idx, - matches: [{ score, value: text, norm, indices }] - }); - } - }); - - return results - } - - _searchLogical(query) { - - const expression = parse(query, this.options); - - const evaluate = (node, item, idx) => { - if (!node.children) { - const { keyId, searcher } = node; - - const matches = this._findMatches({ - key: this._keyStore.get(keyId), - value: this._myIndex.getValueForItemAtKeyId(item, keyId), - searcher - }); - - if (matches && matches.length) { - return [ - { - idx, - item, - matches - } - ] - } - - return [] - } - - const res = []; - for (let i = 0, len = node.children.length; i < len; i += 1) { - const child = node.children[i]; - const result = evaluate(child, item, idx); - if (result.length) { - res.push(...result); - } else if (node.operator === LogicalOperator.AND) { - return [] - } - } - return res - }; - - const records = this._myIndex.records; - const resultMap = {}; - const results = []; - - records.forEach(({ $: item, i: idx }) => { - if (isDefined(item)) { - let expResults = evaluate(expression, item, idx); - - if (expResults.length) { - // Dedupe when adding - if (!resultMap[idx]) { - resultMap[idx] = { idx, item, matches: [] }; - results.push(resultMap[idx]); - } - expResults.forEach(({ matches }) => { - resultMap[idx].matches.push(...matches); - }); - } - } - }); - - return results - } - - _searchObjectList(query, searchKeys) { - const searcher = createSearcher(query, this.options); - const { keys, records } = this._myIndex; - const results = []; - - // List is Array - records.forEach(({ $: item, i: idx }) => { - if (!isDefined(item)) { - return - } - - let matches = []; - - // Iterate over every key (i.e, path), and fetch the value at that key - keys.forEach((key, keyIndex) => { - if (searchKeys.length > 0 && !searchKeys.includes(key.id)) return - matches.push( - ...this._findMatches({ - key, - value: item[keyIndex], - searcher - }) - ); - }); - - if (matches.length) { - results.push({ - idx, - item, - matches - }); - } - }); - - return results - } - _findMatches({ key, value, searcher }) { - if (!isDefined(value)) { - return [] - } - - let matches = []; - - if (isArray(value)) { - value.forEach(({ v: text, i: idx, n: norm }) => { - if (!isDefined(text)) { - return - } - - const { isMatch, score, indices } = searcher.searchIn(text); - - if (isMatch) { - matches.push({ - score, - key, - value: text, - idx, - norm, - indices - }); - } - }); - } else { - const { v: text, n: norm } = value; - - const { isMatch, score, indices } = searcher.searchIn(text); - - if (isMatch) { - matches.push({ score, key, value: text, norm, indices }); - } - } - - return matches - } -} - -Fuse.version = '6.6.2-beta.7'; -Fuse.createIndex = createIndex; -Fuse.parseIndex = parseIndex; -Fuse.config = Config; - -{ - Fuse.parseQuery = parse; -} - -{ - register(ExtendedSearch); -} - -export { Fuse as default }; diff --git a/dist/fuse.esm.min.js b/dist/fuse.esm.min.js deleted file mode 100644 index 6b64aaa88..000000000 --- a/dist/fuse.esm.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Fuse.js v6.6.2-beta.7 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2022 Kiro Risk (http://kiro.me) - * All Rights Reserved. Apache Software License 2.0 - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ -function t(t){return Array.isArray?Array.isArray(t):"[object Array]"===o(t)}function e(t){return"string"==typeof t}function n(t){return"number"==typeof t}function s(t){return!0===t||!1===t||function(t){return i(t)&&null!==t}(t)&&"[object Boolean]"==o(t)}function i(t){return"object"==typeof t}function r(t){return null!=t}function c(t){return!t.trim().length}function o(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":Object.prototype.toString.call(t)}const h=Object.prototype.hasOwnProperty;class a{constructor(t){this._keys=[],this._keyMap={};let e=0;t.forEach((t=>{let n=l(t);this._keys.push(n),this._keyMap[n.id]=n,e+=n.weight})),this._keys.forEach((t=>{t.weight/=e}))}get(t){return this._keyMap[t]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function l(n){let s=null,i=null,r=null,c=1,o=null;if(e(n)||t(n))r=n,s=u(n),i=d(n);else{if(!h.call(n,"name"))throw new Error((t=>`Missing ${t} property in key`)("name"));const t=n.name;if(r=t,h.call(n,"weight")&&(c=n.weight,c<=0))throw new Error((t=>`Property 'weight' in key '${t}' must be a positive integer`)(t));s=u(t),i=d(t),o=n.getFn}return{path:s,id:i,weight:c,src:r,getFn:o}}function u(e){return t(e)?e:e.split(".")}function d(e){return t(e)?e.join("."):e}var g={isCaseSensitive:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(t,e)=>t.score===e.score?t.idx{if(r(i))if(c[l]){const u=i[c[l]];if(!r(u))return;if(l===c.length-1&&(e(u)||n(u)||s(u)))o.push(function(t){return null==t?"":function(t){if("string"==typeof t)return t;let e=t+"";return"0"==e&&1/t==-1/0?"-0":e}(t)}(u));else if(t(u)){h=!0;for(let t=0,e=u.length;t{this._keysMap[t.id]=e}))}create(){!this.isCreated&&this.docs.length&&(this.isCreated=!0,e(this.docs[0])?this.docs.forEach(((t,e)=>{this._addString(t,e)})):this.docs.forEach(((t,e)=>{this._addObject(t,e)})),this.norm.clear())}add(t){const n=this.size();e(t)?this._addString(t,n):this._addObject(t,n)}removeAt(t){this.records.splice(t,1);for(let e=t,n=this.size();e{let h=s.getFn?s.getFn(n):this.getFn(n,s.path);if(r(h))if(t(h)){let n=[];const s=[{nestedArrIndex:-1,value:h}];for(;s.length;){const{nestedArrIndex:i,value:o}=s.pop();if(r(o))if(e(o)&&!c(o)){let t={v:o,i:i,n:this.norm.get(o)};n.push(t)}else t(o)&&o.forEach(((t,e)=>{s.push({nestedArrIndex:e,value:t})}))}i.$[o]=n}else if(e(h)&&!c(h)){let t={v:h,n:this.norm.get(h)};i.$[o]=t}})),this.records.push(i)}toJSON(){return{keys:this.keys,records:this.records}}}function m(t,e,{getFn:n=g.getFn,fieldNormWeight:s=g.fieldNormWeight}={}){const i=new p({getFn:n,fieldNormWeight:s});return i.setKeys(t.map(l)),i.setSources(e),i.create(),i}function M(t,{errors:e=0,currentLocation:n=0,expectedLocation:s=0,distance:i=g.distance,ignoreLocation:r=g.ignoreLocation}={}){const c=e/t.length;if(r)return c;const o=Math.abs(s-n);return i?c+o/i:o?1:c}function x(t,e,n,{location:s=g.location,distance:i=g.distance,threshold:r=g.threshold,findAllMatches:c=g.findAllMatches,minMatchCharLength:o=g.minMatchCharLength,includeMatches:h=g.includeMatches,ignoreLocation:a=g.ignoreLocation}={}){if(e.length>32)throw new Error(`Pattern length exceeds max of ${32}.`);const l=e.length,u=t.length,d=Math.max(0,Math.min(s,u));let f=r,p=d;const m=o>1||h,x=m?Array(u):[];let y;for(;(y=t.indexOf(e,p))>-1;){let t=M(e,{currentLocation:y,expectedLocation:d,distance:i,ignoreLocation:a});if(f=Math.min(t,f),p=y+l,m){let t=0;for(;t=h;r-=1){let c=r-1,o=n[t.charAt(c)];if(m&&(x[c]=+!!o),y[r]=(y[r+1]<<1|1)&o,s&&(y[r]|=(L[r+1]|L[r])<<1|1|L[r+1]),y[r]&v&&(k=M(e,{errors:s,currentLocation:c,expectedLocation:d,distance:i,ignoreLocation:a}),k<=f)){if(f=k,p=c,p<=d)break;h=Math.max(1,2*d-p)}}if(M(e,{errors:s+1,currentLocation:d,expectedLocation:d,distance:i,ignoreLocation:a})>f)break;L=y}const S={isMatch:p>=0,score:Math.max(.001,k)};if(m){const t=function(t=[],e=g.minMatchCharLength){let n=[],s=-1,i=-1,r=0;for(let c=t.length;r=e&&n.push([s,i]),s=-1)}return t[r-1]&&r-s>=e&&n.push([s,r-1]),n}(x,o);t.length?h&&(S.indices=t):S.isMatch=!1}return S}function y(t){let e={};for(let n=0,s=t.length;n{this.chunks.push({pattern:t,alphabet:y(t),startIndex:e})},l=this.pattern.length;if(l>32){let t=0;const e=l%32,n=l-e;for(;t{const{isMatch:f,score:p,indices:m}=x(t,e,d,{location:s+g,distance:i,threshold:r,findAllMatches:c,minMatchCharLength:o,includeMatches:n,ignoreLocation:h});f&&(u=!0),l+=p,f&&m&&(a=[...a,...m])}));let d={isMatch:u,score:u?l/this.chunks.length:1};return u&&n&&(d.indices=a),d}}class k{constructor(t){this.pattern=t}static isMultiMatch(t){return _(t,this.multiRegex)}static isSingleMatch(t){return _(t,this.singleRegex)}search(){}}function _(t,e){const n=t.match(e);return n?n[1]:null}class v extends k{constructor(t,{location:e=g.location,threshold:n=g.threshold,distance:s=g.distance,includeMatches:i=g.includeMatches,findAllMatches:r=g.findAllMatches,minMatchCharLength:c=g.minMatchCharLength,isCaseSensitive:o=g.isCaseSensitive,ignoreLocation:h=g.ignoreLocation}={}){super(t),this._bitapSearch=new L(t,{location:e,threshold:n,distance:s,includeMatches:i,findAllMatches:r,minMatchCharLength:c,isCaseSensitive:o,ignoreLocation:h})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(t){return this._bitapSearch.searchIn(t)}}class S extends k{constructor(t){super(t)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(t){let e,n=0;const s=[],i=this.pattern.length;for(;(e=t.indexOf(this.pattern,n))>-1;)n=e+i,s.push([e,n-1]);const r=!!s.length;return{isMatch:r,score:r?0:1,indices:s}}}const C=[class extends k{constructor(t){super(t)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(t){const e=t===this.pattern;return{isMatch:e,score:e?0:1,indices:[0,this.pattern.length-1]}}},S,class extends k{constructor(t){super(t)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(t){const e=t.startsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,this.pattern.length-1]}}},class extends k{constructor(t){super(t)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(t){const e=!t.startsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,t.length-1]}}},class extends k{constructor(t){super(t)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(t){const e=!t.endsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,t.length-1]}}},class extends k{constructor(t){super(t)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(t){const e=t.endsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[t.length-this.pattern.length,t.length-1]}}},class extends k{constructor(t){super(t)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(t){const e=-1===t.indexOf(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,t.length-1]}}},v],I=C.length,w=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/;const $=new Set([v.type,S.type]);class A{constructor(t,{isCaseSensitive:e=g.isCaseSensitive,includeMatches:n=g.includeMatches,minMatchCharLength:s=g.minMatchCharLength,ignoreLocation:i=g.ignoreLocation,findAllMatches:r=g.findAllMatches,location:c=g.location,threshold:o=g.threshold,distance:h=g.distance}={}){this.query=null,this.options={isCaseSensitive:e,includeMatches:n,minMatchCharLength:s,findAllMatches:r,ignoreLocation:i,location:c,threshold:o,distance:h},this.pattern=e?t:t.toLowerCase(),this.query=function(t,e={}){return t.split("|").map((t=>{let n=t.trim().split(w).filter((t=>t&&!!t.trim())),s=[];for(let t=0,i=n.length;t!(!t[F]&&!t[N]),W=t=>({[F]:Object.keys(t).map((e=>({[e]:t[e]})))});function z(n,s,{auto:r=!0}={}){const c=n=>{let o=Object.keys(n);const h=(t=>!!t[R])(n);if(!h&&o.length>1&&!j(n))return c(W(n));if((e=>!t(e)&&i(e)&&!j(e))(n)){const t=h?n[R]:o[0],i=h?n[O]:n[t];if(!e(i))throw new Error((t=>`Invalid value for key ${t}`)(t));const c={keyId:d(t),pattern:i};return r&&(c.searcher=E(i,s)),c}let a={children:[],operator:o[0]};return o.forEach((e=>{const s=n[e];t(s)&&s.forEach((t=>{a.children.push(c(t))}))})),a};return j(n)||(n=W(n)),c(n)}function K(t,e){const n=t.matches;e.matches=[],r(n)&&n.forEach((t=>{if(!r(t.indices)||!t.indices.length)return;const{indices:n,value:s}=t;let i={indices:n,value:s};t.key&&(i.key=t.key.src),t.idx>-1&&(i.refIndex=t.idx),e.matches.push(i)}))}function P(t,e){e.score=t.score}class q{constructor(t,e={},n){this.options={...g,...e},this.options.useExtendedSearch,this._keyStore=new a(this.options.keys),this.setCollection(t,n)}setCollection(t,e){if(this._docs=t,e&&!(e instanceof p))throw new Error("Incorrect 'index' type");this._myIndex=e||m(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(t){r(t)&&(this._docs.push(t),this._myIndex.add(t))}remove(t=(()=>!1)){const e=[];for(let n=0,s=this._docs.length;n{let n=1;t.matches.forEach((({key:t,norm:s,score:i})=>{const r=t?t.weight:null;n*=Math.pow(0===i&&r?Number.EPSILON:i,(r||1)*(e?1:s))})),t.score=n}))}(l,{ignoreFieldNorm:a}),o&&l.sort(h),n(s)&&s>-1&&(l=l.slice(0,s)),function(t,e,{includeMatches:n=g.includeMatches,includeScore:s=g.includeScore}={}){const i=[];return n&&i.push(K),s&&i.push(P),t.map((t=>{const{idx:n}=t,s={item:e[n],refIndex:n};return i.length&&i.forEach((e=>{e(t,s)})),s}))}(l,this._docs,{includeMatches:r,includeScore:c})}_searchStringList(t){const e=E(t,this.options),{records:n}=this._myIndex,s=[];return n.forEach((({v:t,i:n,n:i})=>{if(!r(t))return;const{isMatch:c,score:o,indices:h}=e.searchIn(t);c&&s.push({item:t,idx:n,matches:[{score:o,value:t,norm:i,indices:h}]})})),s}_searchLogical(t){const e=z(t,this.options),n=(t,e,s)=>{if(!t.children){const{keyId:n,searcher:i}=t,r=this._findMatches({key:this._keyStore.get(n),value:this._myIndex.getValueForItemAtKeyId(e,n),searcher:i});return r&&r.length?[{idx:s,item:e,matches:r}]:[]}const i=[];for(let r=0,c=t.children.length;r{if(r(t)){let r=n(e,t,s);r.length&&(i[s]||(i[s]={idx:s,item:t,matches:[]},c.push(i[s])),r.forEach((({matches:t})=>{i[s].matches.push(...t)})))}})),c}_searchObjectList(t,e){const n=E(t,this.options),{keys:s,records:i}=this._myIndex,c=[];return i.forEach((({$:t,i:i})=>{if(!r(t))return;let o=[];s.forEach(((s,i)=>{e.length>0&&!e.includes(s.id)||o.push(...this._findMatches({key:s,value:t[i],searcher:n}))})),o.length&&c.push({idx:i,item:t,matches:o})})),c}_findMatches({key:e,value:n,searcher:s}){if(!r(n))return[];let i=[];if(t(n))n.forEach((({v:t,i:n,n:c})=>{if(!r(t))return;const{isMatch:o,score:h,indices:a}=s.searchIn(t);o&&i.push({score:h,key:e,value:t,idx:n,norm:c,indices:a})}));else{const{v:t,n:r}=n,{isMatch:c,score:o,indices:h}=s.searchIn(t);c&&i.push({score:o,key:e,value:t,norm:r,indices:h})}return i}}q.version="6.6.2-beta.7",q.createIndex=m,q.parseIndex=function(t,{getFn:e=g.getFn,fieldNormWeight:n=g.fieldNormWeight}={}){const{keys:s,records:i}=t,r=new p({getFn:e,fieldNormWeight:n});return r.setKeys(s),r.setIndexRecords(i),r},q.config=g,function(...t){b.push(...t)}(A);export{q as default}; \ No newline at end of file diff --git a/dist/fuse.js b/dist/fuse.js deleted file mode 100644 index 2d2a76e16..000000000 --- a/dist/fuse.js +++ /dev/null @@ -1,2242 +0,0 @@ -/** - * Fuse.js v6.6.2-beta.7 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2022 Kiro Risk (http://kiro.me) - * All Rights Reserved. Apache Software License 2.0 - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Fuse = factory()); -})(this, (function () { 'use strict'; - - function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - enumerableOnly && (symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - })), keys.push.apply(keys, symbols); - } - - return keys; - } - - function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = null != arguments[i] ? arguments[i] : {}; - i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { - _defineProperty(target, key, source[key]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { - Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); - }); - } - - return target; - } - - function _typeof(obj) { - "@babel/helpers - typeof"; - - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); - } - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; - } - - function _defineProperty(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; - } - - function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - - Object.defineProperty(subClass, "prototype", { - value: Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }), - writable: false - }); - if (superClass) _setPrototypeOf(subClass, superClass); - } - - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); - } - - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); - } - - function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - - try { - Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); - return true; - } catch (e) { - return false; - } - } - - function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; - } - - function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } else if (call !== void 0) { - throw new TypeError("Derived constructors may only return object or undefined"); - } - - return _assertThisInitialized(self); - } - - function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); - - return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), - result; - - if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; - - result = Reflect.construct(Super, arguments, NewTarget); - } else { - result = Super.apply(this, arguments); - } - - return _possibleConstructorReturn(this, result); - }; - } - - function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); - } - - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); - } - - function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); - } - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; - } - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - function isArray(value) { - return !Array.isArray ? getTag(value) === '[object Array]' : Array.isArray(value); - } // Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js - - var INFINITY = 1 / 0; - function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value; - } - - var result = value + ''; - return result == '0' && 1 / value == -INFINITY ? '-0' : result; - } - function toString(value) { - return value == null ? '' : baseToString(value); - } - function isString(value) { - return typeof value === 'string'; - } - function isNumber(value) { - return typeof value === 'number'; - } // Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js - - function isBoolean(value) { - return value === true || value === false || isObjectLike(value) && getTag(value) == '[object Boolean]'; - } - function isObject(value) { - return _typeof(value) === 'object'; - } // Checks if `value` is object-like. - - function isObjectLike(value) { - return isObject(value) && value !== null; - } - function isDefined(value) { - return value !== undefined && value !== null; - } - function isBlank(value) { - return !value.trim().length; - } // Gets the `toStringTag` of `value`. - // Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js - - function getTag(value) { - return value == null ? value === undefined ? '[object Undefined]' : '[object Null]' : Object.prototype.toString.call(value); - } - - var EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available'; - var INCORRECT_INDEX_TYPE = "Incorrect 'index' type"; - var LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = function LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key) { - return "Invalid value for key ".concat(key); - }; - var PATTERN_LENGTH_TOO_LARGE = function PATTERN_LENGTH_TOO_LARGE(max) { - return "Pattern length exceeds max of ".concat(max, "."); - }; - var MISSING_KEY_PROPERTY = function MISSING_KEY_PROPERTY(name) { - return "Missing ".concat(name, " property in key"); - }; - var INVALID_KEY_WEIGHT_VALUE = function INVALID_KEY_WEIGHT_VALUE(key) { - return "Property 'weight' in key '".concat(key, "' must be a positive integer"); - }; - - var hasOwn = Object.prototype.hasOwnProperty; - - var KeyStore = /*#__PURE__*/function () { - function KeyStore(keys) { - var _this = this; - - _classCallCheck(this, KeyStore); - - this._keys = []; - this._keyMap = {}; - var totalWeight = 0; - keys.forEach(function (key) { - var obj = createKey(key); - - _this._keys.push(obj); - - _this._keyMap[obj.id] = obj; - totalWeight += obj.weight; - }); // Normalize weights so that their sum is equal to 1 - - this._keys.forEach(function (key) { - key.weight /= totalWeight; - }); - } - - _createClass(KeyStore, [{ - key: "get", - value: function get(keyId) { - return this._keyMap[keyId]; - } - }, { - key: "keys", - value: function keys() { - return this._keys; - } - }, { - key: "toJSON", - value: function toJSON() { - return JSON.stringify(this._keys); - } - }]); - - return KeyStore; - }(); - function createKey(key) { - var path = null; - var id = null; - var src = null; - var weight = 1; - var getFn = null; - - if (isString(key) || isArray(key)) { - src = key; - path = createKeyPath(key); - id = createKeyId(key); - } else { - if (!hasOwn.call(key, 'name')) { - throw new Error(MISSING_KEY_PROPERTY('name')); - } - - var name = key.name; - src = name; - - if (hasOwn.call(key, 'weight')) { - weight = key.weight; - - if (weight <= 0) { - throw new Error(INVALID_KEY_WEIGHT_VALUE(name)); - } - } - - path = createKeyPath(name); - id = createKeyId(name); - getFn = key.getFn; - } - - return { - path: path, - id: id, - weight: weight, - src: src, - getFn: getFn - }; - } - function createKeyPath(key) { - return isArray(key) ? key : key.split('.'); - } - function createKeyId(key) { - return isArray(key) ? key.join('.') : key; - } - - function get(obj, path) { - var list = []; - var arr = false; - - var deepGet = function deepGet(obj, path, index) { - if (!isDefined(obj)) { - return; - } - - if (!path[index]) { - // If there's no path left, we've arrived at the object we care about. - list.push(obj); - } else { - var key = path[index]; - var value = obj[key]; - - if (!isDefined(value)) { - return; - } // If we're at the last value in the path, and if it's a string/number/bool, - // add it to the list - - - if (index === path.length - 1 && (isString(value) || isNumber(value) || isBoolean(value))) { - list.push(toString(value)); - } else if (isArray(value)) { - arr = true; // Search each item in the array. - - for (var i = 0, len = value.length; i < len; i += 1) { - deepGet(value[i], path, index + 1); - } - } else if (path.length) { - // An object. Recurse further. - deepGet(value, path, index + 1); - } - } - }; // Backwards compatibility (since path used to be a string) - - - deepGet(obj, isString(path) ? path.split('.') : path, 0); - return arr ? list : list[0]; - } - - var MatchOptions = { - // Whether the matches should be included in the result set. When `true`, each record in the result - // set will include the indices of the matched characters. - // These can consequently be used for highlighting purposes. - includeMatches: false, - // When `true`, the matching function will continue to the end of a search pattern even if - // a perfect match has already been located in the string. - findAllMatches: false, - // Minimum number of characters that must be matched before a result is considered a match - minMatchCharLength: 1 - }; - var BasicOptions = { - // When `true`, the algorithm continues searching to the end of the input even if a perfect - // match is found before the end of the same input. - isCaseSensitive: false, - // When true, the matching function will continue to the end of a search pattern even if - includeScore: false, - // List of properties that will be searched. This also supports nested properties. - keys: [], - // Whether to sort the result list, by score - shouldSort: true, - // Default sort function: sort by ascending score, ascending index - sortFn: function sortFn(a, b) { - return a.score === b.score ? a.idx < b.idx ? -1 : 1 : a.score < b.score ? -1 : 1; - } - }; - var FuzzyOptions = { - // Approximately where in the text is the pattern expected to be found? - location: 0, - // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match - // (of both letters and location), a threshold of '1.0' would match anything. - threshold: 0.6, - // Determines how close the match must be to the fuzzy location (specified above). - // An exact letter match which is 'distance' characters away from the fuzzy location - // would score as a complete mismatch. A distance of '0' requires the match be at - // the exact location specified, a threshold of '1000' would require a perfect match - // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold. - distance: 100 - }; - var AdvancedOptions = { - // When `true`, it enables the use of unix-like search commands - useExtendedSearch: false, - // The get function to use when fetching an object's properties. - // The default will search nested paths *ie foo.bar.baz* - getFn: get, - // When `true`, search will ignore `location` and `distance`, so it won't matter - // where in the string the pattern appears. - // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score - ignoreLocation: false, - // When `true`, the calculation for the relevance score (used for sorting) will - // ignore the field-length norm. - // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm - ignoreFieldNorm: false, - // The weight to determine how much field length norm effects scoring. - fieldNormWeight: 1 - }; - var Config = _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, BasicOptions), MatchOptions), FuzzyOptions), AdvancedOptions); - - var SPACE = /[^ ]+/g; // Field-length norm: the shorter the field, the higher the weight. - // Set to 3 decimals to reduce index size. - - function norm() { - var weight = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; - var mantissa = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3; - var cache = new Map(); - var m = Math.pow(10, mantissa); - return { - get: function get(value) { - var numTokens = value.match(SPACE).length; - - if (cache.has(numTokens)) { - return cache.get(numTokens); - } // Default function is 1/sqrt(x), weight makes that variable - - - var norm = 1 / Math.pow(numTokens, 0.5 * weight); // In place of `toFixed(mantissa)`, for faster computation - - var n = parseFloat(Math.round(norm * m) / m); - cache.set(numTokens, n); - return n; - }, - clear: function clear() { - cache.clear(); - } - }; - } - - var FuseIndex = /*#__PURE__*/function () { - function FuseIndex() { - var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, - _ref$getFn = _ref.getFn, - getFn = _ref$getFn === void 0 ? Config.getFn : _ref$getFn, - _ref$fieldNormWeight = _ref.fieldNormWeight, - fieldNormWeight = _ref$fieldNormWeight === void 0 ? Config.fieldNormWeight : _ref$fieldNormWeight; - - _classCallCheck(this, FuseIndex); - - this.norm = norm(fieldNormWeight, 3); - this.getFn = getFn; - this.isCreated = false; - this.setIndexRecords(); - } - - _createClass(FuseIndex, [{ - key: "setSources", - value: function setSources() { - var docs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - this.docs = docs; - } - }, { - key: "setIndexRecords", - value: function setIndexRecords() { - var records = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - this.records = records; - } - }, { - key: "setKeys", - value: function setKeys() { - var _this = this; - - var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - this.keys = keys; - this._keysMap = {}; - keys.forEach(function (key, idx) { - _this._keysMap[key.id] = idx; - }); - } - }, { - key: "create", - value: function create() { - var _this2 = this; - - if (this.isCreated || !this.docs.length) { - return; - } - - this.isCreated = true; // List is Array - - if (isString(this.docs[0])) { - this.docs.forEach(function (doc, docIndex) { - _this2._addString(doc, docIndex); - }); - } else { - // List is Array - this.docs.forEach(function (doc, docIndex) { - _this2._addObject(doc, docIndex); - }); - } - - this.norm.clear(); - } // Adds a doc to the end of the index - - }, { - key: "add", - value: function add(doc) { - var idx = this.size(); - - if (isString(doc)) { - this._addString(doc, idx); - } else { - this._addObject(doc, idx); - } - } // Removes the doc at the specified index of the index - - }, { - key: "removeAt", - value: function removeAt(idx) { - this.records.splice(idx, 1); // Change ref index of every subsquent doc - - for (var i = idx, len = this.size(); i < len; i += 1) { - this.records[i].i -= 1; - } - } - }, { - key: "getValueForItemAtKeyId", - value: function getValueForItemAtKeyId(item, keyId) { - return item[this._keysMap[keyId]]; - } - }, { - key: "size", - value: function size() { - return this.records.length; - } - }, { - key: "_addString", - value: function _addString(doc, docIndex) { - if (!isDefined(doc) || isBlank(doc)) { - return; - } - - var record = { - v: doc, - i: docIndex, - n: this.norm.get(doc) - }; - this.records.push(record); - } - }, { - key: "_addObject", - value: function _addObject(doc, docIndex) { - var _this3 = this; - - var record = { - i: docIndex, - $: {} - }; // Iterate over every key (i.e, path), and fetch the value at that key - - this.keys.forEach(function (key, keyIndex) { - var value = key.getFn ? key.getFn(doc) : _this3.getFn(doc, key.path); - - if (!isDefined(value)) { - return; - } - - if (isArray(value)) { - (function () { - var subRecords = []; - var stack = [{ - nestedArrIndex: -1, - value: value - }]; - - while (stack.length) { - var _stack$pop = stack.pop(), - nestedArrIndex = _stack$pop.nestedArrIndex, - _value = _stack$pop.value; - - if (!isDefined(_value)) { - continue; - } - - if (isString(_value) && !isBlank(_value)) { - var subRecord = { - v: _value, - i: nestedArrIndex, - n: _this3.norm.get(_value) - }; - subRecords.push(subRecord); - } else if (isArray(_value)) { - _value.forEach(function (item, k) { - stack.push({ - nestedArrIndex: k, - value: item - }); - }); - } else ; - } - - record.$[keyIndex] = subRecords; - })(); - } else if (isString(value) && !isBlank(value)) { - var subRecord = { - v: value, - n: _this3.norm.get(value) - }; - record.$[keyIndex] = subRecord; - } - }); - this.records.push(record); - } - }, { - key: "toJSON", - value: function toJSON() { - return { - keys: this.keys, - records: this.records - }; - } - }]); - - return FuseIndex; - }(); - function createIndex(keys, docs) { - var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - _ref2$getFn = _ref2.getFn, - getFn = _ref2$getFn === void 0 ? Config.getFn : _ref2$getFn, - _ref2$fieldNormWeight = _ref2.fieldNormWeight, - fieldNormWeight = _ref2$fieldNormWeight === void 0 ? Config.fieldNormWeight : _ref2$fieldNormWeight; - - var myIndex = new FuseIndex({ - getFn: getFn, - fieldNormWeight: fieldNormWeight - }); - myIndex.setKeys(keys.map(createKey)); - myIndex.setSources(docs); - myIndex.create(); - return myIndex; - } - function parseIndex(data) { - var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref3$getFn = _ref3.getFn, - getFn = _ref3$getFn === void 0 ? Config.getFn : _ref3$getFn, - _ref3$fieldNormWeight = _ref3.fieldNormWeight, - fieldNormWeight = _ref3$fieldNormWeight === void 0 ? Config.fieldNormWeight : _ref3$fieldNormWeight; - - var keys = data.keys, - records = data.records; - var myIndex = new FuseIndex({ - getFn: getFn, - fieldNormWeight: fieldNormWeight - }); - myIndex.setKeys(keys); - myIndex.setIndexRecords(records); - return myIndex; - } - - function computeScore$1(pattern) { - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$errors = _ref.errors, - errors = _ref$errors === void 0 ? 0 : _ref$errors, - _ref$currentLocation = _ref.currentLocation, - currentLocation = _ref$currentLocation === void 0 ? 0 : _ref$currentLocation, - _ref$expectedLocation = _ref.expectedLocation, - expectedLocation = _ref$expectedLocation === void 0 ? 0 : _ref$expectedLocation, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - var accuracy = errors / pattern.length; - - if (ignoreLocation) { - return accuracy; - } - - var proximity = Math.abs(expectedLocation - currentLocation); - - if (!distance) { - // Dodge divide by zero error. - return proximity ? 1.0 : accuracy; - } - - return accuracy + proximity / distance; - } - - function convertMaskToIndices() { - var matchmask = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - var minMatchCharLength = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Config.minMatchCharLength; - var indices = []; - var start = -1; - var end = -1; - var i = 0; - - for (var len = matchmask.length; i < len; i += 1) { - var match = matchmask[i]; - - if (match && start === -1) { - start = i; - } else if (!match && start !== -1) { - end = i - 1; - - if (end - start + 1 >= minMatchCharLength) { - indices.push([start, end]); - } - - start = -1; - } - } // (i-1 - start) + 1 => i - start - - - if (matchmask[i - 1] && i - start >= minMatchCharLength) { - indices.push([start, i - 1]); - } - - return indices; - } - - // Machine word size - var MAX_BITS = 32; - - function search(text, pattern, patternAlphabet) { - var _ref = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}, - _ref$location = _ref.location, - location = _ref$location === void 0 ? Config.location : _ref$location, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$threshold = _ref.threshold, - threshold = _ref$threshold === void 0 ? Config.threshold : _ref$threshold, - _ref$findAllMatches = _ref.findAllMatches, - findAllMatches = _ref$findAllMatches === void 0 ? Config.findAllMatches : _ref$findAllMatches, - _ref$minMatchCharLeng = _ref.minMatchCharLength, - minMatchCharLength = _ref$minMatchCharLeng === void 0 ? Config.minMatchCharLength : _ref$minMatchCharLeng, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - if (pattern.length > MAX_BITS) { - throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS)); - } - - var patternLen = pattern.length; // Set starting location at beginning text and initialize the alphabet. - - var textLen = text.length; // Handle the case when location > text.length - - var expectedLocation = Math.max(0, Math.min(location, textLen)); // Highest score beyond which we give up. - - var currentThreshold = threshold; // Is there a nearby exact match? (speedup) - - var bestLocation = expectedLocation; // Performance: only computer matches when the minMatchCharLength > 1 - // OR if `includeMatches` is true. - - var computeMatches = minMatchCharLength > 1 || includeMatches; // A mask of the matches, used for building the indices - - var matchMask = computeMatches ? Array(textLen) : []; - var index; // Get all exact matches, here for speed up - - while ((index = text.indexOf(pattern, bestLocation)) > -1) { - var score = computeScore$1(pattern, { - currentLocation: index, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - currentThreshold = Math.min(score, currentThreshold); - bestLocation = index + patternLen; - - if (computeMatches) { - var i = 0; - - while (i < patternLen) { - matchMask[index + i] = 1; - i += 1; - } - } - } // Reset the best location - - - bestLocation = -1; - var lastBitArr = []; - var finalScore = 1; - var binMax = patternLen + textLen; - var mask = 1 << patternLen - 1; - - for (var _i = 0; _i < patternLen; _i += 1) { - // Scan for the best match; each iteration allows for one more error. - // Run a binary search to determine how far from the match location we can stray - // at this error level. - var binMin = 0; - var binMid = binMax; - - while (binMin < binMid) { - var _score2 = computeScore$1(pattern, { - errors: _i, - currentLocation: expectedLocation + binMid, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - - if (_score2 <= currentThreshold) { - binMin = binMid; - } else { - binMax = binMid; - } - - binMid = Math.floor((binMax - binMin) / 2 + binMin); - } // Use the result from this iteration as the maximum for the next. - - - binMax = binMid; - var start = Math.max(1, expectedLocation - binMid + 1); - var finish = findAllMatches ? textLen : Math.min(expectedLocation + binMid, textLen) + patternLen; // Initialize the bit array - - var bitArr = Array(finish + 2); - bitArr[finish + 1] = (1 << _i) - 1; - - for (var j = finish; j >= start; j -= 1) { - var currentLocation = j - 1; - var charMatch = patternAlphabet[text.charAt(currentLocation)]; - - if (computeMatches) { - // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`) - matchMask[currentLocation] = +!!charMatch; - } // First pass: exact match - - - bitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch; // Subsequent passes: fuzzy match - - if (_i) { - bitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1]; - } - - if (bitArr[j] & mask) { - finalScore = computeScore$1(pattern, { - errors: _i, - currentLocation: currentLocation, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); // This match will almost certainly be better than any existing match. - // But check anyway. - - if (finalScore <= currentThreshold) { - // Indeed it is - currentThreshold = finalScore; - bestLocation = currentLocation; // Already passed `loc`, downhill from here on in. - - if (bestLocation <= expectedLocation) { - break; - } // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`. - - - start = Math.max(1, 2 * expectedLocation - bestLocation); - } - } - } // No hope for a (better) match at greater error levels. - - - var _score = computeScore$1(pattern, { - errors: _i + 1, - currentLocation: expectedLocation, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - - if (_score > currentThreshold) { - break; - } - - lastBitArr = bitArr; - } - - var result = { - isMatch: bestLocation >= 0, - // Count exact matches (those with a score of 0) to be "almost" exact - score: Math.max(0.001, finalScore) - }; - - if (computeMatches) { - var indices = convertMaskToIndices(matchMask, minMatchCharLength); - - if (!indices.length) { - result.isMatch = false; - } else if (includeMatches) { - result.indices = indices; - } - } - - return result; - } - - function createPatternAlphabet(pattern) { - var mask = {}; - - for (var i = 0, len = pattern.length; i < len; i += 1) { - var _char = pattern.charAt(i); - - mask[_char] = (mask[_char] || 0) | 1 << len - i - 1; - } - - return mask; - } - - var BitapSearch = /*#__PURE__*/function () { - function BitapSearch(pattern) { - var _this = this; - - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$location = _ref.location, - location = _ref$location === void 0 ? Config.location : _ref$location, - _ref$threshold = _ref.threshold, - threshold = _ref$threshold === void 0 ? Config.threshold : _ref$threshold, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$findAllMatches = _ref.findAllMatches, - findAllMatches = _ref$findAllMatches === void 0 ? Config.findAllMatches : _ref$findAllMatches, - _ref$minMatchCharLeng = _ref.minMatchCharLength, - minMatchCharLength = _ref$minMatchCharLeng === void 0 ? Config.minMatchCharLength : _ref$minMatchCharLeng, - _ref$isCaseSensitive = _ref.isCaseSensitive, - isCaseSensitive = _ref$isCaseSensitive === void 0 ? Config.isCaseSensitive : _ref$isCaseSensitive, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - _classCallCheck(this, BitapSearch); - - this.options = { - location: location, - threshold: threshold, - distance: distance, - includeMatches: includeMatches, - findAllMatches: findAllMatches, - minMatchCharLength: minMatchCharLength, - isCaseSensitive: isCaseSensitive, - ignoreLocation: ignoreLocation - }; - this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); - this.chunks = []; - - if (!this.pattern.length) { - return; - } - - var addChunk = function addChunk(pattern, startIndex) { - _this.chunks.push({ - pattern: pattern, - alphabet: createPatternAlphabet(pattern), - startIndex: startIndex - }); - }; - - var len = this.pattern.length; - - if (len > MAX_BITS) { - var i = 0; - var remainder = len % MAX_BITS; - var end = len - remainder; - - while (i < end) { - addChunk(this.pattern.substr(i, MAX_BITS), i); - i += MAX_BITS; - } - - if (remainder) { - var startIndex = len - MAX_BITS; - addChunk(this.pattern.substr(startIndex), startIndex); - } - } else { - addChunk(this.pattern, 0); - } - } - - _createClass(BitapSearch, [{ - key: "searchIn", - value: function searchIn(text) { - var _this$options = this.options, - isCaseSensitive = _this$options.isCaseSensitive, - includeMatches = _this$options.includeMatches; - - if (!isCaseSensitive) { - text = text.toLowerCase(); - } // Exact match - - - if (this.pattern === text) { - var _result = { - isMatch: true, - score: 0 - }; - - if (includeMatches) { - _result.indices = [[0, text.length - 1]]; - } - - return _result; - } // Otherwise, use Bitap algorithm - - - var _this$options2 = this.options, - location = _this$options2.location, - distance = _this$options2.distance, - threshold = _this$options2.threshold, - findAllMatches = _this$options2.findAllMatches, - minMatchCharLength = _this$options2.minMatchCharLength, - ignoreLocation = _this$options2.ignoreLocation; - var allIndices = []; - var totalScore = 0; - var hasMatches = false; - this.chunks.forEach(function (_ref2) { - var pattern = _ref2.pattern, - alphabet = _ref2.alphabet, - startIndex = _ref2.startIndex; - - var _search = search(text, pattern, alphabet, { - location: location + startIndex, - distance: distance, - threshold: threshold, - findAllMatches: findAllMatches, - minMatchCharLength: minMatchCharLength, - includeMatches: includeMatches, - ignoreLocation: ignoreLocation - }), - isMatch = _search.isMatch, - score = _search.score, - indices = _search.indices; - - if (isMatch) { - hasMatches = true; - } - - totalScore += score; - - if (isMatch && indices) { - allIndices = [].concat(_toConsumableArray(allIndices), _toConsumableArray(indices)); - } - }); - var result = { - isMatch: hasMatches, - score: hasMatches ? totalScore / this.chunks.length : 1 - }; - - if (hasMatches && includeMatches) { - result.indices = allIndices; - } - - return result; - } - }]); - - return BitapSearch; - }(); - - var BaseMatch = /*#__PURE__*/function () { - function BaseMatch(pattern) { - _classCallCheck(this, BaseMatch); - - this.pattern = pattern; - } - - _createClass(BaseMatch, [{ - key: "search", - value: function - /*text*/ - search() {} - }], [{ - key: "isMultiMatch", - value: function isMultiMatch(pattern) { - return getMatch(pattern, this.multiRegex); - } - }, { - key: "isSingleMatch", - value: function isSingleMatch(pattern) { - return getMatch(pattern, this.singleRegex); - } - }]); - - return BaseMatch; - }(); - - function getMatch(pattern, exp) { - var matches = pattern.match(exp); - return matches ? matches[1] : null; - } - - var ExactMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(ExactMatch, _BaseMatch); - - var _super = _createSuper(ExactMatch); - - function ExactMatch(pattern) { - _classCallCheck(this, ExactMatch); - - return _super.call(this, pattern); - } - - _createClass(ExactMatch, [{ - key: "search", - value: function search(text) { - var isMatch = text === this.pattern; - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: [0, this.pattern.length - 1] - }; - } - }], [{ - key: "type", - get: function get() { - return 'exact'; - } - }, { - key: "multiRegex", - get: function get() { - return /^="(.*)"$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^=(.*)$/; - } - }]); - - return ExactMatch; - }(BaseMatch); - - var InverseExactMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(InverseExactMatch, _BaseMatch); - - var _super = _createSuper(InverseExactMatch); - - function InverseExactMatch(pattern) { - _classCallCheck(this, InverseExactMatch); - - return _super.call(this, pattern); - } - - _createClass(InverseExactMatch, [{ - key: "search", - value: function search(text) { - var index = text.indexOf(this.pattern); - var isMatch = index === -1; - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: [0, text.length - 1] - }; - } - }], [{ - key: "type", - get: function get() { - return 'inverse-exact'; - } - }, { - key: "multiRegex", - get: function get() { - return /^!"(.*)"$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^!(.*)$/; - } - }]); - - return InverseExactMatch; - }(BaseMatch); - - var PrefixExactMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(PrefixExactMatch, _BaseMatch); - - var _super = _createSuper(PrefixExactMatch); - - function PrefixExactMatch(pattern) { - _classCallCheck(this, PrefixExactMatch); - - return _super.call(this, pattern); - } - - _createClass(PrefixExactMatch, [{ - key: "search", - value: function search(text) { - var isMatch = text.startsWith(this.pattern); - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: [0, this.pattern.length - 1] - }; - } - }], [{ - key: "type", - get: function get() { - return 'prefix-exact'; - } - }, { - key: "multiRegex", - get: function get() { - return /^\^"(.*)"$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^\^(.*)$/; - } - }]); - - return PrefixExactMatch; - }(BaseMatch); - - var InversePrefixExactMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(InversePrefixExactMatch, _BaseMatch); - - var _super = _createSuper(InversePrefixExactMatch); - - function InversePrefixExactMatch(pattern) { - _classCallCheck(this, InversePrefixExactMatch); - - return _super.call(this, pattern); - } - - _createClass(InversePrefixExactMatch, [{ - key: "search", - value: function search(text) { - var isMatch = !text.startsWith(this.pattern); - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: [0, text.length - 1] - }; - } - }], [{ - key: "type", - get: function get() { - return 'inverse-prefix-exact'; - } - }, { - key: "multiRegex", - get: function get() { - return /^!\^"(.*)"$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^!\^(.*)$/; - } - }]); - - return InversePrefixExactMatch; - }(BaseMatch); - - var SuffixExactMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(SuffixExactMatch, _BaseMatch); - - var _super = _createSuper(SuffixExactMatch); - - function SuffixExactMatch(pattern) { - _classCallCheck(this, SuffixExactMatch); - - return _super.call(this, pattern); - } - - _createClass(SuffixExactMatch, [{ - key: "search", - value: function search(text) { - var isMatch = text.endsWith(this.pattern); - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: [text.length - this.pattern.length, text.length - 1] - }; - } - }], [{ - key: "type", - get: function get() { - return 'suffix-exact'; - } - }, { - key: "multiRegex", - get: function get() { - return /^"(.*)"\$$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^(.*)\$$/; - } - }]); - - return SuffixExactMatch; - }(BaseMatch); - - var InverseSuffixExactMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(InverseSuffixExactMatch, _BaseMatch); - - var _super = _createSuper(InverseSuffixExactMatch); - - function InverseSuffixExactMatch(pattern) { - _classCallCheck(this, InverseSuffixExactMatch); - - return _super.call(this, pattern); - } - - _createClass(InverseSuffixExactMatch, [{ - key: "search", - value: function search(text) { - var isMatch = !text.endsWith(this.pattern); - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: [0, text.length - 1] - }; - } - }], [{ - key: "type", - get: function get() { - return 'inverse-suffix-exact'; - } - }, { - key: "multiRegex", - get: function get() { - return /^!"(.*)"\$$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^!(.*)\$$/; - } - }]); - - return InverseSuffixExactMatch; - }(BaseMatch); - - var FuzzyMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(FuzzyMatch, _BaseMatch); - - var _super = _createSuper(FuzzyMatch); - - function FuzzyMatch(pattern) { - var _this; - - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$location = _ref.location, - location = _ref$location === void 0 ? Config.location : _ref$location, - _ref$threshold = _ref.threshold, - threshold = _ref$threshold === void 0 ? Config.threshold : _ref$threshold, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$findAllMatches = _ref.findAllMatches, - findAllMatches = _ref$findAllMatches === void 0 ? Config.findAllMatches : _ref$findAllMatches, - _ref$minMatchCharLeng = _ref.minMatchCharLength, - minMatchCharLength = _ref$minMatchCharLeng === void 0 ? Config.minMatchCharLength : _ref$minMatchCharLeng, - _ref$isCaseSensitive = _ref.isCaseSensitive, - isCaseSensitive = _ref$isCaseSensitive === void 0 ? Config.isCaseSensitive : _ref$isCaseSensitive, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation; - - _classCallCheck(this, FuzzyMatch); - - _this = _super.call(this, pattern); - _this._bitapSearch = new BitapSearch(pattern, { - location: location, - threshold: threshold, - distance: distance, - includeMatches: includeMatches, - findAllMatches: findAllMatches, - minMatchCharLength: minMatchCharLength, - isCaseSensitive: isCaseSensitive, - ignoreLocation: ignoreLocation - }); - return _this; - } - - _createClass(FuzzyMatch, [{ - key: "search", - value: function search(text) { - return this._bitapSearch.searchIn(text); - } - }], [{ - key: "type", - get: function get() { - return 'fuzzy'; - } - }, { - key: "multiRegex", - get: function get() { - return /^"(.*)"$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^(.*)$/; - } - }]); - - return FuzzyMatch; - }(BaseMatch); - - var IncludeMatch = /*#__PURE__*/function (_BaseMatch) { - _inherits(IncludeMatch, _BaseMatch); - - var _super = _createSuper(IncludeMatch); - - function IncludeMatch(pattern) { - _classCallCheck(this, IncludeMatch); - - return _super.call(this, pattern); - } - - _createClass(IncludeMatch, [{ - key: "search", - value: function search(text) { - var location = 0; - var index; - var indices = []; - var patternLen = this.pattern.length; // Get all exact matches - - while ((index = text.indexOf(this.pattern, location)) > -1) { - location = index + patternLen; - indices.push([index, location - 1]); - } - - var isMatch = !!indices.length; - return { - isMatch: isMatch, - score: isMatch ? 0 : 1, - indices: indices - }; - } - }], [{ - key: "type", - get: function get() { - return 'include'; - } - }, { - key: "multiRegex", - get: function get() { - return /^'"(.*)"$/; - } - }, { - key: "singleRegex", - get: function get() { - return /^'(.*)$/; - } - }]); - - return IncludeMatch; - }(BaseMatch); - - var searchers = [ExactMatch, IncludeMatch, PrefixExactMatch, InversePrefixExactMatch, InverseSuffixExactMatch, SuffixExactMatch, InverseExactMatch, FuzzyMatch]; - var searchersLen = searchers.length; // Regex to split by spaces, but keep anything in quotes together - - var SPACE_RE = / +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/; - var OR_TOKEN = '|'; // Return a 2D array representation of the query, for simpler parsing. - // Example: - // "^core go$ | rb$ | py$ xy$" => [["^core", "go$"], ["rb$"], ["py$", "xy$"]] - - function parseQuery(pattern) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - return pattern.split(OR_TOKEN).map(function (item) { - var query = item.trim().split(SPACE_RE).filter(function (item) { - return item && !!item.trim(); - }); - var results = []; - - for (var i = 0, len = query.length; i < len; i += 1) { - var queryItem = query[i]; // 1. Handle multiple query match (i.e, once that are quoted, like `"hello world"`) - - var found = false; - var idx = -1; - - while (!found && ++idx < searchersLen) { - var searcher = searchers[idx]; - var token = searcher.isMultiMatch(queryItem); - - if (token) { - results.push(new searcher(token, options)); - found = true; - } - } - - if (found) { - continue; - } // 2. Handle single query matches (i.e, once that are *not* quoted) - - - idx = -1; - - while (++idx < searchersLen) { - var _searcher = searchers[idx]; - - var _token = _searcher.isSingleMatch(queryItem); - - if (_token) { - results.push(new _searcher(_token, options)); - break; - } - } - } - - return results; - }); - } - - // to a singl match - - var MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]); - /** - * Command-like searching - * ====================== - * - * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`, - * search in a given text. - * - * Search syntax: - * - * | Token | Match type | Description | - * | ----------- | -------------------------- | -------------------------------------- | - * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` | - * | `=scheme` | exact-match | Items that are `scheme` | - * | `'python` | include-match | Items that include `python` | - * | `!ruby` | inverse-exact-match | Items that do not include `ruby` | - * | `^java` | prefix-exact-match | Items that start with `java` | - * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` | - * | `.js$` | suffix-exact-match | Items that end with `.js` | - * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` | - * - * A single pipe character acts as an OR operator. For example, the following - * query matches entries that start with `core` and end with either`go`, `rb`, - * or`py`. - * - * ``` - * ^core go$ | rb$ | py$ - * ``` - */ - - var ExtendedSearch = /*#__PURE__*/function () { - function ExtendedSearch(pattern) { - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$isCaseSensitive = _ref.isCaseSensitive, - isCaseSensitive = _ref$isCaseSensitive === void 0 ? Config.isCaseSensitive : _ref$isCaseSensitive, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$minMatchCharLeng = _ref.minMatchCharLength, - minMatchCharLength = _ref$minMatchCharLeng === void 0 ? Config.minMatchCharLength : _ref$minMatchCharLeng, - _ref$ignoreLocation = _ref.ignoreLocation, - ignoreLocation = _ref$ignoreLocation === void 0 ? Config.ignoreLocation : _ref$ignoreLocation, - _ref$findAllMatches = _ref.findAllMatches, - findAllMatches = _ref$findAllMatches === void 0 ? Config.findAllMatches : _ref$findAllMatches, - _ref$location = _ref.location, - location = _ref$location === void 0 ? Config.location : _ref$location, - _ref$threshold = _ref.threshold, - threshold = _ref$threshold === void 0 ? Config.threshold : _ref$threshold, - _ref$distance = _ref.distance, - distance = _ref$distance === void 0 ? Config.distance : _ref$distance; - - _classCallCheck(this, ExtendedSearch); - - this.query = null; - this.options = { - isCaseSensitive: isCaseSensitive, - includeMatches: includeMatches, - minMatchCharLength: minMatchCharLength, - findAllMatches: findAllMatches, - ignoreLocation: ignoreLocation, - location: location, - threshold: threshold, - distance: distance - }; - this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); - this.query = parseQuery(this.pattern, this.options); - } - - _createClass(ExtendedSearch, [{ - key: "searchIn", - value: function searchIn(text) { - var query = this.query; - - if (!query) { - return { - isMatch: false, - score: 1 - }; - } - - var _this$options = this.options, - includeMatches = _this$options.includeMatches, - isCaseSensitive = _this$options.isCaseSensitive; - text = isCaseSensitive ? text : text.toLowerCase(); - var numMatches = 0; - var allIndices = []; - var totalScore = 0; // ORs - - for (var i = 0, qLen = query.length; i < qLen; i += 1) { - var searchers = query[i]; // Reset indices - - allIndices.length = 0; - numMatches = 0; // ANDs - - for (var j = 0, pLen = searchers.length; j < pLen; j += 1) { - var searcher = searchers[j]; - - var _searcher$search = searcher.search(text), - isMatch = _searcher$search.isMatch, - indices = _searcher$search.indices, - score = _searcher$search.score; - - if (isMatch) { - numMatches += 1; - totalScore += score; - - if (includeMatches) { - var type = searcher.constructor.type; - - if (MultiMatchSet.has(type)) { - allIndices = [].concat(_toConsumableArray(allIndices), _toConsumableArray(indices)); - } else { - allIndices.push(indices); - } - } - } else { - totalScore = 0; - numMatches = 0; - allIndices.length = 0; - break; - } - } // OR condition, so if TRUE, return - - - if (numMatches) { - var result = { - isMatch: true, - score: totalScore / numMatches - }; - - if (includeMatches) { - result.indices = allIndices; - } - - return result; - } - } // Nothing was matched - - - return { - isMatch: false, - score: 1 - }; - } - }], [{ - key: "condition", - value: function condition(_, options) { - return options.useExtendedSearch; - } - }]); - - return ExtendedSearch; - }(); - - var registeredSearchers = []; - function register() { - registeredSearchers.push.apply(registeredSearchers, arguments); - } - function createSearcher(pattern, options) { - for (var i = 0, len = registeredSearchers.length; i < len; i += 1) { - var searcherClass = registeredSearchers[i]; - - if (searcherClass.condition(pattern, options)) { - return new searcherClass(pattern, options); - } - } - - return new BitapSearch(pattern, options); - } - - var LogicalOperator = { - AND: '$and', - OR: '$or' - }; - var KeyType = { - PATH: '$path', - PATTERN: '$val' - }; - - var isExpression = function isExpression(query) { - return !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]); - }; - - var isPath = function isPath(query) { - return !!query[KeyType.PATH]; - }; - - var isLeaf = function isLeaf(query) { - return !isArray(query) && isObject(query) && !isExpression(query); - }; - - var convertToExplicit = function convertToExplicit(query) { - return _defineProperty({}, LogicalOperator.AND, Object.keys(query).map(function (key) { - return _defineProperty({}, key, query[key]); - })); - }; // When `auto` is `true`, the parse function will infer and initialize and add - // the appropriate `Searcher` instance - - - function parse(query, options) { - var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - _ref3$auto = _ref3.auto, - auto = _ref3$auto === void 0 ? true : _ref3$auto; - - var next = function next(query) { - var keys = Object.keys(query); - var isQueryPath = isPath(query); - - if (!isQueryPath && keys.length > 1 && !isExpression(query)) { - return next(convertToExplicit(query)); - } - - if (isLeaf(query)) { - var key = isQueryPath ? query[KeyType.PATH] : keys[0]; - var pattern = isQueryPath ? query[KeyType.PATTERN] : query[key]; - - if (!isString(pattern)) { - throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key)); - } - - var obj = { - keyId: createKeyId(key), - pattern: pattern - }; - - if (auto) { - obj.searcher = createSearcher(pattern, options); - } - - return obj; - } - - var node = { - children: [], - operator: keys[0] - }; - keys.forEach(function (key) { - var value = query[key]; - - if (isArray(value)) { - value.forEach(function (item) { - node.children.push(next(item)); - }); - } - }); - return node; - }; - - if (!isExpression(query)) { - query = convertToExplicit(query); - } - - return next(query); - } - - function computeScore(results, _ref) { - var _ref$ignoreFieldNorm = _ref.ignoreFieldNorm, - ignoreFieldNorm = _ref$ignoreFieldNorm === void 0 ? Config.ignoreFieldNorm : _ref$ignoreFieldNorm; - results.forEach(function (result) { - var totalScore = 1; - result.matches.forEach(function (_ref2) { - var key = _ref2.key, - norm = _ref2.norm, - score = _ref2.score; - var weight = key ? key.weight : null; - totalScore *= Math.pow(score === 0 && weight ? Number.EPSILON : score, (weight || 1) * (ignoreFieldNorm ? 1 : norm)); - }); - result.score = totalScore; - }); - } - - function transformMatches(result, data) { - var matches = result.matches; - data.matches = []; - - if (!isDefined(matches)) { - return; - } - - matches.forEach(function (match) { - if (!isDefined(match.indices) || !match.indices.length) { - return; - } - - var indices = match.indices, - value = match.value; - var obj = { - indices: indices, - value: value - }; - - if (match.key) { - obj.key = match.key.src; - } - - if (match.idx > -1) { - obj.refIndex = match.idx; - } - - data.matches.push(obj); - }); - } - - function transformScore(result, data) { - data.score = result.score; - } - - function format(results, docs) { - var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - _ref$includeMatches = _ref.includeMatches, - includeMatches = _ref$includeMatches === void 0 ? Config.includeMatches : _ref$includeMatches, - _ref$includeScore = _ref.includeScore, - includeScore = _ref$includeScore === void 0 ? Config.includeScore : _ref$includeScore; - - var transformers = []; - if (includeMatches) transformers.push(transformMatches); - if (includeScore) transformers.push(transformScore); - return results.map(function (result) { - var idx = result.idx; - var data = { - item: docs[idx], - refIndex: idx - }; - - if (transformers.length) { - transformers.forEach(function (transformer) { - transformer(result, data); - }); - } - - return data; - }); - } - - var Fuse$1 = /*#__PURE__*/function () { - function Fuse(docs) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var index = arguments.length > 2 ? arguments[2] : undefined; - - _classCallCheck(this, Fuse); - - this.options = _objectSpread2(_objectSpread2({}, Config), options); - - if (this.options.useExtendedSearch && !true) { - throw new Error(EXTENDED_SEARCH_UNAVAILABLE); - } - - this._keyStore = new KeyStore(this.options.keys); - this.setCollection(docs, index); - } - - _createClass(Fuse, [{ - key: "setCollection", - value: function setCollection(docs, index) { - this._docs = docs; - - if (index && !(index instanceof FuseIndex)) { - throw new Error(INCORRECT_INDEX_TYPE); - } - - this._myIndex = index || createIndex(this.options.keys, this._docs, { - getFn: this.options.getFn, - fieldNormWeight: this.options.fieldNormWeight - }); - } - }, { - key: "add", - value: function add(doc) { - if (!isDefined(doc)) { - return; - } - - this._docs.push(doc); - - this._myIndex.add(doc); - } - }, { - key: "remove", - value: function remove() { - var predicate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function - /* doc, idx */ - () { - return false; - }; - var results = []; - - for (var i = 0, len = this._docs.length; i < len; i += 1) { - var doc = this._docs[i]; - - if (predicate(doc, i)) { - this.removeAt(i); - i -= 1; - len -= 1; - results.push(doc); - } - } - - return results; - } - }, { - key: "removeAt", - value: function removeAt(idx) { - this._docs.splice(idx, 1); - - this._myIndex.removeAt(idx); - } - }, { - key: "getIndex", - value: function getIndex() { - return this._myIndex; - } - }, { - key: "search", - value: function search(query) { - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$limit = _ref.limit, - limit = _ref$limit === void 0 ? -1 : _ref$limit, - _ref$keys = _ref.keys, - keys = _ref$keys === void 0 ? [] : _ref$keys; - - var _this$options = this.options, - includeMatches = _this$options.includeMatches, - includeScore = _this$options.includeScore, - shouldSort = _this$options.shouldSort, - sortFn = _this$options.sortFn, - ignoreFieldNorm = _this$options.ignoreFieldNorm; - var results = isString(query) ? isString(this._docs[0]) ? this._searchStringList(query) : this._searchObjectList(query, keys) : this._searchLogical(query); - computeScore(results, { - ignoreFieldNorm: ignoreFieldNorm - }); - - if (shouldSort) { - results.sort(sortFn); - } - - if (isNumber(limit) && limit > -1) { - results = results.slice(0, limit); - } - - return format(results, this._docs, { - includeMatches: includeMatches, - includeScore: includeScore - }); - } - }, { - key: "_searchStringList", - value: function _searchStringList(query) { - var searcher = createSearcher(query, this.options); - var records = this._myIndex.records; - var results = []; // Iterate over every string in the index - - records.forEach(function (_ref2) { - var text = _ref2.v, - idx = _ref2.i, - norm = _ref2.n; - - if (!isDefined(text)) { - return; - } - - var _searcher$searchIn = searcher.searchIn(text), - isMatch = _searcher$searchIn.isMatch, - score = _searcher$searchIn.score, - indices = _searcher$searchIn.indices; - - if (isMatch) { - results.push({ - item: text, - idx: idx, - matches: [{ - score: score, - value: text, - norm: norm, - indices: indices - }] - }); - } - }); - return results; - } - }, { - key: "_searchLogical", - value: function _searchLogical(query) { - var _this = this; - - var expression = parse(query, this.options); - - var evaluate = function evaluate(node, item, idx) { - if (!node.children) { - var keyId = node.keyId, - searcher = node.searcher; - - var matches = _this._findMatches({ - key: _this._keyStore.get(keyId), - value: _this._myIndex.getValueForItemAtKeyId(item, keyId), - searcher: searcher - }); - - if (matches && matches.length) { - return [{ - idx: idx, - item: item, - matches: matches - }]; - } - - return []; - } - - var res = []; - - for (var i = 0, len = node.children.length; i < len; i += 1) { - var child = node.children[i]; - var result = evaluate(child, item, idx); - - if (result.length) { - res.push.apply(res, _toConsumableArray(result)); - } else if (node.operator === LogicalOperator.AND) { - return []; - } - } - - return res; - }; - - var records = this._myIndex.records; - var resultMap = {}; - var results = []; - records.forEach(function (_ref3) { - var item = _ref3.$, - idx = _ref3.i; - - if (isDefined(item)) { - var expResults = evaluate(expression, item, idx); - - if (expResults.length) { - // Dedupe when adding - if (!resultMap[idx]) { - resultMap[idx] = { - idx: idx, - item: item, - matches: [] - }; - results.push(resultMap[idx]); - } - - expResults.forEach(function (_ref4) { - var _resultMap$idx$matche; - - var matches = _ref4.matches; - - (_resultMap$idx$matche = resultMap[idx].matches).push.apply(_resultMap$idx$matche, _toConsumableArray(matches)); - }); - } - } - }); - return results; - } - }, { - key: "_searchObjectList", - value: function _searchObjectList(query, searchKeys) { - var _this2 = this; - - var searcher = createSearcher(query, this.options); - var _this$_myIndex = this._myIndex, - keys = _this$_myIndex.keys, - records = _this$_myIndex.records; - var results = []; // List is Array - - records.forEach(function (_ref5) { - var item = _ref5.$, - idx = _ref5.i; - - if (!isDefined(item)) { - return; - } - - var matches = []; // Iterate over every key (i.e, path), and fetch the value at that key - - keys.forEach(function (key, keyIndex) { - if (searchKeys.length > 0 && !searchKeys.includes(key.id)) return; - matches.push.apply(matches, _toConsumableArray(_this2._findMatches({ - key: key, - value: item[keyIndex], - searcher: searcher - }))); - }); - - if (matches.length) { - results.push({ - idx: idx, - item: item, - matches: matches - }); - } - }); - return results; - } - }, { - key: "_findMatches", - value: function _findMatches(_ref6) { - var key = _ref6.key, - value = _ref6.value, - searcher = _ref6.searcher; - - if (!isDefined(value)) { - return []; - } - - var matches = []; - - if (isArray(value)) { - value.forEach(function (_ref7) { - var text = _ref7.v, - idx = _ref7.i, - norm = _ref7.n; - - if (!isDefined(text)) { - return; - } - - var _searcher$searchIn2 = searcher.searchIn(text), - isMatch = _searcher$searchIn2.isMatch, - score = _searcher$searchIn2.score, - indices = _searcher$searchIn2.indices; - - if (isMatch) { - matches.push({ - score: score, - key: key, - value: text, - idx: idx, - norm: norm, - indices: indices - }); - } - }); - } else { - var text = value.v, - norm = value.n; - - var _searcher$searchIn3 = searcher.searchIn(text), - isMatch = _searcher$searchIn3.isMatch, - score = _searcher$searchIn3.score, - indices = _searcher$searchIn3.indices; - - if (isMatch) { - matches.push({ - score: score, - key: key, - value: text, - norm: norm, - indices: indices - }); - } - } - - return matches; - } - }]); - - return Fuse; - }(); - - Fuse$1.version = '6.6.2-beta.7'; - Fuse$1.createIndex = createIndex; - Fuse$1.parseIndex = parseIndex; - Fuse$1.config = Config; - - { - Fuse$1.parseQuery = parse; - } - - { - register(ExtendedSearch); - } - - var Fuse = Fuse$1; - - return Fuse; - -})); diff --git a/dist/fuse.min.js b/dist/fuse.min.js deleted file mode 100644 index 0b97a6a26..000000000 --- a/dist/fuse.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Fuse.js v6.6.2-beta.7 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2022 Kiro Risk (http://kiro.me) - * All Rights Reserved. Apache Software License 2.0 - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ -var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(C).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),c=parseFloat(Math.round(o*r)/r);return n.set(i,c),c},clear:function(){n.clear()}}}var $=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?I.getFn:n,o=t.fieldNormWeight,c=void 0===o?I.fieldNormWeight:o;r(this,e),this.norm=E(c,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,g(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();g(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?I.getFn:r,o=n.fieldNormWeight,c=void 0===o?I.fieldNormWeight:o,a=new $({getFn:i,fieldNormWeight:c});return a.setKeys(e.map(_)),a.setSources(t),a.create(),a}function R(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,c=t.expectedLocation,a=void 0===c?0:c,s=t.distance,u=void 0===s?I.distance:s,h=t.ignoreLocation,l=void 0===h?I.ignoreLocation:h,f=r/e.length;if(l)return f;var d=Math.abs(a-o);return u?f+d/u:d?1:f}function N(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:I.minMatchCharLength,n=[],r=-1,i=-1,o=0,c=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}var P=32;function W(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,c=void 0===o?I.location:o,a=i.threshold,s=void 0===a?I.threshold:a,u=i.distance,h=void 0===u?I.distance:u,l=i.includeMatches,f=void 0===l?I.includeMatches:l,d=i.findAllMatches,v=void 0===d?I.findAllMatches:d,g=i.minMatchCharLength,y=void 0===g?I.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?I.isCaseSensitive:p,k=i.ignoreLocation,M=void 0===k?I.ignoreLocation:k;if(r(this,e),this.options={location:c,threshold:s,distance:h,includeMatches:f,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:M},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var b=function(e,t){n.chunks.push({pattern:e,alphabet:W(e),startIndex:t})},x=this.pattern.length;if(x>P){for(var w=0,L=x%P,S=x-L;w3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?I.location:i,c=r.distance,a=void 0===c?I.distance:c,s=r.threshold,u=void 0===s?I.threshold:s,h=r.findAllMatches,l=void 0===h?I.findAllMatches:h,f=r.minMatchCharLength,d=void 0===f?I.minMatchCharLength:f,v=r.includeMatches,g=void 0===v?I.includeMatches:v,y=r.ignoreLocation,p=void 0===y?I.ignoreLocation:y;if(t.length>P)throw new Error(w(P));for(var m,k=t.length,M=e.length,b=Math.max(0,Math.min(o,M)),x=u,L=b,S=d>1||g,_=S?Array(M):[];(m=e.indexOf(t,L))>-1;){var O=R(t,{currentLocation:m,expectedLocation:b,distance:a,ignoreLocation:p});if(x=Math.min(O,x),L=m+k,S)for(var j=0;j=z;q-=1){var B=q-1,J=n[e.charAt(B)];if(S&&(_[B]=+!!J),K[q]=(K[q+1]<<1|1)&J,F&&(K[q]|=(A[q+1]|A[q])<<1|1|A[q+1]),K[q]&$&&(C=R(t,{errors:F,currentLocation:B,expectedLocation:b,distance:a,ignoreLocation:p}))<=x){if(x=C,(L=B)<=b)break;z=Math.max(1,2*b-L)}}if(R(t,{errors:F+1,currentLocation:b,expectedLocation:b,distance:a,ignoreLocation:p})>x)break;A=K}var U={isMatch:L>=0,score:Math.max(.001,C)};if(S){var V=N(_,d);V.length?g&&(U.indices=V):U.isMatch=!1}return U}(e,n,i,{location:c+o,distance:a,threshold:s,findAllMatches:u,minMatchCharLength:h,includeMatches:r,ignoreLocation:l}),p=y.isMatch,m=y.score,k=y.indices;p&&(g=!0),v+=m,p&&k&&(d=[].concat(f(d),f(k)))}));var y={isMatch:g,score:g?v/this.chunks.length:1};return g&&r&&(y.indices=d),y}}]),e}(),z=function(){function e(t){r(this,e),this.pattern=t}return o(e,[{key:"search",value:function(){}}],[{key:"isMultiMatch",value:function(e){return D(e,this.multiRegex)}},{key:"isSingleMatch",value:function(e){return D(e,this.singleRegex)}}]),e}();function D(e,t){var n=e.match(t);return n?n[1]:null}var K=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"exact"}},{key:"multiRegex",get:function(){return/^="(.*)"$/}},{key:"singleRegex",get:function(){return/^=(.*)$/}}]),n}(z),q=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"$/}},{key:"singleRegex",get:function(){return/^!(.*)$/}}]),n}(z),B=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"prefix-exact"}},{key:"multiRegex",get:function(){return/^\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^\^(.*)$/}}]),n}(z),J=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-prefix-exact"}},{key:"multiRegex",get:function(){return/^!\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^!\^(.*)$/}}]),n}(z),U=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}}],[{key:"type",get:function(){return"suffix-exact"}},{key:"multiRegex",get:function(){return/^"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^(.*)\$$/}}]),n}(z),V=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-suffix-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^!(.*)\$$/}}]),n}(z),G=function(e){a(n,e);var t=l(n);function n(e){var i,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},c=o.location,a=void 0===c?I.location:c,s=o.threshold,u=void 0===s?I.threshold:s,h=o.distance,l=void 0===h?I.distance:h,f=o.includeMatches,d=void 0===f?I.includeMatches:f,v=o.findAllMatches,g=void 0===v?I.findAllMatches:v,y=o.minMatchCharLength,p=void 0===y?I.minMatchCharLength:y,m=o.isCaseSensitive,k=void 0===m?I.isCaseSensitive:m,M=o.ignoreLocation,b=void 0===M?I.ignoreLocation:M;return r(this,n),(i=t.call(this,e))._bitapSearch=new T(e,{location:a,threshold:u,distance:l,includeMatches:d,findAllMatches:g,minMatchCharLength:p,isCaseSensitive:k,ignoreLocation:b}),i}return o(n,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),n}(z),H=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){for(var t,n=0,r=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,r.push([t,n-1]);var o=!!r.length;return{isMatch:o,score:o?0:1,indices:r}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),n}(z),Q=[K,H,B,J,V,U,q,G],X=Q.length,Y=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/;function Z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.split("|").map((function(e){for(var n=e.trim().split(Y).filter((function(e){return e&&!!e.trim()})),r=[],i=0,o=n.length;i1&&void 0!==arguments[1]?arguments[1]:{},i=n.isCaseSensitive,o=void 0===i?I.isCaseSensitive:i,c=n.includeMatches,a=void 0===c?I.includeMatches:c,s=n.minMatchCharLength,u=void 0===s?I.minMatchCharLength:s,h=n.ignoreLocation,l=void 0===h?I.ignoreLocation:h,f=n.findAllMatches,d=void 0===f?I.findAllMatches:f,v=n.location,g=void 0===v?I.location:v,y=n.threshold,p=void 0===y?I.threshold:y,m=n.distance,k=void 0===m?I.distance:m;r(this,e),this.query=null,this.options={isCaseSensitive:o,includeMatches:a,minMatchCharLength:u,findAllMatches:d,ignoreLocation:l,location:g,threshold:p,distance:k},this.pattern=o?t:t.toLowerCase(),this.query=Z(this.pattern,this.options)}return o(e,[{key:"searchIn",value:function(e){var t=this.query;if(!t)return{isMatch:!1,score:1};var n=this.options,r=n.includeMatches;e=n.isCaseSensitive?e:e.toLowerCase();for(var i=0,o=[],c=0,a=0,s=t.length;a-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function ve(e,t){t.score=e.score}function ge(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?I.includeMatches:r,o=n.includeScore,c=void 0===o?I.includeScore:o,a=[];return i&&a.push(de),c&&a.push(ve),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return a.length&&a.forEach((function(t){t(e,r)})),r}))}var ye=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;r(this,e),this.options=t(t({},I),i),this.options.useExtendedSearch,this._keyStore=new S(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof $))throw new Error("Incorrect 'index' type");this._myIndex=t||F(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){k(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=t.keys,o=void 0===i?[]:i,c=this.options,a=c.includeMatches,s=c.includeScore,u=c.shouldSort,h=c.sortFn,l=c.ignoreFieldNorm,f=g(e)?g(this._docs[0])?this._searchStringList(e):this._searchObjectList(e,o):this._searchLogical(e);return fe(f,{ignoreFieldNorm:l}),u&&f.sort(h),y(r)&&r>-1&&(f=f.slice(0,r)),ge(f,this._docs,{includeMatches:a,includeScore:s})}},{key:"_searchStringList",value:function(e){var t=re(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(k(n)){var c=t.searchIn(n),a=c.isMatch,s=c.score,u=c.indices;a&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:u}]})}})),r}},{key:"_searchLogical",value:function(e){var t=this,n=function(e,t){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).auto,r=void 0===n||n,i=function e(n){var i=Object.keys(n),o=ue(n);if(!o&&i.length>1&&!se(n))return e(le(n));if(he(n)){var c=o?n[ce]:i[0],a=o?n[ae]:n[c];if(!g(a))throw new Error(x(c));var s={keyId:j(c),pattern:a};return r&&(s.searcher=re(a,t)),s}var u={children:[],operator:i[0]};return i.forEach((function(t){var r=n[t];v(r)&&r.forEach((function(t){u.children.push(e(t))}))})),u};return se(e)||(e=le(e)),i(e)}(e,this.options),r=function e(n,r,i){if(!n.children){var o=n.keyId,c=n.searcher,a=t._findMatches({key:t._keyStore.get(o),value:t._myIndex.getValueForItemAtKeyId(r,o),searcher:c});return a&&a.length?[{idx:i,item:r,matches:a}]:[]}for(var s=[],u=0,h=n.children.length;u0&&!t.includes(e.id)||s.push.apply(s,f(n._findMatches({key:e,value:i[o],searcher:r})))})),s.length&&a.push({idx:c,item:i,matches:s})}})),a}},{key:"_findMatches",value:function(e){var t=e.key,n=e.value,r=e.searcher;if(!k(n))return[];var i=[];if(v(n))n.forEach((function(e){var n=e.v,o=e.i,c=e.n;if(k(n)){var a=r.searchIn(n),s=a.isMatch,u=a.score,h=a.indices;s&&i.push({score:u,key:t,value:n,idx:o,norm:c,indices:h})}}));else{var o=n.v,c=n.n,a=r.searchIn(o),s=a.isMatch,u=a.score,h=a.indices;s&&i.push({score:u,key:t,value:o,norm:c,indices:h})}return i}}]),e}();return ye.version="6.6.2-beta.7",ye.createIndex=F,ye.parseIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?I.getFn:n,i=t.fieldNormWeight,o=void 0===i?I.fieldNormWeight:i,c=e.keys,a=e.records,s=new $({getFn:r,fieldNormWeight:o});return s.setKeys(c),s.setIndexRecords(a),s},ye.config=I,function(){ne.push.apply(ne,arguments)}(te),ye},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t(); \ No newline at end of file diff --git a/package.json b/package.json index f3151d2ec..2f6d93b04 100644 --- a/package.json +++ b/package.json @@ -43,8 +43,7 @@ }, "standard-version": { "scripts": { - "postbump": "yarn build && yarn lint && yarn test 2>/dev/null", - "precommit": "git add dist/*.js dist/*.ts" + "postbump": "yarn build && yarn lint && yarn test 2>/dev/null" } }, "husky": {