2020-12-06 14:08:39 +01:00
( function ( global , factory ) { typeof exports === 'object' && typeof module !== 'undefined' ? module . exports = factory ( ) : typeof define === 'function' && define . amd ? define ( factory ) : ( global = global || self , global . Fuse = factory ( ) ) ; } ( this , ( function ( ) { 'use strict' ; function _typeof ( obj ) { "@babel/helpers - typeof" ; if ( typeof Symbol === "function" && typeof Symbol . iterator === "symbol" ) { _typeof = function ( obj ) { return typeof obj ; } ; } else { _typeof = function ( obj ) { return obj && typeof Symbol === "function" && obj . constructor === Symbol && obj !== Symbol . prototype ? "symbol" : typeof obj ; } ; }
return _typeof ( obj ) ; }
function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function _defineProperties ( target , props ) { for ( var i = 0 ; i < props . length ; i ++ ) { var descriptor = props [ i ] ; descriptor . enumerable = descriptor . enumerable || false ; descriptor . configurable = true ; if ( "value" in descriptor ) descriptor . writable = true ; Object . defineProperty ( target , descriptor . key , descriptor ) ; } }
function _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
function _defineProperty ( obj , key , value ) { if ( key in obj ) { Object . defineProperty ( obj , key , { value : value , enumerable : true , configurable : true , writable : true } ) ; } else { obj [ key ] = value ; }
return obj ; }
function ownKeys ( object , enumerableOnly ) { var keys = Object . keys ( object ) ; if ( Object . getOwnPropertySymbols ) { var symbols = Object . getOwnPropertySymbols ( object ) ; if ( 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 = arguments [ i ] != null ? arguments [ i ] : { } ; if ( i % 2 ) { ownKeys ( Object ( source ) , true ) . forEach ( function ( key ) { _defineProperty ( target , key , source [ key ] ) ; } ) ; } else if ( Object . getOwnPropertyDescriptors ) { Object . defineProperties ( target , Object . getOwnPropertyDescriptors ( source ) ) ; } else { ownKeys ( Object ( source ) ) . forEach ( function ( key ) { Object . defineProperty ( target , key , Object . getOwnPropertyDescriptor ( source , key ) ) ; } ) ; } }
return target ; }
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 } } ) ; if ( superClass ) _setPrototypeOf ( subClass , superClass ) ; }
function _getPrototypeOf ( o ) { _getPrototypeOf = Object . setPrototypeOf ? Object . getPrototypeOf : function _getPrototypeOf ( o ) { return o . _ _proto _ _ || Object . getPrototypeOf ( o ) ; } ; return _getPrototypeOf ( o ) ; }
function _setPrototypeOf ( o , p ) { _setPrototypeOf = Object . setPrototypeOf || function _setPrototypeOf ( o , p ) { o . _ _proto _ _ = p ; return o ; } ; return _setPrototypeOf ( o , p ) ; }
function _isNativeReflectConstruct ( ) { if ( typeof Reflect === "undefined" || ! Reflect . construct ) return false ; if ( Reflect . construct . sham ) return false ; if ( typeof Proxy === "function" ) return true ; try { Date . prototype . toString . call ( Reflect . construct ( Date , [ ] , 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 ; }
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" && Symbol . iterator in Object ( iter ) ) return Array . from ( iter ) ; }
function _unsupportedIterableToArray ( o , minLen ) { if ( ! o ) return ; if ( typeof o === "string" ) return _arrayLikeToArray ( o , minLen ) ; var n = Object . prototype . toString . call ( o ) . slice ( 8 , - 1 ) ; if ( n === "Object" && o . constructor ) n = o . constructor . name ; if ( n === "Map" || n === "Set" ) return Array . from ( o ) ; if ( n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/ . test ( n ) ) return _arrayLikeToArray ( o , minLen ) ; }
function _arrayLikeToArray ( arr , len ) { if ( len == null || len > arr . length ) len = arr . length ; for ( var i = 0 , arr2 = new Array ( len ) ; i < len ; i ++ ) arr2 [ i ] = arr [ i ] ; return arr2 ; }
function _nonIterableSpread ( ) { throw new TypeError ( "Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." ) ; }
function isArray ( value ) { return ! Array . isArray ? getTag ( value ) === '[object Array]' : Array . isArray ( value ) ; }
var INFINITY = 1 / 0 ; function baseToString ( value ) { 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' ; }
function isBoolean ( value ) { return value === true || value === false || isObjectLike ( value ) && getTag ( value ) == '[object Boolean]' ; }
function isObject ( value ) { return _typeof ( value ) === 'object' ; }
function isObjectLike ( value ) { return isObject ( value ) && value !== null ; }
function isDefined ( value ) { return value !== undefined && value !== null ; }
function isBlank ( value ) { return ! value . trim ( ) . length ; }
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 = 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 ) ; totalWeight += obj . weight ; _this . _keys . push ( obj ) ; _this . _keyMap [ obj . id ] = obj ; totalWeight += obj . weight ; } ) ; 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 ; 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 ) ; }
return { path : path , id : id , weight : weight , src : src } ; }
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 ] ) { list . push ( obj ) ; } else { var key = path [ index ] ; var value = obj [ key ] ; if ( ! isDefined ( value ) ) { return ; }
if ( index === path . length - 1 && ( isString ( value ) || isNumber ( value ) || isBoolean ( value ) ) ) { list . push ( toString ( value ) ) ; } else if ( isArray ( value ) ) { arr = true ; for ( var i = 0 , len = value . length ; i < len ; i += 1 ) { deepGet ( value [ i ] , path , index + 1 ) ; } } else if ( path . length ) { deepGet ( value , path , index + 1 ) ; } } } ; deepGet ( obj , isString ( path ) ? path . split ( '.' ) : path , 0 ) ; return arr ? list : list [ 0 ] ; }
2021-01-05 21:23:57 +01:00
var MatchOptions = { includeMatches : false , findAllMatches : false , minMatchCharLength : 1 } ; var BasicOptions = { isCaseSensitive : false , includeScore : false , keys : [ ] , shouldSort : true , sortFn : function sortFn ( a , b ) { return a . score === b . score ? a . idx < b . idx ? - 1 : 1 : a . score < b . score ? - 1 : 1 ; } } ; var FuzzyOptions = { location : 0 , threshold : 0.6 , distance : 100 } ; var AdvancedOptions = { useExtendedSearch : false , getFn : get , ignoreLocation : false , ignoreFieldNorm : false } ; var Config = _objectSpread2 ( { } , BasicOptions , { } , MatchOptions , { } , FuzzyOptions , { } , AdvancedOptions ) ; var SPACE = /[^ ]+/g ; function norm ( ) { var mantissa = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : 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 ) ; }
var norm = 1 / Math . sqrt ( numTokens ) ; var n = parseFloat ( Math . round ( norm * m ) / m ) ; cache . set ( numTokens , n ) ; return n ; } , clear : function clear ( ) { cache . clear ( ) ; } } ; }
2020-12-06 14:08:39 +01:00
var FuseIndex = 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 ; _classCallCheck ( this , FuseIndex ) ; this . norm = norm ( 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 ; if ( isString ( this . docs [ 0 ] ) ) { this . docs . forEach ( function ( doc , docIndex ) { _this2 . _addString ( doc , docIndex ) ; } ) ; } else { this . docs . forEach ( function ( doc , docIndex ) { _this2 . _addObject ( doc , docIndex ) ; } ) ; }
this . norm . clear ( ) ; } } , { key : "add" , value : function add ( doc ) { var idx = this . size ( ) ; if ( isString ( doc ) ) { this . _addString ( doc , idx ) ; } else { this . _addObject ( doc , idx ) ; } } } , { key : "removeAt" , value : function removeAt ( idx ) { this . records . splice ( idx , 1 ) ; 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 , $ : { } } ; this . keys . forEach ( function ( key , keyIndex ) { var value = _this3 . getFn ( doc , key . path ) ; if ( ! isDefined ( value ) ) { return ; }
if ( isArray ( value ) ) { ( function ( ) { var subRecords = [ ] ; var stack = [ { nestedArrIndex : - 1 , value : value } ] ; while ( stack . length ) { var _stack$pop = stack . pop ( ) , nestedArrIndex = _stack$pop . nestedArrIndex , _value = _stack$pop . value ; if ( ! isDefined ( _value ) ) { continue ; }
if ( isString ( _value ) && ! isBlank ( _value ) ) { var subRecord = { v : _value , i : nestedArrIndex , n : _this3 . norm . get ( _value ) } ; subRecords . push ( subRecord ) ; } else if ( isArray ( _value ) ) { _value . forEach ( function ( item , k ) { stack . push ( { nestedArrIndex : k , value : item } ) ; } ) ; } }
record . $ [ keyIndex ] = subRecords ; } ) ( ) ; } else if ( ! 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 ; var myIndex = new FuseIndex ( { getFn : getFn } ) ; 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 ; var keys = data . keys , records = data . records ; var myIndex = new FuseIndex ( { getFn : getFn } ) ; myIndex . setKeys ( keys ) ; myIndex . setIndexRecords ( records ) ; return myIndex ; }
function computeScore ( 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 ) { 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 ; } }
if ( matchmask [ i - 1 ] && i - start >= minMatchCharLength ) { indices . push ( [ start , i - 1 ] ) ; }
return indices ; }
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 ; var textLen = text . length ; var expectedLocation = Math . max ( 0 , Math . min ( location , textLen ) ) ; var currentThreshold = threshold ; var bestLocation = expectedLocation ; var computeMatches = minMatchCharLength > 1 || includeMatches ; var matchMask = computeMatches ? Array ( textLen ) : [ ] ; var index ; while ( ( index = text . indexOf ( pattern , bestLocation ) ) > - 1 ) { var score = computeScore ( 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 ; } } }
bestLocation = - 1 ; var lastBitArr = [ ] ; var finalScore = 1 ; var binMax = patternLen + textLen ; var mask = 1 << patternLen - 1 ; for ( var _i = 0 ; _i < patternLen ; _i += 1 ) { var binMin = 0 ; var binMid = binMax ; while ( binMin < binMid ) { var _score2 = computeScore ( pattern , { errors : _i , currentLocation : expectedLocation + binMid , expectedLocation : expectedLocation , distance : distance , ignoreLocation : ignoreLocation } ) ; if ( _score2 <= currentThreshold ) { binMin = binMid ; } else { binMax = binMid ; }
binMid = Math . floor ( ( binMax - binMin ) / 2 + binMin ) ; }
binMax = binMid ; var start = Math . max ( 1 , expectedLocation - binMid + 1 ) ; var finish = findAllMatches ? textLen : Math . min ( expectedLocation + binMid , textLen ) + patternLen ; 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 ) { matchMask [ currentLocation ] = + ! ! charMatch ; }
bitArr [ j ] = ( bitArr [ j + 1 ] << 1 | 1 ) & charMatch ; if ( _i ) { bitArr [ j ] |= ( lastBitArr [ j + 1 ] | lastBitArr [ j ] ) << 1 | 1 | lastBitArr [ j + 1 ] ; }
if ( bitArr [ j ] & mask ) { finalScore = computeScore ( pattern , { errors : _i , currentLocation : currentLocation , expectedLocation : expectedLocation , distance : distance , ignoreLocation : ignoreLocation } ) ; if ( finalScore <= currentThreshold ) { currentThreshold = finalScore ; bestLocation = currentLocation ; if ( bestLocation <= expectedLocation ) { break ; }
start = Math . max ( 1 , 2 * expectedLocation - bestLocation ) ; } } }
var _score = computeScore ( pattern , { errors : _i + 1 , currentLocation : expectedLocation , expectedLocation : expectedLocation , distance : distance , ignoreLocation : ignoreLocation } ) ; if ( _score > currentThreshold ) { break ; }
lastBitArr = bitArr ; }
var result = { isMatch : bestLocation >= 0 , 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 = 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 ( ) ; }
if ( this . pattern === text ) { var _result = { isMatch : true , score : 0 } ; if ( includeMatches ) { _result . indices = [ [ 0 , text . length - 1 ] ] ; }
return _result ; }
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 = function ( ) { function BaseMatch ( pattern ) { _classCallCheck ( this , BaseMatch ) ; this . pattern = pattern ; }
_createClass ( BaseMatch , [ { key : "search" , value : function search ( )
{ } } ] , [ { key : "isMultiMatch" , value : function isMultiMatch ( pattern ) { return getMatch ( pattern , this . multiRegex ) ; } } , { key : "isSingleMatch" , value : function isSingleMatch ( pattern ) { return getMatch ( pattern , this . singleRegex ) ; } } ] ) ; return BaseMatch ; } ( ) ; function getMatch ( pattern , exp ) { var matches = pattern . match ( exp ) ; return matches ? matches [ 1 ] : null ; }
var ExactMatch = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 ; while ( ( index = text . indexOf ( this . pattern , location ) ) > - 1 ) { location = index + patternLen ; indices . push ( [ index , location - 1 ] ) ; }
2021-01-05 21:23:57 +01:00
var isMatch = ! ! indices . length ; return { isMatch : isMatch , score : isMatch ? 0 : 1 , indices : indices } ; } } ] , [ { key : "type" , get : function get ( ) { return 'include' ; } } , { key : "multiRegex" , get : function get ( ) { return /^'"(.*)"$/ ; } } , { key : "singleRegex" , get : function get ( ) { return /^'(.*)$/ ; } } ] ) ; return IncludeMatch ; } ( BaseMatch ) ; var searchers = [ ExactMatch , IncludeMatch , PrefixExactMatch , InversePrefixExactMatch , InverseSuffixExactMatch , SuffixExactMatch , InverseExactMatch , FuzzyMatch ] ; var searchersLen = searchers . length ; var SPACE _RE = / +(?=([^\"]*\"[^\"]*\")*[^\"]*$)/ ; var OR _TOKEN = '|' ; 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 ] ; 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 ; } }
2020-12-06 14:08:39 +01:00
if ( found ) { continue ; }
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 ; } ) ; }
var MultiMatchSet = new Set ( [ FuzzyMatch . type , IncludeMatch . type ] ) ; var ExtendedSearch = 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 ; for ( var i = 0 , qLen = query . length ; i < qLen ; i += 1 ) { var searchers = query [ i ] ; allIndices . length = 0 ; numMatches = 0 ; 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 ; } }
if ( numMatches ) { var result = { isMatch : true , score : totalScore / numMatches } ; if ( includeMatches ) { result . indices = allIndices ; }
return result ; } }
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 ] ) ; } ) ) ; } ; 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 ) ; }
2021-01-05 21:23:57 +01:00
function computeScore$1 ( 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 ; } ) ; }
2020-12-06 14:08:39 +01:00
var Fuse = 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 ( { } , 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 } ) ; } } , { 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 ( ) { 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$1 ( 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 = [ ] ; 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 [ ] ; }
switch ( node . operator ) { case LogicalOperator . AND : { 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 { return [ ] ; } }
return res ; }
case LogicalOperator . OR : { 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 ) ) ; break ; } }
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 ) { 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 = [ ] ; records . forEach ( function ( _ref5 ) { var item = _ref5 . $ , idx = _ref5 . i ; if ( ! isDefined ( item ) ) { return ; }
var matches = [ ] ; 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 } ) ; } }
2021-01-05 21:23:57 +01:00
return matches ; } } ] ) ; return Fuse ; } ( ) ; Fuse . version = '6.4.6' ; Fuse . createIndex = createIndex ; Fuse . parseIndex = parseIndex ; Fuse . config = Config ; { Fuse . parseQuery = parse ; }
2020-12-06 14:08:39 +01:00
{ register ( ExtendedSearch ) ; }
2020-12-18 07:15:37 +01:00
return Fuse ; } ) ) ) ; ; var fuse ; var resList = document . getElementById ( 'searchResults' ) ; var sInput = document . getElementById ( 'searchInput' ) ; var first , last = null
var resultsAvailable = false ; function loadSearch ( ) { var xhr = new XMLHttpRequest ( ) ; xhr . onreadystatechange = function ( ) { if ( xhr . readyState === 4 ) { if ( xhr . status === 200 ) { var data = JSON . parse ( xhr . responseText ) ; if ( data ) { var options = { isCaseSensitive : false , shouldSort : true , location : 0 , distance : 100 , threshold : 0.4 , minMatchCharLength : 0 , keys : [ 'title' , 'permalink' , 'summary' , 'content' ] } ; fuse = new Fuse ( data , options ) ; } } else { console . log ( xhr . responseText ) ; } } } ; xhr . open ( 'GET' , "../index.json" ) ; xhr . send ( ) ; }
function itemGen ( name , link ) { return ` <li class="post-entry"><header class="entry-header"> ${ name } »</header><a href=" ${ link } " aria-label=" ${ name } "></a></li> ` }
function activeToggle ( ) { document . activeElement . parentElement . classList . toggle ( "active" ) }
2020-12-06 14:08:39 +01:00
document . getElementById ( "searchInput" ) . onkeyup = function ( e ) { const results = fuse . search ( this . value ) ; if ( results . length !== 0 ) { let resultSet = '' ; for ( let item in results ) { resultSet = resultSet + itemGen ( results [ item ] . item . title , results [ item ] . item . permalink ) }
2020-12-18 07:15:37 +01:00
document . getElementById ( "searchResults" ) . innerHTML = resultSet ; resultsAvailable = true ; first = resList . firstChild ; last = resList . lastChild ; } else { resultsAvailable = false ; document . getElementById ( "searchResults" ) . innerHTML = '' ; } }
2020-12-18 17:18:02 +01:00
document . onkeydown = function ( e ) { let key = e . key ; let ae = document . activeElement ; let inbox = document . getElementById ( "searchbox" ) . contains ( ae )
if ( key === "ArrowDown" && resultsAvailable && inbox ) { e . preventDefault ( ) ; if ( ae == sInput ) { activeToggle ( ) ; resList . firstChild . lastChild . focus ( ) ; activeToggle ( ) ; } else if ( ae . parentElement == last ) { } else { activeToggle ( ) ; ae . parentElement . nextSibling . lastChild . focus ( ) ; activeToggle ( ) ; } } else if ( key === "ArrowUp" && resultsAvailable && inbox ) { e . preventDefault ( ) ; if ( ae == sInput ) { } else if ( ae . parentElement == first ) { activeToggle ( ) ; sInput . focus ( ) ; } else { activeToggle ( ) ; ae . parentElement . previousSibling . lastChild . focus ( ) ; activeToggle ( ) ; } } else if ( key === "ArrowRight" && resultsAvailable && inbox ) { ae . click ( ) ; } else if ( key === "Escape" ) { resultsAvailable = false ; document . getElementById ( "searchResults" ) . innerHTML = sInput . value = '' ; sInput . focus ( ) ; } }