diff --git a/dist/fuse.basic.common.cjs b/dist/fuse.basic.cjs similarity index 100% rename from dist/fuse.basic.common.cjs rename to dist/fuse.basic.cjs diff --git a/dist/fuse.basic.common.min.cjs b/dist/fuse.basic.common.min.cjs deleted file mode 100644 index 790366f4b..000000000 --- a/dist/fuse.basic.common.min.cjs +++ /dev/null @@ -1,1253 +0,0 @@ -/** - * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2023 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, _toPropertyKey(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) { - key = _toPropertyKey(key); - 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 _toPrimitive(input, hint) { - if (typeof input !== "object" || input === null) return input; - var prim = input[Symbol.toPrimitive]; - if (prim !== undefined) { - var res = prim.call(input, hint || "default"); - if (typeof res !== "object") return res; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return (hint === "string" ? String : Number)(input); -} -function _toPropertyKey(arg) { - var key = _toPrimitive(arg, "string"); - return typeof key === "symbol" ? key : String(key); -} - -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 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)) { - 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 _score = computeScore$1(pattern, { - errors: _i, - currentLocation: expectedLocation + binMid, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: 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; - 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 _score2 = computeScore$1(pattern, { - errors: _i + 1, - currentLocation: expectedLocation, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - if (_score2 > 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); -} - -// Practical scoring function -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; - 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) : 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) { - 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) { - 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'; -Fuse$1.createIndex = createIndex; -Fuse$1.parseIndex = parseIndex; -Fuse$1.config = Config; -var Fuse = Fuse$1; - -module.exports = Fuse; diff --git a/dist/fuse.basic.esm.min.mjs b/dist/fuse.basic.esm.min.mjs deleted file mode 100644 index 540df6ce8..000000000 --- a/dist/fuse.basic.esm.min.mjs +++ /dev/null @@ -1,1170 +0,0 @@ -/** - * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2023 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 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) -} - -// 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 } = {}) { - const { - includeMatches, - includeScore, - shouldSort, - sortFn, - ignoreFieldNorm - } = this.options; - - let results = isString(query) - ? isString(this._docs[0]) - ? this._searchStringList(query) - : this._searchObjectList(query) - : 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) { - 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) => { - 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'; -Fuse.createIndex = createIndex; -Fuse.parseIndex = parseIndex; -Fuse.config = Config; - -export { Fuse as default }; diff --git a/dist/fuse.basic.min.cjs b/dist/fuse.basic.min.cjs new file mode 100644 index 000000000..e79d45afc --- /dev/null +++ b/dist/fuse.basic.min.cjs @@ -0,0 +1,9 @@ +/** + * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2023 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +"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]:{},n=t.getFn,i=void 0===n?O.getFn:n,o=t.fieldNormWeight,a=void 0===o?O.fieldNormWeight:o;r(this,e),this.norm=function(){var e=arguments.length>0&&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(j).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()}}}(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,f(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();f(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?O.getFn:r,o=n.fieldNormWeight,a=void 0===o?O.fieldNormWeight:o,c=new A({getFn:i,fieldNormWeight:a});return c.setKeys(e.map(x)),c.setSources(t),c.create(),c}function I(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?O.distance:s,u=t.ignoreLocation,l=void 0===u?O.ignoreLocation:u,d=r/e.length;if(l)return d;var f=Math.abs(c-o);return h?d+f/h:f?1:d}var F=32;function C(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?O.location:i,a=r.distance,c=void 0===a?O.distance:a,s=r.threshold,h=void 0===s?O.threshold:s,u=r.findAllMatches,l=void 0===u?O.findAllMatches:u,d=r.minMatchCharLength,f=void 0===d?O.minMatchCharLength:d,v=r.includeMatches,g=void 0===v?O.includeMatches:v,y=r.ignoreLocation,p=void 0===y?O.ignoreLocation:y;if(t.length>F)throw new Error("Pattern length exceeds max of ".concat(F,"."));for(var m,b=t.length,k=e.length,M=Math.max(0,Math.min(o,k)),w=h,x=M,L=f>1||g,S=L?Array(k):[];(m=e.indexOf(t,x))>-1;){var _=I(t,{currentLocation:m,expectedLocation:M,distance:c,ignoreLocation:p});if(w=Math.min(_,w),x=m+b,L)for(var j=0;j=D;J-=1){var R=J-1,T=n[e.charAt(R)];if(L&&(S[R]=+!!T),z[J]=(z[J+1]<<1|1)&T,P&&(z[J]|=(A[J+1]|A[J])<<1|1|A[J+1]),z[J]&N&&(E=I(t,{errors:P,currentLocation:R,expectedLocation:M,distance:c,ignoreLocation:p}))<=w){if(w=E,(x=R)<=M)break;D=Math.max(1,2*M-x)}}if(I(t,{errors:P+1,currentLocation:M,expectedLocation:M,distance:c,ignoreLocation:p})>w)break;A=z}var U={isMatch:x>=0,score:Math.max(.001,E)};if(L){var B=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:O.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}(S,f);B.length?g&&(U.indices=B):U.isMatch=!1}return U}function N(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,a=void 0===o?O.location:o,c=i.threshold,s=void 0===c?O.threshold:c,h=i.distance,u=void 0===h?O.distance:h,l=i.includeMatches,d=void 0===l?O.includeMatches:l,f=i.findAllMatches,v=void 0===f?O.findAllMatches:f,g=i.minMatchCharLength,y=void 0===g?O.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?O.isCaseSensitive:p,b=i.ignoreLocation,k=void 0===b?O.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:N(e),startIndex:t})},w=this.pattern.length;if(w>F){for(var x=0,L=w%F,S=w-L;x-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function K(e,t){t.score=e.score}var z=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({},O),i),this.options.useExtendedSearch)throw new Error("Extended search is not available");this._keyStore=new w(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof A))throw new Error("Incorrect 'index' type");this._myIndex=t||E(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){y(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]:{}).limit,n=void 0===t?-1:t,r=this.options,i=r.includeMatches,o=r.includeScore,a=r.shouldSort,c=r.sortFn,s=r.ignoreFieldNorm,h=f(e)?f(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return function(e,t){var n=t.ignoreFieldNorm,r=void 0===n?O.ignoreFieldNorm:n;e.forEach((function(e){var t=1;e.matches.forEach((function(e){var n=e.key,i=e.norm,o=e.score,a=n?n.weight:null;t*=Math.pow(0===o&&a?Number.EPSILON:o,(a||1)*(r?1:i))})),e.score=t}))}(h,{ignoreFieldNorm:s}),a&&h.sort(c),v(n)&&n>-1&&(h=h.slice(0,n)),function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?O.includeMatches:r,o=n.includeScore,a=void 0===o?O.includeScore:o,c=[];return i&&c.push(D),a&&c.push(K),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}))}(h,this._docs,{includeMatches:i,includeScore:o})}},{key:"_searchStringList",value:function(e){var t=$(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(y(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){var t=this,n=$(e,this.options),r=this._myIndex,i=r.keys,o=r.records,a=[];return o.forEach((function(e){var r=e.$,o=e.i;if(y(r)){var s=[];i.forEach((function(e,i){s.push.apply(s,c(t._findMatches({key:e,value:r[i],searcher:n})))})),s.length&&a.push({idx:o,item:r,matches:s})}})),a}},{key:"_findMatches",value:function(e){var t=e.key,n=e.value,r=e.searcher;if(!y(n))return[];var i=[];if(u(n))n.forEach((function(e){var n=e.v,o=e.i,a=e.n;if(y(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,h=c.score,l=c.indices;s&&i.push({score:h,key:t,value:o,norm:a,indices:l})}return i}}]),e}();z.version="6.6.2",z.createIndex=E,z.parseIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?O.getFn:n,i=t.fieldNormWeight,o=void 0===i?O.fieldNormWeight:i,a=e.keys,c=e.records,s=new A({getFn:r,fieldNormWeight:o});return s.setKeys(a),s.setIndexRecords(c),s},z.config=O;var J=z;module.exports=J; \ No newline at end of file diff --git a/dist/fuse.basic.min.mjs b/dist/fuse.basic.min.mjs new file mode 100644 index 000000000..e29d9e7fb --- /dev/null +++ b/dist/fuse.basic.min.mjs @@ -0,0 +1,9 @@ +/** + * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2023 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]"===h(t)}const e=1/0;function n(t){return null==t?"":function(t){if("string"==typeof t)return t;let n=t+"";return"0"==n&&1/t==-e?"-0":n}(t)}function i(t){return"string"==typeof t}function s(t){return"number"==typeof t}function r(t){return!0===t||!1===t||function(t){return function(t){return"object"==typeof t}(t)&&null!==t}(t)&&"[object Boolean]"==h(t)}function o(t){return null!=t}function c(t){return!t.trim().length}function h(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":Object.prototype.toString.call(t)}const a=t=>`Missing ${t} property in key`,l=t=>`Property 'weight' in key '${t}' must be a positive integer`,d=Object.prototype.hasOwnProperty;class u{constructor(t){this._keys=[],this._keyMap={};let e=0;t.forEach((t=>{let n=f(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 f(e){let n=null,s=null,r=null,o=1,c=null;if(i(e)||t(e))r=e,n=g(e),s=p(e);else{if(!d.call(e,"name"))throw new Error(a("name"));const t=e.name;if(r=t,d.call(e,"weight")&&(o=e.weight,o<=0))throw new Error(l(t));n=g(t),s=p(t),c=e.getFn}return{path:n,id:s,weight:o,src:r,getFn:c}}function g(e){return t(e)?e:e.split(".")}function p(e){return t(e)?e.join("."):e}var m={isCaseSensitive:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(t,e)=>t.score===e.score?t.idx{if(o(e))if(c[d]){const u=e[c[d]];if(!o(u))return;if(d===c.length-1&&(i(u)||s(u)||r(u)))h.push(n(u));else if(t(u)){a=!0;for(let t=0,e=u.length;t{this._keysMap[t.id]=e}))}create(){!this.isCreated&&this.docs.length&&(this.isCreated=!0,i(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 e=this.size();i(t)?this._addString(t,e):this._addObject(t,e)}removeAt(t){this.records.splice(t,1);for(let e=t,n=this.size();e{let h=n.getFn?n.getFn(e):this.getFn(e,n.path);if(o(h))if(t(h)){let e=[];const n=[{nestedArrIndex:-1,value:h}];for(;n.length;){const{nestedArrIndex:s,value:r}=n.pop();if(o(r))if(i(r)&&!c(r)){let t={v:r,i:s,n:this.norm.get(r)};e.push(t)}else t(r)&&r.forEach(((t,e)=>{n.push({nestedArrIndex:e,value:t})}))}s.$[r]=e}else if(i(h)&&!c(h)){let t={v:h,n:this.norm.get(h)};s.$[r]=t}})),this.records.push(s)}toJSON(){return{keys:this.keys,records:this.records}}}function x(t,e,{getFn:n=m.getFn,fieldNormWeight:i=m.fieldNormWeight}={}){const s=new M({getFn:n,fieldNormWeight:i});return s.setKeys(t.map(f)),s.setSources(e),s.create(),s}function L(t,{errors:e=0,currentLocation:n=0,expectedLocation:i=0,distance:s=m.distance,ignoreLocation:r=m.ignoreLocation}={}){const o=e/t.length;if(r)return o;const c=Math.abs(i-n);return s?o+c/s:c?1:o}const _=32;function k(t,e,n,{location:i=m.location,distance:s=m.distance,threshold:r=m.threshold,findAllMatches:o=m.findAllMatches,minMatchCharLength:c=m.minMatchCharLength,includeMatches:h=m.includeMatches,ignoreLocation:a=m.ignoreLocation}={}){if(e.length>_)throw new Error(`Pattern length exceeds max of ${_}.`);const l=e.length,d=t.length,u=Math.max(0,Math.min(i,d));let f=r,g=u;const p=c>1||h,y=p?Array(d):[];let M;for(;(M=t.indexOf(e,g))>-1;){let t=L(e,{currentLocation:M,expectedLocation:u,distance:s,ignoreLocation:a});if(f=Math.min(t,f),g=M+l,p){let t=0;for(;t=h;r-=1){let o=r-1,c=n[t.charAt(o)];if(p&&(y[o]=+!!c),M[r]=(M[r+1]<<1|1)&c,i&&(M[r]|=(x[r+1]|x[r])<<1|1|x[r+1]),M[r]&w&&(k=L(e,{errors:i,currentLocation:o,expectedLocation:u,distance:s,ignoreLocation:a}),k<=f)){if(f=k,g=o,g<=u)break;h=Math.max(1,2*u-g)}}if(L(e,{errors:i+1,currentLocation:u,expectedLocation:u,distance:s,ignoreLocation:a})>f)break;x=M}const I={isMatch:g>=0,score:Math.max(.001,k)};if(p){const t=function(t=[],e=m.minMatchCharLength){let n=[],i=-1,s=-1,r=0;for(let o=t.length;r=e&&n.push([i,s]),i=-1)}return t[r-1]&&r-i>=e&&n.push([i,r-1]),n}(y,c);t.length?h&&(I.indices=t):I.isMatch=!1}return I}function v(t){let e={};for(let n=0,i=t.length;n{this.chunks.push({pattern:t,alphabet:v(t),startIndex:e})},l=this.pattern.length;if(l>_){let t=0;const e=l%_,n=l-e;for(;t{const{isMatch:g,score:p,indices:m}=k(t,e,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 I=[];function S(t,e){for(let n=0,i=I.length;n{if(!o(t.indices)||!t.indices.length)return;const{indices:n,value:i}=t;let s={indices:n,value:i};t.key&&(s.key=t.key.src),t.idx>-1&&(s.refIndex=t.idx),e.matches.push(s)}))}function F(t,e){e.score=t.score}class A{constructor(t,e={},n){if(this.options={...m,...e},this.options.useExtendedSearch)throw new Error("Extended search is not available");this._keyStore=new u(this.options.keys),this.setCollection(t,n)}setCollection(t,e){if(this._docs=t,e&&!(e instanceof M))throw new Error("Incorrect 'index' type");this._myIndex=e||x(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(t){o(t)&&(this._docs.push(t),this._myIndex.add(t))}remove(t=(()=>!1)){const e=[];for(let n=0,i=this._docs.length;n{let n=1;t.matches.forEach((({key:t,norm:i,score:s})=>{const r=t?t.weight:null;n*=Math.pow(0===s&&r?Number.EPSILON:s,(r||1)*(e?1:i))})),t.score=n}))}(a,{ignoreFieldNorm:h}),o&&a.sort(c),s(e)&&e>-1&&(a=a.slice(0,e)),function(t,e,{includeMatches:n=m.includeMatches,includeScore:i=m.includeScore}={}){const s=[];return n&&s.push(E),i&&s.push(F),t.map((t=>{const{idx:n}=t,i={item:e[n],refIndex:n};return s.length&&s.forEach((e=>{e(t,i)})),i}))}(a,this._docs,{includeMatches:n,includeScore:r})}_searchStringList(t){const e=S(t,this.options),{records:n}=this._myIndex,i=[];return n.forEach((({v:t,i:n,n:s})=>{if(!o(t))return;const{isMatch:r,score:c,indices:h}=e.searchIn(t);r&&i.push({item:t,idx:n,matches:[{score:c,value:t,norm:s,indices:h}]})})),i}_searchLogical(t){throw new Error("Logical search is not available")}_searchObjectList(t){const e=S(t,this.options),{keys:n,records:i}=this._myIndex,s=[];return i.forEach((({$:t,i:i})=>{if(!o(t))return;let r=[];n.forEach(((n,i)=>{r.push(...this._findMatches({key:n,value:t[i],searcher:e}))})),r.length&&s.push({idx:i,item:t,matches:r})})),s}_findMatches({key:e,value:n,searcher:i}){if(!o(n))return[];let s=[];if(t(n))n.forEach((({v:t,i:n,n:r})=>{if(!o(t))return;const{isMatch:c,score:h,indices:a}=i.searchIn(t);c&&s.push({score:h,key:e,value:t,idx:n,norm:r,indices:a})}));else{const{v:t,n:r}=n,{isMatch:o,score:c,indices:h}=i.searchIn(t);o&&s.push({score:c,key:e,value:t,norm:r,indices:h})}return s}}A.version="6.6.2",A.createIndex=x,A.parseIndex=function(t,{getFn:e=m.getFn,fieldNormWeight:n=m.fieldNormWeight}={}){const{keys:i,records:s}=t,r=new M({getFn:e,fieldNormWeight:n});return r.setKeys(i),r.setIndexRecords(s),r},A.config=m;export{A as default}; \ No newline at end of file diff --git a/dist/fuse.basic.esm.mjs b/dist/fuse.basic.mjs similarity index 100% rename from dist/fuse.basic.esm.mjs rename to dist/fuse.basic.mjs diff --git a/dist/fuse.common.cjs b/dist/fuse.cjs similarity index 100% rename from dist/fuse.common.cjs rename to dist/fuse.cjs diff --git a/dist/fuse.common.min.cjs b/dist/fuse.common.min.cjs deleted file mode 100644 index a9d44f56b..000000000 --- a/dist/fuse.common.min.cjs +++ /dev/null @@ -1,2001 +0,0 @@ -/** - * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2023 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, _toPropertyKey(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) { - key = _toPropertyKey(key); - 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"); - } - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }); - Object.defineProperty(subClass, "prototype", { - writable: false - }); - if (superClass) _setPrototypeOf(subClass, superClass); -} -function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); -} -function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : 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 _toPrimitive(input, hint) { - if (typeof input !== "object" || input === null) return input; - var prim = input[Symbol.toPrimitive]; - if (prim !== undefined) { - var res = prim.call(input, hint || "default"); - if (typeof res !== "object") return res; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return (hint === "string" ? String : Number)(input); -} -function _toPropertyKey(arg) { - var key = _toPrimitive(arg, "string"); - return typeof key === "symbol" ? key : String(key); -} - -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)) { - 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 _score = computeScore$1(pattern, { - errors: _i, - currentLocation: expectedLocation + binMid, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: 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; - 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 _score2 = computeScore$1(pattern, { - errors: _i + 1, - currentLocation: expectedLocation, - expectedLocation: expectedLocation, - distance: distance, - ignoreLocation: ignoreLocation - }); - if (_score2 > 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 search( /*text*/) {} - }], [{ - 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); - -// ā¯—Order is important. DO NOT CHANGE. -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; - }); -} - -// These extended matchers can return an array of matches, as opposed -// 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); -} - -// Practical scoring function -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; - 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) : 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) { - 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) { - 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'; -Fuse$1.createIndex = createIndex; -Fuse$1.parseIndex = parseIndex; -Fuse$1.config = Config; -{ - register(ExtendedSearch); -} -var Fuse = Fuse$1; - -module.exports = Fuse; diff --git a/dist/fuse.esm.min.mjs b/dist/fuse.esm.min.mjs deleted file mode 100644 index 582158607..000000000 --- a/dist/fuse.esm.min.mjs +++ /dev/null @@ -1,1774 +0,0 @@ -/** - * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2023 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 } = {}) { - const { - includeMatches, - includeScore, - shouldSort, - sortFn, - ignoreFieldNorm - } = this.options; - - let results = isString(query) - ? isString(this._docs[0]) - ? this._searchStringList(query) - : this._searchObjectList(query) - : 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) { - 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) => { - 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'; -Fuse.createIndex = createIndex; -Fuse.parseIndex = parseIndex; -Fuse.config = Config; - -{ - register(ExtendedSearch); -} - -export { Fuse as default }; diff --git a/dist/fuse.min.cjs b/dist/fuse.min.cjs new file mode 100644 index 000000000..9f55a1c6b --- /dev/null +++ b/dist/fuse.min.cjs @@ -0,0 +1,9 @@ +/** + * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2023 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +"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]:{},n=t.getFn,i=void 0===n?$.getFn:n,o=t.fieldNormWeight,c=void 0===o?$.fieldNormWeight:o;r(this,e),this.norm=function(){var e=arguments.length>0&&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(F).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()}}}(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,m(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();m(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?$.getFn:r,o=n.fieldNormWeight,c=void 0===o?$.fieldNormWeight:o,a=new R({getFn:i,fieldNormWeight:c});return a.setKeys(e.map(A)),a.setSources(t),a.create(),a}function N(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?$.distance:s,h=t.ignoreLocation,l=void 0===h?$.ignoreLocation:h,f=r/e.length;if(l)return f;var d=Math.abs(a-o);return u?f+d/u:d?1:f}var W=32;function z(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?$.location:i,c=r.distance,a=void 0===c?$.distance:c,s=r.threshold,u=void 0===s?$.threshold:s,h=r.findAllMatches,l=void 0===h?$.findAllMatches:h,f=r.minMatchCharLength,d=void 0===f?$.minMatchCharLength:f,v=r.includeMatches,g=void 0===v?$.includeMatches:v,y=r.ignoreLocation,p=void 0===y?$.ignoreLocation:y;if(t.length>W)throw new Error("Pattern length exceeds max of ".concat(W,"."));for(var m,k=t.length,M=e.length,b=Math.max(0,Math.min(o,M)),x=u,w=b,S=d>1||g,L=S?Array(M):[];(m=e.indexOf(t,w))>-1;){var _=N(t,{currentLocation:m,expectedLocation:b,distance:a,ignoreLocation:p});if(x=Math.min(_,x),w=m+k,S)for(var O=0;O=P;K-=1){var T=K-1,q=n[e.charAt(T)];if(S&&(L[T]=+!!q),D[K]=(D[K+1]<<1|1)&q,E&&(D[K]|=(j[K+1]|j[K])<<1|1|j[K+1]),D[K]&C&&(A=N(t,{errors:E,currentLocation:T,expectedLocation:b,distance:a,ignoreLocation:p}))<=x){if(x=A,(w=T)<=b)break;P=Math.max(1,2*b-w)}}if(N(t,{errors:E+1,currentLocation:b,expectedLocation:b,distance:a,ignoreLocation:p})>x)break;j=D}var B={isMatch:w>=0,score:Math.max(.001,A)};if(S){var J=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:$.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}(L,d);J.length?g&&(B.indices=J):B.isMatch=!1}return B}function D(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,c=void 0===o?$.location:o,a=i.threshold,s=void 0===a?$.threshold:a,u=i.distance,h=void 0===u?$.distance:u,l=i.includeMatches,f=void 0===l?$.includeMatches:l,d=i.findAllMatches,v=void 0===d?$.findAllMatches:d,g=i.minMatchCharLength,y=void 0===g?$.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?$.isCaseSensitive:p,k=i.ignoreLocation,M=void 0===k?$.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:D(e),startIndex:t})},x=this.pattern.length;if(x>W){for(var w=0,S=x%W,L=x-S;w1&&void 0!==arguments[1]?arguments[1]:{},c=o.location,a=void 0===c?$.location:c,s=o.threshold,u=void 0===s?$.threshold:s,h=o.distance,l=void 0===h?$.distance:h,f=o.includeMatches,d=void 0===f?$.includeMatches:f,v=o.findAllMatches,g=void 0===v?$.findAllMatches:v,y=o.minMatchCharLength,p=void 0===y?$.minMatchCharLength:y,m=o.isCaseSensitive,k=void 0===m?$.isCaseSensitive:m,M=o.ignoreLocation,b=void 0===M?$.ignoreLocation:M;return r(this,n),(i=t.call(this,e))._bitapSearch=new K(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}(),X=function(e){a(n,T);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}(),Y=[B,X,U,V,H,G,J,Q],Z=Y.length,ee=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/;var te=new Set([Q.type,X.type]),ne=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=n.isCaseSensitive,o=void 0===i?$.isCaseSensitive:i,c=n.includeMatches,a=void 0===c?$.includeMatches:c,s=n.minMatchCharLength,u=void 0===s?$.minMatchCharLength:s,h=n.ignoreLocation,l=void 0===h?$.ignoreLocation:h,f=n.findAllMatches,d=void 0===f?$.findAllMatches:f,v=n.location,g=void 0===v?$.location:v,y=n.threshold,p=void 0===y?$.threshold:y,m=n.distance,k=void 0===m?$.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=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.split("|").map((function(e){for(var n=e.trim().split(ee).filter((function(e){return e&&!!e.trim()})),r=[],i=0,o=n.length;i2&&void 0!==arguments[2]?arguments[2]:{}).auto,r=void 0===n||n;return ue(e)||(e=he(e)),function e(n){var i=Object.keys(n),o=function(e){return!!e[ae]}(n);if(!o&&i.length>1&&!ue(n))return e(he(n));if(function(e){return!g(e)&&b(e)&&!ue(e)}(n)){var c=o?n[ae]:i[0],a=o?n[se]:n[c];if(!m(a))throw new Error(function(e){return"Invalid value for key ".concat(e)}(c));var s={keyId:C(c),pattern:a};return r&&(s.searcher=ie(a,t)),s}var u={children:[],operator:i[0]};return i.forEach((function(t){var r=n[t];g(r)&&r.forEach((function(t){u.children.push(e(t))}))})),u}(e)}function fe(e,t){var n=e.matches;t.matches=[],x(n)&&n.forEach((function(e){if(x(e.indices)&&e.indices.length){var n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.src),e.idx>-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function de(e,t){t.score=e.score}var ve=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),this.options.useExtendedSearch,this._keyStore=new j(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof R))throw new Error("Incorrect 'index' type");this._myIndex=t||P(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){x(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]:{}).limit,n=void 0===t?-1:t,r=this.options,i=r.includeMatches,o=r.includeScore,c=r.shouldSort,a=r.sortFn,s=r.ignoreFieldNorm,u=m(e)?m(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return function(e,t){var n=t.ignoreFieldNorm,r=void 0===n?$.ignoreFieldNorm:n;e.forEach((function(e){var t=1;e.matches.forEach((function(e){var n=e.key,i=e.norm,o=e.score,c=n?n.weight:null;t*=Math.pow(0===o&&c?Number.EPSILON:o,(c||1)*(r?1:i))})),e.score=t}))}(u,{ignoreFieldNorm:s}),c&&u.sort(a),k(n)&&n>-1&&(u=u.slice(0,n)),function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?$.includeMatches:r,o=n.includeScore,c=void 0===o?$.includeScore:o,a=[];return i&&a.push(fe),c&&a.push(de),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}))}(u,this._docs,{includeMatches:i,includeScore:o})}},{key:"_searchStringList",value:function(e){var t=ie(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(x(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=le(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;u1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?$.getFn:n,i=t.fieldNormWeight,o=void 0===i?$.fieldNormWeight:i,c=e.keys,a=e.records,s=new R({getFn:r,fieldNormWeight:o});return s.setKeys(c),s.setIndexRecords(a),s},ve.config=$,function(){re.push.apply(re,arguments)}(ne);var ge=ve;module.exports=ge; \ No newline at end of file diff --git a/dist/fuse.min.mjs b/dist/fuse.min.mjs new file mode 100644 index 000000000..912955fb9 --- /dev/null +++ b/dist/fuse.min.mjs @@ -0,0 +1,9 @@ +/** + * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2023 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]"===a(t)}const e=1/0;function n(t){return null==t?"":function(t){if("string"==typeof t)return t;let n=t+"";return"0"==n&&1/t==-e?"-0":n}(t)}function s(t){return"string"==typeof t}function i(t){return"number"==typeof t}function r(t){return!0===t||!1===t||function(t){return c(t)&&null!==t}(t)&&"[object Boolean]"==a(t)}function c(t){return"object"==typeof t}function o(t){return null!=t}function h(t){return!t.trim().length}function a(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":Object.prototype.toString.call(t)}const l=t=>`Missing ${t} property in key`,u=t=>`Property 'weight' in key '${t}' must be a positive integer`,d=Object.prototype.hasOwnProperty;class g{constructor(t){this._keys=[],this._keyMap={};let e=0;t.forEach((t=>{let n=f(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 f(e){let n=null,i=null,r=null,c=1,o=null;if(s(e)||t(e))r=e,n=p(e),i=m(e);else{if(!d.call(e,"name"))throw new Error(l("name"));const t=e.name;if(r=t,d.call(e,"weight")&&(c=e.weight,c<=0))throw new Error(u(t));n=p(t),i=m(t),o=e.getFn}return{path:n,id:i,weight:c,src:r,getFn:o}}function p(e){return t(e)?e:e.split(".")}function m(e){return t(e)?e.join("."):e}var M={isCaseSensitive:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(t,e)=>t.score===e.score?t.idx{if(o(e))if(c[u]){const d=e[c[u]];if(!o(d))return;if(u===c.length-1&&(s(d)||i(d)||r(d)))h.push(n(d));else if(t(d)){a=!0;for(let t=0,e=d.length;t{this._keysMap[t.id]=e}))}create(){!this.isCreated&&this.docs.length&&(this.isCreated=!0,s(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 e=this.size();s(t)?this._addString(t,e):this._addObject(t,e)}removeAt(t){this.records.splice(t,1);for(let e=t,n=this.size();e{let c=n.getFn?n.getFn(e):this.getFn(e,n.path);if(o(c))if(t(c)){let e=[];const n=[{nestedArrIndex:-1,value:c}];for(;n.length;){const{nestedArrIndex:i,value:r}=n.pop();if(o(r))if(s(r)&&!h(r)){let t={v:r,i:i,n:this.norm.get(r)};e.push(t)}else t(r)&&r.forEach(((t,e)=>{n.push({nestedArrIndex:e,value:t})}))}i.$[r]=e}else if(s(c)&&!h(c)){let t={v:c,n:this.norm.get(c)};i.$[r]=t}})),this.records.push(i)}toJSON(){return{keys:this.keys,records:this.records}}}function L(t,e,{getFn:n=M.getFn,fieldNormWeight:s=M.fieldNormWeight}={}){const i=new y({getFn:n,fieldNormWeight:s});return i.setKeys(t.map(f)),i.setSources(e),i.create(),i}function k(t,{errors:e=0,currentLocation:n=0,expectedLocation:s=0,distance:i=M.distance,ignoreLocation:r=M.ignoreLocation}={}){const c=e/t.length;if(r)return c;const o=Math.abs(s-n);return i?c+o/i:o?1:c}const _=32;function v(t,e,n,{location:s=M.location,distance:i=M.distance,threshold:r=M.threshold,findAllMatches:c=M.findAllMatches,minMatchCharLength:o=M.minMatchCharLength,includeMatches:h=M.includeMatches,ignoreLocation:a=M.ignoreLocation}={}){if(e.length>_)throw new Error(`Pattern length exceeds max of ${_}.`);const l=e.length,u=t.length,d=Math.max(0,Math.min(s,u));let g=r,f=d;const p=o>1||h,m=p?Array(u):[];let x;for(;(x=t.indexOf(e,f))>-1;){let t=k(e,{currentLocation:x,expectedLocation:d,distance:i,ignoreLocation:a});if(g=Math.min(t,g),f=x+l,p){let t=0;for(;t=h;r-=1){let c=r-1,o=n[t.charAt(c)];if(p&&(m[c]=+!!o),x[r]=(x[r+1]<<1|1)&o,s&&(x[r]|=(y[r+1]|y[r])<<1|1|y[r+1]),x[r]&S&&(L=k(e,{errors:s,currentLocation:c,expectedLocation:d,distance:i,ignoreLocation:a}),L<=g)){if(g=L,f=c,f<=d)break;h=Math.max(1,2*d-f)}}if(k(e,{errors:s+1,currentLocation:d,expectedLocation:d,distance:i,ignoreLocation:a})>g)break;y=x}const C={isMatch:f>=0,score:Math.max(.001,L)};if(p){const t=function(t=[],e=M.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}(m,o);t.length?h&&(C.indices=t):C.isMatch=!1}return C}function S(t){let e={};for(let n=0,s=t.length;n{this.chunks.push({pattern:t,alphabet:S(t),startIndex:e})},l=this.pattern.length;if(l>_){let t=0;const e=l%_,n=l-e;for(;t{const{isMatch:f,score:p,indices:m}=v(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 I{constructor(t){this.pattern=t}static isMultiMatch(t){return w(t,this.multiRegex)}static isSingleMatch(t){return w(t,this.singleRegex)}search(){}}function w(t,e){const n=t.match(e);return n?n[1]:null}class $ extends I{constructor(t,{location:e=M.location,threshold:n=M.threshold,distance:s=M.distance,includeMatches:i=M.includeMatches,findAllMatches:r=M.findAllMatches,minMatchCharLength:c=M.minMatchCharLength,isCaseSensitive:o=M.isCaseSensitive,ignoreLocation:h=M.ignoreLocation}={}){super(t),this._bitapSearch=new C(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 A extends I{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 E=[class extends I{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]}}},A,class extends I{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 I{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 I{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 I{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 I{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]}}},$],b=E.length,F=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/;const N=new Set([$.type,A.type]);class R{constructor(t,{isCaseSensitive:e=M.isCaseSensitive,includeMatches:n=M.includeMatches,minMatchCharLength:s=M.minMatchCharLength,ignoreLocation:i=M.ignoreLocation,findAllMatches:r=M.findAllMatches,location:c=M.location,threshold:o=M.threshold,distance:h=M.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(F).filter((t=>t&&!!t.trim())),s=[];for(let t=0,i=n.length;t!(!t[W]&&!t[z]),J=t=>({[W]:Object.keys(t).map((e=>({[e]:t[e]})))});function V(e,n,{auto:i=!0}={}){const r=e=>{let o=Object.keys(e);const h=(t=>!!t[K])(e);if(!h&&o.length>1&&!q(e))return r(J(e));if((e=>!t(e)&&c(e)&&!q(e))(e)){const t=h?e[K]:o[0],r=h?e[P]:e[t];if(!s(r))throw new Error((t=>`Invalid value for key ${t}`)(t));const c={keyId:m(t),pattern:r};return i&&(c.searcher=j(r,n)),c}let a={children:[],operator:o[0]};return o.forEach((n=>{const s=e[n];t(s)&&s.forEach((t=>{a.children.push(r(t))}))})),a};return q(e)||(e=J(e)),r(e)}function B(t,e){const n=t.matches;e.matches=[],o(n)&&n.forEach((t=>{if(!o(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 U(t,e){e.score=t.score}class D{constructor(t,e={},n){this.options={...M,...e},this.options.useExtendedSearch,this._keyStore=new g(this.options.keys),this.setCollection(t,n)}setCollection(t,e){if(this._docs=t,e&&!(e instanceof y))throw new Error("Incorrect 'index' type");this._myIndex=e||L(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(t){o(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}))}(a,{ignoreFieldNorm:h}),c&&a.sort(o),i(e)&&e>-1&&(a=a.slice(0,e)),function(t,e,{includeMatches:n=M.includeMatches,includeScore:s=M.includeScore}={}){const i=[];return n&&i.push(B),s&&i.push(U),t.map((t=>{const{idx:n}=t,s={item:e[n],refIndex:n};return i.length&&i.forEach((e=>{e(t,s)})),s}))}(a,this._docs,{includeMatches:n,includeScore:r})}_searchStringList(t){const e=j(t,this.options),{records:n}=this._myIndex,s=[];return n.forEach((({v:t,i:n,n:i})=>{if(!o(t))return;const{isMatch:r,score:c,indices:h}=e.searchIn(t);r&&s.push({item:t,idx:n,matches:[{score:c,value:t,norm:i,indices:h}]})})),s}_searchLogical(t){const e=V(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(o(t)){let c=n(e,t,s);c.length&&(i[s]||(i[s]={idx:s,item:t,matches:[]},r.push(i[s])),c.forEach((({matches:t})=>{i[s].matches.push(...t)})))}})),r}_searchObjectList(t){const e=j(t,this.options),{keys:n,records:s}=this._myIndex,i=[];return s.forEach((({$:t,i:s})=>{if(!o(t))return;let r=[];n.forEach(((n,s)=>{r.push(...this._findMatches({key:n,value:t[s],searcher:e}))})),r.length&&i.push({idx:s,item:t,matches:r})})),i}_findMatches({key:e,value:n,searcher:s}){if(!o(n))return[];let i=[];if(t(n))n.forEach((({v:t,i:n,n:r})=>{if(!o(t))return;const{isMatch:c,score:h,indices:a}=s.searchIn(t);c&&i.push({score:h,key:e,value:t,idx:n,norm:r,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}}D.version="6.6.2",D.createIndex=L,D.parseIndex=function(t,{getFn:e=M.getFn,fieldNormWeight:n=M.fieldNormWeight}={}){const{keys:s,records:i}=t,r=new y({getFn:e,fieldNormWeight:n});return r.setKeys(s),r.setIndexRecords(i),r},D.config=M,function(...t){O.push(...t)}(R);export{D as default}; \ No newline at end of file diff --git a/dist/fuse.esm.mjs b/dist/fuse.mjs similarity index 100% rename from dist/fuse.esm.mjs rename to dist/fuse.mjs diff --git a/package.json b/package.json index 8ef6ba287..d2011be25 100644 --- a/package.json +++ b/package.json @@ -6,31 +6,31 @@ "url": "http://kiro.me" }, "type": "module", - "main": "./dist/fuse.common.cjs", - "module": "./dist/fuse.esm.mjs", + "main": "./dist/fuse.cjs", + "module": "./dist/fuse.mjs", "unpkg": "./dist/fuse.js", "jsdelivr": "./dist/fuse.js", "types": "./dist/fuse.d.ts", "exports": { ".": { "types": "./dist/fuse.d.ts", - "import": "./dist/fuse.esm.mjs", - "require": "./dist/fuse.common.cjs" + "import": "./dist/fuse.mjs", + "require": "./dist/fuse.cjs" }, "./min": { "types": "./dist/fuse.d.ts", - "import": "./dist/fuse.esm.min.mjs", - "require": "./dist/fuse.common.min.cjs" + "import": "./dist/fuse.min.mjs", + "require": "./dist/fuse.min.cjs" }, "./basic": { "types": "./dist/fuse.d.ts", - "import": "./dist/fuse.basic.esm.mjs", - "require": "./dist/fuse.basic.common.cjs" + "import": "./dist/fuse.basic.mjs", + "require": "./dist/fuse.basic.cjs" }, "./min-basic": { "types": "./dist/fuse.d.ts", - "import": "./dist/fuse.basic.esm.min.mjs", - "require": "./dist/fuse.basic.common.min.cjs" + "import": "./dist/fuse.basic.min.mjs", + "require": "./dist/fuse.basic.min.cjs" } }, "sideEffects": false, diff --git a/scripts/build.main.cjs b/scripts/build.main.cjs index 073de1a69..5f41bb034 100644 --- a/scripts/build.main.cjs +++ b/scripts/build.main.cjs @@ -31,7 +31,7 @@ async function build(builds) { async function buildEntry(config) { const output = config.output const { file, banner } = output - const isProd = /(min|prod)\.js$/.test(file) + const isProd = /(min|prod)\.(?:c|m)?js$/.test(file) try { let bundle = await rollup.rollup(config) diff --git a/scripts/configs.cjs b/scripts/configs.cjs index 9ee68a2a0..0861f7b78 100644 --- a/scripts/configs.cjs +++ b/scripts/configs.cjs @@ -63,7 +63,7 @@ const builds = { }, // CommonJS full build 'commonjs-dev-full': { - dest: `dist/${FILENAME}.common.cjs`, + dest: `dist/${FILENAME}.cjs`, env: 'development', features: { ...fullBuildFeatures @@ -72,7 +72,7 @@ const builds = { }, // CommonJS full minified build 'commonjs-prod-full': { - dest: `dist/${FILENAME}.common.min.cjs`, + dest: `dist/${FILENAME}.min.cjs`, env: 'production', features: { ...fullBuildFeatures @@ -81,19 +81,19 @@ const builds = { }, // CommonJS basic build 'commonjs-dev-basic': { - dest: `dist/${FILENAME}.basic.common.cjs`, + dest: `dist/${FILENAME}.basic.cjs`, env: 'development', format: 'cjs' }, // CommonJS basic minified build 'commonjs-prod-basic': { - dest: `dist/${FILENAME}.basic.common.min.cjs`, + dest: `dist/${FILENAME}.basic.min.cjs`, env: 'production', format: 'cjs' }, // ES modules build (for bundlers) 'esm-dev-full': { - dest: `dist/${FILENAME}.esm.mjs`, + dest: `dist/${FILENAME}.mjs`, format: 'es', env: 'development', features: { @@ -102,7 +102,7 @@ const builds = { transpile: false }, 'esm-prod-full': { - dest: `dist/${FILENAME}.esm.min.mjs`, + dest: `dist/${FILENAME}.min.mjs`, format: 'es', env: 'production', features: { @@ -111,13 +111,13 @@ const builds = { transpile: false }, 'esm-basic': { - dest: `dist/${FILENAME}.basic.esm.mjs`, + dest: `dist/${FILENAME}.basic.mjs`, format: 'es', env: 'development', transpile: false }, 'esm-prod-basic': { - dest: `dist/${FILENAME}.basic.esm.min.mjs`, + dest: `dist/${FILENAME}.basic.min.mjs`, format: 'es', env: 'production', transpile: false diff --git a/test/extended-search.test.js b/test/extended-search.test.js index 51a396487..2bfe5b682 100644 --- a/test/extended-search.test.js +++ b/test/extended-search.test.js @@ -1,4 +1,4 @@ -import Fuse from '../dist/fuse.esm.mjs' +import Fuse from '../dist/fuse.mjs' describe('Searching using extended search', () => { const list = [ diff --git a/test/feature-flags.test.js b/test/feature-flags.test.js index f99731b5a..7cb1a0c18 100644 --- a/test/feature-flags.test.js +++ b/test/feature-flags.test.js @@ -1,5 +1,5 @@ // use basic build so that errors are thrown -import Fuse from '../dist/fuse.basic.esm.mjs' +import Fuse from '../dist/fuse.basic.mjs' import * as ErrorMsg from '../src/core/errorMessages' import Books from './fixtures/books.json' assert { type: "json" } diff --git a/test/fuzzy-search.test.js b/test/fuzzy-search.test.js index 5965f6e69..a35526ee7 100644 --- a/test/fuzzy-search.test.js +++ b/test/fuzzy-search.test.js @@ -1,4 +1,4 @@ -import Fuse from '../dist/fuse.esm.mjs' +import Fuse from '../dist/fuse.mjs' import * as ErrorMsg from '../src/core/errorMessages' const defaultList = ['Apple', 'Orange', 'Banana'] diff --git a/test/indexing.test.js b/test/indexing.test.js index be37395bb..b6d635be6 100644 --- a/test/indexing.test.js +++ b/test/indexing.test.js @@ -1,4 +1,4 @@ -import Fuse from '../dist/fuse.esm.mjs' +import Fuse from '../dist/fuse.mjs' import Books from './fixtures/books.json' assert { type: 'json' } const idx = (result) => result.map((obj) => obj.refIndex) diff --git a/test/logical-search.test.js b/test/logical-search.test.js index f95cff48a..aba17cf58 100644 --- a/test/logical-search.test.js +++ b/test/logical-search.test.js @@ -1,4 +1,4 @@ -import Fuse from '../dist/fuse.esm.mjs' +import Fuse from '../dist/fuse.mjs' import Books from './fixtures/books.json' assert { type: 'json' } const idx = (result) => result.map((obj) => obj.refIndex) diff --git a/test/scoring.test.js b/test/scoring.test.js index 3c8f0c963..0e2834624 100644 --- a/test/scoring.test.js +++ b/test/scoring.test.js @@ -1,4 +1,4 @@ -import Fuse from '../dist/fuse.esm.mjs' +import Fuse from '../dist/fuse.mjs' const defaultList = ['Stove', 'My good friend Steve from college'] const defaultOptions = {}