UNPKG

@committed/trie-search

Version:

A trie implementation that maps keys to objects for rapid retrieval by phrases. Most common use will be for typeahead searches.

3 lines (2 loc) 7.08 kB
"use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}Object.defineProperty(exports,"__esModule",{value:!0});var e=t(require("lodash.get")),i=t(require("hasharray"));function n(){return(n=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(t[n]=i[n])}return t}).apply(this,arguments)}function o(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}var r=/^[\s]*$/,s=function(){function t(e,o){void 0===o&&(o={}),this.options=n({},t.DEFAULT_OPTIONS,o),this.keyFields=e?e instanceof Array?e:[e]:[],this.root={},this.size=0,this.options.cache&&(this.getCache=new i("key")),void 0===this.options.splitOnGetRegEx&&(this.options.splitOnGetRegEx=this.options.splitOnRegEx)}t.fromJson=function(e){var i=new t(e.keyFields,e.options);return i.root=e.root,i},t.deepLookup=function(t,i){return e(t,i)};var s=t.prototype;return s.add=function(e,i){this.options.cache&&this.clearCache();for(var n,r=function(t,e){var i;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(i=function(t,e){if(t){if("string"==typeof t)return o(t,void 0);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?o(t,void 0):void 0}}(t))){i&&(t=i);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(i=t[Symbol.iterator]()).next.bind(i)}(null==i||"number"==typeof i?this.keyFields:i);!(n=r()).done;){var s=n.value,a=void 0;if(a=s instanceof Array?t.deepLookup(e,s):e[s]){a=a.toString();for(var l=this.expandString(a),h=0;h<l.length;h++)this.map(l[h],e)}}},s.expandString=function(t){var e,i,n,o=[t];if(this.options.expandRegexes&&this.options.expandRegexes.length)for(var r=0;r<this.options.expandRegexes.length;r++)for(var s,a=this.options.expandRegexes[r];null!==(s=a.regex.exec(t));){var l=(n=a.alternate,(i=t).substr(0,e=s.index)+n+i.substr(e+n.length));o.push(l)}return o},s.addAll=function(t,e){for(var i=0;i<t.length;i++)this.add(t[i],e)},s.reset=function(){this.root={},this.size=0},s.clearCache=function(){this.getCache=new i("key")},s.cleanCache=function(){for(;this.getCache.all.length>this.options.maxCacheSize;)this.getCache.remove(this.getCache.all[0])},s.map=function(t,e){if(this.options.splitOnRegEx&&this.options.splitOnRegEx.test(t)){var n=t.split(this.options.splitOnRegEx),o=n.filter((function(t){return r.test(t)}));if(n.filter((function(e){return e===t})).length+o.length!==n.length){for(var s=0,a=n.length;s<a;s++)r.test(n[s])||this.map(n[s],e);if(!this.options.insertFullUnsplitKey)return}}this.options.cache&&this.clearCache(),this.options.keepAll&&(this.indexed=this.indexed||new i([this.options.keepAllKey]),this.indexed.add(e)),this.options.ignoreCase&&(t=t.toLowerCase());var l=this.keyToArr(t),h=this;!function t(e,i,n){if(0==e.length)return n.value=n.value||[],void n.value.push(i);var o=e.shift();n[o]||h.size++,n[o]=n[o]||{},t(e,i,n[o])}(l,e,this.root)},s.addFromObject=function(t,e){for(var i in this.options.cache&&this.clearCache(),e=e||"value",-1==this.keyFields.indexOf("_key_")&&this.keyFields.push("_key_"),t){var n={_key_:i};n[e]=t[i],this.add(n)}},s.keyToArr=function(t){var e;if(this.options.min&&this.options.min>1){if(t.length<this.options.min)return[];e=(e=[t.substr(0,this.options.min)]).concat(t.substr(this.options.min).split(""))}else e=t.split("");return e},s.findNode=function(t){if(!(this.options.min&&this.options.min>0&&t.length<this.options.min))return function t(e,i){if(i){if(0==e.length)return i;var n=e.shift();return t(e,i[n])}}(this.keyToArr(t),this.root)},s._getCacheKey=function(t,e){var i=t;return e&&(i=t+"_"+e),i},s._get=function(t,e){var n,o;if(t=this.options.ignoreCase?t.toLowerCase():t,this.options.cache&&(n=this.getCache.get(this._getCacheKey(t,e))))return n.value;for(var r=void 0,s=this.options.indexField?[this.options.indexField]:this.keyFields,a=this.options.splitOnGetRegEx?t.split(this.options.splitOnGetRegEx):[t],l=0,h=a.length;l<h;l++)if(!(this.options.min&&a[l].length<this.options.min)){var u=new i(s);(o=this.findNode(a[l]))&&c(o,u),r=r?r.intersection(u):u}var p=r?r.all:[];if(this.options.cache){var d=this._getCacheKey(t,e);this.getCache.add({key:d,value:p}),this.cleanCache()}return p;function c(t,i){if(!e||i.all.length!==e){if(t.value&&t.value.length){if(e&&!(i.all.length+t.value.length<e))return void i.addAll(t.value.slice(0,e-i.all.length));i.addAll(t.value)}for(var n in t){if(e&&i.all.length===e)return;"value"!=n&&c(t[n],i)}}}},s.get=function(t,e,n){var o,r=this.options.indexField?[this.options.indexField]:this.keyFields,s=void 0,a=void 0;if(e&&!this.options.idFieldOrFunction)throw new Error("To use the accumulator, you must specify and idFieldOrFunction");for(var l=0,h=(t=t instanceof Array?t:[t]).length;l<h;l++){var u=this._get(t[l],n);e?a=e(a,t[l],u,this):s=s?s.addAll(u):new i(r).addAll(u)}return e?null!=(o=a)?o:[]:s.all},s.getId=function(t){var e=this.options.idFieldOrFunction;if(null==e)throw new Error("To use the accumulator, you must specify and idFieldOrFunction");return"function"==typeof e?e(t):t[e]},s.toJson=function(){if(this.options.expandRegexes!==t.DEFAULT_OPTIONS.expandRegexes)throw new Error("JSON export of non-default expandRegexes option not supported");if(this.options.idFieldOrFunction!==t.DEFAULT_OPTIONS.idFieldOrFunction)throw new Error("JSON export of non-default idFieldOrFunction option not supported");if(this.options.splitOnGetRegEx!==t.DEFAULT_OPTIONS.splitOnRegEx)throw new Error("JSON export of non-default splitOnGetRegEx option not supported");if(this.options.splitOnRegEx!==t.DEFAULT_OPTIONS.splitOnRegEx)throw new Error("JSON export of non-default splitOnRegEx option not supported");var e=function(t,e){if(null==t)return{};var i,n,o={},r=Object.keys(t);for(n=0;n<r.length;n++)e.indexOf(i=r[n])>=0||(o[i]=t[i]);return o}(this.options,["expandRegexes","idFieldOrFunction","splitOnGetRegEx","splitOnRegEx"]);return{keyFields:this.keyFields,options:e,root:this.root}},t}();s.DEFAULT_OPTIONS={cache:!0,expandRegexes:[{regex:/[åäàáâãæ]/gi,alternate:"a"},{regex:/[èéêë]/gi,alternate:"e"},{regex:/[ìíîï]/gi,alternate:"i"},{regex:/[òóôõö]/gi,alternate:"o"},{regex:/[ùúûü]/gi,alternate:"u"},{regex:/[æ]/gi,alternate:"ae"}],idFieldOrFunction:void 0,ignoreCase:!0,insertFullUnsplitKey:!1,keepAll:!1,keepAllKey:"id",maxCacheSize:64,splitOnRegEx:/\s/g},s.UNION_REDUCER=function(t,e,i,n){if(void 0===t)return i;for(var o,r={},s=Math.max(t.length,i.length),a=[],l=0,h=0;h<s;h++)h<t.length&&(r[o=n.getId(t[h])]=r[o]?r[o]:0,r[o]++,2===r[o]&&(a[l++]=t[h])),h<i.length&&(r[o=n.getId(i[h])]=r[o]?r[o]:0,r[o]++,2===r[o]&&(a[l++]=i[h]));return a},exports.TrieSearch=s; //# sourceMappingURL=trie-search.cjs.production.min.js.map