From 51d0af41665d7d133b8f29977de977ac680aa201 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 09:53:42 -0600 Subject: [PATCH 001/140] ignore package-lock.json --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 165fc09..816aaf4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_store node_modules benchmark/report.json -coverage \ No newline at end of file +coverage +package-lock.json From 7baad5d12a55f7e623e218150b18016bedd618c6 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 09:56:25 -0600 Subject: [PATCH 002/140] Move from optimist to yargs brianreavis/sifter.js#63 --- bin/sifter.js | 4 ++-- package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/sifter.js b/bin/sifter.js index 96ef4a8..7655bd7 100755 --- a/bin/sifter.js +++ b/bin/sifter.js @@ -19,7 +19,7 @@ var path = require('path'); var fs = require('fs'); -var optimist = require('optimist'); +var yargs = require('yargs'); var cardinal = require('cardinal'); var async = require('async'); var csv = require('csv-parse'); @@ -29,7 +29,7 @@ var Sifter = require('../lib/sifter'); var highlight = function(obj) { return cardinal.highlight(JSON.stringify(obj)); }; var raw, data, result, t_start, t_end; -var argv = optimist +var argv = yargs .usage('Usage: $0 --query="search query" --fields=a,b') .default('direction', 'asc') .default('sort', '') diff --git a/package.json b/package.json index 9149e13..1866b3c 100644 --- a/package.json +++ b/package.json @@ -26,11 +26,11 @@ "sifter": "./bin/sifter.js" }, "dependencies": { - "optimist": "^0.6.1", "cardinal": "^1.0.0", "async": "^2.6.0", "humanize": "^0.0.9", - "csv-parse": "^4.6.5" + "csv-parse": "^4.6.5", + "yargs": "^15.3.1" }, "devDependencies": { "coveralls": "^3.0.0", From 33246b8f742264128f4ac001b990681f63349c2a Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 09:56:59 -0600 Subject: [PATCH 003/140] Update node test targets brianreavis/sifter.js#61 --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6fe3094..0fe87c7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,9 @@ sudo: false language: node_js node_js: - - "4" - - "6" + - "10" + - "12" + - "14" before_script: - make script: From 4ebca3bbfa3825166845d7a4be47723127247a53 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 10:01:28 -0600 Subject: [PATCH 004/140] update packages --- package.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 1866b3c..cc51721 100644 --- a/package.json +++ b/package.json @@ -26,18 +26,18 @@ "sifter": "./bin/sifter.js" }, "dependencies": { - "cardinal": "^1.0.0", - "async": "^2.6.0", + "cardinal": "^2.1.1", + "async": "^3.2.0", "humanize": "^0.0.9", - "csv-parse": "^4.6.5", - "yargs": "^15.3.1" + "csv-parse": "^4.15.4", + "yargs": "^16.2.0" }, "devDependencies": { - "coveralls": "^3.0.0", + "coveralls": "^3.1.0", "istanbul": "^0.4.5", - "mocha": "^4.0.1", + "mocha": "^8.3.2", "mocha-istanbul": "^0.3.0", "mocha-lcov-reporter": "^1.3.0", - "uglify-js": "^3.2.0" + "uglify-js": "^3.13.4" } } From cd3ff4683676d90816e4a1940cb2a172d7d9f501 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 11:07:56 -0600 Subject: [PATCH 005/140] add benchmark to package.json --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index cc51721..8219ba1 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "url": "git://github.com/brianreavis/sifter.js.git" }, "scripts": { - "test": "mocha -R list" + "test": "mocha", + "benchmark":"node --expose-gc benchmark/index.js" }, "bin": { "sifter": "./bin/sifter.js" From 4bf4eefed6e1adfca103f85c5d5e0ea711e6c17e Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 11:11:32 -0600 Subject: [PATCH 006/140] remove bower.json --- bower.json | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 bower.json diff --git a/bower.json b/bower.json deleted file mode 100644 index 9405974..0000000 --- a/bower.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "sifter", - "keywords": ["search","filter","sift","data","results","match","sort","autocomplete"], - "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.6.0", - "license": "Apache License, Version 2.0", - "readmeFilename": "README.md", - "repository": { - "type": "git", - "url": "git://github.com/brianreavis/sifter.js.git" - }, - "main": ["sifter.js"], - "ignore": [ - "Makefile", - "test", - "lib", - "bin", - "benchmark", - "node_modules", - ".travis.yml" - ], - "dependencies": {} -} From 03434c456d6015adfd0716cb597da33475bc11f9 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 12:29:11 -0600 Subject: [PATCH 007/140] build from typescript. Use sifter.ts from tom-select --- .config/babel.config.json | 17 ++ .config/rollup.config.js | 95 +++++++ .gitignore | 1 + lib/sifter.ts | 504 ++++++++++++++++++++++++++++++++++++++ package.json | 11 +- test/api.js | 2 +- 6 files changed, 628 insertions(+), 2 deletions(-) create mode 100644 .config/babel.config.json create mode 100644 .config/rollup.config.js create mode 100644 lib/sifter.ts diff --git a/.config/babel.config.json b/.config/babel.config.json new file mode 100644 index 0000000..5d321a3 --- /dev/null +++ b/.config/babel.config.json @@ -0,0 +1,17 @@ +{ + "presets": + [ + [ + "@babel/preset-env", + { + loose: true, + bugfixes: true, + modules: false + } + ], + "@babel/typescript" + ], + "plugins": [ + ["@babel/plugin-proposal-class-properties", { "loose": true }] + ] +} diff --git a/.config/rollup.config.js b/.config/rollup.config.js new file mode 100644 index 0000000..e35658d --- /dev/null +++ b/.config/rollup.config.js @@ -0,0 +1,95 @@ +import babel from '@rollup/plugin-babel'; +import { terser } from 'rollup-plugin-terser'; +import pkg from '../package.json'; +import path from 'path'; +import fs from 'fs'; + +var configs = []; +const banner = `/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */`; + +const extensions = [ + '.js', '.jsx', '.ts', '.tsx', +]; + +var babel_config = babel({ + extensions: extensions, + babelHelpers: 'bundled', + configFile: path.resolve(__dirname,'babel.config.json'), +}); + +var terser_config = terser({ + mangle: true, + format: { + semicolons: false, + comments: function (node, comment) { + var text = comment.value; + var type = comment.type; + if (type == "comment2") { + // multiline comment + return /\* sifter.js/i.test(text); + } + }, + }, +}); + + +// esm +configs.push({ + input: path.resolve(__dirname,'../lib/sifter.ts'), + output:{ + dir: path.resolve(__dirname,'../build/esm'), + format: 'esm', + preserveModules: true, + sourcemap: true, + banner: banner, + }, + plugins:[babel_config] // resolve_config +}); + +// cjs +configs.push({ + input: path.resolve(__dirname,'../lib/sifter.ts'), + output:{ + dir: path.resolve(__dirname,'../build/cjs'), + format: 'cjs', + preserveModules: true, + sourcemap: true, + banner: banner, + }, + plugins:[babel_config] //resolve_config +}); + + +// umd +configs.push({ + input: path.resolve(__dirname,'../lib/sifter.ts'), + output: { + name: 'sifter', + file: `build/umd/sifter.js`, + format: 'umd', + sourcemap: true, + banner: banner + }, + plugins:[ + babel_config, + ] + }); + +// umd min +configs.push({ + input: path.resolve(__dirname,'../lib/sifter.ts'), + output: { + name: 'sifter', + file: `build/umd/sifter.min.js`, + format: 'umd', + sourcemap: true, + banner: banner + }, + plugins:[ + babel_config, + terser_config + ] + }); + + +export default configs; diff --git a/.gitignore b/.gitignore index 816aaf4..4d092aa 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ node_modules benchmark/report.json coverage package-lock.json +build diff --git a/lib/sifter.ts b/lib/sifter.ts new file mode 100644 index 0000000..71f4b26 --- /dev/null +++ b/lib/sifter.ts @@ -0,0 +1,504 @@ +/** + * sifter.js + * Copyright (c) 2013–2020 Brian Reavis & contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + * + * @author Brian Reavis + */ + +type TOptions = { + fields: string|string[], + sort: any[], + score?: ()=>any, + filter?: boolean, + limit?: number, + sort_empty?: any, + nesting?: boolean, + respect_word_boundaries?: boolean, + conjunction?: string, + } + + +type TPrepareObj = { + options: TOptions, + query: string, + tokens: any, + total: number, + items: any[] +} + + + +// utilities +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +var cmp = function(a, b) { + if (typeof a === 'number' && typeof b === 'number') { + return a > b ? 1 : (a < b ? -1 : 0); + } + a = asciifold(String(a || '')); + b = asciifold(String(b || '')); + if (a > b) return 1; + if (b > a) return -1; + return 0; +}; + +/** + * A property getter resolving dot-notation + * @param {Object} obj The root object to fetch property on + * @param {String} name The optionally dotted property name to fetch + * @param {Boolean} nesting Handle nesting or not + * @return {Object} The resolved property value + */ +var getattr = function(obj, name, nesting) { + if (!obj || !name) return; + if (!nesting) return obj[name]; + var names = name.split("."); + while(names.length && (obj = obj[names.shift()])); + return obj; +}; + +var escape_regex = function(str) { + return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); +}; + +var DIACRITICS = { + 'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]', + 'b': '[b␢βΒB฿𐌁ᛒ]', + 'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄCc]', + 'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅDdð]', + 'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇEeɘǝƏƐε]', + 'f': '[fƑƒḞḟ]', + 'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]', + 'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]', + 'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪIi]', + 'j': '[jȷĴĵɈɉʝɟʲ]', + 'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]', + 'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟLl]', + 'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴNnŊŋ]', + 'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]', + 'p': '[pṔṕṖṗⱣᵽƤƥᵱ]', + 'q': '[qꝖꝗʠɊɋꝘꝙq̃]', + 'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]', + 's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]', + 't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]', + 'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]', + 'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]', + 'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]', + 'x': '[xẌẍẊẋχ]', + 'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]', + 'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]' +}; + +var asciifold = (function() { + var i, n, k, chunk; + var foreignletters = ''; + var lookup = {}; + for (k in DIACRITICS) { + if (DIACRITICS.hasOwnProperty(k)) { + chunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1); + foreignletters += chunk; + for (i = 0, n = chunk.length; i < n; i++) { + lookup[chunk.charAt(i)] = k; + } + } + } + var regexp = new RegExp('[' + foreignletters + ']', 'g'); + return function(str) { + return str.replace(regexp, function(foreignletter) { + return lookup[foreignletter]; + }).toLowerCase(); + }; +})(); + + +var propToArray = function(obj, key){ + var value = obj[key]; + if( value && !Array.isArray(value) ){ + obj[key] = [value]; + } +} + + +export default class Sifter{ + + public items: []|{}; + public settings: {diacritics:boolean}; + + /** + * Textually searches arrays and hashes of objects + * by property (or multiple properties). Designed + * specifically for autocomplete. + * + * @constructor + * @param {array|object} items + * @param {object} items + */ + constructor(items, settings) { + this.items = items; + this.settings = settings || {diacritics: true}; + }; + + /** + * Splits a search string into an array of individual + * regexps to be used to match results. + * + * @param {string} query + * @returns {array} + */ + tokenize(query, options ) { + query = String(query || '').toLowerCase().trim(); + if (!query || !query.length) return []; + + var letter; + var tokens = []; + var words = query.split(/\s+/); + var field_regex; + + if( options && options.fields && options.fields.length ){ + field_regex = new RegExp( '^('+options.fields.map(escape_regex).join('|')+')\:(.*)$'); + } + + words.forEach((word) => { + let field_match; + let field = null; + let regex = null; + + // look for "field:query" tokens + if( field_regex && (field_match = word.match(field_regex)) ){ + field = field_match[1]; + word = field_match[2]; + } + + if( word.length > 0 ){ + regex = escape_regex(word); + if (this.settings.diacritics) { + for (letter in DIACRITICS) { + if (DIACRITICS.hasOwnProperty(letter)) { + regex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]); + } + } + } + if ( options && options.respect_word_boundaries) regex = "\\b"+regex + regex = new RegExp(regex, 'i'); + } + + tokens.push({ + string : word, + regex : regex, + field : field, + }); + }); + + return tokens; + }; + + /** + * Iterates over arrays and hashes. + * + * ``` + * this.iterator(this.items, function(item, id) { + * // invoked for each item + * }); + * ``` + * + * @param {array|object} object + */ + iterator(object, callback) { + var iterator; + if (Array.isArray(object)) { + iterator = Array.prototype.forEach || function(callback) { + for (var i = 0, n = this.length; i < n; i++) { + callback(this[i], i, this); + } + }; + } else { + iterator = function(callback) { + for (var key in this) { + if (this.hasOwnProperty(key)) { + callback(this[key], key, this); + } + } + }; + } + + iterator.apply(object, [callback]); + }; + + /** + * Returns a function to be used to score individual results. + * + * Good matches will have a higher score than poor matches. + * If an item is not a match, 0 will be returned by the function. + * + * @returns {function} + */ + getScoreFunction(query:string, options?:TOptions ){ + var self, fields, tokens, token_count, nesting, search; + + self = this; + search = self.prepareSearch(query, options); + tokens = search.tokens; + fields = search.options.fields; + token_count = tokens.length; + nesting = search.options.nesting; + + /** + * Calculates how close of a match the + * given value is against a search token. + * + * @param {string} value + * @param {object} token + * @return {number} + */ + var scoreValue = function(value, token) { + var score, pos; + + if (!value) return 0; + value = String(value || ''); + pos = value.search(token.regex); + if (pos === -1) return 0; + score = token.string.length / value.length; + if (pos === 0) score += 0.5; + return score; + }; + + /** + * Calculates the score of an object + * against the search query. + * + * @param {object} token + * @param {object} data + * @return {number} + */ + var scoreObject = (function() { + var field_count = fields.length; + + if (!field_count) { + return function() { return 0; }; + } + if (field_count === 1) { + return function(token, data) { + return scoreValue(getattr(data, fields[0], nesting), token); + }; + } + return function(token, data) { + var sum = 0; + + // is the token specific to a field? + if( token.field ){ + + const field = getattr(data, token.field, nesting); + + if( !token.regex && field ){ + sum += 0.1; + }else{ + sum += scoreValue(field, token); + } + + }else{ + fields.forEach((field) => { + sum += scoreValue(getattr(data, field, nesting), token); + }); + } + + return sum / field_count; + }; + })(); + + if (!token_count) { + return function() { return 0; }; + } + if (token_count === 1) { + return function(data) { + return scoreObject(tokens[0], data); + }; + } + + if (search.options.conjunction === 'and') { + return function(data) { + var score; + for (var i = 0, sum = 0; i < token_count; i++) { + score = scoreObject(tokens[i], data); + if (score <= 0) return 0; + sum += score; + } + return sum / token_count; + }; + } else { + return function(data) { + for (var i = 0, sum = 0; i < token_count; i++) { + sum += scoreObject(tokens[i], data); + } + return sum / token_count; + }; + } + }; + + /** + * Returns a function that can be used to compare two + * results, for sorting purposes. If no sorting should + * be performed, `null` will be returned. + * + * @param {string|object} search + * @return function(a,b) + */ + getSortFunction(search, options:TOptions) { + var i, n, self, field, fields, fields_count, multiplier, multipliers, get_field, implicit_score, sort; + + self = this; + search = self.prepareSearch(search, options); + sort = (!search.query && options.sort_empty) || options.sort; + + /** + * Fetches the specified sort field value + * from a search result item. + * + * @param {string} name + * @param {object} result + * @return {string} + */ + get_field = function(name, result) { + if (name === '$score') return result.score; + return getattr(self.items[result.id], name, options.nesting); + }; + + // parse options + fields = []; + if (sort) { + for (i = 0, n = sort.length; i < n; i++) { + if (search.query || sort[i].field !== '$score') { + fields.push(sort[i]); + } + } + } + + // the "$score" field is implied to be the primary + // sort field, unless it's manually specified + if (search.query) { + implicit_score = true; + for (i = 0, n = fields.length; i < n; i++) { + if (fields[i].field === '$score') { + implicit_score = false; + break; + } + } + if (implicit_score) { + fields.unshift({field: '$score', direction: 'desc'}); + } + } else { + for (i = 0, n = fields.length; i < n; i++) { + if (fields[i].field === '$score') { + fields.splice(i, 1); + break; + } + } + } + + multipliers = []; + for (i = 0, n = fields.length; i < n; i++) { + multipliers.push(fields[i].direction === 'desc' ? -1 : 1); + } + + // build function + fields_count = fields.length; + if (!fields_count) { + return null; + } else if (fields_count === 1) { + field = fields[0].field; + multiplier = multipliers[0]; + return function(a, b) { + return multiplier * cmp( + get_field(field, a), + get_field(field, b) + ); + }; + } else { + return function(a, b) { + var i, result, field; + for (i = 0; i < fields_count; i++) { + field = fields[i].field; + result = multipliers[i] * cmp( + get_field(field, a), + get_field(field, b) + ); + if (result) return result; + } + return 0; + }; + } + }; + + /** + * Parses a search query and returns an object + * with tokens and fields ready to be populated + * with results. + * + */ + prepareSearch(query:string|TPrepareObj, options:TOptions):TPrepareObj { + if (typeof query === 'object') return query; + + options = Object.assign({},options); + propToArray(options,'fields'); + propToArray(options,'sort'); + propToArray(options,'sort_empty'); + + return { + options : options, + query : String(query || '').toLowerCase(), + tokens : this.tokenize(query, options), + total : 0, + items : [] + }; + }; + + /** + * Searches through all items and returns a sorted array of matches. + * + */ + search(query:string, options:TOptions) : TPrepareObj { + var self = this, score, search; + var fn_sort; + var fn_score; + + search = this.prepareSearch(query, options); + options = search.options; + query = search.query; + + // generate result scoring function + fn_score = options.score || self.getScoreFunction(search); + + // perform search and sort + if (query.length) { + self.iterator(self.items, function(item, id) { + score = fn_score(item); + if (options.filter === false || score > 0) { + search.items.push({'score': score, 'id': id}); + } + }); + } else { + self.iterator(self.items, function(item, id) { + search.items.push({'score': 1, 'id': id}); + }); + } + + fn_sort = self.getSortFunction(search, options); + if (fn_sort) search.items.sort(fn_sort); + + // apply limits + search.total = search.items.length; + if (typeof options.limit === 'number') { + search.items = search.items.slice(0, options.limit); + } + + return search; + }; +} diff --git a/package.json b/package.json index 8219ba1..7492310 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,9 @@ }, "scripts": { "test": "mocha", - "benchmark":"node --expose-gc benchmark/index.js" + "pretest": "npm run build", + "benchmark": "node --expose-gc benchmark/index.js", + "build": "npx rollup -c .config/rollup.config.js" }, "bin": { "sifter": "./bin/sifter.js" @@ -34,11 +36,18 @@ "yargs": "^16.2.0" }, "devDependencies": { + "@babel/core": "^7.13.16", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/preset-env": "^7.13.15", + "@babel/preset-typescript": "^7.13.0", + "@rollup/plugin-babel": "^5.3.0", "coveralls": "^3.1.0", "istanbul": "^0.4.5", "mocha": "^8.3.2", "mocha-istanbul": "^0.3.0", "mocha-lcov-reporter": "^1.3.0", + "rollup": "^2.45.2", + "rollup-plugin-terser": "^7.0.2", "uglify-js": "^3.13.4" } } diff --git a/test/api.js b/test/api.js index d7ad9c2..0ead626 100644 --- a/test/api.js +++ b/test/api.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../lib/sifter.js'); +var Sifter = require('../build/umd/sifter.js'); describe('Sifter', function() { From 30417385d36df50139640024b92221ee87e48908 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 12:30:50 -0600 Subject: [PATCH 008/140] add release.sh --- release.sh | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100755 release.sh diff --git a/release.sh b/release.sh new file mode 100755 index 0000000..416f849 --- /dev/null +++ b/release.sh @@ -0,0 +1,112 @@ +#!/bin/bash + +VERSION=$1 + +# This is a general-purpose function to ask Yes/No questions in Bash, either +# with or without a default answer. It keeps repeating the question until it +# gets a valid answer. +# https://gist.github.com/davejamesmiller/1965569 +ask() { + local prompt default reply + + if [ "${2:-}" = "Y" ]; then + prompt="Y/n" + default=Y + elif [ "${2:-}" = "N" ]; then + prompt="y/N" + default=N + else + prompt="y/n" + default= + fi + + while true; do + + # Ask the question (not using "read -p" as it uses stderr not stdout) + echo -n "$1 [$prompt] " + + # Read the answer (use /dev/tty in case stdin is redirected from somewhere else) + read reply Date: Wed, 21 Apr 2021 12:38:50 -0600 Subject: [PATCH 009/140] update paths --- README.md | 16 +++++++++++----- bin/sifter.js | 4 +++- package.json | 6 ++++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 6486787..1c3171a 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # sifter.js [![NPM version](http://img.shields.io/npm/v/sifter.svg?style=flat)](https://www.npmjs.org/package/sifter) [![Installs](http://img.shields.io/npm/dm/sifter.svg?style=flat)](https://www.npmjs.org/package/sifter) -[![Build Status](https://travis-ci.org/brianreavis/sifter.js.svg)](https://travis-ci.org/brianreavis/sifter.js) -[![Coverage Status](http://img.shields.io/coveralls/brianreavis/sifter.js/master.svg?style=flat)](https://coveralls.io/r/brianreavis/sifter.js) +[![Build Status](https://travis-ci.org/orchidjs/sifter.js.svg)](https://travis-ci.org/orchidjs/sifter.js) +[![Coverage Status](http://img.shields.io/coveralls/orchidjs/sifter.js/master.svg?style=flat)](https://coveralls.io/r/orchidjs/sifter.js) Sifter is a client and server-side library (via [UMD](https://github.com/umdjs/umd)) for textually searching arrays and hashes of objects by property – or multiple properties. It's designed specifically for autocomplete. The process is three-step: *score*, *filter*, *sort*. @@ -147,13 +147,19 @@ Install the dependencies that are required to build and test: $ npm install ``` -First build a copy with `make` then run the test suite with `make test`. +Build from typescript +```sh +$ npm run build +``` -When issuing a pull request, please exclude "sifter.js" and "sifter.min.js" in the project root. +Run tests +```sh +$ npm test +``` ## License -Copyright © 2013–2020 [Brian Reavis](http://twitter.com/brianreavis) & [Contributors](https://github.com/brianreavis/sifter.js/graphs/contributors) +Copyright © 2013–2021 [Contributors](https://github.com/orchidjs/sifter.js/graphs/contributors) Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at: http://www.apache.org/licenses/LICENSE-2.0 diff --git a/bin/sifter.js b/bin/sifter.js index 7655bd7..2159706 100755 --- a/bin/sifter.js +++ b/bin/sifter.js @@ -25,7 +25,9 @@ var async = require('async'); var csv = require('csv-parse'); var Stream = require('stream'); var humanize = require('humanize'); -var Sifter = require('../lib/sifter'); +var Sifter = require('../build/umd/sifter.js'); + + var highlight = function(obj) { return cardinal.highlight(JSON.stringify(obj)); }; var raw, data, result, t_start, t_end; diff --git a/package.json b/package.json index 7492310..51f900f 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,12 @@ "version": "0.6.0", "license": "Apache-2.0", "author": "Brian Reavis ", - "main": "./sifter.js", + "main": "dist/umd/sifter.js", + "browser": "dist/umd/sifter.js", + "module": "dist/esm/sifter.js", "repository": { "type": "git", - "url": "git://github.com/brianreavis/sifter.js.git" + "url": "https://github.com/orchidjs/sifter.js.git" }, "scripts": { "test": "mocha", From d0359c092787d1cab1a58f6bf8b4f4ba67bb262f Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 12:39:05 -0600 Subject: [PATCH 010/140] remove root level scripts --- sifter.js | 498 -------------------------------------------------- sifter.min.js | 2 - 2 files changed, 500 deletions(-) delete mode 100644 sifter.js delete mode 100644 sifter.min.js diff --git a/sifter.js b/sifter.js deleted file mode 100644 index 49a2a45..0000000 --- a/sifter.js +++ /dev/null @@ -1,498 +0,0 @@ -/** - * sifter.js - * Copyright (c) 2013–2020 Brian Reavis & contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this - * file except in compliance with the License. You may obtain a copy of the License at: - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under - * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF - * ANY KIND, either express or implied. See the License for the specific language - * governing permissions and limitations under the License. - * - * @author Brian Reavis - */ - -(function(root, factory) { - if (typeof define === 'function' && define.amd) { - define(factory); - } else if (typeof exports === 'object') { - module.exports = factory(); - } else { - root.Sifter = factory(); - } -}(this, function() { - - /** - * Textually searches arrays and hashes of objects - * by property (or multiple properties). Designed - * specifically for autocomplete. - * - * @constructor - * @param {array|object} items - * @param {object} items - */ - var Sifter = function(items, settings) { - this.items = items; - this.settings = settings || {diacritics: true}; - }; - - /** - * Splits a search string into an array of individual - * regexps to be used to match results. - * - * @param {string} query - * @returns {array} - */ - Sifter.prototype.tokenize = function(query, respect_word_boundaries) { - query = trim(String(query || '').toLowerCase()); - if (!query || !query.length) return []; - - var i, n, regex, letter; - var tokens = []; - var words = query.split(/ +/); - - for (i = 0, n = words.length; i < n; i++) { - regex = escape_regex(words[i]); - if (this.settings.diacritics) { - for (letter in DIACRITICS) { - if (DIACRITICS.hasOwnProperty(letter)) { - regex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]); - } - } - } - if (respect_word_boundaries) regex = "\\b"+regex - tokens.push({ - string : words[i], - regex : new RegExp(regex, 'i') - }); - } - - return tokens; - }; - - /** - * Iterates over arrays and hashes. - * - * ``` - * this.iterator(this.items, function(item, id) { - * // invoked for each item - * }); - * ``` - * - * @param {array|object} object - */ - Sifter.prototype.iterator = function(object, callback) { - var iterator; - if (is_array(object)) { - iterator = Array.prototype.forEach || function(callback) { - for (var i = 0, n = this.length; i < n; i++) { - callback(this[i], i, this); - } - }; - } else { - iterator = function(callback) { - for (var key in this) { - if (this.hasOwnProperty(key)) { - callback(this[key], key, this); - } - } - }; - } - - iterator.apply(object, [callback]); - }; - - /** - * Returns a function to be used to score individual results. - * - * Good matches will have a higher score than poor matches. - * If an item is not a match, 0 will be returned by the function. - * - * @param {object|string} search - * @param {object} options (optional) - * @returns {function} - */ - Sifter.prototype.getScoreFunction = function(search, options) { - var self, fields, tokens, token_count, nesting; - - self = this; - search = self.prepareSearch(search, options); - tokens = search.tokens; - fields = search.options.fields; - token_count = tokens.length; - nesting = search.options.nesting; - - /** - * Calculates how close of a match the - * given value is against a search token. - * - * @param {mixed} value - * @param {object} token - * @return {number} - */ - var scoreValue = function(value, token) { - var score, pos; - - if (!value) return 0; - value = String(value || ''); - pos = value.search(token.regex); - if (pos === -1) return 0; - score = token.string.length / value.length; - if (pos === 0) score += 0.5; - return score; - }; - - /** - * Calculates the score of an object - * against the search query. - * - * @param {object} token - * @param {object} data - * @return {number} - */ - var scoreObject = (function() { - var field_count = fields.length; - if (!field_count) { - return function() { return 0; }; - } - if (field_count === 1) { - return function(token, data) { - return scoreValue(getattr(data, fields[0], nesting), token); - }; - } - return function(token, data) { - for (var i = 0, sum = 0; i < field_count; i++) { - sum += scoreValue(getattr(data, fields[i], nesting), token); - } - return sum / field_count; - }; - })(); - - if (!token_count) { - return function() { return 0; }; - } - if (token_count === 1) { - return function(data) { - return scoreObject(tokens[0], data); - }; - } - - if (search.options.conjunction === 'and') { - return function(data) { - var score; - for (var i = 0, sum = 0; i < token_count; i++) { - score = scoreObject(tokens[i], data); - if (score <= 0) return 0; - sum += score; - } - return sum / token_count; - }; - } else { - return function(data) { - for (var i = 0, sum = 0; i < token_count; i++) { - sum += scoreObject(tokens[i], data); - } - return sum / token_count; - }; - } - }; - - /** - * Returns a function that can be used to compare two - * results, for sorting purposes. If no sorting should - * be performed, `null` will be returned. - * - * @param {string|object} search - * @param {object} options - * @return function(a,b) - */ - Sifter.prototype.getSortFunction = function(search, options) { - var i, n, self, field, fields, fields_count, multiplier, multipliers, get_field, implicit_score, sort; - - self = this; - search = self.prepareSearch(search, options); - sort = (!search.query && options.sort_empty) || options.sort; - - /** - * Fetches the specified sort field value - * from a search result item. - * - * @param {string} name - * @param {object} result - * @return {mixed} - */ - get_field = function(name, result) { - if (name === '$score') return result.score; - return getattr(self.items[result.id], name, options.nesting); - }; - - // parse options - fields = []; - if (sort) { - for (i = 0, n = sort.length; i < n; i++) { - if (search.query || sort[i].field !== '$score') { - fields.push(sort[i]); - } - } - } - - // the "$score" field is implied to be the primary - // sort field, unless it's manually specified - if (search.query) { - implicit_score = true; - for (i = 0, n = fields.length; i < n; i++) { - if (fields[i].field === '$score') { - implicit_score = false; - break; - } - } - if (implicit_score) { - fields.unshift({field: '$score', direction: 'desc'}); - } - } else { - for (i = 0, n = fields.length; i < n; i++) { - if (fields[i].field === '$score') { - fields.splice(i, 1); - break; - } - } - } - - multipliers = []; - for (i = 0, n = fields.length; i < n; i++) { - multipliers.push(fields[i].direction === 'desc' ? -1 : 1); - } - - // build function - fields_count = fields.length; - if (!fields_count) { - return null; - } else if (fields_count === 1) { - field = fields[0].field; - multiplier = multipliers[0]; - return function(a, b) { - return multiplier * cmp( - get_field(field, a), - get_field(field, b) - ); - }; - } else { - return function(a, b) { - var i, result, a_value, b_value, field; - for (i = 0; i < fields_count; i++) { - field = fields[i].field; - result = multipliers[i] * cmp( - get_field(field, a), - get_field(field, b) - ); - if (result) return result; - } - return 0; - }; - } - }; - - /** - * Parses a search query and returns an object - * with tokens and fields ready to be populated - * with results. - * - * @param {string} query - * @param {object} options - * @returns {object} - */ - Sifter.prototype.prepareSearch = function(query, options) { - if (typeof query === 'object') return query; - - options = extend({}, options); - - var option_fields = options.fields; - var option_sort = options.sort; - var option_sort_empty = options.sort_empty; - - if (option_fields && !is_array(option_fields)) options.fields = [option_fields]; - if (option_sort && !is_array(option_sort)) options.sort = [option_sort]; - if (option_sort_empty && !is_array(option_sort_empty)) options.sort_empty = [option_sort_empty]; - - return { - options : options, - query : String(query || '').toLowerCase(), - tokens : this.tokenize(query, options.respect_word_boundaries), - total : 0, - items : [] - }; - }; - - /** - * Searches through all items and returns a sorted array of matches. - * - * The `options` parameter can contain: - * - * - fields {string|array} - * - sort {array} - * - score {function} - * - filter {bool} - * - limit {integer} - * - * Returns an object containing: - * - * - options {object} - * - query {string} - * - tokens {array} - * - total {int} - * - items {array} - * - * @param {string} query - * @param {object} options - * @returns {object} - */ - Sifter.prototype.search = function(query, options) { - var self = this, value, score, search, calculateScore; - var fn_sort; - var fn_score; - - search = this.prepareSearch(query, options); - options = search.options; - query = search.query; - - // generate result scoring function - fn_score = options.score || self.getScoreFunction(search); - - // perform search and sort - if (query.length) { - self.iterator(self.items, function(item, id) { - score = fn_score(item); - if (options.filter === false || score > 0) { - search.items.push({'score': score, 'id': id}); - } - }); - } else { - self.iterator(self.items, function(item, id) { - search.items.push({'score': 1, 'id': id}); - }); - } - - fn_sort = self.getSortFunction(search, options); - if (fn_sort) search.items.sort(fn_sort); - - // apply limits - search.total = search.items.length; - if (typeof options.limit === 'number') { - search.items = search.items.slice(0, options.limit); - } - - return search; - }; - - // utilities - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - var cmp = function(a, b) { - if (typeof a === 'number' && typeof b === 'number') { - return a > b ? 1 : (a < b ? -1 : 0); - } - a = asciifold(String(a || '')); - b = asciifold(String(b || '')); - if (a > b) return 1; - if (b > a) return -1; - return 0; - }; - - var extend = function(a, b) { - var i, n, k, object; - for (i = 1, n = arguments.length; i < n; i++) { - object = arguments[i]; - if (!object) continue; - for (k in object) { - if (object.hasOwnProperty(k)) { - a[k] = object[k]; - } - } - } - return a; - }; - - /** - * A property getter resolving dot-notation - * @param {Object} obj The root object to fetch property on - * @param {String} name The optionally dotted property name to fetch - * @param {Boolean} nesting Handle nesting or not - * @return {Object} The resolved property value - */ - var getattr = function(obj, name, nesting) { - if (!obj || !name) return; - if (!nesting) return obj[name]; - var names = name.split("."); - while(names.length && (obj = obj[names.shift()])); - return obj; - }; - - var trim = function(str) { - return (str + '').replace(/^\s+|\s+$|/g, ''); - }; - - var escape_regex = function(str) { - return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); - }; - - var is_array = Array.isArray || (typeof $ !== 'undefined' && $.isArray) || function(object) { - return Object.prototype.toString.call(object) === '[object Array]'; - }; - - var DIACRITICS = { - 'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]', - 'b': '[b␢βΒB฿𐌁ᛒ]', - 'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄCc]', - 'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅDdð]', - 'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇEeɘǝƏƐε]', - 'f': '[fƑƒḞḟ]', - 'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]', - 'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]', - 'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪIi]', - 'j': '[jȷĴĵɈɉʝɟʲ]', - 'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]', - 'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟLl]', - 'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴNnŊŋ]', - 'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]', - 'p': '[pṔṕṖṗⱣᵽƤƥᵱ]', - 'q': '[qꝖꝗʠɊɋꝘꝙq̃]', - 'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]', - 's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]', - 't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]', - 'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]', - 'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]', - 'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]', - 'x': '[xẌẍẊẋχ]', - 'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]', - 'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]' - }; - - var asciifold = (function() { - var i, n, k, chunk; - var foreignletters = ''; - var lookup = {}; - for (k in DIACRITICS) { - if (DIACRITICS.hasOwnProperty(k)) { - chunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1); - foreignletters += chunk; - for (i = 0, n = chunk.length; i < n; i++) { - lookup[chunk.charAt(i)] = k; - } - } - } - var regexp = new RegExp('[' + foreignletters + ']', 'g'); - return function(str) { - return str.replace(regexp, function(foreignletter) { - return lookup[foreignletter]; - }).toLowerCase(); - }; - })(); - - - // export - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - return Sifter; -})); diff --git a/sifter.min.js b/sifter.min.js deleted file mode 100644 index 0c747be..0000000 --- a/sifter.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! sifter.js | https://github.com/brianreavis/sifter.js | Apache License (v2) */ -(function(r,t){if(typeof define==="function"&&define.amd){define(t)}else if(typeof exports==="object"){module.exports=t()}else{r.Sifter=t()}})(this,function(){var r=function(r,t){this.items=r;this.settings=t||{diacritics:true}};r.prototype.tokenize=function(r,t){r=s(String(r||"").toLowerCase());if(!r||!r.length)return[];var e,n,i,o;var f=[];var u=r.split(/ +/);for(e=0,n=u.length;e0){o.items.push({score:i,id:t})}})}else{t.iterator(t.items,function(r,t){o.items.push({score:1,id:t})})}u=t.getSortFunction(o,e);if(u)o.items.sort(u);o.total=o.items.length;if(typeof e.limit==="number"){o.items=o.items.slice(0,e.limit)}return o};var h=function(r,t){if(typeof r==="number"&&typeof t==="number"){return r>t?1:rt)return 1;if(t>r)return-1;return 0};var o=function(r,t){var e,n,i,o;for(e=1,n=arguments.length;e Date: Wed, 21 Apr 2021 12:40:43 -0600 Subject: [PATCH 011/140] add browserslist --- package.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 51f900f..ad242ac 100644 --- a/package.json +++ b/package.json @@ -51,5 +51,15 @@ "rollup": "^2.45.2", "rollup-plugin-terser": "^7.0.2", "uglify-js": "^3.13.4" - } + }, + "browserslist": [ + ">= 0.5%", + "not dead", + "Chrome >= 60", + "Firefox >= 60", + "Edge >= 17", + "iOS >= 10", + "Safari >= 10", + "not Explorer <= 11" + ] } From 75568c154d0e230bde38813665fcdb7419934b23 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 12:45:01 -0600 Subject: [PATCH 012/140] split tests into smaller files --- test/api.js | 507 --------------------------------------- test/getScoreFunction.js | 55 +++++ test/prepareSearch.js | 40 +++ test/search.js | 353 +++++++++++++++++++++++++++ test/tokenize.js | 63 +++++ 5 files changed, 511 insertions(+), 507 deletions(-) delete mode 100644 test/api.js create mode 100644 test/getScoreFunction.js create mode 100644 test/prepareSearch.js create mode 100644 test/search.js create mode 100644 test/tokenize.js diff --git a/test/api.js b/test/api.js deleted file mode 100644 index 0ead626..0000000 --- a/test/api.js +++ /dev/null @@ -1,507 +0,0 @@ -var assert = require('assert'); -var Sifter = require('../build/umd/sifter.js'); - -describe('Sifter', function() { - - describe('#tokenize()', function() { - var sifter, tokens; - - it('should return an empty array when given an empty string', function() { - var sifter = new Sifter([]); - var tokens = sifter.tokenize(''); - assert.equal(tokens.length, 0); - }); - - it('should return an array', function() { - var sifter = new Sifter([]); - var tokens = sifter.tokenize('hello world'); - assert.equal(Array.isArray(tokens), true); - }); - - it('should split string by spaces', function() { - var sifter = new Sifter([]); - var tokens = sifter.tokenize('hello world'); - assert.equal(tokens.length, 2); - }); - - describe('returned tokens', function() { - before(function() { - sifter = new Sifter([]); - tokens = sifter.tokenize('hello world'); - }); - describe('"string" property', function() { - it('should exist', function() { - assert.notEqual(typeof tokens[0].string, 'undefined'); - }); - it('should be a string', function() { - assert.equal(typeof tokens[0].string, 'string'); - }); - it('should be valid', function() { - assert.equal(tokens[0].string, 'hello'); - assert.equal(tokens[1].string, 'world'); - }); - }); - describe('"regex" property', function() { - it('should exist', function() { - assert.notEqual(typeof tokens[0].regex, 'undefined'); - }); - it('should be a RegExp object', function() { - assert.equal(tokens[0].regex instanceof RegExp, true); - }); - it('should ignore case', function() { - assert.equal(tokens[0].regex.test('HelLO'), true); - assert.equal(tokens[1].regex.test('wORLD'), true); - }); - it('should not be too greedy', function() { - assert.equal(tokens[0].regex.test('afawfaf'), false); - }); - it('should match international characters', function() { - assert.equal(tokens[0].regex.test('hęłlö'), true); - assert.equal(tokens[1].regex.test('wÕrlð'), true); - }); - }); - }); - - }); - - describe('#getScoreFunction()', function() { - - it('should acknowledge AND "conjunction" option', function() { - var score, search, sifter = new Sifter([]); - - score = sifter.getScoreFunction('one two', {fields: ['a','b'], conjunction: 'and'}); - assert.equal(score({a: 'one'}) > 0, false); - assert.equal(score({a: 'one', b: 'two'}) > 0, true); - assert.equal(score({a: 'one', b: 'one'}) > 0, false); - assert.equal(score({a: 'one', b: 'three'}) > 0, false); - assert.equal(score({a: 'three', b: 'three'}) > 0, false); - }); - - it('should acknowledge OR "conjunction" option', function() { - var score, search, sifter = new Sifter([]); - - score = sifter.getScoreFunction('one two', {fields: ['a','b'], conjunction: 'or'}); - assert.equal(score({a: 'one'}) > 0, true); - assert.equal(score({a: 'one', b: 'two'}) > 0, true); - assert.equal(score({a: 'one', b: 'one'}) > 0, true); - assert.equal(score({a: 'one', b: 'three'}) > 0, true); - assert.equal(score({a: 'three', b: 'three'}) > 0, false); - }); - - describe('with query and options', function() { - - it('should return a function that returns a number', function() { - var score, search, sifter = new Sifter([]); - - score = sifter.getScoreFunction('test', {fields: ['a','b']}); - assert.equal(typeof score({a: 'test'}), 'number'); - assert.equal(score({a: 'test'}) > 0, true); - assert.equal(typeof score({}), 'number'); - }); - - }); - - describe('with pre-prepared search', function() { - - it('should return a function that returns a number', function() { - var score, search, sifter = new Sifter([]); - - search = sifter.prepareSearch('test', {fields: ['a','b']}); - score = sifter.getScoreFunction(search); - assert.equal(typeof score({a: 'test'}), 'number'); - assert.equal(score({a: 'test'}) > 0, true); - assert.equal(typeof score({}), 'number'); - }); - - }); - - }); - - describe('#prepareSearch()', function() { - - it('should normalize options', function() { - var sifter = new Sifter([{field: 'a'}, {}]); - var search = sifter.prepareSearch('a', { - fields: {field: 'a'}, - sort: {field: 'a'}, - sort_empty: {field: 'a'} - }); - assert.equal(Array.isArray(search.options.fields), true); - assert.equal(Array.isArray(search.options.sort), true); - assert.equal(Array.isArray(search.options.sort_empty), true); - }); - - describe('returned object', function() { - var sifter = new Sifter([{field: 'a'}, {}]); - var search = sifter.prepareSearch('hello world'); - - it('should contain "total" (int)', function() { - assert.equal(search.total, 0); - }); - it('should contain "tokens" (array)', function() { - assert.equal(Array.isArray(search.tokens), true); - assert.equal(search.tokens.length, 2); - }); - it('should contain "items" (array)', function() { - assert.equal(Array.isArray(search.items), true); - assert.equal(search.items.length, 0); - }); - it('should contain "options" (array)', function() { - assert.equal(search.options !== null, true); - assert.equal(typeof search.options, 'object'); - assert.equal(Array.isArray(search.options), false); - }); - }); - - }); - - describe('#search()', function() { - - it('should not throw if an element does not contain search field', function() { - assert.doesNotThrow(function() { - var sifter = new Sifter([{field: 'a'}, {}]); - var result = sifter.search('hello', {fields: ['field']}); - }); - }); - - it('should allow "fields" option to be a string', function() { - var sifter = new Sifter([{field: 'a'}, {}]); - var result = sifter.search('a', {fields: 'field'}); - assert.equal(result.items[0].id, 0); - }); - - it('should allow to search nested fields', function() { - var sifter = new Sifter([ - {fields: {nested: 'aaa'}}, - {fields: {nested: 'add'}}, - {fields: {nested: 'abb'}} - ]); - var result = sifter.search('aaa', { - fields: 'fields.nested', - nesting: true - }); - - assert.equal(result.items.length, 1); - assert.equal(result.items[0].id, 0); - }); - - it('should allow word boundaries to be respected', function() { - var sifter = new Sifter([ - {name: 'John Smith'}, - {name: 'Jane Doe'}, - ]); - var result = sifter.search('mith', {fields: 'name'}); - assert.equal(result.items.length, 1); - - var result = sifter.search('mith', {fields: 'name', respect_word_boundaries: true}); - assert.equal(result.items.length, 0); - - var result = sifter.search('Smi', {fields: 'name', respect_word_boundaries: true}); - assert.equal(result.items.length, 1); - - var result = sifter.search('John Sm', {fields: 'name', respect_word_boundaries: true}); - assert.equal(result.items.length, 1); - - var result = sifter.search('ohn Smith', {fields: 'name', respect_word_boundaries: true, conjunction: 'and'}); - assert.equal(result.items.length, 0); - }); - - describe('sorting', function() { - it('should respect "sort_empty" option when query absent', function() { - var sifter = new Sifter([ - {field: 'aaa'}, - {field: 'add'}, - {field: 'abb'} - ]); - var result = sifter.search('', { - fields: 'field', - sort: {field: 'field', direction: 'asc'}, - sort_empty: {field: 'field', direction: 'desc'} - }); - assert.equal(result.items[0].id, 1); - assert.equal(result.items[1].id, 2); - assert.equal(result.items[2].id, 0); - }); - it('should work with one field (as object)', function() { - var sifter = new Sifter([ - {field: 'aaa'}, - {field: 'add'}, - {field: 'abb'} - ]); - var result = sifter.search('', { - fields: 'field', - sort: {field: 'field'} - }); - assert.equal(result.items[0].id, 0); - assert.equal(result.items[1].id, 2); - assert.equal(result.items[2].id, 1); - }); - it('should work with one field (as array)', function() { - var sifter = new Sifter([ - {field: 'aaa'}, - {field: 'add'}, - {field: 'abb'} - ]); - var result = sifter.search('', { - fields: 'field', - sort: [{field: 'field'}] - }); - assert.equal(result.items[0].id, 0); - assert.equal(result.items[1].id, 2); - assert.equal(result.items[2].id, 1); - }); - it('should work with multiple fields and respect priority', function() { - var sifter = new Sifter([ - {a: 'bbb', b: 'bbb'}, - {a: 'bbb', b: 'ccc'}, - {a: 'bbb', b: 'aaa'}, - {a: 'aaa'} - ]); - var result = sifter.search('', { - fields: 'field', - sort: [ - {field: 'a'}, - {field: 'b'} - ] - }); - assert.equal(result.items[0].id, 3); - assert.equal(result.items[1].id, 2); - assert.equal(result.items[2].id, 0); - assert.equal(result.items[3].id, 1); - }); - it('should respect numeric fields', function() { - var sifter = new Sifter([ - {field: 1.0}, - {field: 12.9}, - {field: 9.1}, - {field: -9.0} - ]); - var result = sifter.search('', { - fields: 'field', - sort: [{field: 'field'}] - }); - assert.equal(result.items[0].id, 3); - assert.equal(result.items[1].id, 0); - assert.equal(result.items[2].id, 2); - assert.equal(result.items[3].id, 1); - }); - it('should respect sort direction', function() { - var sifter = new Sifter([ - {a: 'bbb', b: 'rrr'}, - {a: 'bbb', b: 'aaa'}, - {a: 'aaa', b: 'rrr'}, - {a: 'aaa', b: 'aaa'} - ]); - var result = sifter.search('', { - fields: 'field', - sort: [ - {field: 'b', direction: 'desc'}, - {field: 'a', direction: 'asc'} - ] - }); - assert.equal(result.items[0].id, 2); - assert.equal(result.items[1].id, 0); - assert.equal(result.items[2].id, 3); - assert.equal(result.items[3].id, 1); - }); - it('should add implicit "$score" field when query present', function() { - var sifter = new Sifter([ - {field: 'yoo'}, - {field: 'book'} - ]); - var result = sifter.search('oo', { - fields: 'field', - sort: [{field: 'field'}] - }); - assert.equal(result.items[0].id, 0); - assert.equal(result.items[1].id, 1); - }); - it('should not add implicit "$score" field if explicitly given', function() { - var sifter = new Sifter([ - {field: 'boooo'}, - {field: 'yoo'}, - {field: 'aaa'} - ]); - var result = sifter.search('oo', { - filter: false, - fields: 'field', - sort: [{field: 'field'}, {field: '$score'}] - }); - assert.equal(result.items[0].id, 2); - assert.equal(result.items[1].id, 0); - assert.equal(result.items[2].id, 1); - }); - it('should be locale-aware', function() { - var sifter = new Sifter([ - {field: 'Zoom Test'}, - {field: 'Água Test'} - ]); - var result = sifter.search('', { - fields: 'field', - sort: [{field: 'field', direction: 'asc'}] - }); - assert.equal(result.items[0].id, 1); - assert.equal(result.items[1].id, 0); - }); - it('should work with nested fields', function() { - var sifter = new Sifter([ - {fields: {nested: 'aaa'}}, - {fields: {nested: 'add'}}, - {fields: {nested: 'abb'}} - ]); - var result = sifter.search('', { - fields: [], - sort: {field: 'fields.nested'}, - nesting: true - }); - assert.equal(result.items[0].id, 0); - assert.equal(result.items[1].id, 2); - assert.equal(result.items[2].id, 1); - }); - }); - - describe('returned results', function() { - var sifter, options, result, result_empty, result_all; - - before(function() { - sifter = new Sifter([ - {title: 'Matterhorn', location: 'Switzerland', continent: 'Europe'}, - {title: 'Eiger', location: 'Switzerland', continent: 'Europe'}, - {title: 'Everest', location: 'Nepal', continent: 'Asia'}, - {title: 'Gannett', location: 'Wyoming', continent: 'North America'}, - {title: 'Denali', location: 'Alaska', continent: 'North America'} - ]); - - options = {limit: 1, fields: ['title', 'location', 'continent']}; - result = sifter.search('switzerland europe', options); - result_empty = sifter.search('awawfawfawf', options); - result_all = sifter.search('', { - fields: ['title', 'location', 'continent'], - sort: [{field: 'title'}] - }); - }); - - it('should not vary when using an array vs a hash as a data source', function() { - var sifter_hash = new Sifter({ - 'a': {title: 'Matterhorn', location: 'Switzerland', continent: 'Europe'}, - 'b': {title: 'Eiger', location: 'Switzerland', continent: 'Europe'}, - 'c': {title: 'Everest', location: 'Nepal', continent: 'Asia'}, - 'd': {title: 'Gannett', location: 'Wyoming', continent: 'North America'}, - 'e': {title: 'Denali', location: 'Alaska', continent: 'North America'} - }); - var result_hash = sifter.search('switzerland europe', options); - assert.deepEqual(result_hash, result); - }); - - describe('"items" array', function() { - it('should be an array', function() { - assert.equal(Array.isArray(result.items), true); - assert.equal(Array.isArray(result_empty.items), true); - assert.equal(Array.isArray(result_all.items), true); - }); - it('should include entire set if no query provided', function() { - assert.equal(result_all.items.length, 5); - }); - it('should not have a length that exceeds "limit" option', function() { - assert.equal(result.items.length > options.limit, false); - }); - it('should not contain any items with a score not equal to 1 (without query)', function() { - for (var i = 0, n = result_all.items.length; i < n; i++) { - assert.equal(result_all.items[i].score, 1); - } - }); - it('should not contain any items with a score of zero (with query)', function() { - for (var i = 0, n = result.items.length; i < n; i++) { - assert.notEqual(result.items[i].score, 0); - } - }); - it('should be empty when no results match', function() { - assert.equal(result_empty.items.length , 0); - }); - - describe('elements', function() { - it('should be objects', function() { - assert.equal(typeof result.items[0], 'object'); - assert.equal(Array.isArray(result.items[0]), false); - }); - describe('"score" property', function() { - it('should exist', function() { - assert.notEqual(typeof result.items[0].score, 'undefined'); - assert.notEqual(typeof result_all.items[0].score, 'undefined'); - }); - it('should be a number', function() { - assert.equal(typeof result.items[0].score, 'number'); - assert.equal(typeof result_all.items[0].score, 'number'); - }); - }); - describe('"id" property', function() { - it('should exist', function() { - assert.notEqual(typeof result.items[0].id, 'undefined'); - assert.notEqual(typeof result_all.items[0].id, 'undefined'); - }); - }); - }); - }); - - describe('"options"', function() { - it('should not be a reference to original options', function() { - assert.equal(result.options === options, false); - }); - it('should match original search options', function() { - assert.deepEqual(result.options, options); - }); - }); - - describe('"tokens"', function() { - it('should be an array', function() { - assert.equal(Array.isArray(result.tokens), true); - }); - describe('elements', function() { - it('should be a object', function() { - assert.equal(typeof result.tokens[0], 'object'); - assert.equal(Array.isArray(result.tokens[0]), false); - }); - describe('"string" property', function() { - it('should exist', function() { - assert.notEqual(typeof result.tokens[0].string, 'undefined'); - }); - it('should be a string', function() { - assert.equal(typeof result.tokens[0].string, 'string'); - }); - it('should be valid', function() { - assert.equal(result.tokens[0].string, 'switzerland'); - assert.equal(result.tokens[1].string, 'europe'); - }); - }); - describe('"regex" property', function() { - it('should exist', function() { - assert.notEqual(typeof result.tokens[0].regex, 'undefined'); - }); - it('should be a RegExp object', function() { - assert.equal(result.tokens[0].regex instanceof RegExp, true); - }); - }); - }); - }); - - describe('"query"', function() { - it('should match original query', function() { - assert.equal(result.query, 'switzerland europe'); - }); - }); - - describe('"total"', function() { - it('should be an integer', function() { - assert.equal(typeof result.total, 'number'); - assert.equal(Math.floor(result.total), Math.ceil(result.total)); - }); - it('should be valid', function() { - assert.equal(result.total, 2); - assert.equal(result_empty.total, 0); - }); - }); - - }); - - }); -}); diff --git a/test/getScoreFunction.js b/test/getScoreFunction.js new file mode 100644 index 0000000..3adff01 --- /dev/null +++ b/test/getScoreFunction.js @@ -0,0 +1,55 @@ +var assert = require('assert'); +var Sifter = require('../build/umd/sifter.js'); + +describe('#getScoreFunction()', function() { + + it('should acknowledge AND "conjunction" option', function() { + var score, search, sifter = new Sifter([]); + + score = sifter.getScoreFunction('one two', {fields: ['a','b'], conjunction: 'and'}); + assert.equal(score({a: 'one'}) > 0, false); + assert.equal(score({a: 'one', b: 'two'}) > 0, true); + assert.equal(score({a: 'one', b: 'one'}) > 0, false); + assert.equal(score({a: 'one', b: 'three'}) > 0, false); + assert.equal(score({a: 'three', b: 'three'}) > 0, false); + }); + + it('should acknowledge OR "conjunction" option', function() { + var score, search, sifter = new Sifter([]); + + score = sifter.getScoreFunction('one two', {fields: ['a','b'], conjunction: 'or'}); + assert.equal(score({a: 'one'}) > 0, true); + assert.equal(score({a: 'one', b: 'two'}) > 0, true); + assert.equal(score({a: 'one', b: 'one'}) > 0, true); + assert.equal(score({a: 'one', b: 'three'}) > 0, true); + assert.equal(score({a: 'three', b: 'three'}) > 0, false); + }); + + describe('with query and options', function() { + + it('should return a function that returns a number', function() { + var score, search, sifter = new Sifter([]); + + score = sifter.getScoreFunction('test', {fields: ['a','b']}); + assert.equal(typeof score({a: 'test'}), 'number'); + assert.equal(score({a: 'test'}) > 0, true); + assert.equal(typeof score({}), 'number'); + }); + + }); + + describe('with pre-prepared search', function() { + + it('should return a function that returns a number', function() { + var score, search, sifter = new Sifter([]); + + search = sifter.prepareSearch('test', {fields: ['a','b']}); + score = sifter.getScoreFunction(search); + assert.equal(typeof score({a: 'test'}), 'number'); + assert.equal(score({a: 'test'}) > 0, true); + assert.equal(typeof score({}), 'number'); + }); + + }); + +}); diff --git a/test/prepareSearch.js b/test/prepareSearch.js new file mode 100644 index 0000000..6ee518a --- /dev/null +++ b/test/prepareSearch.js @@ -0,0 +1,40 @@ +var assert = require('assert'); +var Sifter = require('../build/umd/sifter.js'); + +describe('#prepareSearch()', function() { + + it('should normalize options', function() { + var sifter = new Sifter([{field: 'a'}, {}]); + var search = sifter.prepareSearch('a', { + fields: {field: 'a'}, + sort: {field: 'a'}, + sort_empty: {field: 'a'} + }); + assert.equal(Array.isArray(search.options.fields), true); + assert.equal(Array.isArray(search.options.sort), true); + assert.equal(Array.isArray(search.options.sort_empty), true); + }); + + describe('returned object', function() { + var sifter = new Sifter([{field: 'a'}, {}]); + var search = sifter.prepareSearch('hello world'); + + it('should contain "total" (int)', function() { + assert.equal(search.total, 0); + }); + it('should contain "tokens" (array)', function() { + assert.equal(Array.isArray(search.tokens), true); + assert.equal(search.tokens.length, 2); + }); + it('should contain "items" (array)', function() { + assert.equal(Array.isArray(search.items), true); + assert.equal(search.items.length, 0); + }); + it('should contain "options" (array)', function() { + assert.equal(search.options !== null, true); + assert.equal(typeof search.options, 'object'); + assert.equal(Array.isArray(search.options), false); + }); + }); + +}); diff --git a/test/search.js b/test/search.js new file mode 100644 index 0000000..a2c8b0e --- /dev/null +++ b/test/search.js @@ -0,0 +1,353 @@ +var assert = require('assert'); +var Sifter = require('../build/umd/sifter.js'); + + +describe('#search()', function() { + + it('should not throw if an element does not contain search field', function() { + assert.doesNotThrow(function() { + var sifter = new Sifter([{field: 'a'}, {}]); + var result = sifter.search('hello', {fields: ['field']}); + }); + }); + + it('should allow "fields" option to be a string', function() { + var sifter = new Sifter([{field: 'a'}, {}]); + var result = sifter.search('a', {fields: 'field'}); + assert.equal(result.items[0].id, 0); + }); + + it('should allow to search nested fields', function() { + var sifter = new Sifter([ + {fields: {nested: 'aaa'}}, + {fields: {nested: 'add'}}, + {fields: {nested: 'abb'}} + ]); + var result = sifter.search('aaa', { + fields: 'fields.nested', + nesting: true + }); + + assert.equal(result.items.length, 1); + assert.equal(result.items[0].id, 0); + }); + + it('should allow word boundaries to be respected', function() { + var sifter = new Sifter([ + {name: 'John Smith'}, + {name: 'Jane Doe'}, + ]); + var result = sifter.search('mith', {fields: 'name'}); + assert.equal(result.items.length, 1); + + var result = sifter.search('mith', {fields: 'name', respect_word_boundaries: true}); + assert.equal(result.items.length, 0); + + var result = sifter.search('Smi', {fields: 'name', respect_word_boundaries: true}); + assert.equal(result.items.length, 1); + + var result = sifter.search('John Sm', {fields: 'name', respect_word_boundaries: true}); + assert.equal(result.items.length, 1); + + var result = sifter.search('ohn Smith', {fields: 'name', respect_word_boundaries: true, conjunction: 'and'}); + assert.equal(result.items.length, 0); + }); + + describe('sorting', function() { + it('should respect "sort_empty" option when query absent', function() { + var sifter = new Sifter([ + {field: 'aaa'}, + {field: 'add'}, + {field: 'abb'} + ]); + var result = sifter.search('', { + fields: 'field', + sort: {field: 'field', direction: 'asc'}, + sort_empty: {field: 'field', direction: 'desc'} + }); + assert.equal(result.items[0].id, 1); + assert.equal(result.items[1].id, 2); + assert.equal(result.items[2].id, 0); + }); + it('should work with one field (as object)', function() { + var sifter = new Sifter([ + {field: 'aaa'}, + {field: 'add'}, + {field: 'abb'} + ]); + var result = sifter.search('', { + fields: 'field', + sort: {field: 'field'} + }); + assert.equal(result.items[0].id, 0); + assert.equal(result.items[1].id, 2); + assert.equal(result.items[2].id, 1); + }); + it('should work with one field (as array)', function() { + var sifter = new Sifter([ + {field: 'aaa'}, + {field: 'add'}, + {field: 'abb'} + ]); + var result = sifter.search('', { + fields: 'field', + sort: [{field: 'field'}] + }); + assert.equal(result.items[0].id, 0); + assert.equal(result.items[1].id, 2); + assert.equal(result.items[2].id, 1); + }); + it('should work with multiple fields and respect priority', function() { + var sifter = new Sifter([ + {a: 'bbb', b: 'bbb'}, + {a: 'bbb', b: 'ccc'}, + {a: 'bbb', b: 'aaa'}, + {a: 'aaa'} + ]); + var result = sifter.search('', { + fields: 'field', + sort: [ + {field: 'a'}, + {field: 'b'} + ] + }); + assert.equal(result.items[0].id, 3); + assert.equal(result.items[1].id, 2); + assert.equal(result.items[2].id, 0); + assert.equal(result.items[3].id, 1); + }); + it('should respect numeric fields', function() { + var sifter = new Sifter([ + {field: 1.0}, + {field: 12.9}, + {field: 9.1}, + {field: -9.0} + ]); + var result = sifter.search('', { + fields: 'field', + sort: [{field: 'field'}] + }); + assert.equal(result.items[0].id, 3); + assert.equal(result.items[1].id, 0); + assert.equal(result.items[2].id, 2); + assert.equal(result.items[3].id, 1); + }); + it('should respect sort direction', function() { + var sifter = new Sifter([ + {a: 'bbb', b: 'rrr'}, + {a: 'bbb', b: 'aaa'}, + {a: 'aaa', b: 'rrr'}, + {a: 'aaa', b: 'aaa'} + ]); + var result = sifter.search('', { + fields: 'field', + sort: [ + {field: 'b', direction: 'desc'}, + {field: 'a', direction: 'asc'} + ] + }); + assert.equal(result.items[0].id, 2); + assert.equal(result.items[1].id, 0); + assert.equal(result.items[2].id, 3); + assert.equal(result.items[3].id, 1); + }); + it('should add implicit "$score" field when query present', function() { + var sifter = new Sifter([ + {field: 'yoo'}, + {field: 'book'} + ]); + var result = sifter.search('oo', { + fields: 'field', + sort: [{field: 'field'}] + }); + assert.equal(result.items[0].id, 0); + assert.equal(result.items[1].id, 1); + }); + it('should not add implicit "$score" field if explicitly given', function() { + var sifter = new Sifter([ + {field: 'boooo'}, + {field: 'yoo'}, + {field: 'aaa'} + ]); + var result = sifter.search('oo', { + filter: false, + fields: 'field', + sort: [{field: 'field'}, {field: '$score'}] + }); + assert.equal(result.items[0].id, 2); + assert.equal(result.items[1].id, 0); + assert.equal(result.items[2].id, 1); + }); + it('should be locale-aware', function() { + var sifter = new Sifter([ + {field: 'Zoom Test'}, + {field: 'Água Test'} + ]); + var result = sifter.search('', { + fields: 'field', + sort: [{field: 'field', direction: 'asc'}] + }); + assert.equal(result.items[0].id, 1); + assert.equal(result.items[1].id, 0); + }); + it('should work with nested fields', function() { + var sifter = new Sifter([ + {fields: {nested: 'aaa'}}, + {fields: {nested: 'add'}}, + {fields: {nested: 'abb'}} + ]); + var result = sifter.search('', { + fields: [], + sort: {field: 'fields.nested'}, + nesting: true + }); + assert.equal(result.items[0].id, 0); + assert.equal(result.items[1].id, 2); + assert.equal(result.items[2].id, 1); + }); + }); + + describe('returned results', function() { + var sifter, options, result, result_empty, result_all; + + before(function() { + sifter = new Sifter([ + {title: 'Matterhorn', location: 'Switzerland', continent: 'Europe'}, + {title: 'Eiger', location: 'Switzerland', continent: 'Europe'}, + {title: 'Everest', location: 'Nepal', continent: 'Asia'}, + {title: 'Gannett', location: 'Wyoming', continent: 'North America'}, + {title: 'Denali', location: 'Alaska', continent: 'North America'} + ]); + + options = {limit: 1, fields: ['title', 'location', 'continent']}; + result = sifter.search('switzerland europe', options); + result_empty = sifter.search('awawfawfawf', options); + result_all = sifter.search('', { + fields: ['title', 'location', 'continent'], + sort: [{field: 'title'}] + }); + }); + + it('should not vary when using an array vs a hash as a data source', function() { + var sifter_hash = new Sifter({ + 'a': {title: 'Matterhorn', location: 'Switzerland', continent: 'Europe'}, + 'b': {title: 'Eiger', location: 'Switzerland', continent: 'Europe'}, + 'c': {title: 'Everest', location: 'Nepal', continent: 'Asia'}, + 'd': {title: 'Gannett', location: 'Wyoming', continent: 'North America'}, + 'e': {title: 'Denali', location: 'Alaska', continent: 'North America'} + }); + var result_hash = sifter.search('switzerland europe', options); + assert.deepEqual(result_hash, result); + }); + + describe('"items" array', function() { + it('should be an array', function() { + assert.equal(Array.isArray(result.items), true); + assert.equal(Array.isArray(result_empty.items), true); + assert.equal(Array.isArray(result_all.items), true); + }); + it('should include entire set if no query provided', function() { + assert.equal(result_all.items.length, 5); + }); + it('should not have a length that exceeds "limit" option', function() { + assert.equal(result.items.length > options.limit, false); + }); + it('should not contain any items with a score not equal to 1 (without query)', function() { + for (var i = 0, n = result_all.items.length; i < n; i++) { + assert.equal(result_all.items[i].score, 1); + } + }); + it('should not contain any items with a score of zero (with query)', function() { + for (var i = 0, n = result.items.length; i < n; i++) { + assert.notEqual(result.items[i].score, 0); + } + }); + it('should be empty when no results match', function() { + assert.equal(result_empty.items.length , 0); + }); + + describe('elements', function() { + it('should be objects', function() { + assert.equal(typeof result.items[0], 'object'); + assert.equal(Array.isArray(result.items[0]), false); + }); + describe('"score" property', function() { + it('should exist', function() { + assert.notEqual(typeof result.items[0].score, 'undefined'); + assert.notEqual(typeof result_all.items[0].score, 'undefined'); + }); + it('should be a number', function() { + assert.equal(typeof result.items[0].score, 'number'); + assert.equal(typeof result_all.items[0].score, 'number'); + }); + }); + describe('"id" property', function() { + it('should exist', function() { + assert.notEqual(typeof result.items[0].id, 'undefined'); + assert.notEqual(typeof result_all.items[0].id, 'undefined'); + }); + }); + }); + }); + + describe('"options"', function() { + it('should not be a reference to original options', function() { + assert.equal(result.options === options, false); + }); + it('should match original search options', function() { + assert.deepEqual(result.options, options); + }); + }); + + describe('"tokens"', function() { + it('should be an array', function() { + assert.equal(Array.isArray(result.tokens), true); + }); + describe('elements', function() { + it('should be a object', function() { + assert.equal(typeof result.tokens[0], 'object'); + assert.equal(Array.isArray(result.tokens[0]), false); + }); + describe('"string" property', function() { + it('should exist', function() { + assert.notEqual(typeof result.tokens[0].string, 'undefined'); + }); + it('should be a string', function() { + assert.equal(typeof result.tokens[0].string, 'string'); + }); + it('should be valid', function() { + assert.equal(result.tokens[0].string, 'switzerland'); + assert.equal(result.tokens[1].string, 'europe'); + }); + }); + describe('"regex" property', function() { + it('should exist', function() { + assert.notEqual(typeof result.tokens[0].regex, 'undefined'); + }); + it('should be a RegExp object', function() { + assert.equal(result.tokens[0].regex instanceof RegExp, true); + }); + }); + }); + }); + + describe('"query"', function() { + it('should match original query', function() { + assert.equal(result.query, 'switzerland europe'); + }); + }); + + describe('"total"', function() { + it('should be an integer', function() { + assert.equal(typeof result.total, 'number'); + assert.equal(Math.floor(result.total), Math.ceil(result.total)); + }); + it('should be valid', function() { + assert.equal(result.total, 2); + assert.equal(result_empty.total, 0); + }); + }); + + }); + +}); diff --git a/test/tokenize.js b/test/tokenize.js new file mode 100644 index 0000000..af63279 --- /dev/null +++ b/test/tokenize.js @@ -0,0 +1,63 @@ +var assert = require('assert'); +var Sifter = require('../build/umd/sifter.js'); + +describe('#tokenize()', function() { + var sifter, tokens; + + it('should return an empty array when given an empty string', function() { + var sifter = new Sifter([]); + var tokens = sifter.tokenize(''); + assert.equal(tokens.length, 0); + }); + + it('should return an array', function() { + var sifter = new Sifter([]); + var tokens = sifter.tokenize('hello world'); + assert.equal(Array.isArray(tokens), true); + }); + + it('should split string by spaces', function() { + var sifter = new Sifter([]); + var tokens = sifter.tokenize('hello world'); + assert.equal(tokens.length, 2); + }); + + describe('returned tokens', function() { + before(function() { + sifter = new Sifter([]); + tokens = sifter.tokenize('hello world'); + }); + describe('"string" property', function() { + it('should exist', function() { + assert.notEqual(typeof tokens[0].string, 'undefined'); + }); + it('should be a string', function() { + assert.equal(typeof tokens[0].string, 'string'); + }); + it('should be valid', function() { + assert.equal(tokens[0].string, 'hello'); + assert.equal(tokens[1].string, 'world'); + }); + }); + describe('"regex" property', function() { + it('should exist', function() { + assert.notEqual(typeof tokens[0].regex, 'undefined'); + }); + it('should be a RegExp object', function() { + assert.equal(tokens[0].regex instanceof RegExp, true); + }); + it('should ignore case', function() { + assert.equal(tokens[0].regex.test('HelLO'), true); + assert.equal(tokens[1].regex.test('wORLD'), true); + }); + it('should not be too greedy', function() { + assert.equal(tokens[0].regex.test('afawfaf'), false); + }); + it('should match international characters', function() { + assert.equal(tokens[0].regex.test('hęłlö'), true); + assert.equal(tokens[1].regex.test('wÕrlð'), true); + }); + }); + }); + +}); From 5368693a231882bf89c5754d668189de27bc0420 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 12:52:08 -0600 Subject: [PATCH 013/140] add tests for field searching --- test/search.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/test/search.js b/test/search.js index a2c8b0e..01999f4 100644 --- a/test/search.js +++ b/test/search.js @@ -350,4 +350,29 @@ describe('#search()', function() { }); + describe('#field searching', function() { + + var data = [ + {fieldx: 'aa', fieldy: 'a'}, + {fieldx: 'ab', fieldy: 'a', fieldz: 'b' } + ]; + var sifter = new Sifter(data); + + it('should return two matching rows', function() { + var result = sifter.search('fieldx:a', {fields: ['fieldx','fieldy','fieldz']}); + assert.equal(result.items.length, 2); + }); + + it('should return one matching row', function() { + var result = sifter.search('fieldz:b', {fields: ['fieldx','fieldy','fieldz']}); + assert.equal(result.items.length, 1); + }); + + it('should return one matching row', function() { + var result = sifter.search('fieldz:', {fields: ['fieldx','fieldy','fieldz']}); + assert.equal(result.items.length, 1); + }); + + }); + }); From 27ae2619b492d715caf8712902738d8951c16c35 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 13:01:20 -0600 Subject: [PATCH 014/140] benchmark result readability --- benchmark/index.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/benchmark/index.js b/benchmark/index.js index 1407e4c..6e9f26a 100644 --- a/benchmark/index.js +++ b/benchmark/index.js @@ -91,9 +91,9 @@ var timed_report = function(title, fn) { var p_delta = Math.round(t_delta / t_old * 100, 1); reports_new[title] = t_new; - process.stdout.write('\033[1;39m' + humanize.numberFormat(t_new / 1000) + ' ms\033[0;39m \033[1;30m(score: ' + (t_new / time_baseline).toFixed(6) + ')\033[0;39m '); + process.stdout.write('\033[1;39m' + humanize.numberFormat(t_new / 1000) + ' ms\033[0;39m (score: ' + (t_new / time_baseline).toFixed(6) + ')\033[0;39m '); if (t_old) { - process.stdout.write('\t' + (Math.abs(p_delta) < 5 ? '\033[1;30m' : (t_delta > 0 ? '\033[31m' : '\033[32m'))); + process.stdout.write('\t' + (Math.abs(p_delta) < 5 ? '' : (t_delta > 0 ? '\033[31m' : '\033[32m'))); process.stdout.write((t_delta > 0 ? '-' : '+') + Math.abs(p_delta) + '% (' + (t_delta > 0 ? '+' : '') + humanize.numberFormat(Math.round(t_delta / 1000), 0) + 'ms)'); process.stdout.write('\033[0;39m'); } @@ -111,8 +111,8 @@ var trial = function(title, searches, options) { }; console.log('sifter.js Benchmark'); -console.log('\033[1;30m' + humanize.numberFormat(searches_limit, 0) + ' trials (searches)\033[0;39m'); -console.log('\033[1;30m' + humanize.numberFormat(corpus.length, 0) + ' options (index size)\033[0;39m'); +console.log( humanize.numberFormat(searches_limit, 0) + ' trials (searches)\033[0;39m'); +console.log( humanize.numberFormat(corpus.length, 0) + ' options (index size)\033[0;39m'); console.log('\n\033[32mResults:\033[0;39m'); trial('No query', searches_mixed, {query: '', options: {fields: ['a'], sort: [{field: 'a'}], direction: 'asc'}}); @@ -140,10 +140,10 @@ trial('3 field search (limit 100)', searches_mixed, {options: {fields: ['a','b', console.log(''); trial('4 field search', searches_mixed, {options: {fields: ['a','b','c','d'], sort: [{field: 'a'}], direction: 'asc'}}); -trial('4 field search (limit 100)', searches_mixed, {options: {fields: ['a','b','c','d'], sort: [{field: 'a'}], direction: 'asc', limit: 100}}); trial('4 field search (1 letter)', searches_1letter, {options: {fields: ['a','b','c','d'], sort: [{field: 'a'}], direction: 'asc'}}); trial('4 field search (2 letter)', searches_2letter, {options: {fields: ['a','b','c','d'], sort: [{field: 'a'}], direction: 'asc'}}); trial('4 field search (3 letter)', searches_3letter, {options: {fields: ['a','b','c','d'], sort: [{field: 'a'}], direction: 'asc'}}); +trial('4 field search (limit 100)', searches_mixed, {options: {fields: ['a','b','c','d'], sort: [{field: 'a'}], direction: 'asc', limit: 100}}); console.log(''); trial('5 field search', searches_mixed, {options: {fields: ['a','b','c','d','e'], sort: [{field: 'a'}], direction: 'asc'}}); @@ -155,4 +155,4 @@ trial('5 field search (limit 100)', searches_mixed, {options: {fields: ['a','b', if (process.argv.indexOf('--no-save') === -1) { fs.writeFileSync(path_report, JSON.stringify(reports_new), 'utf8'); console.log('\nReport written to ' + path_report); -} \ No newline at end of file +} From 5fb2812446fe3e66b08f1f962dc3d509e1eb0663 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 13:22:46 -0600 Subject: [PATCH 015/140] remove lib/sifter.js --- lib/sifter.js | 498 -------------------------------------------------- 1 file changed, 498 deletions(-) delete mode 100644 lib/sifter.js diff --git a/lib/sifter.js b/lib/sifter.js deleted file mode 100644 index 49a2a45..0000000 --- a/lib/sifter.js +++ /dev/null @@ -1,498 +0,0 @@ -/** - * sifter.js - * Copyright (c) 2013–2020 Brian Reavis & contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this - * file except in compliance with the License. You may obtain a copy of the License at: - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under - * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF - * ANY KIND, either express or implied. See the License for the specific language - * governing permissions and limitations under the License. - * - * @author Brian Reavis - */ - -(function(root, factory) { - if (typeof define === 'function' && define.amd) { - define(factory); - } else if (typeof exports === 'object') { - module.exports = factory(); - } else { - root.Sifter = factory(); - } -}(this, function() { - - /** - * Textually searches arrays and hashes of objects - * by property (or multiple properties). Designed - * specifically for autocomplete. - * - * @constructor - * @param {array|object} items - * @param {object} items - */ - var Sifter = function(items, settings) { - this.items = items; - this.settings = settings || {diacritics: true}; - }; - - /** - * Splits a search string into an array of individual - * regexps to be used to match results. - * - * @param {string} query - * @returns {array} - */ - Sifter.prototype.tokenize = function(query, respect_word_boundaries) { - query = trim(String(query || '').toLowerCase()); - if (!query || !query.length) return []; - - var i, n, regex, letter; - var tokens = []; - var words = query.split(/ +/); - - for (i = 0, n = words.length; i < n; i++) { - regex = escape_regex(words[i]); - if (this.settings.diacritics) { - for (letter in DIACRITICS) { - if (DIACRITICS.hasOwnProperty(letter)) { - regex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]); - } - } - } - if (respect_word_boundaries) regex = "\\b"+regex - tokens.push({ - string : words[i], - regex : new RegExp(regex, 'i') - }); - } - - return tokens; - }; - - /** - * Iterates over arrays and hashes. - * - * ``` - * this.iterator(this.items, function(item, id) { - * // invoked for each item - * }); - * ``` - * - * @param {array|object} object - */ - Sifter.prototype.iterator = function(object, callback) { - var iterator; - if (is_array(object)) { - iterator = Array.prototype.forEach || function(callback) { - for (var i = 0, n = this.length; i < n; i++) { - callback(this[i], i, this); - } - }; - } else { - iterator = function(callback) { - for (var key in this) { - if (this.hasOwnProperty(key)) { - callback(this[key], key, this); - } - } - }; - } - - iterator.apply(object, [callback]); - }; - - /** - * Returns a function to be used to score individual results. - * - * Good matches will have a higher score than poor matches. - * If an item is not a match, 0 will be returned by the function. - * - * @param {object|string} search - * @param {object} options (optional) - * @returns {function} - */ - Sifter.prototype.getScoreFunction = function(search, options) { - var self, fields, tokens, token_count, nesting; - - self = this; - search = self.prepareSearch(search, options); - tokens = search.tokens; - fields = search.options.fields; - token_count = tokens.length; - nesting = search.options.nesting; - - /** - * Calculates how close of a match the - * given value is against a search token. - * - * @param {mixed} value - * @param {object} token - * @return {number} - */ - var scoreValue = function(value, token) { - var score, pos; - - if (!value) return 0; - value = String(value || ''); - pos = value.search(token.regex); - if (pos === -1) return 0; - score = token.string.length / value.length; - if (pos === 0) score += 0.5; - return score; - }; - - /** - * Calculates the score of an object - * against the search query. - * - * @param {object} token - * @param {object} data - * @return {number} - */ - var scoreObject = (function() { - var field_count = fields.length; - if (!field_count) { - return function() { return 0; }; - } - if (field_count === 1) { - return function(token, data) { - return scoreValue(getattr(data, fields[0], nesting), token); - }; - } - return function(token, data) { - for (var i = 0, sum = 0; i < field_count; i++) { - sum += scoreValue(getattr(data, fields[i], nesting), token); - } - return sum / field_count; - }; - })(); - - if (!token_count) { - return function() { return 0; }; - } - if (token_count === 1) { - return function(data) { - return scoreObject(tokens[0], data); - }; - } - - if (search.options.conjunction === 'and') { - return function(data) { - var score; - for (var i = 0, sum = 0; i < token_count; i++) { - score = scoreObject(tokens[i], data); - if (score <= 0) return 0; - sum += score; - } - return sum / token_count; - }; - } else { - return function(data) { - for (var i = 0, sum = 0; i < token_count; i++) { - sum += scoreObject(tokens[i], data); - } - return sum / token_count; - }; - } - }; - - /** - * Returns a function that can be used to compare two - * results, for sorting purposes. If no sorting should - * be performed, `null` will be returned. - * - * @param {string|object} search - * @param {object} options - * @return function(a,b) - */ - Sifter.prototype.getSortFunction = function(search, options) { - var i, n, self, field, fields, fields_count, multiplier, multipliers, get_field, implicit_score, sort; - - self = this; - search = self.prepareSearch(search, options); - sort = (!search.query && options.sort_empty) || options.sort; - - /** - * Fetches the specified sort field value - * from a search result item. - * - * @param {string} name - * @param {object} result - * @return {mixed} - */ - get_field = function(name, result) { - if (name === '$score') return result.score; - return getattr(self.items[result.id], name, options.nesting); - }; - - // parse options - fields = []; - if (sort) { - for (i = 0, n = sort.length; i < n; i++) { - if (search.query || sort[i].field !== '$score') { - fields.push(sort[i]); - } - } - } - - // the "$score" field is implied to be the primary - // sort field, unless it's manually specified - if (search.query) { - implicit_score = true; - for (i = 0, n = fields.length; i < n; i++) { - if (fields[i].field === '$score') { - implicit_score = false; - break; - } - } - if (implicit_score) { - fields.unshift({field: '$score', direction: 'desc'}); - } - } else { - for (i = 0, n = fields.length; i < n; i++) { - if (fields[i].field === '$score') { - fields.splice(i, 1); - break; - } - } - } - - multipliers = []; - for (i = 0, n = fields.length; i < n; i++) { - multipliers.push(fields[i].direction === 'desc' ? -1 : 1); - } - - // build function - fields_count = fields.length; - if (!fields_count) { - return null; - } else if (fields_count === 1) { - field = fields[0].field; - multiplier = multipliers[0]; - return function(a, b) { - return multiplier * cmp( - get_field(field, a), - get_field(field, b) - ); - }; - } else { - return function(a, b) { - var i, result, a_value, b_value, field; - for (i = 0; i < fields_count; i++) { - field = fields[i].field; - result = multipliers[i] * cmp( - get_field(field, a), - get_field(field, b) - ); - if (result) return result; - } - return 0; - }; - } - }; - - /** - * Parses a search query and returns an object - * with tokens and fields ready to be populated - * with results. - * - * @param {string} query - * @param {object} options - * @returns {object} - */ - Sifter.prototype.prepareSearch = function(query, options) { - if (typeof query === 'object') return query; - - options = extend({}, options); - - var option_fields = options.fields; - var option_sort = options.sort; - var option_sort_empty = options.sort_empty; - - if (option_fields && !is_array(option_fields)) options.fields = [option_fields]; - if (option_sort && !is_array(option_sort)) options.sort = [option_sort]; - if (option_sort_empty && !is_array(option_sort_empty)) options.sort_empty = [option_sort_empty]; - - return { - options : options, - query : String(query || '').toLowerCase(), - tokens : this.tokenize(query, options.respect_word_boundaries), - total : 0, - items : [] - }; - }; - - /** - * Searches through all items and returns a sorted array of matches. - * - * The `options` parameter can contain: - * - * - fields {string|array} - * - sort {array} - * - score {function} - * - filter {bool} - * - limit {integer} - * - * Returns an object containing: - * - * - options {object} - * - query {string} - * - tokens {array} - * - total {int} - * - items {array} - * - * @param {string} query - * @param {object} options - * @returns {object} - */ - Sifter.prototype.search = function(query, options) { - var self = this, value, score, search, calculateScore; - var fn_sort; - var fn_score; - - search = this.prepareSearch(query, options); - options = search.options; - query = search.query; - - // generate result scoring function - fn_score = options.score || self.getScoreFunction(search); - - // perform search and sort - if (query.length) { - self.iterator(self.items, function(item, id) { - score = fn_score(item); - if (options.filter === false || score > 0) { - search.items.push({'score': score, 'id': id}); - } - }); - } else { - self.iterator(self.items, function(item, id) { - search.items.push({'score': 1, 'id': id}); - }); - } - - fn_sort = self.getSortFunction(search, options); - if (fn_sort) search.items.sort(fn_sort); - - // apply limits - search.total = search.items.length; - if (typeof options.limit === 'number') { - search.items = search.items.slice(0, options.limit); - } - - return search; - }; - - // utilities - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - var cmp = function(a, b) { - if (typeof a === 'number' && typeof b === 'number') { - return a > b ? 1 : (a < b ? -1 : 0); - } - a = asciifold(String(a || '')); - b = asciifold(String(b || '')); - if (a > b) return 1; - if (b > a) return -1; - return 0; - }; - - var extend = function(a, b) { - var i, n, k, object; - for (i = 1, n = arguments.length; i < n; i++) { - object = arguments[i]; - if (!object) continue; - for (k in object) { - if (object.hasOwnProperty(k)) { - a[k] = object[k]; - } - } - } - return a; - }; - - /** - * A property getter resolving dot-notation - * @param {Object} obj The root object to fetch property on - * @param {String} name The optionally dotted property name to fetch - * @param {Boolean} nesting Handle nesting or not - * @return {Object} The resolved property value - */ - var getattr = function(obj, name, nesting) { - if (!obj || !name) return; - if (!nesting) return obj[name]; - var names = name.split("."); - while(names.length && (obj = obj[names.shift()])); - return obj; - }; - - var trim = function(str) { - return (str + '').replace(/^\s+|\s+$|/g, ''); - }; - - var escape_regex = function(str) { - return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); - }; - - var is_array = Array.isArray || (typeof $ !== 'undefined' && $.isArray) || function(object) { - return Object.prototype.toString.call(object) === '[object Array]'; - }; - - var DIACRITICS = { - 'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]', - 'b': '[b␢βΒB฿𐌁ᛒ]', - 'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄCc]', - 'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅDdð]', - 'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇEeɘǝƏƐε]', - 'f': '[fƑƒḞḟ]', - 'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]', - 'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]', - 'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪIi]', - 'j': '[jȷĴĵɈɉʝɟʲ]', - 'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]', - 'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟLl]', - 'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴNnŊŋ]', - 'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]', - 'p': '[pṔṕṖṗⱣᵽƤƥᵱ]', - 'q': '[qꝖꝗʠɊɋꝘꝙq̃]', - 'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]', - 's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]', - 't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]', - 'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]', - 'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]', - 'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]', - 'x': '[xẌẍẊẋχ]', - 'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]', - 'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]' - }; - - var asciifold = (function() { - var i, n, k, chunk; - var foreignletters = ''; - var lookup = {}; - for (k in DIACRITICS) { - if (DIACRITICS.hasOwnProperty(k)) { - chunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1); - foreignletters += chunk; - for (i = 0, n = chunk.length; i < n; i++) { - lookup[chunk.charAt(i)] = k; - } - } - } - var regexp = new RegExp('[' + foreignletters + ']', 'g'); - return function(str) { - return str.replace(regexp, function(foreignletter) { - return lookup[foreignletter]; - }).toLowerCase(); - }; - })(); - - - // export - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - return Sifter; -})); From 5e8c2f0f432e9f34afbd7c4a0f9c3a9755587030 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 13:23:08 -0600 Subject: [PATCH 016/140] rename Sifter.iterator() to iterate() --- lib/sifter.ts | 61 +++++++++++++++++++++++--------------------------- test/search.js | 7 ++++++ 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 71f4b26..a938062 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -128,6 +128,32 @@ var propToArray = function(obj, key){ } +/** + * Iterates over arrays and hashes. + * + * ``` + * iterate(this.items, function(item, id) { + * // invoked for each item + * }); + * ``` + * + * @param {array|object} object + */ +const iterate = function(object, callback) { + + if ( Array.isArray(object)) { + Array.prototype.forEach.call(object,callback); + + }else{ + + for (var key in object) { + if (object.hasOwnProperty(key)) { + callback(object[key], key); + } + } + } +}; + export default class Sifter{ public items: []|{}; @@ -201,37 +227,6 @@ export default class Sifter{ return tokens; }; - /** - * Iterates over arrays and hashes. - * - * ``` - * this.iterator(this.items, function(item, id) { - * // invoked for each item - * }); - * ``` - * - * @param {array|object} object - */ - iterator(object, callback) { - var iterator; - if (Array.isArray(object)) { - iterator = Array.prototype.forEach || function(callback) { - for (var i = 0, n = this.length; i < n; i++) { - callback(this[i], i, this); - } - }; - } else { - iterator = function(callback) { - for (var key in this) { - if (this.hasOwnProperty(key)) { - callback(this[key], key, this); - } - } - }; - } - - iterator.apply(object, [callback]); - }; /** * Returns a function to be used to score individual results. @@ -478,14 +473,14 @@ export default class Sifter{ // perform search and sort if (query.length) { - self.iterator(self.items, function(item, id) { + iterate(self.items, (item, id) => { score = fn_score(item); if (options.filter === false || score > 0) { search.items.push({'score': score, 'id': id}); } }); } else { - self.iterator(self.items, function(item, id) { + iterate(self.items, (item, id) => { search.items.push({'score': 1, 'id': id}); }); } diff --git a/test/search.js b/test/search.js index 01999f4..8c5a021 100644 --- a/test/search.js +++ b/test/search.js @@ -53,6 +53,13 @@ describe('#search()', function() { assert.equal(result.items.length, 0); }); + it('should work if search data is an object', function() { + var sifter = new Sifter({a:{field: 'a'}, b:{field:'b'}}); + var result = sifter.search('a', {fields: ['field']}); + assert.equal(result.items.length, 1); + assert.equal(result.items[0].id, 'a'); + }); + describe('sorting', function() { it('should respect "sort_empty" option when query absent', function() { var sifter = new Sifter([ From 6c97e162fb5327c0ad9e032e67f1305f85ffb401 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 13:36:43 -0600 Subject: [PATCH 017/140] create diacritics.ts and utils.ts --- lib/diacritics.ts | 28 ++++++++++++ lib/sifter.ts | 106 ++++++---------------------------------------- lib/utils.ts | 60 ++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 94 deletions(-) create mode 100644 lib/diacritics.ts create mode 100644 lib/utils.ts diff --git a/lib/diacritics.ts b/lib/diacritics.ts new file mode 100644 index 0000000..4a13341 --- /dev/null +++ b/lib/diacritics.ts @@ -0,0 +1,28 @@ + +export var DIACRITICS:{ [key: string]: string } = { + 'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]', + 'b': '[b␢βΒB฿𐌁ᛒ]', + 'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄCc]', + 'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅDdð]', + 'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇEeɘǝƏƐε]', + 'f': '[fƑƒḞḟ]', + 'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]', + 'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]', + 'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪIi]', + 'j': '[jȷĴĵɈɉʝɟʲ]', + 'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]', + 'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟLl]', + 'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴNnŊŋ]', + 'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]', + 'p': '[pṔṕṖṗⱣᵽƤƥᵱ]', + 'q': '[qꝖꝗʠɊɋꝘꝙq̃]', + 'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]', + 's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]', + 't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]', + 'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]', + 'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]', + 'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]', + 'x': '[xẌẍẊẋχ]', + 'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]', + 'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]' +}; diff --git a/lib/sifter.ts b/lib/sifter.ts index a938062..7a499e9 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -14,6 +14,10 @@ * @author Brian Reavis */ +import { getattr, escape_regex, propToArray, iterate } from './utils.ts'; +import { DIACRITICS } from './diacritics.ts'; + + type TOptions = { fields: string|string[], sort: any[], @@ -35,69 +39,6 @@ type TPrepareObj = { items: any[] } - - -// utilities -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -var cmp = function(a, b) { - if (typeof a === 'number' && typeof b === 'number') { - return a > b ? 1 : (a < b ? -1 : 0); - } - a = asciifold(String(a || '')); - b = asciifold(String(b || '')); - if (a > b) return 1; - if (b > a) return -1; - return 0; -}; - -/** - * A property getter resolving dot-notation - * @param {Object} obj The root object to fetch property on - * @param {String} name The optionally dotted property name to fetch - * @param {Boolean} nesting Handle nesting or not - * @return {Object} The resolved property value - */ -var getattr = function(obj, name, nesting) { - if (!obj || !name) return; - if (!nesting) return obj[name]; - var names = name.split("."); - while(names.length && (obj = obj[names.shift()])); - return obj; -}; - -var escape_regex = function(str) { - return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); -}; - -var DIACRITICS = { - 'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]', - 'b': '[b␢βΒB฿𐌁ᛒ]', - 'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄCc]', - 'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅDdð]', - 'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇEeɘǝƏƐε]', - 'f': '[fƑƒḞḟ]', - 'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]', - 'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]', - 'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪIi]', - 'j': '[jȷĴĵɈɉʝɟʲ]', - 'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]', - 'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟLl]', - 'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴNnŊŋ]', - 'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]', - 'p': '[pṔṕṖṗⱣᵽƤƥᵱ]', - 'q': '[qꝖꝗʠɊɋꝘꝙq̃]', - 'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]', - 's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]', - 't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]', - 'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]', - 'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]', - 'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]', - 'x': '[xẌẍẊẋχ]', - 'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]', - 'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]' -}; - var asciifold = (function() { var i, n, k, chunk; var foreignletters = ''; @@ -120,38 +61,15 @@ var asciifold = (function() { })(); -var propToArray = function(obj, key){ - var value = obj[key]; - if( value && !Array.isArray(value) ){ - obj[key] = [value]; - } -} - - -/** - * Iterates over arrays and hashes. - * - * ``` - * iterate(this.items, function(item, id) { - * // invoked for each item - * }); - * ``` - * - * @param {array|object} object - */ -const iterate = function(object, callback) { - - if ( Array.isArray(object)) { - Array.prototype.forEach.call(object,callback); - - }else{ - - for (var key in object) { - if (object.hasOwnProperty(key)) { - callback(object[key], key); - } - } +function cmp(a, b) { + if (typeof a === 'number' && typeof b === 'number') { + return a > b ? 1 : (a < b ? -1 : 0); } + a = asciifold(String(a || '')); + b = asciifold(String(b || '')); + if (a > b) return 1; + if (b > a) return -1; + return 0; }; export default class Sifter{ diff --git a/lib/utils.ts b/lib/utils.ts new file mode 100644 index 0000000..367d432 --- /dev/null +++ b/lib/utils.ts @@ -0,0 +1,60 @@ + + + +/** + * A property getter resolving dot-notation + * @param {Object} obj The root object to fetch property on + * @param {String} name The optionally dotted property name to fetch + * @param {Boolean} nesting Handle nesting or not + * @return {Object} The resolved property value + */ +export function getattr(obj, name, nesting) { + if (!obj || !name) return; + if (!nesting) return obj[name]; + var names = name.split("."); + while(names.length && (obj = obj[names.shift()])); + return obj; +}; + +export function escape_regex(str) { + return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); +}; + + +/** + * Cast object property to an array if it exists and has a value + * + */ +export function propToArray(obj, key){ + var value = obj[key]; + if( value && !Array.isArray(value) ){ + obj[key] = [value]; + } +} + + +/** + * Iterates over arrays and hashes. + * + * ``` + * iterate(this.items, function(item, id) { + * // invoked for each item + * }); + * ``` + * + * @param {array|object} object + */ +export function iterate(object, callback) { + + if ( Array.isArray(object)) { + Array.prototype.forEach.call(object,callback); + + }else{ + + for (var key in object) { + if (object.hasOwnProperty(key)) { + callback(object[key], key); + } + } + } +}; From 2f72a1aa7d04e5b4f558ad06e9b6d724983bf9d4 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 13:39:29 -0600 Subject: [PATCH 018/140] move cmp() and asciifold to utils.ts --- lib/sifter.ts | 34 +--------------------------------- lib/utils.ts | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 7a499e9..3d658ef 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -14,7 +14,7 @@ * @author Brian Reavis */ -import { getattr, escape_regex, propToArray, iterate } from './utils.ts'; +import { getattr, escape_regex, propToArray, iterate, cmp } from './utils.ts'; import { DIACRITICS } from './diacritics.ts'; @@ -39,38 +39,6 @@ type TPrepareObj = { items: any[] } -var asciifold = (function() { - var i, n, k, chunk; - var foreignletters = ''; - var lookup = {}; - for (k in DIACRITICS) { - if (DIACRITICS.hasOwnProperty(k)) { - chunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1); - foreignletters += chunk; - for (i = 0, n = chunk.length; i < n; i++) { - lookup[chunk.charAt(i)] = k; - } - } - } - var regexp = new RegExp('[' + foreignletters + ']', 'g'); - return function(str) { - return str.replace(regexp, function(foreignletter) { - return lookup[foreignletter]; - }).toLowerCase(); - }; -})(); - - -function cmp(a, b) { - if (typeof a === 'number' && typeof b === 'number') { - return a > b ? 1 : (a < b ? -1 : 0); - } - a = asciifold(String(a || '')); - b = asciifold(String(b || '')); - if (a > b) return 1; - if (b > a) return -1; - return 0; -}; export default class Sifter{ diff --git a/lib/utils.ts b/lib/utils.ts index 367d432..e5d0957 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -1,4 +1,5 @@ +import { DIACRITICS } from './diacritics.ts'; /** @@ -58,3 +59,38 @@ export function iterate(object, callback) { } } }; + + + +var asciifold = (function() { + var i, n, k, chunk; + var foreignletters = ''; + var lookup = {}; + for (k in DIACRITICS) { + if (DIACRITICS.hasOwnProperty(k)) { + chunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1); + foreignletters += chunk; + for (i = 0, n = chunk.length; i < n; i++) { + lookup[chunk.charAt(i)] = k; + } + } + } + var regexp = new RegExp('[' + foreignletters + ']', 'g'); + return function(str) { + return str.replace(regexp, function(foreignletter) { + return lookup[foreignletter]; + }).toLowerCase(); + }; +})(); + + +export function cmp(a, b) { + if (typeof a === 'number' && typeof b === 'number') { + return a > b ? 1 : (a < b ? -1 : 0); + } + a = asciifold(String(a || '')); + b = asciifold(String(b || '')); + if (a > b) return 1; + if (b > a) return -1; + return 0; +}; From 616e528c5bd69711558f6b1c8162ca20164edb2a Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 13:41:52 -0600 Subject: [PATCH 019/140] fix require() in benchmark --- benchmark/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/index.js b/benchmark/index.js index 6e9f26a..56629d4 100644 --- a/benchmark/index.js +++ b/benchmark/index.js @@ -18,7 +18,7 @@ process.chdir(__dirname); var fs = require('fs'); var humanize = require('humanize'); -var Sifter = require('../lib/sifter'); +var Sifter = require('../build/umd/sifter.js'); var microtime; try { From d78c80741a9e07280945e64114fa056a4bef8828 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 13:59:59 -0600 Subject: [PATCH 020/140] add test:typescript --- .config/tsconfig.json | 15 +++++++++++++++ lib/sifter.ts | 4 ++-- package.json | 2 ++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 .config/tsconfig.json diff --git a/.config/tsconfig.json b/.config/tsconfig.json new file mode 100644 index 0000000..98479ab --- /dev/null +++ b/.config/tsconfig.json @@ -0,0 +1,15 @@ +{ + "include": ["../lib/**/*"], + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "strict": false, + "target": "esnext", + "module": "esnext", + "noUnusedLocals": true, + "noImplicitAny":false, + + "declaration": true, + "declarationDir": "../dist/types", + }, +} diff --git a/lib/sifter.ts b/lib/sifter.ts index 3d658ef..32eedba 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -28,7 +28,7 @@ type TOptions = { nesting?: boolean, respect_word_boundaries?: boolean, conjunction?: string, - } +} type TPrepareObj = { @@ -66,7 +66,7 @@ export default class Sifter{ * @param {string} query * @returns {array} */ - tokenize(query, options ) { + tokenize(query:string, options?:TOptions ):{string:string,regex:RegExp,field:string}[] { query = String(query || '').toLowerCase().trim(); if (!query || !query.length) return []; diff --git a/package.json b/package.json index ad242ac..4290860 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ }, "scripts": { "test": "mocha", + "test:typescript": "tsc -p .config --noemit", "pretest": "npm run build", "benchmark": "node --expose-gc benchmark/index.js", "build": "npx rollup -c .config/rollup.config.js" @@ -50,6 +51,7 @@ "mocha-lcov-reporter": "^1.3.0", "rollup": "^2.45.2", "rollup-plugin-terser": "^7.0.2", + "typescript": "^4.2.4", "uglify-js": "^3.13.4" }, "browserslist": [ From a3710eabc32ab03a447b707351581465f7e145d4 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 14:01:59 -0600 Subject: [PATCH 021/140] remove bin --- README.md | 13 ----- bin/sifter.js | 158 -------------------------------------------------- package.json | 10 ---- 3 files changed, 181 deletions(-) delete mode 100755 bin/sifter.js diff --git a/README.md b/README.md index 1c3171a..13a60c0 100644 --- a/README.md +++ b/README.md @@ -125,19 +125,6 @@ Performs a search for `query` with the provided `options`. -## CLI - -![CLI](http://i.imgur.com/fSQBnWZ.png) - -Sifter comes with a command line interface that's useful for testing on datasets. It accepts JSON and CSV data, either from a file or from stdin (unix pipes). If using CSV data, the first line of the file must be a header row. -```sh -$ npm install -g sifter -``` - -```sh -$ cat file.csv | sifter --query="ant" --fields=title -$ sifter --query="ant" --fields=title --file=file.csv -``` ## Contributing diff --git a/bin/sifter.js b/bin/sifter.js deleted file mode 100755 index 2159706..0000000 --- a/bin/sifter.js +++ /dev/null @@ -1,158 +0,0 @@ -#!/usr/bin/env node - -/** - * Sifter CLI - * - * Copyright (c) 2013-2020 Brian Reavis - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this - * file except in compliance with the License. You may obtain a copy of the License at: - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under - * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF - * ANY KIND, either express or implied. See the License for the specific language - * governing permissions and limitations under the License. - * - * @author Brian Reavis - */ - -var path = require('path'); -var fs = require('fs'); -var yargs = require('yargs'); -var cardinal = require('cardinal'); -var async = require('async'); -var csv = require('csv-parse'); -var Stream = require('stream'); -var humanize = require('humanize'); -var Sifter = require('../build/umd/sifter.js'); - - -var highlight = function(obj) { return cardinal.highlight(JSON.stringify(obj)); }; - -var raw, data, result, t_start, t_end; -var argv = yargs - .usage('Usage: $0 --query="search query" --fields=a,b') - .default('direction', 'asc') - .default('sort', '') - .default('query', '') - .default('fields', '') - .describe('fields', 'Search fields (comma separated)') - .describe('query', 'Search query') - .describe('sort', 'Sort field') - .describe('direction', 'Sort direction') - .describe('file', 'CSV or JSON dataset') - .argv; - -/** - * Reads input from file or stdin. - * - * @param {function} callback - */ -var step_read = function(callback) { - var buffer = []; - - if (argv.file) { - raw = fs.readFileSync(argv.file, 'utf8'); - callback(); - } else { - process.stdin.on('data', function(chunk) { - buffer.push(chunk); - }); - process.stdin.on('end', function() { - raw = buffer.join('').replace(/^\s+|\s+$/g, ''); - callback(); - }); - process.stdin.resume(); - process.stdin.setEncoding('utf8'); - } -}; - -/** - * Parses input input data into an array of - * an items that can be sifted through. - * - * Accepts CSV & JSON. - * - * @param {function} callback - */ -var step_parse = function(callback) { - // json - if (raw[0] === '[') { - try { - data = JSON.parse(raw); - } catch (e) { - return callback(new Error('Unable to parse JSON.')); - } - return callback(); - } - - // csv - data = []; - csv(raw, {columns: true}, function(err, parsed) { - if (err) return callback(err); - parsed.forEach(function(line) { - if (Array.isArray(line)) return; - data.push(line); - }); - callback(); - }); -}; - -/** - * Search! - * - * @param {function} callback - */ -var step_sift = function(callback) { - var sifter = new Sifter(data); - var sort = argv.sort && [{ - field: argv.sort, - direction: argv.direction - }]; - - t_start = Date.now(); - result = sifter.search(argv.query, { - fields: (typeof argv.fields !== 'undefined' ? String(argv.fields) : '').split(','), - limit: argv.limit, - sort: sort - }); - - t_end = Date.now(); - callback(); -}; - -/** - * Format and display output to console. - * - * @param {function} callback - */ -var step_output = function(callback) { - var i, n, json; - - console.log('query = ' + JSON.stringify(result.query)); - console.log('fields = ' + result.options.fields.join(', ')); - console.log('total results = ' + humanize.numberFormat(result.total, 0)); - console.log('total searched = ' + humanize.numberFormat(data.length, 0)); - console.log('search time = ' + humanize.numberFormat((t_end - t_start) / 1000) + 'ms'); - console.log(''); - - for (i = 0, n = result.items.length; i < n; i++) { - process.stdout.write('\033[1;30m' + result.items[i].score.toFixed(5) + '\033[0;39m '); - console.log(highlight(data[result.items[i].id])); - } - - callback(); -}; - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -async.series([ - step_read, - step_parse, - step_sift, - step_output -], function(err) { - if (err) throw err; - process.exit(0); -}); diff --git a/package.json b/package.json index 4290860..4b861fa 100644 --- a/package.json +++ b/package.json @@ -28,16 +28,6 @@ "benchmark": "node --expose-gc benchmark/index.js", "build": "npx rollup -c .config/rollup.config.js" }, - "bin": { - "sifter": "./bin/sifter.js" - }, - "dependencies": { - "cardinal": "^2.1.1", - "async": "^3.2.0", - "humanize": "^0.0.9", - "csv-parse": "^4.15.4", - "yargs": "^16.2.0" - }, "devDependencies": { "@babel/core": "^7.13.16", "@babel/plugin-proposal-class-properties": "^7.13.0", From 17a85b203c3fc8c1ffcd05ac7c93b22113a6cce3 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 14:10:58 -0600 Subject: [PATCH 022/140] rename field vars in sort fn to sort_fld --- lib/sifter.ts | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 32eedba..bcd9bdd 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -233,7 +233,7 @@ export default class Sifter{ * @return function(a,b) */ getSortFunction(search, options:TOptions) { - var i, n, self, field, fields, fields_count, multiplier, multipliers, get_field, implicit_score, sort; + var i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort; self = this; search = self.prepareSearch(search, options); @@ -253,11 +253,11 @@ export default class Sifter{ }; // parse options - fields = []; + sort_flds = []; if (sort) { for (i = 0, n = sort.length; i < n; i++) { if (search.query || sort[i].field !== '$score') { - fields.push(sort[i]); + sort_flds.push(sort[i]); } } } @@ -266,47 +266,47 @@ export default class Sifter{ // sort field, unless it's manually specified if (search.query) { implicit_score = true; - for (i = 0, n = fields.length; i < n; i++) { - if (fields[i].field === '$score') { + for (i = 0, n = sort_flds.length; i < n; i++) { + if (sort_flds[i].field === '$score') { implicit_score = false; break; } } if (implicit_score) { - fields.unshift({field: '$score', direction: 'desc'}); + sort_flds.unshift({field: '$score', direction: 'desc'}); } } else { - for (i = 0, n = fields.length; i < n; i++) { - if (fields[i].field === '$score') { - fields.splice(i, 1); + for (i = 0, n = sort_flds.length; i < n; i++) { + if (sort_flds[i].field === '$score') { + sort_flds.splice(i, 1); break; } } } multipliers = []; - for (i = 0, n = fields.length; i < n; i++) { - multipliers.push(fields[i].direction === 'desc' ? -1 : 1); + for (i = 0, n = sort_flds.length; i < n; i++) { + multipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1); } // build function - fields_count = fields.length; - if (!fields_count) { + sort_flds_count = sort_flds.length; + if (!sort_flds_count) { return null; - } else if (fields_count === 1) { - field = fields[0].field; + } else if (sort_flds_count === 1) { + sort_fld = sort_flds[0].field; multiplier = multipliers[0]; return function(a, b) { return multiplier * cmp( - get_field(field, a), - get_field(field, b) + get_field(sort_fld, a), + get_field(sort_fld, b) ); }; } else { return function(a, b) { var i, result, field; - for (i = 0; i < fields_count; i++) { - field = fields[i].field; + for (i = 0; i < sort_flds_count; i++) { + field = sort_flds[i].field; result = multipliers[i] * cmp( get_field(field, a), get_field(field, b) From 817efb630c388d064f7173b0ed7abe0650c9e1c1 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 15:03:16 -0600 Subject: [PATCH 023/140] _getScoreFunction() and _getSortFunction() --- lib/sifter.ts | 31 +++++++++++++++++++------------ test/getScoreFunction.js | 2 +- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index bcd9bdd..3746e8e 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -123,10 +123,14 @@ export default class Sifter{ * @returns {function} */ getScoreFunction(query:string, options?:TOptions ){ - var self, fields, tokens, token_count, nesting, search; + var search = this.prepareSearch(query, options); + return this._getScoreFunction(search); + } + + _getScoreFunction(search:TPrepareObj ){ + var self, fields, tokens, token_count, nesting; self = this; - search = self.prepareSearch(query, options); tokens = search.tokens; fields = search.options.fields; token_count = tokens.length; @@ -229,15 +233,19 @@ export default class Sifter{ * results, for sorting purposes. If no sorting should * be performed, `null` will be returned. * - * @param {string|object} search * @return function(a,b) */ - getSortFunction(search, options:TOptions) { - var i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort; + getSortFunction(search:string, options:TOptions) { + var search = this.prepareSearch(query, options); + return this._getSortFunction(search); + } + + _getSortFunction(search:TPrepareObj){ + var i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options; - self = this; - search = self.prepareSearch(search, options); - sort = (!search.query && options.sort_empty) || options.sort; + self = this; + options = search.options; + sort = (!search.query && options.sort_empty) || options.sort; /** * Fetches the specified sort field value @@ -324,8 +332,7 @@ export default class Sifter{ * with results. * */ - prepareSearch(query:string|TPrepareObj, options:TOptions):TPrepareObj { - if (typeof query === 'object') return query; + prepareSearch(query:string, options:TOptions):TPrepareObj { options = Object.assign({},options); propToArray(options,'fields'); @@ -355,7 +362,7 @@ export default class Sifter{ query = search.query; // generate result scoring function - fn_score = options.score || self.getScoreFunction(search); + fn_score = options.score || self._getScoreFunction(search); // perform search and sort if (query.length) { @@ -371,7 +378,7 @@ export default class Sifter{ }); } - fn_sort = self.getSortFunction(search, options); + fn_sort = self._getSortFunction(search); if (fn_sort) search.items.sort(fn_sort); // apply limits diff --git a/test/getScoreFunction.js b/test/getScoreFunction.js index 3adff01..eddfab1 100644 --- a/test/getScoreFunction.js +++ b/test/getScoreFunction.js @@ -44,7 +44,7 @@ describe('#getScoreFunction()', function() { var score, search, sifter = new Sifter([]); search = sifter.prepareSearch('test', {fields: ['a','b']}); - score = sifter.getScoreFunction(search); + score = sifter._getScoreFunction(search); assert.equal(typeof score({a: 'test'}), 'number'); assert.equal(score({a: 'test'}) > 0, true); assert.equal(typeof score({}), 'number'); From 734769973d45c249cd7ae99138a20bf69b9a9335 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 21 Apr 2021 17:52:44 -0600 Subject: [PATCH 024/140] humanize needed for benchmark --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 4b861fa..dbd3778 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "@babel/preset-typescript": "^7.13.0", "@rollup/plugin-babel": "^5.3.0", "coveralls": "^3.1.0", + "humanize": "0.0.9", "istanbul": "^0.4.5", "mocha": "^8.3.2", "mocha-istanbul": "^0.3.0", From 7f977e0739dc78c02de9f150cc892b4d2fa0004a Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 11:54:53 -0600 Subject: [PATCH 025/140] introduce weighted fields --- lib/sifter.ts | 101 ++++++++++++++++++++++++++---------------- lib/utils.ts | 2 +- test/prepareSearch.js | 4 +- test/search.js | 50 +++++++++++++++++++-- 4 files changed, 112 insertions(+), 45 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 3746e8e..e5845c2 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -63,10 +63,8 @@ export default class Sifter{ * Splits a search string into an array of individual * regexps to be used to match results. * - * @param {string} query - * @returns {array} */ - tokenize(query:string, options?:TOptions ):{string:string,regex:RegExp,field:string}[] { + tokenize(query:string, respect_word_boundaries?:boolean, weights ):{string:string,regex:RegExp,field:string}[] { query = String(query || '').toLowerCase().trim(); if (!query || !query.length) return []; @@ -75,14 +73,14 @@ export default class Sifter{ var words = query.split(/\s+/); var field_regex; - if( options && options.fields && options.fields.length ){ - field_regex = new RegExp( '^('+options.fields.map(escape_regex).join('|')+')\:(.*)$'); + if( weights ){ + field_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\:(.*)$'); } words.forEach((word) => { let field_match; - let field = null; - let regex = null; + let field = null; + let regex = null; // look for "field:query" tokens if( field_regex && (field_match = word.match(field_regex)) ){ @@ -99,7 +97,7 @@ export default class Sifter{ } } } - if ( options && options.respect_word_boundaries) regex = "\\b"+regex + if ( respect_word_boundaries ) regex = "\\b"+regex regex = new RegExp(regex, 'i'); } @@ -128,32 +126,40 @@ export default class Sifter{ } _getScoreFunction(search:TPrepareObj ){ - var self, fields, tokens, token_count, nesting; + const tokens = search.tokens, + token_count = tokens.length; + + if (!token_count) { + return function() { return 0; }; + } + + const self = this, + fields = search.options.fields, + nesting = search.options.nesting, + weights = search.weights, + field_count = fields.length; - self = this; - tokens = search.tokens; - fields = search.options.fields; - token_count = tokens.length; - nesting = search.options.nesting; /** * Calculates how close of a match the * given value is against a search token. * - * @param {string} value * @param {object} token * @return {number} */ - var scoreValue = function(value, token) { + var scoreValue = function(value:string, token, weight:number ) { var score, pos; if (!value) return 0; + value = String(value || ''); pos = value.search(token.regex); if (pos === -1) return 0; + score = token.string.length / value.length; if (pos === 0) score += 0.5; - return score; + + return score * weight; }; /** @@ -165,33 +171,35 @@ export default class Sifter{ * @return {number} */ var scoreObject = (function() { - var field_count = fields.length; if (!field_count) { return function() { return 0; }; } + if (field_count === 1) { return function(token, data) { - return scoreValue(getattr(data, fields[0], nesting), token); + const field = fields[0].field; + return scoreValue(getattr(data, field, nesting), token, weights[field]); }; } + return function(token, data) { var sum = 0; // is the token specific to a field? if( token.field ){ - const field = getattr(data, token.field, nesting); + const value = getattr(data, token.field, nesting); - if( !token.regex && field ){ + if( !token.regex && value ){ sum += 0.1; }else{ - sum += scoreValue(field, token); + sum += scoreValue(value, token, weights[token.field]); } }else{ - fields.forEach((field) => { - sum += scoreValue(getattr(data, field, nesting), token); + iterate(weights, (weight, field) => { + sum += scoreValue(getattr(data, field, nesting), token, weight); }); } @@ -199,9 +207,6 @@ export default class Sifter{ }; })(); - if (!token_count) { - return function() { return 0; }; - } if (token_count === 1) { return function(data) { return scoreObject(tokens[0], data); @@ -210,8 +215,8 @@ export default class Sifter{ if (search.options.conjunction === 'and') { return function(data) { - var score; - for (var i = 0, sum = 0; i < token_count; i++) { + var i = 0, score, sum = 0; + for (; i < token_count; i++) { score = scoreObject(tokens[i], data); if (score <= 0) return 0; sum += score; @@ -220,9 +225,10 @@ export default class Sifter{ }; } else { return function(data) { - for (var i = 0, sum = 0; i < token_count; i++) { - sum += scoreObject(tokens[i], data); - } + var sum = 0; + iterate(tokens,(token)=>{ + sum += scoreObject(token, data); + }); return sum / token_count; }; } @@ -333,18 +339,37 @@ export default class Sifter{ * */ prepareSearch(query:string, options:TOptions):TPrepareObj { + const weights = {}; options = Object.assign({},options); - propToArray(options,'fields'); propToArray(options,'sort'); propToArray(options,'sort_empty'); + // convert fields to new format + if( options.fields ){ + propToArray(options,'fields'); + if( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){ + var fields = []; + options.fields.forEach((fld_name) => { + fields.push({field:fld_name}); + }); + options.fields = fields; + } + + + options.fields.forEach((field_params)=>{ + weights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1; + }); + } + + return { - options : options, - query : String(query || '').toLowerCase(), - tokens : this.tokenize(query, options), - total : 0, - items : [] + options : options, + query : String(query || '').toLowerCase(), + tokens : this.tokenize(query, options.respect_word_boundaries, weights), + total : 0, + items : [], + weights : weights, }; }; diff --git a/lib/utils.ts b/lib/utils.ts index e5d0957..3e26b2e 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -48,7 +48,7 @@ export function propToArray(obj, key){ export function iterate(object, callback) { if ( Array.isArray(object)) { - Array.prototype.forEach.call(object,callback); + object.forEach(callback); }else{ diff --git a/test/prepareSearch.js b/test/prepareSearch.js index 6ee518a..7d274a7 100644 --- a/test/prepareSearch.js +++ b/test/prepareSearch.js @@ -6,11 +6,11 @@ describe('#prepareSearch()', function() { it('should normalize options', function() { var sifter = new Sifter([{field: 'a'}, {}]); var search = sifter.prepareSearch('a', { - fields: {field: 'a'}, + fields: [{field: 'a'}], sort: {field: 'a'}, sort_empty: {field: 'a'} }); - assert.equal(Array.isArray(search.options.fields), true); + //assert.equal(Array.isArray(search.options.fields), true); assert.equal(Array.isArray(search.options.sort), true); assert.equal(Array.isArray(search.options.sort_empty), true); }); diff --git a/test/search.js b/test/search.js index 8c5a021..c0237dd 100644 --- a/test/search.js +++ b/test/search.js @@ -204,7 +204,7 @@ describe('#search()', function() { {fields: {nested: 'abb'}} ]); var result = sifter.search('', { - fields: [], + fields: ['fields.nested'], sort: {field: 'fields.nested'}, nesting: true }); @@ -301,9 +301,9 @@ describe('#search()', function() { it('should not be a reference to original options', function() { assert.equal(result.options === options, false); }); - it('should match original search options', function() { - assert.deepEqual(result.options, options); - }); + //it('should match original search options', function() { + // assert.deepEqual(result.options, options); + //}); }); describe('"tokens"', function() { @@ -382,4 +382,46 @@ describe('#search()', function() { }); + describe('#field weights', function() { + + var data = [ + {fieldx: 'aaa', fieldy: 'abb'}, + {fieldx: 'abb', fieldy: 'aaa'} + ]; + var sifter = new Sifter(data); + + it('row 0 should be first', function() { + var result = sifter.search('b', { + fields: [ + {field:'fieldx',weight:1}, + {field:'fieldy',weight:2} + ] + }); + assert.equal(result.items[0].id,0); + }); + + it('row 1 should be first', function() { + var result = sifter.search('b', { + fields: [ + {field:'fieldx',weight:2}, + {field:'fieldy',weight:1} + ] + }); + assert.equal(result.items[0].id,1); + }); + + it('only row 0', function() { + var result = sifter.search('b', { + fields: [ + {field:'fieldx',weight:0}, + {field:'fieldy',weight:1} + ] + }); + assert.equal(result.items.length,1); + assert.equal(result.items[0].id,0); + }); + + }); + + }); From 9a0e12acb836f755ca710d45744bd5d3350b1052 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 12:33:33 -0600 Subject: [PATCH 026/140] move scoreValue to utils.ts, add getAttrNesting --- lib/sifter.ts | 54 ++++++++++++++++++++------------------------------- lib/utils.ts | 39 +++++++++++++++++++++++++++++++++---- 2 files changed, 56 insertions(+), 37 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index e5845c2..8a10c2b 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -14,7 +14,7 @@ * @author Brian Reavis */ -import { getattr, escape_regex, propToArray, iterate, cmp } from './utils.ts'; +import { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts'; import { DIACRITICS } from './diacritics.ts'; @@ -34,11 +34,16 @@ type TOptions = { type TPrepareObj = { options: TOptions, query: string, - tokens: any, + tokens: TToken[], total: number, items: any[] } +type TToken = { + string:string, + regex:RegExp, + field:string +} export default class Sifter{ @@ -64,7 +69,7 @@ export default class Sifter{ * regexps to be used to match results. * */ - tokenize(query:string, respect_word_boundaries?:boolean, weights ):{string:string,regex:RegExp,field:string}[] { + tokenize(query:string, respect_word_boundaries?:boolean, weights ):TToken[] { query = String(query || '').toLowerCase().trim(); if (!query || !query.length) return []; @@ -137,36 +142,16 @@ export default class Sifter{ fields = search.options.fields, nesting = search.options.nesting, weights = search.weights, - field_count = fields.length; - - - /** - * Calculates how close of a match the - * given value is against a search token. - * - * @param {object} token - * @return {number} - */ - var scoreValue = function(value:string, token, weight:number ) { - var score, pos; - - if (!value) return 0; - - value = String(value || ''); - pos = value.search(token.regex); - if (pos === -1) return 0; + field_count = fields.length, + getAttrFn = search.getAttrFn; - score = token.string.length / value.length; - if (pos === 0) score += 0.5; - return score * weight; - }; /** * Calculates the score of an object * against the search query. * - * @param {object} token + * @param {TToken} token * @param {object} data * @return {number} */ @@ -177,19 +162,19 @@ export default class Sifter{ } if (field_count === 1) { - return function(token, data) { + return function(token:TToken, data) { const field = fields[0].field; - return scoreValue(getattr(data, field, nesting), token, weights[field]); + return scoreValue(getAttrFn(data, field), token, weights[field]); }; } - return function(token, data) { + return function(token:TToken, data) { var sum = 0; // is the token specific to a field? if( token.field ){ - const value = getattr(data, token.field, nesting); + const value = getAttrFn(data, token.field); if( !token.regex && value ){ sum += 0.1; @@ -197,9 +182,11 @@ export default class Sifter{ sum += scoreValue(value, token, weights[token.field]); } + + }else{ iterate(weights, (weight, field) => { - sum += scoreValue(getattr(data, field, nesting), token, weight); + sum += scoreValue(getAttrFn(data, field), token, weight); }); } @@ -226,7 +213,7 @@ export default class Sifter{ } else { return function(data) { var sum = 0; - iterate(tokens,(token)=>{ + iterate(tokens,(token:TToken)=>{ sum += scoreObject(token, data); }); return sum / token_count; @@ -263,7 +250,7 @@ export default class Sifter{ */ get_field = function(name, result) { if (name === '$score') return result.score; - return getattr(self.items[result.id], name, options.nesting); + return search.getAttrFn(self.items[result.id], name, options.nesting); }; // parse options @@ -370,6 +357,7 @@ export default class Sifter{ total : 0, items : [], weights : weights, + getAttrFn : (options.nesting) ? getAttrNesting : getAttr, }; }; diff --git a/lib/utils.ts b/lib/utils.ts index 3e26b2e..5e63761 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -6,17 +6,48 @@ import { DIACRITICS } from './diacritics.ts'; * A property getter resolving dot-notation * @param {Object} obj The root object to fetch property on * @param {String} name The optionally dotted property name to fetch - * @param {Boolean} nesting Handle nesting or not * @return {Object} The resolved property value */ -export function getattr(obj, name, nesting) { - if (!obj || !name) return; - if (!nesting) return obj[name]; +export function getAttr(obj, name, nesting) { + if (!obj ) return; + return obj[name]; +}; + +/** + * A property getter resolving dot-notation + * @param {Object} obj The root object to fetch property on + * @param {String} name The optionally dotted property name to fetch + * @return {Object} The resolved property value + */ +export function getAttrNesting(obj, name ) { + if (!obj ) return; var names = name.split("."); while(names.length && (obj = obj[names.shift()])); return obj; }; +/** + * Calculates how close of a match the + * given value is against a search token. + * + * @param {object} token + * @return {number} + */ +export function scoreValue(value:string, token, weight:number ) { + var score, pos; + + if (!value) return 0; + + value = String(value || ''); + pos = value.search(token.regex); + if (pos === -1) return 0; + + score = token.string.length / value.length; + if (pos === 0) score += 0.5; + + return score * weight; +}; + export function escape_regex(str) { return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); }; From 7c66aff8618f565f87a058c176d4042fe3386c74 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 12:48:27 -0600 Subject: [PATCH 027/140] update typings --- lib/sifter.ts | 42 +++++++++++++++++++++++++----------------- lib/utils.ts | 4 ++-- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 8a10c2b..948ea61 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -18,8 +18,13 @@ import { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate import { DIACRITICS } from './diacritics.ts'; +type TField = { + field: string, + weight?: number, +} + type TOptions = { - fields: string|string[], + fields: TField[], sort: any[], score?: ()=>any, filter?: boolean, @@ -30,21 +35,26 @@ type TOptions = { conjunction?: string, } +type TToken = { + string:string, + regex:RegExp, + field:string +} + +type TWeights = {[key:string]:number} type TPrepareObj = { options: TOptions, query: string, tokens: TToken[], total: number, - items: any[] -} + items: any[], + weights: TWeights, + getAttrFn: (any,string)=>any, -type TToken = { - string:string, - regex:RegExp, - field:string } + export default class Sifter{ public items: []|{}; @@ -69,7 +79,7 @@ export default class Sifter{ * regexps to be used to match results. * */ - tokenize(query:string, respect_word_boundaries?:boolean, weights ):TToken[] { + tokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] { query = String(query || '').toLowerCase().trim(); if (!query || !query.length) return []; @@ -125,7 +135,7 @@ export default class Sifter{ * * @returns {function} */ - getScoreFunction(query:string, options?:TOptions ){ + getScoreFunction(query:string, options ){ var search = this.prepareSearch(query, options); return this._getScoreFunction(search); } @@ -138,9 +148,7 @@ export default class Sifter{ return function() { return 0; }; } - const self = this, - fields = search.options.fields, - nesting = search.options.nesting, + const fields = search.options.fields, weights = search.weights, field_count = fields.length, getAttrFn = search.getAttrFn; @@ -228,7 +236,7 @@ export default class Sifter{ * * @return function(a,b) */ - getSortFunction(search:string, options:TOptions) { + getSortFunction(query:string, options) { var search = this.prepareSearch(query, options); return this._getSortFunction(search); } @@ -250,7 +258,7 @@ export default class Sifter{ */ get_field = function(name, result) { if (name === '$score') return result.score; - return search.getAttrFn(self.items[result.id], name, options.nesting); + return search.getAttrFn(self.items[result.id], name); }; // parse options @@ -325,10 +333,10 @@ export default class Sifter{ * with results. * */ - prepareSearch(query:string, options:TOptions):TPrepareObj { - const weights = {}; + prepareSearch(query:string, optsUser):TPrepareObj { + const weights = {}; + var options = Object.assign({},optsUser); - options = Object.assign({},options); propToArray(options,'sort'); propToArray(options,'sort_empty'); diff --git a/lib/utils.ts b/lib/utils.ts index 5e63761..8c962c8 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -8,7 +8,7 @@ import { DIACRITICS } from './diacritics.ts'; * @param {String} name The optionally dotted property name to fetch * @return {Object} The resolved property value */ -export function getAttr(obj, name, nesting) { +export function getAttr(obj:{[key:string]:any}, name:string ) { if (!obj ) return; return obj[name]; }; @@ -19,7 +19,7 @@ export function getAttr(obj, name, nesting) { * @param {String} name The optionally dotted property name to fetch * @return {Object} The resolved property value */ -export function getAttrNesting(obj, name ) { +export function getAttrNesting(obj:{[key:string]:any}, name:string ) { if (!obj ) return; var names = name.split("."); while(names.length && (obj = obj[names.shift()])); From 4b73ef854560750f3a19e7c16152861608e3e6e6 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 13:04:30 -0600 Subject: [PATCH 028/140] ignore all benchmark reports --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4d092aa..ac03fef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ .DS_store node_modules -benchmark/report.json +benchmark/report*.json coverage package-lock.json build From 5c19b69f1634062af22db571d70a453fdff95a40 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 13:14:22 -0600 Subject: [PATCH 029/140] remove uglify, update makefile --- Makefile | 9 ++------- package.json | 3 +-- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 3c418a3..2133d36 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,6 @@ MOCHA=node_modules/.bin/mocha COVERALLS=node_modules/.bin/coveralls _MOCHA=node_modules/.bin/_mocha ISTANBUL=node_modules/.bin/istanbul -UGLIFYJS=node_modules/.bin/uglifyjs OUT=sifter.js OUT_MIN=sifter.min.js @@ -32,11 +31,7 @@ test-ci-coverage: @echo Done compile: - @cp lib/sifter.js sifter.js - $(UGLIFYJS) --mangle -b beautify=false,ascii_only=true --output $(OUT_MIN) $(OUT) - @echo "$(BANNER)" | cat - $(OUT_MIN) > temp && mv temp $(OUT_MIN) - - @echo "`cat $(OUT_MIN) | gzip -9f | wc -c` bytes (gzipped)" + npm run build release: ifeq ($(strip $(version)),) @@ -54,4 +49,4 @@ else git push origin --tags npm publish @echo "\033[32mv${version} released\033[0;39m" -endif \ No newline at end of file +endif diff --git a/package.json b/package.json index dbd3778..51c9f4c 100644 --- a/package.json +++ b/package.json @@ -42,8 +42,7 @@ "mocha-lcov-reporter": "^1.3.0", "rollup": "^2.45.2", "rollup-plugin-terser": "^7.0.2", - "typescript": "^4.2.4", - "uglify-js": "^3.13.4" + "typescript": "^4.2.4" }, "browserslist": [ ">= 0.5%", From 3bf79f8a75ceb58592ea1aab95bbd7e14af7c85a Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 13:21:23 -0600 Subject: [PATCH 030/140] update package name --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 51c9f4c..5966da3 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "sifter", + "name": "@orchidjs/sifter", "keywords": [ "search", "filter", From 46a5fa257b4a4e6e25780c83bd29d766803e09b4 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 14:34:36 -0600 Subject: [PATCH 031/140] test with jest --- .travis.yml | 6 ++---- package.json | 13 ++++++++++--- test/search.js | 2 +- test/tokenize.js | 2 +- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0fe87c7..68e0bcb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,6 @@ node_js: - "10" - "12" - "14" -before_script: - - make script: - - make test-ci - - make test-ci-coverage + - npm test + - npm run coveralls diff --git a/package.json b/package.json index 5966da3..a097dab 100644 --- a/package.json +++ b/package.json @@ -22,11 +22,13 @@ "url": "https://github.com/orchidjs/sifter.js.git" }, "scripts": { - "test": "mocha", + "test:mocha": "mocha", + "test": "jest", "test:typescript": "tsc -p .config --noemit", "pretest": "npm run build", "benchmark": "node --expose-gc benchmark/index.js", - "build": "npx rollup -c .config/rollup.config.js" + "build": "npx rollup -c .config/rollup.config.js", + "coveralls": "jest --coverage && cat ./tests/coverage/lcov.info | coveralls" }, "devDependencies": { "@babel/core": "^7.13.16", @@ -37,6 +39,7 @@ "coveralls": "^3.1.0", "humanize": "0.0.9", "istanbul": "^0.4.5", + "jest": "^26.6.3", "mocha": "^8.3.2", "mocha-istanbul": "^0.3.0", "mocha-lcov-reporter": "^1.3.0", @@ -53,5 +56,9 @@ "iOS >= 10", "Safari >= 10", "not Explorer <= 11" - ] + ], + "jest": { + "verbose": true, + "testMatch": [ "**/test/**/*.js" ] + } } diff --git a/test/search.js b/test/search.js index c0237dd..c990d00 100644 --- a/test/search.js +++ b/test/search.js @@ -217,7 +217,7 @@ describe('#search()', function() { describe('returned results', function() { var sifter, options, result, result_empty, result_all; - before(function() { + beforeAll(function() { sifter = new Sifter([ {title: 'Matterhorn', location: 'Switzerland', continent: 'Europe'}, {title: 'Eiger', location: 'Switzerland', continent: 'Europe'}, diff --git a/test/tokenize.js b/test/tokenize.js index af63279..47e497f 100644 --- a/test/tokenize.js +++ b/test/tokenize.js @@ -23,7 +23,7 @@ describe('#tokenize()', function() { }); describe('returned tokens', function() { - before(function() { + beforeAll(function() { sifter = new Sifter([]); tokens = sifter.tokenize('hello world'); }); From 48c20999f1720365a7a3f180ec7da7b9ec549b31 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 14:38:50 -0600 Subject: [PATCH 032/140] coverage folder --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a097dab..2f51e07 100644 --- a/package.json +++ b/package.json @@ -23,12 +23,12 @@ }, "scripts": { "test:mocha": "mocha", - "test": "jest", + "test": "jest --coverage", "test:typescript": "tsc -p .config --noemit", "pretest": "npm run build", "benchmark": "node --expose-gc benchmark/index.js", "build": "npx rollup -c .config/rollup.config.js", - "coveralls": "jest --coverage && cat ./tests/coverage/lcov.info | coveralls" + "coveralls": "jest --coverage && cat ./coverage/lcov.info | coveralls" }, "devDependencies": { "@babel/core": "^7.13.16", From 2eaf18ca9e4458d4ff8eedfd2ce278ef2a69808a Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 15:32:47 -0600 Subject: [PATCH 033/140] remove mocha + istanbul --- Makefile | 27 +-------------------------- package.json | 11 ++++------- 2 files changed, 5 insertions(+), 33 deletions(-) diff --git a/Makefile b/Makefile index 2133d36..a7e8301 100644 --- a/Makefile +++ b/Makefile @@ -1,35 +1,10 @@ -.PHONY: compile test test-ci release benchmark - -MOCHA=node_modules/.bin/mocha -COVERALLS=node_modules/.bin/coveralls -_MOCHA=node_modules/.bin/_mocha -ISTANBUL=node_modules/.bin/istanbul - -OUT=sifter.js -OUT_MIN=sifter.min.js -BANNER=/*! sifter.js | https://github.com/brianreavis/sifter.js | Apache License (v2) */ +.PHONY: compile release benchmark all: compile benchmark: node --expose-gc benchmark/index.js -test: - $(MOCHA) -R list - -test-ci: - $(MOCHA) -R tap - -test-ci-coverage: - @rm -rf coverage - $(ISTANBUL) cover $(_MOCHA) --report lcovonly -- -R tap - - @echo - @echo Sending report to coveralls.io... - @cat ./coverage/lcov.info | $(COVERALLS) - @rm -rf ./coverage - @echo Done - compile: npm run build diff --git a/package.json b/package.json index 2f51e07..9edca99 100644 --- a/package.json +++ b/package.json @@ -22,13 +22,12 @@ "url": "https://github.com/orchidjs/sifter.js.git" }, "scripts": { - "test:mocha": "mocha", "test": "jest --coverage", "test:typescript": "tsc -p .config --noemit", "pretest": "npm run build", "benchmark": "node --expose-gc benchmark/index.js", "build": "npx rollup -c .config/rollup.config.js", - "coveralls": "jest --coverage && cat ./coverage/lcov.info | coveralls" + "coveralls": "jest --coverage && cat ./coverage/lcov.info | coveralls" }, "devDependencies": { "@babel/core": "^7.13.16", @@ -38,11 +37,7 @@ "@rollup/plugin-babel": "^5.3.0", "coveralls": "^3.1.0", "humanize": "0.0.9", - "istanbul": "^0.4.5", "jest": "^26.6.3", - "mocha": "^8.3.2", - "mocha-istanbul": "^0.3.0", - "mocha-lcov-reporter": "^1.3.0", "rollup": "^2.45.2", "rollup-plugin-terser": "^7.0.2", "typescript": "^4.2.4" @@ -59,6 +54,8 @@ ], "jest": { "verbose": true, - "testMatch": [ "**/test/**/*.js" ] + "testMatch": [ + "**/test/**/*.js" + ] } } From 6305e31cc5e8bdf474614aa9c2d83d25467c86a0 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 16:11:17 -0600 Subject: [PATCH 034/140] tsconfig: "moduleResolution": "node" --- .config/tsconfig.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.config/tsconfig.json b/.config/tsconfig.json index 98479ab..d5c6f76 100644 --- a/.config/tsconfig.json +++ b/.config/tsconfig.json @@ -11,5 +11,7 @@ "declaration": true, "declarationDir": "../dist/types", + + "moduleResolution": "node" }, } From 2f34e8a9275fc4ee1c2ae968c1a675f39ae6fea7 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 16:11:59 -0600 Subject: [PATCH 035/140] asciifold w/out diacritics, add test --- lib/utils.ts | 30 +++++++----------------------- test/utils.js | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 23 deletions(-) create mode 100644 test/utils.js diff --git a/lib/utils.ts b/lib/utils.ts index 8c962c8..1c81bb9 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -1,6 +1,4 @@ -import { DIACRITICS } from './diacritics.ts'; - /** * A property getter resolving dot-notation @@ -92,27 +90,13 @@ export function iterate(object, callback) { }; - -var asciifold = (function() { - var i, n, k, chunk; - var foreignletters = ''; - var lookup = {}; - for (k in DIACRITICS) { - if (DIACRITICS.hasOwnProperty(k)) { - chunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1); - foreignletters += chunk; - for (i = 0, n = chunk.length; i < n; i++) { - lookup[chunk.charAt(i)] = k; - } - } - } - var regexp = new RegExp('[' + foreignletters + ']', 'g'); - return function(str) { - return str.replace(regexp, function(foreignletter) { - return lookup[foreignletter]; - }).toLowerCase(); - }; -})(); +/** + * Remove accents + * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 + */ +export function asciifold(str:string):string{ + return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').toLowerCase(); +}; export function cmp(a, b) { diff --git a/test/utils.js b/test/utils.js new file mode 100644 index 0000000..66ffd98 --- /dev/null +++ b/test/utils.js @@ -0,0 +1,15 @@ +var assert = require('assert'); +var utils = require('../build/cjs/utils.js'); + +describe('#prepareSearch()', function() { + + it('should remove accents', function() { + + var from = 'aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ'; + var to = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; + + assert.equal( utils.cmp(from,to), true); + }); + + +}); From 2d1d25e26f54cb5cfe3d4522b74558f747fe70ed Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 16:12:39 -0600 Subject: [PATCH 036/140] require cjs in tests --- test/getScoreFunction.js | 2 +- test/prepareSearch.js | 2 +- test/search.js | 2 +- test/tokenize.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/getScoreFunction.js b/test/getScoreFunction.js index eddfab1..b8a179d 100644 --- a/test/getScoreFunction.js +++ b/test/getScoreFunction.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../build/umd/sifter.js'); +var Sifter = require('../build/cjs/sifter.js'); describe('#getScoreFunction()', function() { diff --git a/test/prepareSearch.js b/test/prepareSearch.js index 7d274a7..2f7621c 100644 --- a/test/prepareSearch.js +++ b/test/prepareSearch.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../build/umd/sifter.js'); +var Sifter = require('../build/cjs/sifter.js'); describe('#prepareSearch()', function() { diff --git a/test/search.js b/test/search.js index c990d00..ae1114e 100644 --- a/test/search.js +++ b/test/search.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../build/umd/sifter.js'); +var Sifter = require('../build/cjs/sifter.js'); describe('#search()', function() { diff --git a/test/tokenize.js b/test/tokenize.js index 47e497f..a8bcaa5 100644 --- a/test/tokenize.js +++ b/test/tokenize.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../build/umd/sifter.js'); +var Sifter = require('../build/cjs/sifter.js'); describe('#tokenize()', function() { var sifter, tokens; From 73fce68ca35d67b4c33db9a47942d51a95c8b46f Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 16:18:56 -0600 Subject: [PATCH 037/140] asciifold query string, add test --- lib/sifter.ts | 6 +++--- test/search.js | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 948ea61..1898ed0 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -14,7 +14,7 @@ * @author Brian Reavis */ -import { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts'; +import { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp, asciifold } from './utils.ts'; import { DIACRITICS } from './diacritics.ts'; @@ -80,7 +80,6 @@ export default class Sifter{ * */ tokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] { - query = String(query || '').toLowerCase().trim(); if (!query || !query.length) return []; var letter; @@ -357,10 +356,11 @@ export default class Sifter{ }); } + query = asciifold( String(query || '') ).trim(); return { options : options, - query : String(query || '').toLowerCase(), + query : query, tokens : this.tokenize(query, options.respect_word_boundaries, weights), total : 0, items : [], diff --git a/test/search.js b/test/search.js index ae1114e..1edbec7 100644 --- a/test/search.js +++ b/test/search.js @@ -60,6 +60,24 @@ describe('#search()', function() { assert.equal(result.items[0].id, 'a'); }); + it('should handle accents', function() { + var sifter = new Sifter([ + {fields: 'a'}, + {fields: 'Ḁ'}, + {fields: 'ḁ'}, + {fields: 'Ă'}, + {fields: 'ă'}, + {fields: 'Â'}, + ]); + var result = sifter.search('ą', { + fields: 'fields', + sort:[{field:'fields'}], + }); + + assert.equal(result.items.length, 6); + }); + + describe('sorting', function() { it('should respect "sort_empty" option when query absent', function() { var sifter = new Sifter([ From 0607ede0ad08b93c9b2c670960128465d98f9f7f Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 20:51:57 -0600 Subject: [PATCH 038/140] more complete list of diacritics --- lib/diacritics.ts | 157 ++++++++++++++++++++++++++++++++++++++-------- lib/sifter.ts | 14 ++--- test/tokenize.js | 2 +- 3 files changed, 137 insertions(+), 36 deletions(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index 4a13341..f9c4940 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -1,28 +1,133 @@ +// https://github.com/andrewrk/node-diacritics/blob/master/index.js export var DIACRITICS:{ [key: string]: string } = { - 'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]', - 'b': '[b␢βΒB฿𐌁ᛒ]', - 'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄCc]', - 'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅDdð]', - 'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇEeɘǝƏƐε]', - 'f': '[fƑƒḞḟ]', - 'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]', - 'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]', - 'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪIi]', - 'j': '[jȷĴĵɈɉʝɟʲ]', - 'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]', - 'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟLl]', - 'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴNnŊŋ]', - 'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]', - 'p': '[pṔṕṖṗⱣᵽƤƥᵱ]', - 'q': '[qꝖꝗʠɊɋꝘꝙq̃]', - 'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]', - 's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]', - 't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]', - 'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]', - 'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]', - 'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]', - 'x': '[xẌẍẊẋχ]', - 'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]', - 'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]' -}; + " ":" ", + 0:"߀", + A:"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ", + AA:"Ꜳ", + AE:"ÆǼǢ", + AO:"Ꜵ", + AU:"Ꜷ", + AV:"ꜸꜺ", + AY:"Ꜽ", + B:"ⒷBḂḄḆɃƁ", + C:"ⒸCꜾḈĆCĈĊČÇƇȻ", + D:"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ", + Dh:"Ð", + DZ:"DZDŽ", + Dz:"DzDž", + E:"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ", + F:"ꝼⒻFḞƑꝻ", + G:"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ", + H:"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ", + I:"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ", + J:"ⒿJĴɈȷ", + K:"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ", + L:"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ", + LJ:"LJ", + Lj:"Lj", + M:"ⓂMḾṀṂⱮƜϻ", + N:"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ", + NJ:"NJ", + Nj:"Nj", + O:"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ", + OE:"Œ", + OI:"Ƣ", + OO:"Ꝏ", + OU:"Ȣ", + P:"ⓅPṔṖƤⱣꝐꝒꝔ", + Q:"ⓆQꝖꝘɊ", + R:"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ", + S:"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ", + T:"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ", + Th:"Þ", + TZ:"Ꜩ", + U:"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ", + V:"ⓋVṼṾƲꝞɅ", + VY:"Ꝡ", + W:"ⓌWẀẂŴẆẄẈⱲ", + X:"ⓍXẊẌ", + Y:"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ", + Z:"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ", + a:"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ", + aa:"ꜳ", + ae:"æǽǣ", + ao:"ꜵ", + au:"ꜷ", + av:"ꜹꜻ", + ay:"ꜽ", + b:"ⓑbḃḅḇƀƃɓƂ", + c:"cⓒćĉċčçḉƈȼꜿↄ", + d:"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ", + dh:"ð", + dz:"dzdž", + e:"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ", + f:"ⓕfḟƒ", + ff:"ff", + fi:"fi", + fl:"fl", + ffi:"ffi", + ffl:"ffl", + g:"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ", + h:"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ", + hv:"ƕ", + i:"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı", + j:"ⓙjĵǰɉ", + k:"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ", + l:"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ", + lj:"lj", + m:"ⓜmḿṁṃɱɯ", + n:"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ", + nj:"nj", + o:"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ", + oe:"œ", + oi:"ƣ", + oo:"ꝏ", + ou:"ȣ", + p:"ⓟpṕṗƥᵽꝑꝓꝕρ", + q:"ⓠqɋꝗꝙ", + r:"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ", + s:"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ", + ss:"ß", + t:"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ", + th:"þ", + tz:"ꜩ", + u:"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ", + v:"ⓥvṽṿʋꝟʌ", + vy:"ꝡ", + w:"ⓦwẁẃŵẇẅẘẉⱳ", + x:"ⓧxẋẍ", + y:"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ", + z:"ⓩzźẑżžẓẕƶȥɀⱬꝣ" +} + +var diacriticRegex = (function() { + + var list = []; + + for( let letter in DIACRITICS ){ + + if( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){ + continue; + } + + if( DIACRITICS.hasOwnProperty(letter) ){ + + var replace = letter + DIACRITICS[letter]; + if( letter.toUpperCase() in DIACRITICS ){ + replace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()]; + } + + list.push({let:letter,pat:'['+replace+']'}); + } + } + + return function(regex:string):string{ + list.forEach((item)=>{ + regex = regex.replace( new RegExp(item.let,'g'),item.pat); + }); + return regex; + } +})(); + +export { diacriticRegex }; diff --git a/lib/sifter.ts b/lib/sifter.ts index 1898ed0..2c5505d 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -15,7 +15,7 @@ */ import { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp, asciifold } from './utils.ts'; -import { DIACRITICS } from './diacritics.ts'; +import { diacriticRegex } from './diacritics.ts'; type TField = { @@ -91,7 +91,7 @@ export default class Sifter{ field_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\:(.*)$'); } - words.forEach((word) => { + words.forEach((word:string) => { let field_match; let field = null; let regex = null; @@ -104,14 +104,10 @@ export default class Sifter{ if( word.length > 0 ){ regex = escape_regex(word); - if (this.settings.diacritics) { - for (letter in DIACRITICS) { - if (DIACRITICS.hasOwnProperty(letter)) { - regex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]); - } - } + if( this.settings.diacritics ){ + regex = diacriticRegex(regex); } - if ( respect_word_boundaries ) regex = "\\b"+regex + if( respect_word_boundaries ) regex = "\\b"+regex regex = new RegExp(regex, 'i'); } diff --git a/test/tokenize.js b/test/tokenize.js index a8bcaa5..51d726a 100644 --- a/test/tokenize.js +++ b/test/tokenize.js @@ -55,7 +55,7 @@ describe('#tokenize()', function() { }); it('should match international characters', function() { assert.equal(tokens[0].regex.test('hęłlö'), true); - assert.equal(tokens[1].regex.test('wÕrlð'), true); + assert.equal(tokens[1].regex.test('wÕrlƌ'), true); }); }); }); From 3af08f50d3c516320826cac61a31c7659442a044 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Apr 2021 22:25:37 -0600 Subject: [PATCH 039/140] generate diacritic list from codepoints and String.normalize() --- lib/diacritics.ts | 153 +++++++++++++++++++++++++++++++++++++++++++++- lib/sifter.ts | 8 +-- lib/utils.ts | 13 +--- test/tokenize.js | 4 +- 4 files changed, 159 insertions(+), 19 deletions(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index f9c4940..c3e5d5a 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -1,6 +1,6 @@ // https://github.com/andrewrk/node-diacritics/blob/master/index.js -export var DIACRITICS:{ [key: string]: string } = { +var DIACRITICS:{ [key: string]: string } = { " ":" ", 0:"߀", A:"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ", @@ -101,10 +101,156 @@ export var DIACRITICS:{ [key: string]: string } = { z:"ⓩzźẑżžẓẕƶȥɀⱬꝣ" } +/** + * code points generated from toCodePoints(); + * removed 65339 to 65345 + */ +var code_points = [ + [ 67, 67 ], + [ 160, 160 ], + [ 192, 438 ], + [ 452, 652 ], + [ 961, 961 ], + [ 1019, 1019 ], + [ 1083, 1083 ], + [ 1281, 1289 ], + [ 1984, 1984 ], + [ 5095, 5095 ], + [ 7429, 7441 ], + [ 7545, 7549 ], + [ 7680, 7935 ], + [ 8580, 8580 ], + [ 9398, 9449 ], + [ 11360, 11391 ], + [ 42792, 42793 ], + [ 42802, 42851 ], + [ 42873, 42897 ], + [ 42912, 42922 ], + [ 64256, 64260 ], + [ 65313, 65338 ], + [ 65345, 65370 ] +]; + +/** + * Remove accents + * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 + * + */ +export function asciifold(str:string):string{ + return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD').toLowerCase(); +}; + + +/** + * Convert list of diacritics to array of code points + * + */ +function toCodePoints(tolerance=8){ + var char_codes = []; + + for( let letter in DIACRITICS ){ + let _diacritics = DIACRITICS[letter]; + for( let n = 0; n < _diacritics.length; n++ ){ + var code_point = _diacritics.codePointAt(n); + char_codes.push( code_point ); + } + } + + //https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range + char_codes.sort((a, b) => a - b); + var result = char_codes.reduce(function (accumulator, currentValue, index, source) { + + if( !index ){ + accumulator.push( [currentValue,currentValue] ); + + }else if( currentValue - source[index - 1] > tolerance ){ + accumulator.push( [currentValue,currentValue] ); + + }else{ + + accumulator.push( [accumulator.pop()[0],currentValue]); + } + + return accumulator; + }, []); + + console.log(`char_codes (${result.length})`,result); +} + +/** + * Generate a list of diacritics from the list of code points + * + */ +export function generateDiacritics(){ + + var latin_convert = { + 'l·': 'l', + 'ʼn': 'n', + 'æ': 'ae', + 'ø': 'o', + 'aʾ': 'a', + 'dž': 'dz', + }; + + var diacritics = {}; + //var no_latin = []; + code_points.forEach((code_range)=>{ + + for(let i = code_range[0]; i <= code_range[1]; i++){ + let diacritic = String.fromCharCode(i); + let latin = diacritic.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD'); + + if( latin == diacritic ){ + //no_latin.push(diacritic); + continue; + } + + latin = latin.toLowerCase(); + + if( latin in latin_convert ){ + latin = latin_convert[latin]; + } + + if( !(latin in diacritics) ){ + diacritics[latin] = latin + latin.toUpperCase(); + } + diacritics[latin] += diacritic; + } + }); + + return diacritics; +} + +/** + * Expand a regular expression pattern to include diacritics + * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ + * + */ +var diacriticRegexPoints = (function() { + + const diacritics = generateDiacritics(); + + return function(regex:string):string{ + for( let latin in diacritics ){ + if( diacritics.hasOwnProperty(latin) ){ + regex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']'); + } + } + return regex; + }; + +})(); + + +/** + * Expand a regular expression pattern to include diacritics + * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ + * + * rollup will bundle this function (and the DIACRITICS constant) unless commented out + * var diacriticRegex = (function() { var list = []; - for( let letter in DIACRITICS ){ if( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){ @@ -129,5 +275,6 @@ var diacriticRegex = (function() { return regex; } })(); +*/ -export { diacriticRegex }; +export { diacriticRegexPoints }; diff --git a/lib/sifter.ts b/lib/sifter.ts index 2c5505d..07dab2b 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -14,8 +14,8 @@ * @author Brian Reavis */ -import { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp, asciifold } from './utils.ts'; -import { diacriticRegex } from './diacritics.ts'; +import { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts'; +import { diacriticRegexPoints, asciifold } from './diacritics.ts'; type TField = { @@ -105,7 +105,7 @@ export default class Sifter{ if( word.length > 0 ){ regex = escape_regex(word); if( this.settings.diacritics ){ - regex = diacriticRegex(regex); + regex = diacriticRegexPoints(regex); } if( respect_word_boundaries ) regex = "\\b"+regex regex = new RegExp(regex, 'i'); @@ -352,7 +352,7 @@ export default class Sifter{ }); } - query = asciifold( String(query || '') ).trim(); + query = asciifold( String(query || '') ).toLowerCase().trim(); return { options : options, diff --git a/lib/utils.ts b/lib/utils.ts index 1c81bb9..49b54a4 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -1,4 +1,5 @@ +import { asciifold } from './diacritics.ts'; /** * A property getter resolving dot-notation @@ -90,21 +91,13 @@ export function iterate(object, callback) { }; -/** - * Remove accents - * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 - */ -export function asciifold(str:string):string{ - return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').toLowerCase(); -}; - export function cmp(a, b) { if (typeof a === 'number' && typeof b === 'number') { return a > b ? 1 : (a < b ? -1 : 0); } - a = asciifold(String(a || '')); - b = asciifold(String(b || '')); + a = asciifold(String(a || '')).toLowerCase(); + b = asciifold(String(b || '')).toLowerCase(); if (a > b) return 1; if (b > a) return -1; return 0; diff --git a/test/tokenize.js b/test/tokenize.js index 51d726a..1eff87b 100644 --- a/test/tokenize.js +++ b/test/tokenize.js @@ -54,8 +54,8 @@ describe('#tokenize()', function() { assert.equal(tokens[0].regex.test('afawfaf'), false); }); it('should match international characters', function() { - assert.equal(tokens[0].regex.test('hęłlö'), true); - assert.equal(tokens[1].regex.test('wÕrlƌ'), true); + assert.equal(tokens[0].regex.test('Ḧęŀlö'), true); + assert.equal(tokens[1].regex.test('ẘÕⓡlḋ'), true); }); }); }); From fa06f713ea025bd9ac52598f3f028038bee209f9 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Fri, 23 Apr 2021 08:17:22 -0600 Subject: [PATCH 040/140] call generateDiacritics() once without nested function --- lib/diacritics.ts | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index c3e5d5a..ea30a91 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -1,6 +1,8 @@ +type TDiacraticList = {[key:string]:string}; + // https://github.com/andrewrk/node-diacritics/blob/master/index.js -var DIACRITICS:{ [key: string]: string } = { +var DIACRITICS:TDiacraticList = { " ":" ", 0:"߀", A:"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ", @@ -181,7 +183,7 @@ function toCodePoints(tolerance=8){ * Generate a list of diacritics from the list of code points * */ -export function generateDiacritics(){ +export function generateDiacritics():TDiacraticList{ var latin_convert = { 'l·': 'l', @@ -226,20 +228,21 @@ export function generateDiacritics(){ * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ * */ -var diacriticRegexPoints = (function() { +var diacritics:TDiacraticList = null +export function diacriticRegexPoints(regex:string):string{ - const diacritics = generateDiacritics(); + if( diacritics === null ){ + diacritics = generateDiacritics(); + console.log('generate'); + } - return function(regex:string):string{ - for( let latin in diacritics ){ - if( diacritics.hasOwnProperty(latin) ){ - regex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']'); - } + for( let latin in diacritics ){ + if( diacritics.hasOwnProperty(latin) ){ + regex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']'); } - return regex; - }; - -})(); + } + return regex; +} /** @@ -276,5 +279,3 @@ var diacriticRegex = (function() { } })(); */ - -export { diacriticRegexPoints }; From d6abf62fc0e0245347905a1899c3dccd5c348780 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Fri, 23 Apr 2021 08:29:30 -0600 Subject: [PATCH 041/140] ignore "An import path cannot end with a '.ts' extension". Setting extension to '.js' and leaving extension off don't work --- lib/sifter.ts | 3 ++- lib/utils.ts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 07dab2b..3cc0df6 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -14,7 +14,9 @@ * @author Brian Reavis */ +// @ts-ignore import { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts'; +// @ts-ignore import { diacriticRegexPoints, asciifold } from './diacritics.ts'; @@ -82,7 +84,6 @@ export default class Sifter{ tokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] { if (!query || !query.length) return []; - var letter; var tokens = []; var words = query.split(/\s+/); var field_regex; diff --git a/lib/utils.ts b/lib/utils.ts index 49b54a4..95b1a4d 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -1,4 +1,5 @@ +// @ts-ignore import { asciifold } from './diacritics.ts'; /** From a67898c74201d63496d3d79e36431a860f3ab50a Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Fri, 23 Apr 2021 08:43:16 -0600 Subject: [PATCH 042/140] ignore warning about toCodePoints, rmeove console.log --- lib/diacritics.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index ea30a91..d7fc4a1 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -147,6 +147,7 @@ export function asciifold(str:string):string{ * Convert list of diacritics to array of code points * */ +// @ts-ignore function toCodePoints(tolerance=8){ var char_codes = []; @@ -220,6 +221,8 @@ export function generateDiacritics():TDiacraticList{ } }); + //console.log('no_latin',JSON.stringify(no_latin)); + return diacritics; } @@ -233,7 +236,6 @@ export function diacriticRegexPoints(regex:string):string{ if( diacritics === null ){ diacritics = generateDiacritics(); - console.log('generate'); } for( let latin in diacritics ){ From 921db8784006de48336a7bef29091f9a1af8a797 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Fri, 23 Apr 2021 09:07:34 -0600 Subject: [PATCH 043/140] update readme --- README.md | 55 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 13a60c0..5bd3912 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,20 @@ # sifter.js -[![NPM version](http://img.shields.io/npm/v/sifter.svg?style=flat)](https://www.npmjs.org/package/sifter) -[![Installs](http://img.shields.io/npm/dm/sifter.svg?style=flat)](https://www.npmjs.org/package/sifter) [![Build Status](https://travis-ci.org/orchidjs/sifter.js.svg)](https://travis-ci.org/orchidjs/sifter.js) [![Coverage Status](http://img.shields.io/coveralls/orchidjs/sifter.js/master.svg?style=flat)](https://coveralls.io/r/orchidjs/sifter.js) -Sifter is a client and server-side library (via [UMD](https://github.com/umdjs/umd)) for textually searching arrays and hashes of objects by property – or multiple properties. It's designed specifically for autocomplete. The process is three-step: *score*, *filter*, *sort*. + +Sifter is a fast and small (<6kb) client and server-side library (coded in TypeScript and available in [CJS, UMD, and ESM](https://irian.to/blogs/what-are-cjs-amd-umd-and-esm-in-javascript/)) for textually searching arrays and hashes of objects by property – or multiple properties. It's designed specifically for autocomplete. The process is three-step: *score*, *filter*, *sort*. * **Supports díåcritîçs.**
For example, if searching for "montana" and an item in the set has a value of "montaña", it will still be matched. Sorting will also play nicely with diacritics. * **Smart scoring.**
Items are scored / sorted intelligently depending on where a match is found in the string (how close to the beginning) and what percentage of the string matches. * **Multi-field sorting.**
When scores aren't enough to go by – like when getting results for an empty query – it can sort by one or more fields. For example, sort by a person's first name and last name without actually merging the properties to a single string. * **Nested properties.**
Allows to search and sort on nested properties so you can perform search on complex objects without flattening them simply by using dot-notation to reference fields (ie. `nested.property`). +* **Weighted fields.**
Assign weights to multi-field configurations for more control of search results +* **Field searching**
Search for values in one field with "field-name:query" + ```sh -$ npm install sifter # node.js -$ bower install sifter # browser +$ npm install @orchidjs/sifter # node.js ``` ## Usage @@ -30,7 +31,7 @@ var sifter = new Sifter([ ]); var result = sifter.search('anna', { - fields: ['title', 'location', 'continent'], + fields: [{field:'title',weight:2}, {field:'location'}, {field:'continent',weight:0.5}], sort: [{field: 'title', direction: 'asc'}], limit: 3 }); @@ -38,10 +39,10 @@ var result = sifter.search('anna', { Seaching will provide back meta information and an "items" array that contains objects with the index (or key, if searching a hash) and a score that represents how good of a match the item was. Items that did not match will not be returned. -``` -{"score": 0.2878787878787879, "id": 0}, -{"score": 0.27777777777777773, "id": 1}, -{"score": 0.2692307692307692, "id": 2} +```js +{ score: 0.5757575757575758, id: 0 }, +{ score: 0.5555555555555555, id: 1 }, +{ score: 0.5384615384615384, id: 2 } ``` Items are sorted by best-match, primarily. If two or more items have the same score (which will be the case when searching with an empty string), it will resort to the fields listed in the "sort" option. @@ -50,23 +51,23 @@ The full result comes back in the format of: ```js { - "options": { - "fields": ["title", "location", "continent"], - "sort": [ - {"field": "title", "direction": "asc"} + options: { + fields: [{field:"title",weight:2},{field:"location",weight:1}, {field:"continent",weight:0.5}], + sort: [ + {field: "title", direction: "asc"} ], - "limit": 3 + limit: 3 }, - "query": "anna", - "tokens": [{ - "string": "anna", - "regex": /[aÀÁÂÃÄÅàáâãäå][nÑñ][nÑñ][aÀÁÂÃÄÅàáâãäå]/ + query: "anna", + tokens: [{ + string: "anna", + regex: /[aÀÁÂÃÄÅàáâãäå][nÑñ][nÑñ][aÀÁÂÃÄÅàáâãäå]/ }], - "total": 3, - "items": [ - {"score": 0.2878787878787879, "id": 0}, - {"score": 0.27777777777777773, "id": 1}, - {"score": 0.2692307692307692,"id": 2} + total: 3, + items: [ + { score: 0.5757575757575758, id: 0 }, + { score: 0.5555555555555555, id: 1 }, + { score: 0.5384615384615384, id: 2 } ] } ``` @@ -86,7 +87,11 @@ Performs a search for `query` with the provided `options`. fields array - An array of property names to be searched. + An array of property names and optional weights to be searched. +```js +fields: [{field:"title",weight:2},{field:"location",weight:1}, {field:"continent",weight:0.5}], +``` + limit From 9c30737c8797a909fec38e939e15f38f2971f902 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Fri, 23 Apr 2021 09:13:15 -0600 Subject: [PATCH 044/140] empty file for release.sh to remove --- dist/Empty Document | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dist/Empty Document diff --git a/dist/Empty Document b/dist/Empty Document new file mode 100644 index 0000000..e69de29 From 8e7450a8574cf8e6b5fd27f2405a2592b45e3123 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Fri, 23 Apr 2021 09:13:53 -0600 Subject: [PATCH 045/140] v0.7.0 Release --- dist/Empty Document | 0 dist/cjs/diacritics.js | 123 ++++++++ dist/cjs/diacritics.js.map | 1 + dist/cjs/sifter.js | 382 ++++++++++++++++++++++++ dist/cjs/sifter.js.map | 1 + dist/cjs/utils.js | 110 +++++++ dist/cjs/utils.js.map | 1 + dist/esm/diacritics.js | 117 ++++++++ dist/esm/diacritics.js.map | 1 + dist/esm/sifter.js | 380 ++++++++++++++++++++++++ dist/esm/sifter.js.map | 1 + dist/esm/utils.js | 100 +++++++ dist/esm/utils.js.map | 1 + dist/umd/sifter.js | 594 +++++++++++++++++++++++++++++++++++++ dist/umd/sifter.js.map | 1 + dist/umd/sifter.min.js | 53 ++++ dist/umd/sifter.min.js.map | 1 + package.json | 2 +- 18 files changed, 1868 insertions(+), 1 deletion(-) delete mode 100644 dist/Empty Document create mode 100644 dist/cjs/diacritics.js create mode 100644 dist/cjs/diacritics.js.map create mode 100644 dist/cjs/sifter.js create mode 100644 dist/cjs/sifter.js.map create mode 100644 dist/cjs/utils.js create mode 100644 dist/cjs/utils.js.map create mode 100644 dist/esm/diacritics.js create mode 100644 dist/esm/diacritics.js.map create mode 100644 dist/esm/sifter.js create mode 100644 dist/esm/sifter.js.map create mode 100644 dist/esm/utils.js create mode 100644 dist/esm/utils.js.map create mode 100644 dist/umd/sifter.js create mode 100644 dist/umd/sifter.js.map create mode 100644 dist/umd/sifter.min.js create mode 100644 dist/umd/sifter.min.js.map diff --git a/dist/Empty Document b/dist/Empty Document deleted file mode 100644 index e69de29..0000000 diff --git a/dist/cjs/diacritics.js b/dist/cjs/diacritics.js new file mode 100644 index 0000000..762c818 --- /dev/null +++ b/dist/cjs/diacritics.js @@ -0,0 +1,123 @@ +/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +// https://github.com/andrewrk/node-diacritics/blob/master/index.js +/** + * code points generated from toCodePoints(); + * removed 65339 to 65345 + */ + +var code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [1019, 1019], [1083, 1083], [1281, 1289], [1984, 1984], [5095, 5095], [7429, 7441], [7545, 7549], [7680, 7935], [8580, 8580], [9398, 9449], [11360, 11391], [42792, 42793], [42802, 42851], [42873, 42897], [42912, 42922], [64256, 64260], [65313, 65338], [65345, 65370]]; +/** + * Remove accents + * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 + * + */ + +function asciifold(str) { + return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD').toLowerCase(); +} +/** + * Generate a list of diacritics from the list of code points + * + */ + + +function generateDiacritics() { + var latin_convert = { + 'l·': 'l', + 'ʼn': 'n', + 'æ': 'ae', + 'ø': 'o', + 'aʾ': 'a', + 'dž': 'dz' + }; + var diacritics = {}; //var no_latin = []; + + code_points.forEach(code_range => { + for (let i = code_range[0]; i <= code_range[1]; i++) { + let diacritic = String.fromCharCode(i); + let latin = diacritic.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD'); + + if (latin == diacritic) { + //no_latin.push(diacritic); + continue; + } + + latin = latin.toLowerCase(); + + if (latin in latin_convert) { + latin = latin_convert[latin]; + } + + if (!(latin in diacritics)) { + diacritics[latin] = latin + latin.toUpperCase(); + } + + diacritics[latin] += diacritic; + } + }); //console.log('no_latin',JSON.stringify(no_latin)); + + return diacritics; +} +/** + * Expand a regular expression pattern to include diacritics + * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ + * + */ + +var diacritics = null; +function diacriticRegexPoints(regex) { + if (diacritics === null) { + diacritics = generateDiacritics(); + } + + for (let latin in diacritics) { + if (diacritics.hasOwnProperty(latin)) { + regex = regex.replace(new RegExp(latin, 'g'), '[' + diacritics[latin] + ']'); + } + } + + return regex; +} +/** + * Expand a regular expression pattern to include diacritics + * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ + * + * rollup will bundle this function (and the DIACRITICS constant) unless commented out + * +var diacriticRegex = (function() { + + var list = []; + for( let letter in DIACRITICS ){ + + if( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){ + continue; + } + + if( DIACRITICS.hasOwnProperty(letter) ){ + + var replace = letter + DIACRITICS[letter]; + if( letter.toUpperCase() in DIACRITICS ){ + replace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()]; + } + + list.push({let:letter,pat:'['+replace+']'}); + } + } + + return function(regex:string):string{ + list.forEach((item)=>{ + regex = regex.replace( new RegExp(item.let,'g'),item.pat); + }); + return regex; + } +})(); +*/ + +exports.asciifold = asciifold; +exports.diacriticRegexPoints = diacriticRegexPoints; +exports.generateDiacritics = generateDiacritics; +//# sourceMappingURL=diacritics.js.map diff --git a/dist/cjs/diacritics.js.map b/dist/cjs/diacritics.js.map new file mode 100644 index 0000000..c77bb5e --- /dev/null +++ b/dist/cjs/diacritics.js.map @@ -0,0 +1 @@ +{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp"],"mappings":"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"} \ No newline at end of file diff --git a/dist/cjs/sifter.js b/dist/cjs/sifter.js new file mode 100644 index 0000000..4659774 --- /dev/null +++ b/dist/cjs/sifter.js @@ -0,0 +1,382 @@ +/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ +'use strict'; + +var utils = require('./utils.js'); +var diacritics = require('./diacritics.js'); + +/** + * sifter.js + * Copyright (c) 2013–2020 Brian Reavis & contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + * + * @author Brian Reavis + */ +class Sifter { + /** + * Textually searches arrays and hashes of objects + * by property (or multiple properties). Designed + * specifically for autocomplete. + * + * @constructor + * @param {array|object} items + * @param {object} items + */ + constructor(items, settings) { + this.items = void 0; + this.settings = void 0; + this.items = items; + this.settings = settings || { + diacritics: true + }; + } + + /** + * Splits a search string into an array of individual + * regexps to be used to match results. + * + */ + tokenize(query, respect_word_boundaries, weights) { + if (!query || !query.length) return []; + var tokens = []; + var words = query.split(/\s+/); + var field_regex; + + if (weights) { + field_regex = new RegExp('^(' + Object.keys(weights).map(utils.escape_regex).join('|') + ')\:(.*)$'); + } + + words.forEach(word => { + let field_match; + let field = null; + let regex = null; // look for "field:query" tokens + + if (field_regex && (field_match = word.match(field_regex))) { + field = field_match[1]; + word = field_match[2]; + } + + if (word.length > 0) { + regex = utils.escape_regex(word); + + if (this.settings.diacritics) { + regex = diacritics.diacriticRegexPoints(regex); + } + + if (respect_word_boundaries) regex = "\\b" + regex; + regex = new RegExp(regex, 'i'); + } + + tokens.push({ + string: word, + regex: regex, + field: field + }); + }); + return tokens; + } + + /** + * Returns a function to be used to score individual results. + * + * Good matches will have a higher score than poor matches. + * If an item is not a match, 0 will be returned by the function. + * + * @returns {function} + */ + getScoreFunction(query, options) { + var search = this.prepareSearch(query, options); + return this._getScoreFunction(search); + } + + _getScoreFunction(search) { + const tokens = search.tokens, + token_count = tokens.length; + + if (!token_count) { + return function () { + return 0; + }; + } + + const fields = search.options.fields, + weights = search.weights, + field_count = fields.length, + getAttrFn = search.getAttrFn; + /** + * Calculates the score of an object + * against the search query. + * + * @param {TToken} token + * @param {object} data + * @return {number} + */ + + var scoreObject = function () { + if (!field_count) { + return function () { + return 0; + }; + } + + if (field_count === 1) { + return function (token, data) { + const field = fields[0].field; + return utils.scoreValue(getAttrFn(data, field), token, weights[field]); + }; + } + + return function (token, data) { + var sum = 0; // is the token specific to a field? + + if (token.field) { + const value = getAttrFn(data, token.field); + + if (!token.regex && value) { + sum += 0.1; + } else { + sum += utils.scoreValue(value, token, weights[token.field]); + } + } else { + utils.iterate(weights, (weight, field) => { + sum += utils.scoreValue(getAttrFn(data, field), token, weight); + }); + } + + return sum / field_count; + }; + }(); + + if (token_count === 1) { + return function (data) { + return scoreObject(tokens[0], data); + }; + } + + if (search.options.conjunction === 'and') { + return function (data) { + var i = 0, + score, + sum = 0; + + for (; i < token_count; i++) { + score = scoreObject(tokens[i], data); + if (score <= 0) return 0; + sum += score; + } + + return sum / token_count; + }; + } else { + return function (data) { + var sum = 0; + utils.iterate(tokens, token => { + sum += scoreObject(token, data); + }); + return sum / token_count; + }; + } + } + + /** + * Returns a function that can be used to compare two + * results, for sorting purposes. If no sorting should + * be performed, `null` will be returned. + * + * @return function(a,b) + */ + getSortFunction(query, options) { + var search = this.prepareSearch(query, options); + return this._getSortFunction(search); + } + + _getSortFunction(search) { + var i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options; + self = this; + options = search.options; + sort = !search.query && options.sort_empty || options.sort; + /** + * Fetches the specified sort field value + * from a search result item. + * + * @param {string} name + * @param {object} result + * @return {string} + */ + + get_field = function (name, result) { + if (name === '$score') return result.score; + return search.getAttrFn(self.items[result.id], name); + }; // parse options + + + sort_flds = []; + + if (sort) { + for (i = 0, n = sort.length; i < n; i++) { + if (search.query || sort[i].field !== '$score') { + sort_flds.push(sort[i]); + } + } + } // the "$score" field is implied to be the primary + // sort field, unless it's manually specified + + + if (search.query) { + implicit_score = true; + + for (i = 0, n = sort_flds.length; i < n; i++) { + if (sort_flds[i].field === '$score') { + implicit_score = false; + break; + } + } + + if (implicit_score) { + sort_flds.unshift({ + field: '$score', + direction: 'desc' + }); + } + } else { + for (i = 0, n = sort_flds.length; i < n; i++) { + if (sort_flds[i].field === '$score') { + sort_flds.splice(i, 1); + break; + } + } + } + + multipliers = []; + + for (i = 0, n = sort_flds.length; i < n; i++) { + multipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1); + } // build function + + + sort_flds_count = sort_flds.length; + + if (!sort_flds_count) { + return null; + } else if (sort_flds_count === 1) { + sort_fld = sort_flds[0].field; + multiplier = multipliers[0]; + return function (a, b) { + return multiplier * utils.cmp(get_field(sort_fld, a), get_field(sort_fld, b)); + }; + } else { + return function (a, b) { + var i, result, field; + + for (i = 0; i < sort_flds_count; i++) { + field = sort_flds[i].field; + result = multipliers[i] * utils.cmp(get_field(field, a), get_field(field, b)); + if (result) return result; + } + + return 0; + }; + } + } + + /** + * Parses a search query and returns an object + * with tokens and fields ready to be populated + * with results. + * + */ + prepareSearch(query, optsUser) { + const weights = {}; + var options = Object.assign({}, optsUser); + utils.propToArray(options, 'sort'); + utils.propToArray(options, 'sort_empty'); // convert fields to new format + + if (options.fields) { + utils.propToArray(options, 'fields'); + + if (Array.isArray(options.fields) && typeof options.fields[0] !== 'object') { + var fields = []; + options.fields.forEach(fld_name => { + fields.push({ + field: fld_name + }); + }); + options.fields = fields; + } + + options.fields.forEach(field_params => { + weights[field_params.field] = 'weight' in field_params ? field_params.weight : 1; + }); + } + + query = diacritics.asciifold(String(query || '')).toLowerCase().trim(); + return { + options: options, + query: query, + tokens: this.tokenize(query, options.respect_word_boundaries, weights), + total: 0, + items: [], + weights: weights, + getAttrFn: options.nesting ? utils.getAttrNesting : utils.getAttr + }; + } + + /** + * Searches through all items and returns a sorted array of matches. + * + */ + search(query, options) { + var self = this, + score, + search; + var fn_sort; + var fn_score; + search = this.prepareSearch(query, options); + options = search.options; + query = search.query; // generate result scoring function + + fn_score = options.score || self._getScoreFunction(search); // perform search and sort + + if (query.length) { + utils.iterate(self.items, (item, id) => { + score = fn_score(item); + + if (options.filter === false || score > 0) { + search.items.push({ + 'score': score, + 'id': id + }); + } + }); + } else { + utils.iterate(self.items, (item, id) => { + search.items.push({ + 'score': 1, + 'id': id + }); + }); + } + + fn_sort = self._getSortFunction(search); + if (fn_sort) search.items.sort(fn_sort); // apply limits + + search.total = search.items.length; + + if (typeof options.limit === 'number') { + search.items = search.items.slice(0, options.limit); + } + + return search; + } + +} + +module.exports = Sifter; +//# sourceMappingURL=sifter.js.map diff --git a/dist/cjs/sifter.js.map b/dist/cjs/sifter.js.map new file mode 100644 index 0000000..5d62446 --- /dev/null +++ b/dist/cjs/sifter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tvar tokens = [];\n\t\tvar words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += 0.1;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, weights[token.field]);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options;\n\n\t\tself\t\t= this;\n\t\toptions\t\t= search.options;\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort;\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tget_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tsort_flds = [];\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmultipliers = [];\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( String(query || '') ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","self","sort_fld","sort_flds","sort_flds_count","multiplier","multipliers","get_field","implicit_score","sort","sort_empty","name","result","id","unshift","direction","splice","a","b","cmp","optsUser","assign","propToArray","Array","isArray","fld_name","field_params","asciifold","String","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/cjs/utils.js b/dist/cjs/utils.js new file mode 100644 index 0000000..2f9dd7b --- /dev/null +++ b/dist/cjs/utils.js @@ -0,0 +1,110 @@ +/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var diacritics = require('./diacritics.js'); + +// @ts-ignore +/** + * A property getter resolving dot-notation + * @param {Object} obj The root object to fetch property on + * @param {String} name The optionally dotted property name to fetch + * @return {Object} The resolved property value + */ + +function getAttr(obj, name) { + if (!obj) return; + return obj[name]; +} +/** + * A property getter resolving dot-notation + * @param {Object} obj The root object to fetch property on + * @param {String} name The optionally dotted property name to fetch + * @return {Object} The resolved property value + */ + +function getAttrNesting(obj, name) { + if (!obj) return; + var names = name.split("."); + + while (names.length && (obj = obj[names.shift()])); + + return obj; +} +/** + * Calculates how close of a match the + * given value is against a search token. + * + * @param {object} token + * @return {number} + */ + +function scoreValue(value, token, weight) { + var score, pos; + if (!value) return 0; + value = String(value || ''); + pos = value.search(token.regex); + if (pos === -1) return 0; + score = token.string.length / value.length; + if (pos === 0) score += 0.5; + return score * weight; +} +function escape_regex(str) { + return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); +} +/** + * Cast object property to an array if it exists and has a value + * + */ + +function propToArray(obj, key) { + var value = obj[key]; + + if (value && !Array.isArray(value)) { + obj[key] = [value]; + } +} +/** + * Iterates over arrays and hashes. + * + * ``` + * iterate(this.items, function(item, id) { + * // invoked for each item + * }); + * ``` + * + * @param {array|object} object + */ + +function iterate(object, callback) { + if (Array.isArray(object)) { + object.forEach(callback); + } else { + for (var key in object) { + if (object.hasOwnProperty(key)) { + callback(object[key], key); + } + } + } +} +function cmp(a, b) { + if (typeof a === 'number' && typeof b === 'number') { + return a > b ? 1 : a < b ? -1 : 0; + } + + a = diacritics.asciifold(String(a || '')).toLowerCase(); + b = diacritics.asciifold(String(b || '')).toLowerCase(); + if (a > b) return 1; + if (b > a) return -1; + return 0; +} + +exports.cmp = cmp; +exports.escape_regex = escape_regex; +exports.getAttr = getAttr; +exports.getAttrNesting = getAttrNesting; +exports.iterate = iterate; +exports.propToArray = propToArray; +exports.scoreValue = scoreValue; +//# sourceMappingURL=utils.js.map diff --git a/dist/cjs/utils.js.map b/dist/cjs/utils.js.map new file mode 100644 index 0000000..8599a0c --- /dev/null +++ b/dist/cjs/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = String(value || '');\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(String(a || '')).toLowerCase();\n\tb = asciifold(String(b || '')).toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","String","search","regex","string","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/diacritics.js b/dist/esm/diacritics.js new file mode 100644 index 0000000..9417e86 --- /dev/null +++ b/dist/esm/diacritics.js @@ -0,0 +1,117 @@ +/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ +// https://github.com/andrewrk/node-diacritics/blob/master/index.js +/** + * code points generated from toCodePoints(); + * removed 65339 to 65345 + */ + +var code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [1019, 1019], [1083, 1083], [1281, 1289], [1984, 1984], [5095, 5095], [7429, 7441], [7545, 7549], [7680, 7935], [8580, 8580], [9398, 9449], [11360, 11391], [42792, 42793], [42802, 42851], [42873, 42897], [42912, 42922], [64256, 64260], [65313, 65338], [65345, 65370]]; +/** + * Remove accents + * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 + * + */ + +function asciifold(str) { + return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD').toLowerCase(); +} +/** + * Generate a list of diacritics from the list of code points + * + */ + + +function generateDiacritics() { + var latin_convert = { + 'l·': 'l', + 'ʼn': 'n', + 'æ': 'ae', + 'ø': 'o', + 'aʾ': 'a', + 'dž': 'dz' + }; + var diacritics = {}; //var no_latin = []; + + code_points.forEach(code_range => { + for (let i = code_range[0]; i <= code_range[1]; i++) { + let diacritic = String.fromCharCode(i); + let latin = diacritic.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD'); + + if (latin == diacritic) { + //no_latin.push(diacritic); + continue; + } + + latin = latin.toLowerCase(); + + if (latin in latin_convert) { + latin = latin_convert[latin]; + } + + if (!(latin in diacritics)) { + diacritics[latin] = latin + latin.toUpperCase(); + } + + diacritics[latin] += diacritic; + } + }); //console.log('no_latin',JSON.stringify(no_latin)); + + return diacritics; +} +/** + * Expand a regular expression pattern to include diacritics + * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ + * + */ + +var diacritics = null; +function diacriticRegexPoints(regex) { + if (diacritics === null) { + diacritics = generateDiacritics(); + } + + for (let latin in diacritics) { + if (diacritics.hasOwnProperty(latin)) { + regex = regex.replace(new RegExp(latin, 'g'), '[' + diacritics[latin] + ']'); + } + } + + return regex; +} +/** + * Expand a regular expression pattern to include diacritics + * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ + * + * rollup will bundle this function (and the DIACRITICS constant) unless commented out + * +var diacriticRegex = (function() { + + var list = []; + for( let letter in DIACRITICS ){ + + if( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){ + continue; + } + + if( DIACRITICS.hasOwnProperty(letter) ){ + + var replace = letter + DIACRITICS[letter]; + if( letter.toUpperCase() in DIACRITICS ){ + replace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()]; + } + + list.push({let:letter,pat:'['+replace+']'}); + } + } + + return function(regex:string):string{ + list.forEach((item)=>{ + regex = regex.replace( new RegExp(item.let,'g'),item.pat); + }); + return regex; + } +})(); +*/ + +export { asciifold, diacriticRegexPoints, generateDiacritics }; +//# sourceMappingURL=diacritics.js.map diff --git a/dist/esm/diacritics.js.map b/dist/esm/diacritics.js.map new file mode 100644 index 0000000..4ff2c5d --- /dev/null +++ b/dist/esm/diacritics.js.map @@ -0,0 +1 @@ +{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/sifter.js b/dist/esm/sifter.js new file mode 100644 index 0000000..1858ed0 --- /dev/null +++ b/dist/esm/sifter.js @@ -0,0 +1,380 @@ +/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ +import { escape_regex, iterate, cmp, propToArray, getAttrNesting, getAttr, scoreValue } from './utils.js'; +import { diacriticRegexPoints, asciifold } from './diacritics.js'; + +/** + * sifter.js + * Copyright (c) 2013–2020 Brian Reavis & contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + * + * @author Brian Reavis + */ +class Sifter { + /** + * Textually searches arrays and hashes of objects + * by property (or multiple properties). Designed + * specifically for autocomplete. + * + * @constructor + * @param {array|object} items + * @param {object} items + */ + constructor(items, settings) { + this.items = void 0; + this.settings = void 0; + this.items = items; + this.settings = settings || { + diacritics: true + }; + } + + /** + * Splits a search string into an array of individual + * regexps to be used to match results. + * + */ + tokenize(query, respect_word_boundaries, weights) { + if (!query || !query.length) return []; + var tokens = []; + var words = query.split(/\s+/); + var field_regex; + + if (weights) { + field_regex = new RegExp('^(' + Object.keys(weights).map(escape_regex).join('|') + ')\:(.*)$'); + } + + words.forEach(word => { + let field_match; + let field = null; + let regex = null; // look for "field:query" tokens + + if (field_regex && (field_match = word.match(field_regex))) { + field = field_match[1]; + word = field_match[2]; + } + + if (word.length > 0) { + regex = escape_regex(word); + + if (this.settings.diacritics) { + regex = diacriticRegexPoints(regex); + } + + if (respect_word_boundaries) regex = "\\b" + regex; + regex = new RegExp(regex, 'i'); + } + + tokens.push({ + string: word, + regex: regex, + field: field + }); + }); + return tokens; + } + + /** + * Returns a function to be used to score individual results. + * + * Good matches will have a higher score than poor matches. + * If an item is not a match, 0 will be returned by the function. + * + * @returns {function} + */ + getScoreFunction(query, options) { + var search = this.prepareSearch(query, options); + return this._getScoreFunction(search); + } + + _getScoreFunction(search) { + const tokens = search.tokens, + token_count = tokens.length; + + if (!token_count) { + return function () { + return 0; + }; + } + + const fields = search.options.fields, + weights = search.weights, + field_count = fields.length, + getAttrFn = search.getAttrFn; + /** + * Calculates the score of an object + * against the search query. + * + * @param {TToken} token + * @param {object} data + * @return {number} + */ + + var scoreObject = function () { + if (!field_count) { + return function () { + return 0; + }; + } + + if (field_count === 1) { + return function (token, data) { + const field = fields[0].field; + return scoreValue(getAttrFn(data, field), token, weights[field]); + }; + } + + return function (token, data) { + var sum = 0; // is the token specific to a field? + + if (token.field) { + const value = getAttrFn(data, token.field); + + if (!token.regex && value) { + sum += 0.1; + } else { + sum += scoreValue(value, token, weights[token.field]); + } + } else { + iterate(weights, (weight, field) => { + sum += scoreValue(getAttrFn(data, field), token, weight); + }); + } + + return sum / field_count; + }; + }(); + + if (token_count === 1) { + return function (data) { + return scoreObject(tokens[0], data); + }; + } + + if (search.options.conjunction === 'and') { + return function (data) { + var i = 0, + score, + sum = 0; + + for (; i < token_count; i++) { + score = scoreObject(tokens[i], data); + if (score <= 0) return 0; + sum += score; + } + + return sum / token_count; + }; + } else { + return function (data) { + var sum = 0; + iterate(tokens, token => { + sum += scoreObject(token, data); + }); + return sum / token_count; + }; + } + } + + /** + * Returns a function that can be used to compare two + * results, for sorting purposes. If no sorting should + * be performed, `null` will be returned. + * + * @return function(a,b) + */ + getSortFunction(query, options) { + var search = this.prepareSearch(query, options); + return this._getSortFunction(search); + } + + _getSortFunction(search) { + var i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options; + self = this; + options = search.options; + sort = !search.query && options.sort_empty || options.sort; + /** + * Fetches the specified sort field value + * from a search result item. + * + * @param {string} name + * @param {object} result + * @return {string} + */ + + get_field = function (name, result) { + if (name === '$score') return result.score; + return search.getAttrFn(self.items[result.id], name); + }; // parse options + + + sort_flds = []; + + if (sort) { + for (i = 0, n = sort.length; i < n; i++) { + if (search.query || sort[i].field !== '$score') { + sort_flds.push(sort[i]); + } + } + } // the "$score" field is implied to be the primary + // sort field, unless it's manually specified + + + if (search.query) { + implicit_score = true; + + for (i = 0, n = sort_flds.length; i < n; i++) { + if (sort_flds[i].field === '$score') { + implicit_score = false; + break; + } + } + + if (implicit_score) { + sort_flds.unshift({ + field: '$score', + direction: 'desc' + }); + } + } else { + for (i = 0, n = sort_flds.length; i < n; i++) { + if (sort_flds[i].field === '$score') { + sort_flds.splice(i, 1); + break; + } + } + } + + multipliers = []; + + for (i = 0, n = sort_flds.length; i < n; i++) { + multipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1); + } // build function + + + sort_flds_count = sort_flds.length; + + if (!sort_flds_count) { + return null; + } else if (sort_flds_count === 1) { + sort_fld = sort_flds[0].field; + multiplier = multipliers[0]; + return function (a, b) { + return multiplier * cmp(get_field(sort_fld, a), get_field(sort_fld, b)); + }; + } else { + return function (a, b) { + var i, result, field; + + for (i = 0; i < sort_flds_count; i++) { + field = sort_flds[i].field; + result = multipliers[i] * cmp(get_field(field, a), get_field(field, b)); + if (result) return result; + } + + return 0; + }; + } + } + + /** + * Parses a search query and returns an object + * with tokens and fields ready to be populated + * with results. + * + */ + prepareSearch(query, optsUser) { + const weights = {}; + var options = Object.assign({}, optsUser); + propToArray(options, 'sort'); + propToArray(options, 'sort_empty'); // convert fields to new format + + if (options.fields) { + propToArray(options, 'fields'); + + if (Array.isArray(options.fields) && typeof options.fields[0] !== 'object') { + var fields = []; + options.fields.forEach(fld_name => { + fields.push({ + field: fld_name + }); + }); + options.fields = fields; + } + + options.fields.forEach(field_params => { + weights[field_params.field] = 'weight' in field_params ? field_params.weight : 1; + }); + } + + query = asciifold(String(query || '')).toLowerCase().trim(); + return { + options: options, + query: query, + tokens: this.tokenize(query, options.respect_word_boundaries, weights), + total: 0, + items: [], + weights: weights, + getAttrFn: options.nesting ? getAttrNesting : getAttr + }; + } + + /** + * Searches through all items and returns a sorted array of matches. + * + */ + search(query, options) { + var self = this, + score, + search; + var fn_sort; + var fn_score; + search = this.prepareSearch(query, options); + options = search.options; + query = search.query; // generate result scoring function + + fn_score = options.score || self._getScoreFunction(search); // perform search and sort + + if (query.length) { + iterate(self.items, (item, id) => { + score = fn_score(item); + + if (options.filter === false || score > 0) { + search.items.push({ + 'score': score, + 'id': id + }); + } + }); + } else { + iterate(self.items, (item, id) => { + search.items.push({ + 'score': 1, + 'id': id + }); + }); + } + + fn_sort = self._getSortFunction(search); + if (fn_sort) search.items.sort(fn_sort); // apply limits + + search.total = search.items.length; + + if (typeof options.limit === 'number') { + search.items = search.items.slice(0, options.limit); + } + + return search; + } + +} + +export default Sifter; +//# sourceMappingURL=sifter.js.map diff --git a/dist/esm/sifter.js.map b/dist/esm/sifter.js.map new file mode 100644 index 0000000..31d8e07 --- /dev/null +++ b/dist/esm/sifter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tvar tokens = [];\n\t\tvar words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += 0.1;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, weights[token.field]);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options;\n\n\t\tself\t\t= this;\n\t\toptions\t\t= search.options;\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort;\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tget_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tsort_flds = [];\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmultipliers = [];\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( String(query || '') ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","self","sort_fld","sort_flds","sort_flds_count","multiplier","multipliers","get_field","implicit_score","sort","sort_empty","name","result","id","unshift","direction","splice","a","b","cmp","optsUser","assign","propToArray","Array","isArray","fld_name","field_params","asciifold","String","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/utils.js b/dist/esm/utils.js new file mode 100644 index 0000000..9901e11 --- /dev/null +++ b/dist/esm/utils.js @@ -0,0 +1,100 @@ +/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ +import { asciifold } from './diacritics.js'; + +// @ts-ignore +/** + * A property getter resolving dot-notation + * @param {Object} obj The root object to fetch property on + * @param {String} name The optionally dotted property name to fetch + * @return {Object} The resolved property value + */ + +function getAttr(obj, name) { + if (!obj) return; + return obj[name]; +} +/** + * A property getter resolving dot-notation + * @param {Object} obj The root object to fetch property on + * @param {String} name The optionally dotted property name to fetch + * @return {Object} The resolved property value + */ + +function getAttrNesting(obj, name) { + if (!obj) return; + var names = name.split("."); + + while (names.length && (obj = obj[names.shift()])); + + return obj; +} +/** + * Calculates how close of a match the + * given value is against a search token. + * + * @param {object} token + * @return {number} + */ + +function scoreValue(value, token, weight) { + var score, pos; + if (!value) return 0; + value = String(value || ''); + pos = value.search(token.regex); + if (pos === -1) return 0; + score = token.string.length / value.length; + if (pos === 0) score += 0.5; + return score * weight; +} +function escape_regex(str) { + return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); +} +/** + * Cast object property to an array if it exists and has a value + * + */ + +function propToArray(obj, key) { + var value = obj[key]; + + if (value && !Array.isArray(value)) { + obj[key] = [value]; + } +} +/** + * Iterates over arrays and hashes. + * + * ``` + * iterate(this.items, function(item, id) { + * // invoked for each item + * }); + * ``` + * + * @param {array|object} object + */ + +function iterate(object, callback) { + if (Array.isArray(object)) { + object.forEach(callback); + } else { + for (var key in object) { + if (object.hasOwnProperty(key)) { + callback(object[key], key); + } + } + } +} +function cmp(a, b) { + if (typeof a === 'number' && typeof b === 'number') { + return a > b ? 1 : a < b ? -1 : 0; + } + + a = asciifold(String(a || '')).toLowerCase(); + b = asciifold(String(b || '')).toLowerCase(); + if (a > b) return 1; + if (b > a) return -1; + return 0; +} + +export { cmp, escape_regex, getAttr, getAttrNesting, iterate, propToArray, scoreValue }; +//# sourceMappingURL=utils.js.map diff --git a/dist/esm/utils.js.map b/dist/esm/utils.js.map new file mode 100644 index 0000000..960b4fc --- /dev/null +++ b/dist/esm/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = String(value || '');\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(String(a || '')).toLowerCase();\n\tb = asciifold(String(b || '')).toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","String","search","regex","string","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file diff --git a/dist/umd/sifter.js b/dist/umd/sifter.js new file mode 100644 index 0000000..c9486b3 --- /dev/null +++ b/dist/umd/sifter.js @@ -0,0 +1,594 @@ +/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.sifter = factory()); +}(this, (function () { 'use strict'; + + // https://github.com/andrewrk/node-diacritics/blob/master/index.js + /** + * code points generated from toCodePoints(); + * removed 65339 to 65345 + */ + + var code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [1019, 1019], [1083, 1083], [1281, 1289], [1984, 1984], [5095, 5095], [7429, 7441], [7545, 7549], [7680, 7935], [8580, 8580], [9398, 9449], [11360, 11391], [42792, 42793], [42802, 42851], [42873, 42897], [42912, 42922], [64256, 64260], [65313, 65338], [65345, 65370]]; + /** + * Remove accents + * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 + * + */ + + function asciifold(str) { + return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD').toLowerCase(); + } + /** + * Generate a list of diacritics from the list of code points + * + */ + + + function generateDiacritics() { + var latin_convert = { + 'l·': 'l', + 'ʼn': 'n', + 'æ': 'ae', + 'ø': 'o', + 'aʾ': 'a', + 'dž': 'dz' + }; + var diacritics = {}; //var no_latin = []; + + code_points.forEach(code_range => { + for (let i = code_range[0]; i <= code_range[1]; i++) { + let diacritic = String.fromCharCode(i); + let latin = diacritic.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD'); + + if (latin == diacritic) { + //no_latin.push(diacritic); + continue; + } + + latin = latin.toLowerCase(); + + if (latin in latin_convert) { + latin = latin_convert[latin]; + } + + if (!(latin in diacritics)) { + diacritics[latin] = latin + latin.toUpperCase(); + } + + diacritics[latin] += diacritic; + } + }); //console.log('no_latin',JSON.stringify(no_latin)); + + return diacritics; + } + /** + * Expand a regular expression pattern to include diacritics + * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ + * + */ + + var diacritics = null; + function diacriticRegexPoints(regex) { + if (diacritics === null) { + diacritics = generateDiacritics(); + } + + for (let latin in diacritics) { + if (diacritics.hasOwnProperty(latin)) { + regex = regex.replace(new RegExp(latin, 'g'), '[' + diacritics[latin] + ']'); + } + } + + return regex; + } + /** + * Expand a regular expression pattern to include diacritics + * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ + * + * rollup will bundle this function (and the DIACRITICS constant) unless commented out + * + var diacriticRegex = (function() { + + var list = []; + for( let letter in DIACRITICS ){ + + if( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){ + continue; + } + + if( DIACRITICS.hasOwnProperty(letter) ){ + + var replace = letter + DIACRITICS[letter]; + if( letter.toUpperCase() in DIACRITICS ){ + replace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()]; + } + + list.push({let:letter,pat:'['+replace+']'}); + } + } + + return function(regex:string):string{ + list.forEach((item)=>{ + regex = regex.replace( new RegExp(item.let,'g'),item.pat); + }); + return regex; + } + })(); + */ + + // @ts-ignore + /** + * A property getter resolving dot-notation + * @param {Object} obj The root object to fetch property on + * @param {String} name The optionally dotted property name to fetch + * @return {Object} The resolved property value + */ + + function getAttr(obj, name) { + if (!obj) return; + return obj[name]; + } + /** + * A property getter resolving dot-notation + * @param {Object} obj The root object to fetch property on + * @param {String} name The optionally dotted property name to fetch + * @return {Object} The resolved property value + */ + + function getAttrNesting(obj, name) { + if (!obj) return; + var names = name.split("."); + + while (names.length && (obj = obj[names.shift()])); + + return obj; + } + /** + * Calculates how close of a match the + * given value is against a search token. + * + * @param {object} token + * @return {number} + */ + + function scoreValue(value, token, weight) { + var score, pos; + if (!value) return 0; + value = String(value || ''); + pos = value.search(token.regex); + if (pos === -1) return 0; + score = token.string.length / value.length; + if (pos === 0) score += 0.5; + return score * weight; + } + function escape_regex(str) { + return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); + } + /** + * Cast object property to an array if it exists and has a value + * + */ + + function propToArray(obj, key) { + var value = obj[key]; + + if (value && !Array.isArray(value)) { + obj[key] = [value]; + } + } + /** + * Iterates over arrays and hashes. + * + * ``` + * iterate(this.items, function(item, id) { + * // invoked for each item + * }); + * ``` + * + * @param {array|object} object + */ + + function iterate(object, callback) { + if (Array.isArray(object)) { + object.forEach(callback); + } else { + for (var key in object) { + if (object.hasOwnProperty(key)) { + callback(object[key], key); + } + } + } + } + function cmp(a, b) { + if (typeof a === 'number' && typeof b === 'number') { + return a > b ? 1 : a < b ? -1 : 0; + } + + a = asciifold(String(a || '')).toLowerCase(); + b = asciifold(String(b || '')).toLowerCase(); + if (a > b) return 1; + if (b > a) return -1; + return 0; + } + + /** + * sifter.js + * Copyright (c) 2013–2020 Brian Reavis & contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + * + * @author Brian Reavis + */ + class Sifter { + /** + * Textually searches arrays and hashes of objects + * by property (or multiple properties). Designed + * specifically for autocomplete. + * + * @constructor + * @param {array|object} items + * @param {object} items + */ + constructor(items, settings) { + this.items = void 0; + this.settings = void 0; + this.items = items; + this.settings = settings || { + diacritics: true + }; + } + + /** + * Splits a search string into an array of individual + * regexps to be used to match results. + * + */ + tokenize(query, respect_word_boundaries, weights) { + if (!query || !query.length) return []; + var tokens = []; + var words = query.split(/\s+/); + var field_regex; + + if (weights) { + field_regex = new RegExp('^(' + Object.keys(weights).map(escape_regex).join('|') + ')\:(.*)$'); + } + + words.forEach(word => { + let field_match; + let field = null; + let regex = null; // look for "field:query" tokens + + if (field_regex && (field_match = word.match(field_regex))) { + field = field_match[1]; + word = field_match[2]; + } + + if (word.length > 0) { + regex = escape_regex(word); + + if (this.settings.diacritics) { + regex = diacriticRegexPoints(regex); + } + + if (respect_word_boundaries) regex = "\\b" + regex; + regex = new RegExp(regex, 'i'); + } + + tokens.push({ + string: word, + regex: regex, + field: field + }); + }); + return tokens; + } + + /** + * Returns a function to be used to score individual results. + * + * Good matches will have a higher score than poor matches. + * If an item is not a match, 0 will be returned by the function. + * + * @returns {function} + */ + getScoreFunction(query, options) { + var search = this.prepareSearch(query, options); + return this._getScoreFunction(search); + } + + _getScoreFunction(search) { + const tokens = search.tokens, + token_count = tokens.length; + + if (!token_count) { + return function () { + return 0; + }; + } + + const fields = search.options.fields, + weights = search.weights, + field_count = fields.length, + getAttrFn = search.getAttrFn; + /** + * Calculates the score of an object + * against the search query. + * + * @param {TToken} token + * @param {object} data + * @return {number} + */ + + var scoreObject = function () { + if (!field_count) { + return function () { + return 0; + }; + } + + if (field_count === 1) { + return function (token, data) { + const field = fields[0].field; + return scoreValue(getAttrFn(data, field), token, weights[field]); + }; + } + + return function (token, data) { + var sum = 0; // is the token specific to a field? + + if (token.field) { + const value = getAttrFn(data, token.field); + + if (!token.regex && value) { + sum += 0.1; + } else { + sum += scoreValue(value, token, weights[token.field]); + } + } else { + iterate(weights, (weight, field) => { + sum += scoreValue(getAttrFn(data, field), token, weight); + }); + } + + return sum / field_count; + }; + }(); + + if (token_count === 1) { + return function (data) { + return scoreObject(tokens[0], data); + }; + } + + if (search.options.conjunction === 'and') { + return function (data) { + var i = 0, + score, + sum = 0; + + for (; i < token_count; i++) { + score = scoreObject(tokens[i], data); + if (score <= 0) return 0; + sum += score; + } + + return sum / token_count; + }; + } else { + return function (data) { + var sum = 0; + iterate(tokens, token => { + sum += scoreObject(token, data); + }); + return sum / token_count; + }; + } + } + + /** + * Returns a function that can be used to compare two + * results, for sorting purposes. If no sorting should + * be performed, `null` will be returned. + * + * @return function(a,b) + */ + getSortFunction(query, options) { + var search = this.prepareSearch(query, options); + return this._getSortFunction(search); + } + + _getSortFunction(search) { + var i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options; + self = this; + options = search.options; + sort = !search.query && options.sort_empty || options.sort; + /** + * Fetches the specified sort field value + * from a search result item. + * + * @param {string} name + * @param {object} result + * @return {string} + */ + + get_field = function (name, result) { + if (name === '$score') return result.score; + return search.getAttrFn(self.items[result.id], name); + }; // parse options + + + sort_flds = []; + + if (sort) { + for (i = 0, n = sort.length; i < n; i++) { + if (search.query || sort[i].field !== '$score') { + sort_flds.push(sort[i]); + } + } + } // the "$score" field is implied to be the primary + // sort field, unless it's manually specified + + + if (search.query) { + implicit_score = true; + + for (i = 0, n = sort_flds.length; i < n; i++) { + if (sort_flds[i].field === '$score') { + implicit_score = false; + break; + } + } + + if (implicit_score) { + sort_flds.unshift({ + field: '$score', + direction: 'desc' + }); + } + } else { + for (i = 0, n = sort_flds.length; i < n; i++) { + if (sort_flds[i].field === '$score') { + sort_flds.splice(i, 1); + break; + } + } + } + + multipliers = []; + + for (i = 0, n = sort_flds.length; i < n; i++) { + multipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1); + } // build function + + + sort_flds_count = sort_flds.length; + + if (!sort_flds_count) { + return null; + } else if (sort_flds_count === 1) { + sort_fld = sort_flds[0].field; + multiplier = multipliers[0]; + return function (a, b) { + return multiplier * cmp(get_field(sort_fld, a), get_field(sort_fld, b)); + }; + } else { + return function (a, b) { + var i, result, field; + + for (i = 0; i < sort_flds_count; i++) { + field = sort_flds[i].field; + result = multipliers[i] * cmp(get_field(field, a), get_field(field, b)); + if (result) return result; + } + + return 0; + }; + } + } + + /** + * Parses a search query and returns an object + * with tokens and fields ready to be populated + * with results. + * + */ + prepareSearch(query, optsUser) { + const weights = {}; + var options = Object.assign({}, optsUser); + propToArray(options, 'sort'); + propToArray(options, 'sort_empty'); // convert fields to new format + + if (options.fields) { + propToArray(options, 'fields'); + + if (Array.isArray(options.fields) && typeof options.fields[0] !== 'object') { + var fields = []; + options.fields.forEach(fld_name => { + fields.push({ + field: fld_name + }); + }); + options.fields = fields; + } + + options.fields.forEach(field_params => { + weights[field_params.field] = 'weight' in field_params ? field_params.weight : 1; + }); + } + + query = asciifold(String(query || '')).toLowerCase().trim(); + return { + options: options, + query: query, + tokens: this.tokenize(query, options.respect_word_boundaries, weights), + total: 0, + items: [], + weights: weights, + getAttrFn: options.nesting ? getAttrNesting : getAttr + }; + } + + /** + * Searches through all items and returns a sorted array of matches. + * + */ + search(query, options) { + var self = this, + score, + search; + var fn_sort; + var fn_score; + search = this.prepareSearch(query, options); + options = search.options; + query = search.query; // generate result scoring function + + fn_score = options.score || self._getScoreFunction(search); // perform search and sort + + if (query.length) { + iterate(self.items, (item, id) => { + score = fn_score(item); + + if (options.filter === false || score > 0) { + search.items.push({ + 'score': score, + 'id': id + }); + } + }); + } else { + iterate(self.items, (item, id) => { + search.items.push({ + 'score': 1, + 'id': id + }); + }); + } + + fn_sort = self._getSortFunction(search); + if (fn_sort) search.items.sort(fn_sort); // apply limits + + search.total = search.items.length; + + if (typeof options.limit === 'number') { + search.items = search.items.slice(0, options.limit); + } + + return search; + } + + } + + return Sifter; + +}))); +//# sourceMappingURL=sifter.js.map diff --git a/dist/umd/sifter.js.map b/dist/umd/sifter.js.map new file mode 100644 index 0000000..b0e8ad8 --- /dev/null +++ b/dist/umd/sifter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = String(value || '');\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(String(a || '')).toLowerCase();\n\tb = asciifold(String(b || '')).toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tvar tokens = [];\n\t\tvar words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += 0.1;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, weights[token.field]);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options;\n\n\t\tself\t\t= this;\n\t\toptions\t\t= search.options;\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort;\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tget_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tsort_flds = [];\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmultipliers = [];\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( String(query || '') ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","self","sort_fld","sort_flds","sort_flds_count","multiplier","multipliers","get_field","implicit_score","sort","sort_empty","result","id","unshift","direction","splice","optsUser","assign","fld_name","field_params","trim","total","nesting","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/umd/sifter.min.js b/dist/umd/sifter.min.js new file mode 100644 index 0000000..e7a1b12 --- /dev/null +++ b/dist/umd/sifter.min.js @@ -0,0 +1,53 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).sifter=t()}(this,(function(){"use strict" +var e=[[67,67],[160,160],[192,438],[452,652],[961,961],[1019,1019],[1083,1083],[1281,1289],[1984,1984],[5095,5095],[7429,7441],[7545,7549],[7680,7935],[8580,8580],[9398,9449],[11360,11391],[42792,42793],[42802,42851],[42873,42897],[42912,42922],[64256,64260],[65313,65338],[65345,65370]] +function t(e){return e.normalize("NFD").replace(/[\u0300-\u036F]/g,"").normalize("NFKD").toLowerCase()}var r=null +function n(t){null===r&&(r=function(){var t={"l·":"l","ʼn":"n","æ":"ae","ø":"o","aʾ":"a","dž":"dz"},r={} +return e.forEach((e=>{for(let n=e[0];n<=e[1];n++){let e=String.fromCharCode(n),i=e.normalize("NFD").replace(/[\u0300-\u036F]/g,"").normalize("NFKD") +i!=e&&(i=i.toLowerCase(),i in t&&(i=t[i]),i in r||(r[i]=i+i.toUpperCase()),r[i]+=e)}})),r}()) +for(let e in r)r.hasOwnProperty(e)&&(t=t.replace(new RegExp(e,"g"),"["+r[e]+"]")) +return t}function i(e,t){if(e)return e[t]}function o(e,t){if(e){for(var r=t.split(".");r.length&&(e=e[r.shift()]););return e}}function s(e,t,r){var n,i +return e?-1===(i=(e=String(e||"")).search(t.regex))?0:(n=t.string.length/e.length,0===i&&(n+=.5),n*r):0}function u(e){return(e+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function f(e,t){var r=e[t] +r&&!Array.isArray(r)&&(e[t]=[r])}function c(e,t){if(Array.isArray(e))e.forEach(t) +else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)}function l(e,r){return"number"==typeof e&&"number"==typeof r?e>r?1:e(r=t(String(r||"")).toLowerCase())?1:r>e?-1:0} +/** + * sifter.js + * Copyright (c) 2013–2020 Brian Reavis & contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + * + * @author Brian Reavis + */return class{constructor(e,t){this.items=void 0,this.settings=void 0,this.items=e,this.settings=t||{diacritics:!0}}tokenize(e,t,r){if(!e||!e.length)return[] +var i,o=[],s=e.split(/\s+/) +return r&&(i=new RegExp("^("+Object.keys(r).map(u).join("|")+"):(.*)$")),s.forEach((e=>{let r,s=null,f=null +i&&(r=e.match(i))&&(s=r[1],e=r[2]),e.length>0&&(f=u(e),this.settings.diacritics&&(f=n(f)),t&&(f="\\b"+f),f=new RegExp(f,"i")),o.push({string:e,regex:f,field:s})})),o}getScoreFunction(e,t){var r=this.prepareSearch(e,t) +return this._getScoreFunction(r)}_getScoreFunction(e){const t=e.tokens,r=t.length +if(!r)return function(){return 0} +const n=e.options.fields,i=e.weights,o=n.length,u=e.getAttrFn +var f=o?1===o?function(e,t){const r=n[0].field +return s(u(t,r),e,i[r])}:function(e,t){var r=0 +if(e.field){const n=u(t,e.field) +!e.regex&&n?r+=.1:r+=s(n,e,i[e.field])}else c(i,((n,i)=>{r+=s(u(t,i),e,n)})) +return r/o}:function(){return 0} +return 1===r?function(e){return f(t[0],e)}:"and"===e.options.conjunction?function(e){for(var n,i=0,o=0;i{n+=f(t,e)})),n/r}}getSortFunction(e,t){var r=this.prepareSearch(e,t) +return this._getSortFunction(r)}_getSortFunction(e){var t,r,n,i,o,s,u,f,c,a,h,g +if(n=this,g=e.options,h=!e.query&&g.sort_empty||g.sort,c=function(t,r){return"$score"===t?r.score:e.getAttrFn(n.items[r.id],t)},o=[],h)for(t=0,r=h.length;t{u.push({field:e})})),s.fields=u}s.fields.forEach((e=>{n[e.field]="weight"in e?e.weight:1}))}return{options:s,query:e=t(String(e||"")).toLowerCase().trim(),tokens:this.tokenize(e,s.respect_word_boundaries,n),total:0,items:[],weights:n,getAttrFn:s.nesting?o:i}}search(e,t){var r,n,i,o,s=this +return n=this.prepareSearch(e,t),t=n.options,e=n.query,o=t.score||s._getScoreFunction(n),e.length?c(s.items,((e,i)=>{r=o(e),(!1===t.filter||r>0)&&n.items.push({score:r,id:i})})):c(s.items,((e,t)=>{n.items.push({score:1,id:t})})),(i=s._getSortFunction(n))&&n.items.sort(i),n.total=n.items.length,"number"==typeof t.limit&&(n.items=n.items.slice(0,t.limit)),n}}})) +//# sourceMappingURL=sifter.min.js.map diff --git a/dist/umd/sifter.min.js.map b/dist/umd/sifter.min.js.map new file mode 100644 index 0000000..b5a31d8 --- /dev/null +++ b/dist/umd/sifter.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = String(value || '');\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(String(a || '')).toLowerCase();\n\tb = asciifold(String(b || '')).toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tvar tokens = [];\n\t\tvar words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += 0.1;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, weights[token.field]);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options;\n\n\t\tself\t\t= this;\n\t\toptions\t\t= search.options;\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort;\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tget_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tsort_flds = [];\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmultipliers = [];\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( String(query || '') ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","diacritics","diacriticRegexPoints","regex","latin_convert","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","generateDiacritics","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","field_regex","tokens","words","Object","keys","map","join","word","field_match","field","match","this","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","self","sort_fld","sort_flds","sort_flds_count","multiplier","multipliers","get_field","implicit_score","sort","sort_empty","result","id","unshift","direction","splice","optsUser","assign","fld_name","field_params","trim","total","nesting","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 9edca99..5f8aa5f 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.6.0", + "version": "0.7.0", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 838c1d1a08dfb1e9d082365576b07829110078e0 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Fri, 23 Apr 2021 09:26:41 -0600 Subject: [PATCH 046/140] utils.ts test coverage, change string casting --- lib/sifter.ts | 2 +- lib/utils.ts | 6 +++--- test/utils.js | 13 +++++++++++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 3cc0df6..20c37e1 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -353,7 +353,7 @@ export default class Sifter{ }); } - query = asciifold( String(query || '') ).toLowerCase().trim(); + query = asciifold( query + '' ).toLowerCase().trim(); return { options : options, diff --git a/lib/utils.ts b/lib/utils.ts index 95b1a4d..8800fd1 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -38,7 +38,7 @@ export function scoreValue(value:string, token, weight:number ) { if (!value) return 0; - value = String(value || ''); + value = value + ''; pos = value.search(token.regex); if (pos === -1) return 0; @@ -97,8 +97,8 @@ export function cmp(a, b) { if (typeof a === 'number' && typeof b === 'number') { return a > b ? 1 : (a < b ? -1 : 0); } - a = asciifold(String(a || '')).toLowerCase(); - b = asciifold(String(b || '')).toLowerCase(); + a = asciifold(a + '').toLowerCase(); + b = asciifold(b + '').toLowerCase(); if (a > b) return 1; if (b > a) return -1; return 0; diff --git a/test/utils.js b/test/utils.js index 66ffd98..e3c3260 100644 --- a/test/utils.js +++ b/test/utils.js @@ -11,5 +11,18 @@ describe('#prepareSearch()', function() { assert.equal( utils.cmp(from,to), true); }); + it('getAttr should return void when invalid object passed', function() { + assert.equal( utils.getAttr(null,'test'), null); + }); + + it('getAttrNesting should return void when invalid object passed', function() { + assert.equal( utils.getAttrNesting(null,'test'), null); + }); + + it('scoreValue should cast non-string values to string', function() { + var token = {string:'a',regex:new RegExp('a','i')}; + var score = utils.scoreValue([], token, 1); + assert.equal( score, 0); + }); }); From 8f6d8c62fbfa95c23665316893b536ed1fc73b81 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Fri, 23 Apr 2021 16:26:00 -0600 Subject: [PATCH 047/140] remove test from npmignore --- .npmignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.npmignore b/.npmignore index 452a877..1d678e0 100644 --- a/.npmignore +++ b/.npmignore @@ -1,4 +1,3 @@ *.md .git* benchmark/ -test/ \ No newline at end of file From 6072983cc0b148f0c90845e71627a73cb9d62632 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Fri, 23 Apr 2021 19:37:16 -0600 Subject: [PATCH 048/140] Create dependabot.yml --- .github/dependabot.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..4a81ecc --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,13 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "npm" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" + allow: + - dependency-type: "direct" From 9e9036e67922c9e02d27bf2ea380fb56e2acb64e Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 27 Apr 2021 20:24:40 -0600 Subject: [PATCH 049/140] more sensible weights for "field:" queries --- lib/sifter.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 20c37e1..ea06d86 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -159,7 +159,7 @@ export default class Sifter{ * @param {object} data * @return {number} */ - var scoreObject = (function() { + const scoreObject = (function() { if (!field_count) { return function() { return 0; }; @@ -181,9 +181,9 @@ export default class Sifter{ const value = getAttrFn(data, token.field); if( !token.regex && value ){ - sum += 0.1; + sum += (1/field_count); }else{ - sum += scoreValue(value, token, weights[token.field]); + sum += scoreValue(value, token, 1); } From 091ebab8cde5f215ca905f3dde9c19425241477d Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 27 Apr 2021 20:43:37 -0600 Subject: [PATCH 050/140] const instead of var --- lib/sifter.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index ea06d86..df1af85 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -84,8 +84,8 @@ export default class Sifter{ tokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] { if (!query || !query.length) return []; - var tokens = []; - var words = query.split(/\s+/); + const tokens = []; + const words = query.split(/\s+/); var field_regex; if( weights ){ @@ -238,11 +238,14 @@ export default class Sifter{ } _getSortFunction(search:TPrepareObj){ - var i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options; + var i, n, sort_fld, sort_flds_count, multiplier, implicit_score; + + const self = this, + options = search.options, + sort = (!search.query && options.sort_empty) || options.sort, + sort_flds = [], + multipliers = []; - self = this; - options = search.options; - sort = (!search.query && options.sort_empty) || options.sort; /** * Fetches the specified sort field value @@ -252,13 +255,12 @@ export default class Sifter{ * @param {object} result * @return {string} */ - get_field = function(name, result) { + const get_field = function(name, result) { if (name === '$score') return result.score; return search.getAttrFn(self.items[result.id], name); }; // parse options - sort_flds = []; if (sort) { for (i = 0, n = sort.length; i < n; i++) { if (search.query || sort[i].field !== '$score') { @@ -289,7 +291,6 @@ export default class Sifter{ } } - multipliers = []; for (i = 0, n = sort_flds.length; i < n; i++) { multipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1); } From 8b60e4953c7ca19763dbb188633e73f4993fc2b2 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 27 Apr 2021 20:45:12 -0600 Subject: [PATCH 051/140] v0.7.1 Release --- dist/cjs/sifter.js | 28 +++++++++++++--------------- dist/cjs/sifter.js.map | 2 +- dist/cjs/utils.js | 6 +++--- dist/cjs/utils.js.map | 2 +- dist/esm/sifter.js | 28 +++++++++++++--------------- dist/esm/sifter.js.map | 2 +- dist/esm/utils.js | 6 +++--- dist/esm/utils.js.map | 2 +- dist/umd/sifter.js | 34 ++++++++++++++++------------------ dist/umd/sifter.js.map | 2 +- dist/umd/sifter.min.js | 33 +++++++++++++++++---------------- dist/umd/sifter.min.js.map | 2 +- package.json | 2 +- 13 files changed, 72 insertions(+), 77 deletions(-) diff --git a/dist/cjs/sifter.js b/dist/cjs/sifter.js index 4659774..5bcd8fc 100644 --- a/dist/cjs/sifter.js +++ b/dist/cjs/sifter.js @@ -45,8 +45,8 @@ class Sifter { */ tokenize(query, respect_word_boundaries, weights) { if (!query || !query.length) return []; - var tokens = []; - var words = query.split(/\s+/); + const tokens = []; + const words = query.split(/\s+/); var field_regex; if (weights) { @@ -119,7 +119,7 @@ class Sifter { * @return {number} */ - var scoreObject = function () { + const scoreObject = function () { if (!field_count) { return function () { return 0; @@ -140,9 +140,9 @@ class Sifter { const value = getAttrFn(data, token.field); if (!token.regex && value) { - sum += 0.1; + sum += 1 / field_count; } else { - sum += utils.scoreValue(value, token, weights[token.field]); + sum += utils.scoreValue(value, token, 1); } } else { utils.iterate(weights, (weight, field) => { @@ -198,10 +198,12 @@ class Sifter { } _getSortFunction(search) { - var i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options; - self = this; - options = search.options; - sort = !search.query && options.sort_empty || options.sort; + var i, n, sort_fld, sort_flds_count, multiplier, implicit_score; + const self = this, + options = search.options, + sort = !search.query && options.sort_empty || options.sort, + sort_flds = [], + multipliers = []; /** * Fetches the specified sort field value * from a search result item. @@ -211,14 +213,12 @@ class Sifter { * @return {string} */ - get_field = function (name, result) { + const get_field = function get_field(name, result) { if (name === '$score') return result.score; return search.getAttrFn(self.items[result.id], name); }; // parse options - sort_flds = []; - if (sort) { for (i = 0, n = sort.length; i < n; i++) { if (search.query || sort[i].field !== '$score') { @@ -254,8 +254,6 @@ class Sifter { } } - multipliers = []; - for (i = 0, n = sort_flds.length; i < n; i++) { multipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1); } // build function @@ -316,7 +314,7 @@ class Sifter { }); } - query = diacritics.asciifold(String(query || '')).toLowerCase().trim(); + query = diacritics.asciifold(query + '').toLowerCase().trim(); return { options: options, query: query, diff --git a/dist/cjs/sifter.js.map b/dist/cjs/sifter.js.map index 5d62446..16e8b13 100644 --- a/dist/cjs/sifter.js.map +++ b/dist/cjs/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tvar tokens = [];\n\t\tvar words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += 0.1;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, weights[token.field]);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options;\n\n\t\tself\t\t= this;\n\t\toptions\t\t= search.options;\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort;\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tget_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tsort_flds = [];\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmultipliers = [];\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( String(query || '') ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","self","sort_fld","sort_flds","sort_flds_count","multiplier","multipliers","get_field","implicit_score","sort","sort_empty","name","result","id","unshift","direction","splice","a","b","cmp","optsUser","assign","propToArray","Array","isArray","fld_name","field_params","asciifold","String","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","a","b","cmp","optsUser","assign","propToArray","Array","isArray","fld_name","field_params","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/cjs/utils.js b/dist/cjs/utils.js index 2f9dd7b..638401e 100644 --- a/dist/cjs/utils.js +++ b/dist/cjs/utils.js @@ -43,7 +43,7 @@ function getAttrNesting(obj, name) { function scoreValue(value, token, weight) { var score, pos; if (!value) return 0; - value = String(value || ''); + value = value + ''; pos = value.search(token.regex); if (pos === -1) return 0; score = token.string.length / value.length; @@ -93,8 +93,8 @@ function cmp(a, b) { return a > b ? 1 : a < b ? -1 : 0; } - a = diacritics.asciifold(String(a || '')).toLowerCase(); - b = diacritics.asciifold(String(b || '')).toLowerCase(); + a = diacritics.asciifold(a + '').toLowerCase(); + b = diacritics.asciifold(b + '').toLowerCase(); if (a > b) return 1; if (b > a) return -1; return 0; diff --git a/dist/cjs/utils.js.map b/dist/cjs/utils.js.map index 8599a0c..b86c3bf 100644 --- a/dist/cjs/utils.js.map +++ b/dist/cjs/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = String(value || '');\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(String(a || '')).toLowerCase();\n\tb = asciifold(String(b || '')).toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","String","search","regex","string","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","regex","string","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/sifter.js b/dist/esm/sifter.js index 1858ed0..dbef946 100644 --- a/dist/esm/sifter.js +++ b/dist/esm/sifter.js @@ -43,8 +43,8 @@ class Sifter { */ tokenize(query, respect_word_boundaries, weights) { if (!query || !query.length) return []; - var tokens = []; - var words = query.split(/\s+/); + const tokens = []; + const words = query.split(/\s+/); var field_regex; if (weights) { @@ -117,7 +117,7 @@ class Sifter { * @return {number} */ - var scoreObject = function () { + const scoreObject = function () { if (!field_count) { return function () { return 0; @@ -138,9 +138,9 @@ class Sifter { const value = getAttrFn(data, token.field); if (!token.regex && value) { - sum += 0.1; + sum += 1 / field_count; } else { - sum += scoreValue(value, token, weights[token.field]); + sum += scoreValue(value, token, 1); } } else { iterate(weights, (weight, field) => { @@ -196,10 +196,12 @@ class Sifter { } _getSortFunction(search) { - var i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options; - self = this; - options = search.options; - sort = !search.query && options.sort_empty || options.sort; + var i, n, sort_fld, sort_flds_count, multiplier, implicit_score; + const self = this, + options = search.options, + sort = !search.query && options.sort_empty || options.sort, + sort_flds = [], + multipliers = []; /** * Fetches the specified sort field value * from a search result item. @@ -209,14 +211,12 @@ class Sifter { * @return {string} */ - get_field = function (name, result) { + const get_field = function get_field(name, result) { if (name === '$score') return result.score; return search.getAttrFn(self.items[result.id], name); }; // parse options - sort_flds = []; - if (sort) { for (i = 0, n = sort.length; i < n; i++) { if (search.query || sort[i].field !== '$score') { @@ -252,8 +252,6 @@ class Sifter { } } - multipliers = []; - for (i = 0, n = sort_flds.length; i < n; i++) { multipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1); } // build function @@ -314,7 +312,7 @@ class Sifter { }); } - query = asciifold(String(query || '')).toLowerCase().trim(); + query = asciifold(query + '').toLowerCase().trim(); return { options: options, query: query, diff --git a/dist/esm/sifter.js.map b/dist/esm/sifter.js.map index 31d8e07..2ff0c0b 100644 --- a/dist/esm/sifter.js.map +++ b/dist/esm/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tvar tokens = [];\n\t\tvar words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += 0.1;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, weights[token.field]);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options;\n\n\t\tself\t\t= this;\n\t\toptions\t\t= search.options;\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort;\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tget_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tsort_flds = [];\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmultipliers = [];\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( String(query || '') ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","self","sort_fld","sort_flds","sort_flds_count","multiplier","multipliers","get_field","implicit_score","sort","sort_empty","name","result","id","unshift","direction","splice","a","b","cmp","optsUser","assign","propToArray","Array","isArray","fld_name","field_params","asciifold","String","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","a","b","cmp","optsUser","assign","propToArray","Array","isArray","fld_name","field_params","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/utils.js b/dist/esm/utils.js index 9901e11..15afd56 100644 --- a/dist/esm/utils.js +++ b/dist/esm/utils.js @@ -39,7 +39,7 @@ function getAttrNesting(obj, name) { function scoreValue(value, token, weight) { var score, pos; if (!value) return 0; - value = String(value || ''); + value = value + ''; pos = value.search(token.regex); if (pos === -1) return 0; score = token.string.length / value.length; @@ -89,8 +89,8 @@ function cmp(a, b) { return a > b ? 1 : a < b ? -1 : 0; } - a = asciifold(String(a || '')).toLowerCase(); - b = asciifold(String(b || '')).toLowerCase(); + a = asciifold(a + '').toLowerCase(); + b = asciifold(b + '').toLowerCase(); if (a > b) return 1; if (b > a) return -1; return 0; diff --git a/dist/esm/utils.js.map b/dist/esm/utils.js.map index 960b4fc..7a2c127 100644 --- a/dist/esm/utils.js.map +++ b/dist/esm/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = String(value || '');\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(String(a || '')).toLowerCase();\n\tb = asciifold(String(b || '')).toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","String","search","regex","string","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","regex","string","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file diff --git a/dist/umd/sifter.js b/dist/umd/sifter.js index c9486b3..e21e0c5 100644 --- a/dist/umd/sifter.js +++ b/dist/umd/sifter.js @@ -157,7 +157,7 @@ function scoreValue(value, token, weight) { var score, pos; if (!value) return 0; - value = String(value || ''); + value = value + ''; pos = value.search(token.regex); if (pos === -1) return 0; score = token.string.length / value.length; @@ -207,8 +207,8 @@ return a > b ? 1 : a < b ? -1 : 0; } - a = asciifold(String(a || '')).toLowerCase(); - b = asciifold(String(b || '')).toLowerCase(); + a = asciifold(a + '').toLowerCase(); + b = asciifold(b + '').toLowerCase(); if (a > b) return 1; if (b > a) return -1; return 0; @@ -255,8 +255,8 @@ */ tokenize(query, respect_word_boundaries, weights) { if (!query || !query.length) return []; - var tokens = []; - var words = query.split(/\s+/); + const tokens = []; + const words = query.split(/\s+/); var field_regex; if (weights) { @@ -329,7 +329,7 @@ * @return {number} */ - var scoreObject = function () { + const scoreObject = function () { if (!field_count) { return function () { return 0; @@ -350,9 +350,9 @@ const value = getAttrFn(data, token.field); if (!token.regex && value) { - sum += 0.1; + sum += 1 / field_count; } else { - sum += scoreValue(value, token, weights[token.field]); + sum += scoreValue(value, token, 1); } } else { iterate(weights, (weight, field) => { @@ -408,10 +408,12 @@ } _getSortFunction(search) { - var i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options; - self = this; - options = search.options; - sort = !search.query && options.sort_empty || options.sort; + var i, n, sort_fld, sort_flds_count, multiplier, implicit_score; + const self = this, + options = search.options, + sort = !search.query && options.sort_empty || options.sort, + sort_flds = [], + multipliers = []; /** * Fetches the specified sort field value * from a search result item. @@ -421,14 +423,12 @@ * @return {string} */ - get_field = function (name, result) { + const get_field = function get_field(name, result) { if (name === '$score') return result.score; return search.getAttrFn(self.items[result.id], name); }; // parse options - sort_flds = []; - if (sort) { for (i = 0, n = sort.length; i < n; i++) { if (search.query || sort[i].field !== '$score') { @@ -464,8 +464,6 @@ } } - multipliers = []; - for (i = 0, n = sort_flds.length; i < n; i++) { multipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1); } // build function @@ -526,7 +524,7 @@ }); } - query = asciifold(String(query || '')).toLowerCase().trim(); + query = asciifold(query + '').toLowerCase().trim(); return { options: options, query: query, diff --git a/dist/umd/sifter.js.map b/dist/umd/sifter.js.map index b0e8ad8..f95dd75 100644 --- a/dist/umd/sifter.js.map +++ b/dist/umd/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = String(value || '');\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(String(a || '')).toLowerCase();\n\tb = asciifold(String(b || '')).toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tvar tokens = [];\n\t\tvar words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += 0.1;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, weights[token.field]);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options;\n\n\t\tself\t\t= this;\n\t\toptions\t\t= search.options;\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort;\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tget_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tsort_flds = [];\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmultipliers = [];\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( String(query || '') ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","self","sort_fld","sort_flds","sort_flds_count","multiplier","multipliers","get_field","implicit_score","sort","sort_empty","result","id","unshift","direction","splice","optsUser","assign","fld_name","field_params","trim","total","nesting","fn_sort","fn_score","item","filter","limit","slice"],"mappings":";;;;;;;CAGA;CAsGA;CACA;CACA;CACA;;CACA,IAAIA,WAAW,GAAG,CACjB,CAAE,EAAF,EAAM,EAAN,CADiB,EAEjB,CAAE,GAAF,EAAO,GAAP,CAFiB,EAGjB,CAAE,GAAF,EAAO,GAAP,CAHiB,EAIjB,CAAE,GAAF,EAAO,GAAP,CAJiB,EAKjB,CAAE,GAAF,EAAO,GAAP,CALiB,EAMjB,CAAE,IAAF,EAAQ,IAAR,CANiB,EAOjB,CAAE,IAAF,EAAQ,IAAR,CAPiB,EAQjB,CAAE,IAAF,EAAQ,IAAR,CARiB,EASjB,CAAE,IAAF,EAAQ,IAAR,CATiB,EAUjB,CAAE,IAAF,EAAQ,IAAR,CAViB,EAWjB,CAAE,IAAF,EAAQ,IAAR,CAXiB,EAYjB,CAAE,IAAF,EAAQ,IAAR,CAZiB,EAajB,CAAE,IAAF,EAAQ,IAAR,CAbiB,EAcjB,CAAE,IAAF,EAAQ,IAAR,CAdiB,EAejB,CAAE,IAAF,EAAQ,IAAR,CAfiB,EAgBjB,CAAE,KAAF,EAAS,KAAT,CAhBiB,EAiBjB,CAAE,KAAF,EAAS,KAAT,CAjBiB,EAkBjB,CAAE,KAAF,EAAS,KAAT,CAlBiB,EAmBjB,CAAE,KAAF,EAAS,KAAT,CAnBiB,EAoBjB,CAAE,KAAF,EAAS,KAAT,CApBiB,EAqBjB,CAAE,KAAF,EAAS,KAAT,CArBiB,EAsBjB,CAAE,KAAF,EAAS,KAAT,CAtBiB,EAuBjB,CAAE,KAAF,EAAS,KAAT,CAvBiB,CAAlB;CA0BA;CACA;CACA;CACA;CACA;;CACO,SAASC,SAAT,CAAmBC,GAAnB,EAAqC;CAC3C,SAAOA,GAAG,CAACC,SAAJ,CAAc,KAAd,EAAqBC,OAArB,CAA6B,kBAA7B,EAAiD,EAAjD,EAAqDD,SAArD,CAA+D,MAA/D,EAAuEE,WAAvE,EAAP;CACA;CAwCD;CACA;CACA;CACA;;;CACO,SAASC,kBAAT,GAA4C;CAElD,MAAIC,aAAa,GAAG;CACnB,UAAM,GADa;CAEnB,UAAM,GAFa;CAGnB,SAAK,IAHc;CAInB,SAAK,GAJc;CAKnB,UAAM,GALa;CAMnB,WAAO;CANY,GAApB;CASA,MAAIC,UAAU,GAAG,EAAjB,CAXkD;;CAalDR,EAAAA,WAAW,CAACS,OAAZ,CAAqBC,UAAD,IAAc;CAEjC,SAAI,IAAIC,CAAC,GAAGD,UAAU,CAAC,CAAD,CAAtB,EAA2BC,CAAC,IAAID,UAAU,CAAC,CAAD,CAA1C,EAA+CC,CAAC,EAAhD,EAAmD;CAClD,UAAIC,SAAS,GAAGC,MAAM,CAACC,YAAP,CAAoBH,CAApB,CAAhB;CACA,UAAII,KAAK,GAAIH,SAAS,CAACT,SAAV,CAAoB,KAApB,EAA2BC,OAA3B,CAAmC,kBAAnC,EAAuD,EAAvD,EAA2DD,SAA3D,CAAqE,MAArE,CAAb;;CAEA,UAAIY,KAAK,IAAIH,SAAb,EAAwB;CACvB;CACA;CACA;;CAEDG,MAAAA,KAAK,GAAGA,KAAK,CAACV,WAAN,EAAR;;CAEA,UAAIU,KAAK,IAAIR,aAAb,EAA4B;CAC3BQ,QAAAA,KAAK,GAAGR,aAAa,CAACQ,KAAD,CAArB;CACA;;CAED,UAAI,EAAEA,KAAK,IAAIP,UAAX,CAAJ,EAA4B;CAC3BA,QAAAA,UAAU,CAACO,KAAD,CAAV,GAAoBA,KAAK,GAAGA,KAAK,CAACC,WAAN,EAA5B;CACA;;CACDR,MAAAA,UAAU,CAACO,KAAD,CAAV,IAAqBH,SAArB;CACA;CACD,GAtBD,EAbkD;;CAuClD,SAAOJ,UAAP;CACA;CAED;CACA;CACA;CACA;CACA;;CACA,IAAIA,UAAyB,GAAG,IAAhC;CACO,SAASS,oBAAT,CAA8BC,KAA9B,EAAkD;CAExD,MAAIV,UAAU,KAAK,IAAnB,EAAyB;CACxBA,IAAAA,UAAU,GAAGF,kBAAkB,EAA/B;CACA;;CAED,OAAK,IAAIS,KAAT,IAAkBP,UAAlB,EAA8B;CAC7B,QAAIA,UAAU,CAACW,cAAX,CAA0BJ,KAA1B,CAAJ,EAAsC;CACrCG,MAAAA,KAAK,GAAGA,KAAK,CAACd,OAAN,CAAe,IAAIgB,MAAJ,CAAWL,KAAX,EAAiB,GAAjB,CAAf,EAAsC,MAAIP,UAAU,CAACO,KAAD,CAAd,GAAsB,GAA5D,CAAR;CACA;CACD;;CACD,SAAOG,KAAP;CACA;CAGD;CACA;CACA;CACA;CACA;CACA;CACA;AACA;CACA;CACA;AACA;CACA;CACA;CACA;AACA;CACA;AACA;CACA;CACA;CACA;CACA;AACA;CACA;CACA;CACA;AACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CCzRA;CAGA;CACA;CACA;CACA;CACA;CACA;;CACO,SAASG,OAAT,CAAiBC,GAAjB,EAAyCC,IAAzC,EAAuD;CAC1D,MAAI,CAACD,GAAL,EAAW;CACX,SAAOA,GAAG,CAACC,IAAD,CAAV;CACH;CAED;CACA;CACA;CACA;CACA;CACA;;CACO,SAASC,cAAT,CAAwBF,GAAxB,EAAgDC,IAAhD,EAA8D;CACjE,MAAI,CAACD,GAAL,EAAW;CACX,MAAIG,KAAK,GAAGF,IAAI,CAACG,KAAL,CAAW,GAAX,CAAZ;;CACA,SAAMD,KAAK,CAACE,MAAN,KAAiBL,GAAG,GAAGA,GAAG,CAACG,KAAK,CAACG,KAAN,EAAD,CAA1B,CAAN,CAAiD;;CACjD,SAAON,GAAP;CACH;CAED;CACA;CACA;CACA;CACA;CACA;CACA;;CACO,SAASO,UAAT,CAAoBC,KAApB,EAAkCC,KAAlC,EAAyCC,MAAzC,EAAyD;CAC/D,MAAIC,KAAJ,EAAWC,GAAX;CAEA,MAAI,CAACJ,KAAL,EAAY,OAAO,CAAP;CAEZA,EAAAA,KAAK,GAAGjB,MAAM,CAACiB,KAAK,IAAI,EAAV,CAAd;CACAI,EAAAA,GAAG,GAAGJ,KAAK,CAACK,MAAN,CAAaJ,KAAK,CAACb,KAAnB,CAAN;CACA,MAAIgB,GAAG,KAAK,CAAC,CAAb,EAAgB,OAAO,CAAP;CAEhBD,EAAAA,KAAK,GAAGF,KAAK,CAACK,MAAN,CAAaT,MAAb,GAAsBG,KAAK,CAACH,MAApC;CACA,MAAIO,GAAG,KAAK,CAAZ,EAAeD,KAAK,IAAI,GAAT;CAEf,SAAOA,KAAK,GAAGD,MAAf;CACA;CAEM,SAASK,YAAT,CAAsBnC,GAAtB,EAA2B;CACjC,SAAO,CAACA,GAAG,GAAG,EAAP,EAAWE,OAAX,CAAmB,wBAAnB,EAA6C,MAA7C,CAAP;CACA;CAGD;CACA;CACA;CACA;;CACO,SAASkC,WAAT,CAAqBhB,GAArB,EAA0BiB,GAA1B,EAA8B;CACpC,MAAIT,KAAK,GAAGR,GAAG,CAACiB,GAAD,CAAf;;CACA,MAAIT,KAAK,IAAI,CAACU,KAAK,CAACC,OAAN,CAAcX,KAAd,CAAd,EAAoC;CACnCR,IAAAA,GAAG,CAACiB,GAAD,CAAH,GAAW,CAACT,KAAD,CAAX;CACA;CACD;CAGD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CACO,SAASY,OAAT,CAAiBC,MAAjB,EAAyBC,QAAzB,EAAmC;CAEzC,MAAKJ,KAAK,CAACC,OAAN,CAAcE,MAAd,CAAL,EAA4B;CAC3BA,IAAAA,MAAM,CAAClC,OAAP,CAAemC,QAAf;CAEA,GAHD,MAGK;CAEJ,SAAK,IAAIL,GAAT,IAAgBI,MAAhB,EAAwB;CACvB,UAAIA,MAAM,CAACxB,cAAP,CAAsBoB,GAAtB,CAAJ,EAAgC;CAC/BK,QAAAA,QAAQ,CAACD,MAAM,CAACJ,GAAD,CAAP,EAAcA,GAAd,CAAR;CACA;CACD;CACD;CACD;CAIM,SAASM,GAAT,CAAaC,CAAb,EAAgBC,CAAhB,EAAmB;CACzB,MAAI,OAAOD,CAAP,KAAa,QAAb,IAAyB,OAAOC,CAAP,KAAa,QAA1C,EAAoD;CACnD,WAAOD,CAAC,GAAGC,CAAJ,GAAQ,CAAR,GAAaD,CAAC,GAAGC,CAAJ,GAAQ,CAAC,CAAT,GAAa,CAAjC;CACA;;CACDD,EAAAA,CAAC,GAAG7C,SAAS,CAACY,MAAM,CAACiC,CAAC,IAAI,EAAN,CAAP,CAAT,CAA2BzC,WAA3B,EAAJ;CACA0C,EAAAA,CAAC,GAAG9C,SAAS,CAACY,MAAM,CAACkC,CAAC,IAAI,EAAN,CAAP,CAAT,CAA2B1C,WAA3B,EAAJ;CACA,MAAIyC,CAAC,GAAGC,CAAR,EAAW,OAAO,CAAP;CACX,MAAIA,CAAC,GAAGD,CAAR,EAAW,OAAO,CAAC,CAAR;CACX,SAAO,CAAP;CACA;;CCxGD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CA6Ce,MAAME,MAAN,CAAY;CAK1B;CACD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACCC,EAAAA,WAAW,CAACC,KAAD,EAAQC,QAAR,EAAkB;CAAA,SAZtBD,KAYsB;CAAA,SAXtBC,QAWsB;CAC5B,SAAKD,KAAL,GAAaA,KAAb;CACA,SAAKC,QAAL,GAAgBA,QAAQ,IAAI;CAAC3C,MAAAA,UAAU,EAAE;CAAb,KAA5B;CACA;;CAED;CACD;CACA;CACA;CACA;CACC4C,EAAAA,QAAQ,CAACC,KAAD,EAAeC,uBAAf,EAAiDC,OAAjD,EAA8E;CACrF,QAAI,CAACF,KAAD,IAAU,CAACA,KAAK,CAAC1B,MAArB,EAA6B,OAAO,EAAP;CAE7B,QAAI6B,MAAM,GAAG,EAAb;CACA,QAAIC,KAAK,GAAGJ,KAAK,CAAC3B,KAAN,CAAY,KAAZ,CAAZ;CACA,QAAIgC,WAAJ;;CAEA,QAAIH,OAAJ,EAAa;CACZG,MAAAA,WAAW,GAAG,IAAItC,MAAJ,CAAY,OAAMuC,MAAM,CAACC,IAAP,CAAYL,OAAZ,EAAqBM,GAArB,CAAyBxB,YAAzB,EAAuCyB,IAAvC,CAA4C,GAA5C,CAAN,GAAuD,UAAnE,CAAd;CACA;;CAEDL,IAAAA,KAAK,CAAChD,OAAN,CAAesD,IAAD,IAAiB;CAC9B,UAAIC,WAAJ;CACA,UAAIC,KAAK,GAAG,IAAZ;CACA,UAAI/C,KAAK,GAAG,IAAZ,CAH8B;;CAM9B,UAAIwC,WAAW,KAAKM,WAAW,GAAGD,IAAI,CAACG,KAAL,CAAWR,WAAX,CAAnB,CAAf,EAA4D;CAC3DO,QAAAA,KAAK,GAAGD,WAAW,CAAC,CAAD,CAAnB;CACAD,QAAAA,IAAI,GAAGC,WAAW,CAAC,CAAD,CAAlB;CACA;;CAED,UAAID,IAAI,CAACpC,MAAL,GAAc,CAAlB,EAAqB;CACpBT,QAAAA,KAAK,GAAGmB,YAAY,CAAC0B,IAAD,CAApB;;CACA,YAAI,KAAKZ,QAAL,CAAc3C,UAAlB,EAA8B;CAC7BU,UAAAA,KAAK,GAAGD,oBAAoB,CAACC,KAAD,CAA5B;CACA;;CACD,YAAIoC,uBAAJ,EAA8BpC,KAAK,GAAG,QAAMA,KAAd;CAC9BA,QAAAA,KAAK,GAAG,IAAIE,MAAJ,CAAWF,KAAX,EAAkB,GAAlB,CAAR;CACA;;CAEDsC,MAAAA,MAAM,CAACW,IAAP,CAAY;CACX/B,QAAAA,MAAM,EAAG2B,IADE;CAEX7C,QAAAA,KAAK,EAAIA,KAFE;CAGX+C,QAAAA,KAAK,EAAIA;CAHE,OAAZ;CAKA,KAzBD;CA2BA,WAAOT,MAAP;CACA;;CAGD;CACD;CACA;CACA;CACA;CACA;CACA;CACA;CACCY,EAAAA,gBAAgB,CAACf,KAAD,EAAegB,OAAf,EAAwB;CACvC,QAAIlC,MAAM,GAAG,KAAKmC,aAAL,CAAmBjB,KAAnB,EAA0BgB,OAA1B,CAAb;CACA,WAAO,KAAKE,iBAAL,CAAuBpC,MAAvB,CAAP;CACA;;CAEDoC,EAAAA,iBAAiB,CAACpC,MAAD,EAAqB;CACrC,UAAMqB,MAAM,GAAIrB,MAAM,CAACqB,MAAvB;CAAA,UACAgB,WAAW,GAAKhB,MAAM,CAAC7B,MADvB;;CAGA,QAAI,CAAC6C,WAAL,EAAkB;CACjB,aAAO,YAAW;CAAE,eAAO,CAAP;CAAW,OAA/B;CACA;;CAED,UAAMC,MAAM,GAAGtC,MAAM,CAACkC,OAAP,CAAeI,MAA9B;CAAA,UACAlB,OAAO,GAAKpB,MAAM,CAACoB,OADnB;CAAA,UAEAmB,WAAW,GAAID,MAAM,CAAC9C,MAFtB;CAAA,UAGAgD,SAAS,GAAIxC,MAAM,CAACwC,SAHpB;CAOA;CACF;CACA;CACA;CACA;CACA;CACA;CACA;;CACE,QAAIC,WAAW,GAAI,YAAW;CAE7B,UAAI,CAACF,WAAL,EAAkB;CACjB,eAAO,YAAW;CAAE,iBAAO,CAAP;CAAW,SAA/B;CACA;;CAED,UAAIA,WAAW,KAAK,CAApB,EAAuB;CACtB,eAAO,UAAS3C,KAAT,EAAuB8C,IAAvB,EAA6B;CACnC,gBAAMZ,KAAK,GAAGQ,MAAM,CAAC,CAAD,CAAN,CAAUR,KAAxB;CACA,iBAAOpC,UAAU,CAAC8C,SAAS,CAACE,IAAD,EAAOZ,KAAP,CAAV,EAAyBlC,KAAzB,EAAgCwB,OAAO,CAACU,KAAD,CAAvC,CAAjB;CACA,SAHD;CAIA;;CAED,aAAO,UAASlC,KAAT,EAAuB8C,IAAvB,EAA6B;CACnC,YAAIC,GAAG,GAAG,CAAV,CADmC;;CAInC,YAAI/C,KAAK,CAACkC,KAAV,EAAiB;CAEhB,gBAAMnC,KAAK,GAAG6C,SAAS,CAACE,IAAD,EAAO9C,KAAK,CAACkC,KAAb,CAAvB;;CAEA,cAAI,CAAClC,KAAK,CAACb,KAAP,IAAgBY,KAApB,EAA2B;CAC1BgD,YAAAA,GAAG,IAAI,GAAP;CACA,WAFD,MAEK;CACJA,YAAAA,GAAG,IAAIjD,UAAU,CAACC,KAAD,EAAQC,KAAR,EAAewB,OAAO,CAACxB,KAAK,CAACkC,KAAP,CAAtB,CAAjB;CACA;CAID,SAZD,MAYK;CACJvB,UAAAA,OAAO,CAACa,OAAD,EAAU,CAACvB,MAAD,EAASiC,KAAT,KAAmB;CACnCa,YAAAA,GAAG,IAAIjD,UAAU,CAAC8C,SAAS,CAACE,IAAD,EAAOZ,KAAP,CAAV,EAAyBlC,KAAzB,EAAgCC,MAAhC,CAAjB;CACA,WAFM,CAAP;CAGA;;CAED,eAAO8C,GAAG,GAAGJ,WAAb;CACA,OAvBD;CAwBA,KArCiB,EAAlB;;CAuCA,QAAIF,WAAW,KAAK,CAApB,EAAuB;CACtB,aAAO,UAASK,IAAT,EAAe;CACrB,eAAOD,WAAW,CAACpB,MAAM,CAAC,CAAD,CAAP,EAAYqB,IAAZ,CAAlB;CACA,OAFD;CAGA;;CAED,QAAI1C,MAAM,CAACkC,OAAP,CAAeU,WAAf,KAA+B,KAAnC,EAA0C;CACzC,aAAO,UAASF,IAAT,EAAe;CACrB,YAAIlE,CAAC,GAAG,CAAR;CAAA,YAAWsB,KAAX;CAAA,YAAkB6C,GAAG,GAAG,CAAxB;;CACA,eAAOnE,CAAC,GAAG6D,WAAX,EAAwB7D,CAAC,EAAzB,EAA6B;CAC5BsB,UAAAA,KAAK,GAAG2C,WAAW,CAACpB,MAAM,CAAC7C,CAAD,CAAP,EAAYkE,IAAZ,CAAnB;CACA,cAAI5C,KAAK,IAAI,CAAb,EAAgB,OAAO,CAAP;CAChB6C,UAAAA,GAAG,IAAI7C,KAAP;CACA;;CACD,eAAO6C,GAAG,GAAGN,WAAb;CACA,OARD;CASA,KAVD,MAUO;CACN,aAAO,UAASK,IAAT,EAAe;CACrB,YAAIC,GAAG,GAAG,CAAV;CACApC,QAAAA,OAAO,CAACc,MAAD,EAASzB,KAAD,IAAgB;CAC9B+C,UAAAA,GAAG,IAAIF,WAAW,CAAC7C,KAAD,EAAQ8C,IAAR,CAAlB;CACA,SAFM,CAAP;CAGA,eAAOC,GAAG,GAAGN,WAAb;CACA,OAND;CAOA;CACD;;CAED;CACD;CACA;CACA;CACA;CACA;CACA;CACCQ,EAAAA,eAAe,CAAC3B,KAAD,EAAegB,OAAf,EAAwB;CACtC,QAAIlC,MAAM,GAAI,KAAKmC,aAAL,CAAmBjB,KAAnB,EAA0BgB,OAA1B,CAAd;CACA,WAAO,KAAKY,gBAAL,CAAsB9C,MAAtB,CAAP;CACA;;CAED8C,EAAAA,gBAAgB,CAAC9C,MAAD,EAAoB;CACnC,QAAIxB,CAAJ,EAAOuE,CAAP,EAAUC,IAAV,EAAgBC,QAAhB,EAA0BC,SAA1B,EAAqCC,eAArC,EAAsDC,UAAtD,EAAkEC,WAAlE,EAA+EC,SAA/E,EAA0FC,cAA1F,EAA0GC,IAA1G,EAAgHtB,OAAhH;CAEAc,IAAAA,IAAI,GAAI,IAAR;CACAd,IAAAA,OAAO,GAAIlC,MAAM,CAACkC,OAAlB;CACAsB,IAAAA,IAAI,GAAK,CAACxD,MAAM,CAACkB,KAAR,IAAiBgB,OAAO,CAACuB,UAA1B,IAAyCvB,OAAO,CAACsB,IAAzD;CAEA;CACF;CACA;CACA;CACA;CACA;CACA;CACA;;CACEF,IAAAA,SAAS,GAAG,UAASlE,IAAT,EAAesE,MAAf,EAAuB;CAClC,UAAItE,IAAI,KAAK,QAAb,EAAuB,OAAOsE,MAAM,CAAC5D,KAAd;CACvB,aAAOE,MAAM,CAACwC,SAAP,CAAiBQ,IAAI,CAACjC,KAAL,CAAW2C,MAAM,CAACC,EAAlB,CAAjB,EAAwCvE,IAAxC,CAAP;CACA,KAHD,CAfmC;;;CAqBnC8D,IAAAA,SAAS,GAAG,EAAZ;;CACA,QAAIM,IAAJ,EAAU;CACT,WAAKhF,CAAC,GAAG,CAAJ,EAAOuE,CAAC,GAAGS,IAAI,CAAChE,MAArB,EAA6BhB,CAAC,GAAGuE,CAAjC,EAAoCvE,CAAC,EAArC,EAAyC;CACxC,YAAIwB,MAAM,CAACkB,KAAP,IAAgBsC,IAAI,CAAChF,CAAD,CAAJ,CAAQsD,KAAR,KAAkB,QAAtC,EAAgD;CAC/CoB,UAAAA,SAAS,CAAClB,IAAV,CAAewB,IAAI,CAAChF,CAAD,CAAnB;CACA;CACD;CACD,KA5BkC;CA+BnC;;;CACA,QAAIwB,MAAM,CAACkB,KAAX,EAAkB;CACjBqC,MAAAA,cAAc,GAAG,IAAjB;;CACA,WAAK/E,CAAC,GAAG,CAAJ,EAAOuE,CAAC,GAAGG,SAAS,CAAC1D,MAA1B,EAAkChB,CAAC,GAAGuE,CAAtC,EAAyCvE,CAAC,EAA1C,EAA8C;CAC7C,YAAI0E,SAAS,CAAC1E,CAAD,CAAT,CAAasD,KAAb,KAAuB,QAA3B,EAAqC;CACpCyB,UAAAA,cAAc,GAAG,KAAjB;CACA;CACA;CACD;;CACD,UAAIA,cAAJ,EAAoB;CACnBL,QAAAA,SAAS,CAACU,OAAV,CAAkB;CAAC9B,UAAAA,KAAK,EAAE,QAAR;CAAkB+B,UAAAA,SAAS,EAAE;CAA7B,SAAlB;CACA;CACD,KAXD,MAWO;CACN,WAAKrF,CAAC,GAAG,CAAJ,EAAOuE,CAAC,GAAGG,SAAS,CAAC1D,MAA1B,EAAkChB,CAAC,GAAGuE,CAAtC,EAAyCvE,CAAC,EAA1C,EAA8C;CAC7C,YAAI0E,SAAS,CAAC1E,CAAD,CAAT,CAAasD,KAAb,KAAuB,QAA3B,EAAqC;CACpCoB,UAAAA,SAAS,CAACY,MAAV,CAAiBtF,CAAjB,EAAoB,CAApB;CACA;CACA;CACD;CACD;;CAED6E,IAAAA,WAAW,GAAG,EAAd;;CACA,SAAK7E,CAAC,GAAG,CAAJ,EAAOuE,CAAC,GAAGG,SAAS,CAAC1D,MAA1B,EAAkChB,CAAC,GAAGuE,CAAtC,EAAyCvE,CAAC,EAA1C,EAA8C;CAC7C6E,MAAAA,WAAW,CAACrB,IAAZ,CAAiBkB,SAAS,CAAC1E,CAAD,CAAT,CAAaqF,SAAb,KAA2B,MAA3B,GAAoC,CAAC,CAArC,GAAyC,CAA1D;CACA,KAvDkC;;;CA0DnCV,IAAAA,eAAe,GAAGD,SAAS,CAAC1D,MAA5B;;CACA,QAAI,CAAC2D,eAAL,EAAsB;CACrB,aAAO,IAAP;CACA,KAFD,MAEO,IAAIA,eAAe,KAAK,CAAxB,EAA2B;CACjCF,MAAAA,QAAQ,GAAGC,SAAS,CAAC,CAAD,CAAT,CAAapB,KAAxB;CACAsB,MAAAA,UAAU,GAAGC,WAAW,CAAC,CAAD,CAAxB;CACA,aAAO,UAAS1C,CAAT,EAAYC,CAAZ,EAAe;CACrB,eAAOwC,UAAU,GAAG1C,GAAG,CACtB4C,SAAS,CAACL,QAAD,EAAWtC,CAAX,CADa,EAEtB2C,SAAS,CAACL,QAAD,EAAWrC,CAAX,CAFa,CAAvB;CAIA,OALD;CAMA,KATM,MASA;CACN,aAAO,UAASD,CAAT,EAAYC,CAAZ,EAAe;CACrB,YAAIpC,CAAJ,EAAOkF,MAAP,EAAe5B,KAAf;;CACA,aAAKtD,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG2E,eAAhB,EAAiC3E,CAAC,EAAlC,EAAsC;CACrCsD,UAAAA,KAAK,GAAGoB,SAAS,CAAC1E,CAAD,CAAT,CAAasD,KAArB;CACA4B,UAAAA,MAAM,GAAGL,WAAW,CAAC7E,CAAD,CAAX,GAAiBkC,GAAG,CAC5B4C,SAAS,CAACxB,KAAD,EAAQnB,CAAR,CADmB,EAE5B2C,SAAS,CAACxB,KAAD,EAAQlB,CAAR,CAFmB,CAA7B;CAIA,cAAI8C,MAAJ,EAAY,OAAOA,MAAP;CACZ;;CACD,eAAO,CAAP;CACA,OAXD;CAYA;CACD;;CAED;CACD;CACA;CACA;CACA;CACA;CACCvB,EAAAA,aAAa,CAACjB,KAAD,EAAe6C,QAAf,EAAqC;CACjD,UAAM3C,OAAO,GAAG,EAAhB;CACA,QAAIc,OAAO,GAAIV,MAAM,CAACwC,MAAP,CAAc,EAAd,EAAiBD,QAAjB,CAAf;CAEA5D,IAAAA,WAAW,CAAC+B,OAAD,EAAS,MAAT,CAAX;CACA/B,IAAAA,WAAW,CAAC+B,OAAD,EAAS,YAAT,CAAX,CALiD;;CAQjD,QAAIA,OAAO,CAACI,MAAZ,EAAoB;CACnBnC,MAAAA,WAAW,CAAC+B,OAAD,EAAS,QAAT,CAAX;;CACA,UAAI7B,KAAK,CAACC,OAAN,CAAc4B,OAAO,CAACI,MAAtB,KAAiC,OAAOJ,OAAO,CAACI,MAAR,CAAe,CAAf,CAAP,KAA6B,QAAlE,EAA4E;CAC3E,YAAIA,MAAM,GAAG,EAAb;CACAJ,QAAAA,OAAO,CAACI,MAAR,CAAehE,OAAf,CAAwB2F,QAAD,IAAc;CACpC3B,UAAAA,MAAM,CAACN,IAAP,CAAY;CAACF,YAAAA,KAAK,EAACmC;CAAP,WAAZ;CACA,SAFD;CAGA/B,QAAAA,OAAO,CAACI,MAAR,GAAiBA,MAAjB;CACA;;CAGDJ,MAAAA,OAAO,CAACI,MAAR,CAAehE,OAAf,CAAwB4F,YAAD,IAAgB;CACtC9C,QAAAA,OAAO,CAAC8C,YAAY,CAACpC,KAAd,CAAP,GAA+B,YAAYoC,YAAb,GAA6BA,YAAY,CAACrE,MAA1C,GAAmD,CAAjF;CACA,OAFD;CAGA;;CAEDqB,IAAAA,KAAK,GAAGpD,SAAS,CAAEY,MAAM,CAACwC,KAAK,IAAI,EAAV,CAAR,CAAT,CAAiChD,WAAjC,GAA+CiG,IAA/C,EAAR;CAEA,WAAO;CACNjC,MAAAA,OAAO,EAAIA,OADL;CAENhB,MAAAA,KAAK,EAAIA,KAFH;CAGNG,MAAAA,MAAM,EAAI,KAAKJ,QAAL,CAAcC,KAAd,EAAqBgB,OAAO,CAACf,uBAA7B,EAAsDC,OAAtD,CAHJ;CAINgD,MAAAA,KAAK,EAAI,CAJH;CAKNrD,MAAAA,KAAK,EAAI,EALH;CAMNK,MAAAA,OAAO,EAAIA,OANL;CAONoB,MAAAA,SAAS,EAAIN,OAAO,CAACmC,OAAT,GAAoBhF,cAApB,GAAqCH;CAP3C,KAAP;CASA;;CAED;CACD;CACA;CACA;CACCc,EAAAA,MAAM,CAACkB,KAAD,EAAegB,OAAf,EAA+C;CACpD,QAAIc,IAAI,GAAG,IAAX;CAAA,QAAiBlD,KAAjB;CAAA,QAAwBE,MAAxB;CACA,QAAIsE,OAAJ;CACA,QAAIC,QAAJ;CAEAvE,IAAAA,MAAM,GAAI,KAAKmC,aAAL,CAAmBjB,KAAnB,EAA0BgB,OAA1B,CAAV;CACAA,IAAAA,OAAO,GAAGlC,MAAM,CAACkC,OAAjB;CACAhB,IAAAA,KAAK,GAAKlB,MAAM,CAACkB,KAAjB,CAPoD;;CAUpDqD,IAAAA,QAAQ,GAAGrC,OAAO,CAACpC,KAAR,IAAiBkD,IAAI,CAACZ,iBAAL,CAAuBpC,MAAvB,CAA5B,CAVoD;;CAapD,QAAIkB,KAAK,CAAC1B,MAAV,EAAkB;CACjBe,MAAAA,OAAO,CAACyC,IAAI,CAACjC,KAAN,EAAa,CAACyD,IAAD,EAAOb,EAAP,KAAc;CACjC7D,QAAAA,KAAK,GAAGyE,QAAQ,CAACC,IAAD,CAAhB;;CACA,YAAItC,OAAO,CAACuC,MAAR,KAAmB,KAAnB,IAA4B3E,KAAK,GAAG,CAAxC,EAA2C;CAC1CE,UAAAA,MAAM,CAACe,KAAP,CAAaiB,IAAb,CAAkB;CAAC,qBAASlC,KAAV;CAAiB,kBAAM6D;CAAvB,WAAlB;CACA;CACD,OALM,CAAP;CAMA,KAPD,MAOO;CACNpD,MAAAA,OAAO,CAACyC,IAAI,CAACjC,KAAN,EAAa,CAACyD,IAAD,EAAOb,EAAP,KAAc;CACjC3D,QAAAA,MAAM,CAACe,KAAP,CAAaiB,IAAb,CAAkB;CAAC,mBAAS,CAAV;CAAa,gBAAM2B;CAAnB,SAAlB;CACA,OAFM,CAAP;CAGA;;CAEDW,IAAAA,OAAO,GAAGtB,IAAI,CAACF,gBAAL,CAAsB9C,MAAtB,CAAV;CACA,QAAIsE,OAAJ,EAAatE,MAAM,CAACe,KAAP,CAAayC,IAAb,CAAkBc,OAAlB,EA3BuC;;CA8BpDtE,IAAAA,MAAM,CAACoE,KAAP,GAAepE,MAAM,CAACe,KAAP,CAAavB,MAA5B;;CACA,QAAI,OAAO0C,OAAO,CAACwC,KAAf,KAAyB,QAA7B,EAAuC;CACtC1E,MAAAA,MAAM,CAACe,KAAP,GAAef,MAAM,CAACe,KAAP,CAAa4D,KAAb,CAAmB,CAAnB,EAAsBzC,OAAO,CAACwC,KAA9B,CAAf;CACA;;CAED,WAAO1E,MAAP;CACA;;CA7VyB;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","optsUser","assign","fld_name","field_params","trim","total","nesting","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/umd/sifter.min.js b/dist/umd/sifter.min.js index e7a1b12..de7e37e 100644 --- a/dist/umd/sifter.min.js +++ b/dist/umd/sifter.min.js @@ -6,9 +6,9 @@ return e.forEach((e=>{for(let n=e[0];n<=e[1];n++){let e=String.fromCharCode(n),i i!=e&&(i=i.toLowerCase(),i in t&&(i=t[i]),i in r||(r[i]=i+i.toUpperCase()),r[i]+=e)}})),r}()) for(let e in r)r.hasOwnProperty(e)&&(t=t.replace(new RegExp(e,"g"),"["+r[e]+"]")) return t}function i(e,t){if(e)return e[t]}function o(e,t){if(e){for(var r=t.split(".");r.length&&(e=e[r.shift()]););return e}}function s(e,t,r){var n,i -return e?-1===(i=(e=String(e||"")).search(t.regex))?0:(n=t.string.length/e.length,0===i&&(n+=.5),n*r):0}function u(e){return(e+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function f(e,t){var r=e[t] +return e?-1===(i=(e+="").search(t.regex))?0:(n=t.string.length/e.length,0===i&&(n+=.5),n*r):0}function u(e){return(e+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function f(e,t){var r=e[t] r&&!Array.isArray(r)&&(e[t]=[r])}function c(e,t){if(Array.isArray(e))e.forEach(t) -else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)}function l(e,r){return"number"==typeof e&&"number"==typeof r?e>r?1:e(r=t(String(r||"")).toLowerCase())?1:r>e?-1:0} +else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)}function l(e,r){return"number"==typeof e&&"number"==typeof r?e>r?1:e(r=t(r+"").toLowerCase())?1:r>e?-1:0} /** * sifter.js * Copyright (c) 2013–2020 Brian Reavis & contributors @@ -24,30 +24,31 @@ else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)}function l(e,r){return"number * * @author Brian Reavis */return class{constructor(e,t){this.items=void 0,this.settings=void 0,this.items=e,this.settings=t||{diacritics:!0}}tokenize(e,t,r){if(!e||!e.length)return[] -var i,o=[],s=e.split(/\s+/) -return r&&(i=new RegExp("^("+Object.keys(r).map(u).join("|")+"):(.*)$")),s.forEach((e=>{let r,s=null,f=null -i&&(r=e.match(i))&&(s=r[1],e=r[2]),e.length>0&&(f=u(e),this.settings.diacritics&&(f=n(f)),t&&(f="\\b"+f),f=new RegExp(f,"i")),o.push({string:e,regex:f,field:s})})),o}getScoreFunction(e,t){var r=this.prepareSearch(e,t) +const i=[],o=e.split(/\s+/) +var s +return r&&(s=new RegExp("^("+Object.keys(r).map(u).join("|")+"):(.*)$")),o.forEach((e=>{let r,o=null,f=null +s&&(r=e.match(s))&&(o=r[1],e=r[2]),e.length>0&&(f=u(e),this.settings.diacritics&&(f=n(f)),t&&(f="\\b"+f),f=new RegExp(f,"i")),i.push({string:e,regex:f,field:o})})),i}getScoreFunction(e,t){var r=this.prepareSearch(e,t) return this._getScoreFunction(r)}_getScoreFunction(e){const t=e.tokens,r=t.length if(!r)return function(){return 0} -const n=e.options.fields,i=e.weights,o=n.length,u=e.getAttrFn -var f=o?1===o?function(e,t){const r=n[0].field +const n=e.options.fields,i=e.weights,o=n.length,u=e.getAttrFn,f=o?1===o?function(e,t){const r=n[0].field return s(u(t,r),e,i[r])}:function(e,t){var r=0 if(e.field){const n=u(t,e.field) -!e.regex&&n?r+=.1:r+=s(n,e,i[e.field])}else c(i,((n,i)=>{r+=s(u(t,i),e,n)})) +!e.regex&&n?r+=1/o:r+=s(n,e,1)}else c(i,((n,i)=>{r+=s(u(t,i),e,n)})) return r/o}:function(){return 0} return 1===r?function(e){return f(t[0],e)}:"and"===e.options.conjunction?function(e){for(var n,i=0,o=0;i{n+=f(t,e)})),n/r}}getSortFunction(e,t){var r=this.prepareSearch(e,t) -return this._getSortFunction(r)}_getSortFunction(e){var t,r,n,i,o,s,u,f,c,a,h,g -if(n=this,g=e.options,h=!e.query&&g.sort_empty||g.sort,c=function(t,r){return"$score"===t?r.score:e.getAttrFn(n.items[r.id],t)},o=[],h)for(t=0,r=h.length;t{u.push({field:e})})),s.fields=u}s.fields.forEach((e=>{n[e.field]="weight"in e?e.weight:1}))}return{options:s,query:e=t(String(e||"")).toLowerCase().trim(),tokens:this.tokenize(e,s.respect_word_boundaries,n),total:0,items:[],weights:n,getAttrFn:s.nesting?o:i}}search(e,t){var r,n,i,o,s=this +s.fields.forEach((e=>{u.push({field:e})})),s.fields=u}s.fields.forEach((e=>{n[e.field]="weight"in e?e.weight:1}))}return{options:s,query:e=t(e+"").toLowerCase().trim(),tokens:this.tokenize(e,s.respect_word_boundaries,n),total:0,items:[],weights:n,getAttrFn:s.nesting?o:i}}search(e,t){var r,n,i,o,s=this return n=this.prepareSearch(e,t),t=n.options,e=n.query,o=t.score||s._getScoreFunction(n),e.length?c(s.items,((e,i)=>{r=o(e),(!1===t.filter||r>0)&&n.items.push({score:r,id:i})})):c(s.items,((e,t)=>{n.items.push({score:1,id:t})})),(i=s._getSortFunction(n))&&n.items.sort(i),n.total=n.items.length,"number"==typeof t.limit&&(n.items=n.items.slice(0,t.limit)),n}}})) //# sourceMappingURL=sifter.min.js.map diff --git a/dist/umd/sifter.min.js.map b/dist/umd/sifter.min.js.map index b5a31d8..35f3171 100644 --- a/dist/umd/sifter.min.js.map +++ b/dist/umd/sifter.min.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = String(value || '');\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(String(a || '')).toLowerCase();\n\tb = asciifold(String(b || '')).toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tvar tokens = [];\n\t\tvar words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tvar scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += 0.1;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, weights[token.field]);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, self, sort_fld, sort_flds, sort_flds_count, multiplier, multipliers, get_field, implicit_score, sort, options;\n\n\t\tself\t\t= this;\n\t\toptions\t\t= search.options;\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort;\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tget_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tsort_flds = [];\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmultipliers = [];\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( String(query || '') ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","diacritics","diacriticRegexPoints","regex","latin_convert","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","generateDiacritics","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","field_regex","tokens","words","Object","keys","map","join","word","field_match","field","match","this","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","self","sort_fld","sort_flds","sort_flds_count","multiplier","multipliers","get_field","implicit_score","sort","sort_empty","result","id","unshift","direction","splice","optsUser","assign","fld_name","field_params","trim","total","nesting","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","diacritics","diacriticRegexPoints","regex","latin_convert","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","generateDiacritics","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","this","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","optsUser","assign","fld_name","field_params","trim","total","nesting","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 5f8aa5f..0d162b7 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.7.0", + "version": "0.7.1", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 1a154fb5fe42a47e9a800fb13209417eaae11cd1 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sat, 8 May 2021 11:42:02 -0600 Subject: [PATCH 052/140] fix invalid options --- test/prepareSearch.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/prepareSearch.js b/test/prepareSearch.js index 2f7621c..ce8107b 100644 --- a/test/prepareSearch.js +++ b/test/prepareSearch.js @@ -4,11 +4,11 @@ var Sifter = require('../build/cjs/sifter.js'); describe('#prepareSearch()', function() { it('should normalize options', function() { - var sifter = new Sifter([{field: 'a'}, {}]); + var sifter = new Sifter([{fielda: 'a'}, {}]); var search = sifter.prepareSearch('a', { - fields: [{field: 'a'}], - sort: {field: 'a'}, - sort_empty: {field: 'a'} + fields: [{field: 'fielda'}], + sort: {field: 'fielda'}, + sort_empty: {field: 'fielda'} }); //assert.equal(Array.isArray(search.options.fields), true); assert.equal(Array.isArray(search.options.sort), true); From eca2800ee3e656ba4479d8be7b725ae1834e601b Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sat, 8 May 2021 11:44:32 -0600 Subject: [PATCH 053/140] move sorting tests to sorting.js, add test ordering w/out $score --- test/search.js | 155 -------------------------------------- test/sorting.js | 193 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 193 insertions(+), 155 deletions(-) create mode 100644 test/sorting.js diff --git a/test/search.js b/test/search.js index 1edbec7..1b574ea 100644 --- a/test/search.js +++ b/test/search.js @@ -77,161 +77,6 @@ describe('#search()', function() { assert.equal(result.items.length, 6); }); - - describe('sorting', function() { - it('should respect "sort_empty" option when query absent', function() { - var sifter = new Sifter([ - {field: 'aaa'}, - {field: 'add'}, - {field: 'abb'} - ]); - var result = sifter.search('', { - fields: 'field', - sort: {field: 'field', direction: 'asc'}, - sort_empty: {field: 'field', direction: 'desc'} - }); - assert.equal(result.items[0].id, 1); - assert.equal(result.items[1].id, 2); - assert.equal(result.items[2].id, 0); - }); - it('should work with one field (as object)', function() { - var sifter = new Sifter([ - {field: 'aaa'}, - {field: 'add'}, - {field: 'abb'} - ]); - var result = sifter.search('', { - fields: 'field', - sort: {field: 'field'} - }); - assert.equal(result.items[0].id, 0); - assert.equal(result.items[1].id, 2); - assert.equal(result.items[2].id, 1); - }); - it('should work with one field (as array)', function() { - var sifter = new Sifter([ - {field: 'aaa'}, - {field: 'add'}, - {field: 'abb'} - ]); - var result = sifter.search('', { - fields: 'field', - sort: [{field: 'field'}] - }); - assert.equal(result.items[0].id, 0); - assert.equal(result.items[1].id, 2); - assert.equal(result.items[2].id, 1); - }); - it('should work with multiple fields and respect priority', function() { - var sifter = new Sifter([ - {a: 'bbb', b: 'bbb'}, - {a: 'bbb', b: 'ccc'}, - {a: 'bbb', b: 'aaa'}, - {a: 'aaa'} - ]); - var result = sifter.search('', { - fields: 'field', - sort: [ - {field: 'a'}, - {field: 'b'} - ] - }); - assert.equal(result.items[0].id, 3); - assert.equal(result.items[1].id, 2); - assert.equal(result.items[2].id, 0); - assert.equal(result.items[3].id, 1); - }); - it('should respect numeric fields', function() { - var sifter = new Sifter([ - {field: 1.0}, - {field: 12.9}, - {field: 9.1}, - {field: -9.0} - ]); - var result = sifter.search('', { - fields: 'field', - sort: [{field: 'field'}] - }); - assert.equal(result.items[0].id, 3); - assert.equal(result.items[1].id, 0); - assert.equal(result.items[2].id, 2); - assert.equal(result.items[3].id, 1); - }); - it('should respect sort direction', function() { - var sifter = new Sifter([ - {a: 'bbb', b: 'rrr'}, - {a: 'bbb', b: 'aaa'}, - {a: 'aaa', b: 'rrr'}, - {a: 'aaa', b: 'aaa'} - ]); - var result = sifter.search('', { - fields: 'field', - sort: [ - {field: 'b', direction: 'desc'}, - {field: 'a', direction: 'asc'} - ] - }); - assert.equal(result.items[0].id, 2); - assert.equal(result.items[1].id, 0); - assert.equal(result.items[2].id, 3); - assert.equal(result.items[3].id, 1); - }); - it('should add implicit "$score" field when query present', function() { - var sifter = new Sifter([ - {field: 'yoo'}, - {field: 'book'} - ]); - var result = sifter.search('oo', { - fields: 'field', - sort: [{field: 'field'}] - }); - assert.equal(result.items[0].id, 0); - assert.equal(result.items[1].id, 1); - }); - it('should not add implicit "$score" field if explicitly given', function() { - var sifter = new Sifter([ - {field: 'boooo'}, - {field: 'yoo'}, - {field: 'aaa'} - ]); - var result = sifter.search('oo', { - filter: false, - fields: 'field', - sort: [{field: 'field'}, {field: '$score'}] - }); - assert.equal(result.items[0].id, 2); - assert.equal(result.items[1].id, 0); - assert.equal(result.items[2].id, 1); - }); - it('should be locale-aware', function() { - var sifter = new Sifter([ - {field: 'Zoom Test'}, - {field: 'Água Test'} - ]); - var result = sifter.search('', { - fields: 'field', - sort: [{field: 'field', direction: 'asc'}] - }); - assert.equal(result.items[0].id, 1); - assert.equal(result.items[1].id, 0); - }); - it('should work with nested fields', function() { - var sifter = new Sifter([ - {fields: {nested: 'aaa'}}, - {fields: {nested: 'add'}}, - {fields: {nested: 'abb'}} - ]); - var result = sifter.search('', { - fields: ['fields.nested'], - sort: {field: 'fields.nested'}, - nesting: true - }); - assert.equal(result.items[0].id, 0); - assert.equal(result.items[1].id, 2); - assert.equal(result.items[2].id, 1); - }); - }); - describe('returned results', function() { var sifter, options, result, result_empty, result_all; diff --git a/test/sorting.js b/test/sorting.js new file mode 100644 index 0000000..1171633 --- /dev/null +++ b/test/sorting.js @@ -0,0 +1,193 @@ +var assert = require('assert'); +var Sifter = require('../build/cjs/sifter.js'); + +describe('sorting', function() { + + it('should respect "sort_empty" option when query absent', function() { + var sifter = new Sifter([ + {field: 'aaa'}, + {field: 'add'}, + {field: 'abb'} + ]); + var result = sifter.search('', { + fields: 'field', + sort: {field: 'field', direction: 'asc'}, + sort_empty: {field: 'field', direction: 'desc'} + }); + assert.equal(result.items[0].id, 1); + assert.equal(result.items[1].id, 2); + assert.equal(result.items[2].id, 0); + }); + + it('should work with one field (as object)', function() { + var sifter = new Sifter([ + {field: 'aaa'}, + {field: 'add'}, + {field: 'abb'} + ]); + var result = sifter.search('', { + fields: 'field', + sort: {field: 'field'} + }); + assert.equal(result.items[0].id, 0); + assert.equal(result.items[1].id, 2); + assert.equal(result.items[2].id, 1); + }); + + it('should work with one field (as array)', function() { + var sifter = new Sifter([ + {field: 'aaa'}, + {field: 'add'}, + {field: 'abb'} + ]); + var result = sifter.search('', { + fields: 'field', + sort: [{field: 'field'}] + }); + assert.equal(result.items[0].id, 0); + assert.equal(result.items[1].id, 2); + assert.equal(result.items[2].id, 1); + }); + + it('should work with multiple fields and respect priority', function() { + var sifter = new Sifter([ + {a: 'bbb', b: 'bbb'}, + {a: 'bbb', b: 'ccc'}, + {a: 'bbb', b: 'aaa'}, + {a: 'aaa'} + ]); + var result = sifter.search('', { + fields: 'field', + sort: [ + {field: 'a'}, + {field: 'b'} + ] + }); + assert.equal(result.items[0].id, 3); + assert.equal(result.items[1].id, 2); + assert.equal(result.items[2].id, 0); + assert.equal(result.items[3].id, 1); + }); + + it('should respect numeric fields', function() { + var sifter = new Sifter([ + {field: 1.0}, + {field: 12.9}, + {field: 9.1}, + {field: -9.0} + ]); + var result = sifter.search('', { + fields: 'field', + sort: [{field: 'field'}] + }); + assert.equal(result.items[0].id, 3); + assert.equal(result.items[1].id, 0); + assert.equal(result.items[2].id, 2); + assert.equal(result.items[3].id, 1); + }); + + it('should respect sort direction', function() { + var sifter = new Sifter([ + {a: 'bbb', b: 'rrr'}, + {a: 'bbb', b: 'aaa'}, + {a: 'aaa', b: 'rrr'}, + {a: 'aaa', b: 'aaa'} + ]); + var result = sifter.search('', { + fields: 'field', + sort: [ + {field: 'b', direction: 'desc'}, + {field: 'a', direction: 'asc'} + ] + }); + assert.equal(result.items[0].id, 2); + assert.equal(result.items[1].id, 0); + assert.equal(result.items[2].id, 3); + assert.equal(result.items[3].id, 1); + }); + + it('should add implicit "$score" field when query present', function() { + var sifter = new Sifter([ + {field: 'yoo'}, + {field: 'book'} + ]); + var result = sifter.search('oo', { + fields: 'field', + sort: [{field: 'field'}] + }); + assert.equal(result.items[0].id, 0); + assert.equal(result.items[1].id, 1); + }); + + it('should not add implicit "$score" field if explicitly given', function() { + var sifter = new Sifter([ + {field: 'boooo'}, + {field: 'yoo'}, + {field: 'aaa'} + ]); + var result = sifter.search('oo', { + filter: false, + fields: 'field', + sort: [{field: 'field'}, {field: '$score'}] + }); + assert.equal(result.items[0].id, 2); + assert.equal(result.items[1].id, 0); + assert.equal(result.items[2].id, 1); + }); + + it('should be locale-aware', function() { + var sifter = new Sifter([ + {field: 'Zoom Test'}, + {field: 'Água Test'} + ]); + var result = sifter.search('', { + fields: 'field', + sort: [{field: 'field', direction: 'asc'}] + }); + assert.equal(result.items[0].id, 1); + assert.equal(result.items[1].id, 0); + }); + + it('should work with nested fields', function() { + var sifter = new Sifter([ + {fields: {nested: 'aaa'}}, + {fields: {nested: 'add'}}, + {fields: {nested: 'abb'}} + ]); + var result = sifter.search('', { + fields: ['fields.nested'], + sort: {field: 'fields.nested'}, + nesting: true + }); + assert.equal(result.items[0].id, 0); + assert.equal(result.items[1].id, 2); + assert.equal(result.items[2].id, 1); + }); + + it('should not order results by $score', function() { + + var data = [ + {fielda:'aaab',$order:1}, + {fielda:'babaaa',$order:2}, + {fielda:'abaaaaa',$order:10}, + {fielda:'aabaaaaaaa',$order:12}, + {fielda:'abbaaaaa',$order:20}, + {fielda:'abaaaaaaa',$order:22}, + ]; + + var sifter = new Sifter(data); + var search = sifter.search('a', { + fields: [{field: 'fielda'}], + sort: [{field: '$order'},{field:'$score'}], + }); + + + assert.equal(search.items[0].id,0); + assert.equal(search.items[1].id,1); + assert.equal(search.items[2].id,2); + assert.equal(search.items[3].id,3); + assert.equal(search.items[4].id,4); + assert.equal(search.items[5].id,5); + }); + +}); From 19a3f63f577273dc9bcf65cf92f92058bf43e564 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Mon, 10 May 2021 09:17:35 -0600 Subject: [PATCH 054/140] if search field is empty, all items should match. orchidjs/tom-select#78 --- lib/sifter.ts | 6 +++--- test/search.js | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index df1af85..d2a3093 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -149,6 +149,9 @@ export default class Sifter{ field_count = fields.length, getAttrFn = search.getAttrFn; + if (!field_count) { + return function() { return 1; }; + } /** @@ -161,9 +164,6 @@ export default class Sifter{ */ const scoreObject = (function() { - if (!field_count) { - return function() { return 0; }; - } if (field_count === 1) { return function(token:TToken, data) { diff --git a/test/search.js b/test/search.js index 1b574ea..abab18c 100644 --- a/test/search.js +++ b/test/search.js @@ -287,4 +287,21 @@ describe('#search()', function() { }); + it('empty field', function() { + + var data = [ + {fieldx: 'aaa', fieldy: 'abb'}, + {fieldx: 'abb', fieldy: 'aaa'} + ]; + var sifter = new Sifter(data); + + var result = sifter.search('b', { + fields: [] + }); + + assert.equal(result.items.length,2); + assert.equal(result.items[0].id,0); + }); + + }); From 3b544ad145c6f43509f1711e43071d1e9072f82e Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Mon, 10 May 2021 13:46:51 -0600 Subject: [PATCH 055/140] v0.7.2 Release --- dist/cjs/sifter.js | 13 +++++++------ dist/cjs/sifter.js.map | 2 +- dist/esm/sifter.js | 13 +++++++------ dist/esm/sifter.js.map | 2 +- dist/umd/sifter.js | 13 +++++++------ dist/umd/sifter.js.map | 2 +- dist/umd/sifter.min.js | 6 ++++-- dist/umd/sifter.min.js.map | 2 +- package.json | 2 +- 9 files changed, 30 insertions(+), 25 deletions(-) diff --git a/dist/cjs/sifter.js b/dist/cjs/sifter.js index 5bcd8fc..bc66761 100644 --- a/dist/cjs/sifter.js +++ b/dist/cjs/sifter.js @@ -110,6 +110,12 @@ class Sifter { weights = search.weights, field_count = fields.length, getAttrFn = search.getAttrFn; + + if (!field_count) { + return function () { + return 1; + }; + } /** * Calculates the score of an object * against the search query. @@ -119,13 +125,8 @@ class Sifter { * @return {number} */ - const scoreObject = function () { - if (!field_count) { - return function () { - return 0; - }; - } + const scoreObject = function () { if (field_count === 1) { return function (token, data) { const field = fields[0].field; diff --git a/dist/cjs/sifter.js.map b/dist/cjs/sifter.js.map index 16e8b13..d2ea6eb 100644 --- a/dist/cjs/sifter.js.map +++ b/dist/cjs/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","a","b","cmp","optsUser","assign","propToArray","Array","isArray","fld_name","field_params","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","a","b","cmp","optsUser","assign","propToArray","Array","isArray","fld_name","field_params","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_sort","fn_score","item","filter","limit","slice"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA6Ce,MAAMA,MAAN,CAAY;AAK1B;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACCC,EAAAA,WAAW,CAACC,KAAD,EAAQC,QAAR,EAAkB;AAAA,SAZtBD,KAYsB;AAAA,SAXtBC,QAWsB;AAC5B,SAAKD,KAAL,GAAaA,KAAb;AACA,SAAKC,QAAL,GAAgBA,QAAQ,IAAI;AAACC,MAAAA,UAAU,EAAE;AAAb,KAA5B;AACA;;AAED;AACD;AACA;AACA;AACA;AACCC,EAAAA,QAAQ,CAACC,KAAD,EAAeC,uBAAf,EAAiDC,OAAjD,EAA8E;AACrF,QAAI,CAACF,KAAD,IAAU,CAACA,KAAK,CAACG,MAArB,EAA6B,OAAO,EAAP;AAE7B,UAAMC,MAAM,GAAG,EAAf;AACA,UAAMC,KAAK,GAAGL,KAAK,CAACM,KAAN,CAAY,KAAZ,CAAd;AACA,QAAIC,WAAJ;;AAEA,QAAIL,OAAJ,EAAa;AACZK,MAAAA,WAAW,GAAG,IAAIC,MAAJ,CAAY,OAAMC,MAAM,CAACC,IAAP,CAAYR,OAAZ,EAAqBS,GAArB,CAAyBC,kBAAzB,EAAuCC,IAAvC,CAA4C,GAA5C,CAAN,GAAuD,UAAnE,CAAd;AACA;;AAEDR,IAAAA,KAAK,CAACS,OAAN,CAAeC,IAAD,IAAiB;AAC9B,UAAIC,WAAJ;AACA,UAAIC,KAAK,GAAG,IAAZ;AACA,UAAIC,KAAK,GAAG,IAAZ,CAH8B;;AAM9B,UAAIX,WAAW,KAAKS,WAAW,GAAGD,IAAI,CAACI,KAAL,CAAWZ,WAAX,CAAnB,CAAf,EAA4D;AAC3DU,QAAAA,KAAK,GAAGD,WAAW,CAAC,CAAD,CAAnB;AACAD,QAAAA,IAAI,GAAGC,WAAW,CAAC,CAAD,CAAlB;AACA;;AAED,UAAID,IAAI,CAACZ,MAAL,GAAc,CAAlB,EAAqB;AACpBe,QAAAA,KAAK,GAAGN,kBAAY,CAACG,IAAD,CAApB;;AACA,YAAI,KAAKlB,QAAL,CAAcC,UAAlB,EAA8B;AAC7BoB,UAAAA,KAAK,GAAGE,+BAAoB,CAACF,KAAD,CAA5B;AACA;;AACD,YAAIjB,uBAAJ,EAA8BiB,KAAK,GAAG,QAAMA,KAAd;AAC9BA,QAAAA,KAAK,GAAG,IAAIV,MAAJ,CAAWU,KAAX,EAAkB,GAAlB,CAAR;AACA;;AAEDd,MAAAA,MAAM,CAACiB,IAAP,CAAY;AACXC,QAAAA,MAAM,EAAGP,IADE;AAEXG,QAAAA,KAAK,EAAIA,KAFE;AAGXD,QAAAA,KAAK,EAAIA;AAHE,OAAZ;AAKA,KAzBD;AA2BA,WAAOb,MAAP;AACA;;AAGD;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACCmB,EAAAA,gBAAgB,CAACvB,KAAD,EAAewB,OAAf,EAAwB;AACvC,QAAIC,MAAM,GAAG,KAAKC,aAAL,CAAmB1B,KAAnB,EAA0BwB,OAA1B,CAAb;AACA,WAAO,KAAKG,iBAAL,CAAuBF,MAAvB,CAAP;AACA;;AAEDE,EAAAA,iBAAiB,CAACF,MAAD,EAAqB;AACrC,UAAMrB,MAAM,GAAIqB,MAAM,CAACrB,MAAvB;AAAA,UACAwB,WAAW,GAAKxB,MAAM,CAACD,MADvB;;AAGA,QAAI,CAACyB,WAAL,EAAkB;AACjB,aAAO,YAAW;AAAE,eAAO,CAAP;AAAW,OAA/B;AACA;;AAED,UAAMC,MAAM,GAAGJ,MAAM,CAACD,OAAP,CAAeK,MAA9B;AAAA,UACA3B,OAAO,GAAKuB,MAAM,CAACvB,OADnB;AAAA,UAEA4B,WAAW,GAAID,MAAM,CAAC1B,MAFtB;AAAA,UAGA4B,SAAS,GAAIN,MAAM,CAACM,SAHpB;;AAKA,QAAI,CAACD,WAAL,EAAkB;AACjB,aAAO,YAAW;AAAE,eAAO,CAAP;AAAW,OAA/B;AACA;AAGD;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;AACE,UAAME,WAAW,GAAI,YAAW;AAG/B,UAAIF,WAAW,KAAK,CAApB,EAAuB;AACtB,eAAO,UAASG,KAAT,EAAuBC,IAAvB,EAA6B;AACnC,gBAAMjB,KAAK,GAAGY,MAAM,CAAC,CAAD,CAAN,CAAUZ,KAAxB;AACA,iBAAOkB,gBAAU,CAACJ,SAAS,CAACG,IAAD,EAAOjB,KAAP,CAAV,EAAyBgB,KAAzB,EAAgC/B,OAAO,CAACe,KAAD,CAAvC,CAAjB;AACA,SAHD;AAIA;;AAED,aAAO,UAASgB,KAAT,EAAuBC,IAAvB,EAA6B;AACnC,YAAIE,GAAG,GAAG,CAAV,CADmC;;AAInC,YAAIH,KAAK,CAAChB,KAAV,EAAiB;AAEhB,gBAAMoB,KAAK,GAAGN,SAAS,CAACG,IAAD,EAAOD,KAAK,CAAChB,KAAb,CAAvB;;AAEA,cAAI,CAACgB,KAAK,CAACf,KAAP,IAAgBmB,KAApB,EAA2B;AAC1BD,YAAAA,GAAG,IAAK,IAAEN,WAAV;AACA,WAFD,MAEK;AACJM,YAAAA,GAAG,IAAID,gBAAU,CAACE,KAAD,EAAQJ,KAAR,EAAe,CAAf,CAAjB;AACA;AAID,SAZD,MAYK;AACJK,UAAAA,aAAO,CAACpC,OAAD,EAAU,CAACqC,MAAD,EAAStB,KAAT,KAAmB;AACnCmB,YAAAA,GAAG,IAAID,gBAAU,CAACJ,SAAS,CAACG,IAAD,EAAOjB,KAAP,CAAV,EAAyBgB,KAAzB,EAAgCM,MAAhC,CAAjB;AACA,WAFM,CAAP;AAGA;;AAED,eAAOH,GAAG,GAAGN,WAAb;AACA,OAvBD;AAwBA,KAlCmB,EAApB;;AAoCA,QAAIF,WAAW,KAAK,CAApB,EAAuB;AACtB,aAAO,UAASM,IAAT,EAAe;AACrB,eAAOF,WAAW,CAAC5B,MAAM,CAAC,CAAD,CAAP,EAAY8B,IAAZ,CAAlB;AACA,OAFD;AAGA;;AAED,QAAIT,MAAM,CAACD,OAAP,CAAegB,WAAf,KAA+B,KAAnC,EAA0C;AACzC,aAAO,UAASN,IAAT,EAAe;AACrB,YAAIO,CAAC,GAAG,CAAR;AAAA,YAAWC,KAAX;AAAA,YAAkBN,GAAG,GAAG,CAAxB;;AACA,eAAOK,CAAC,GAAGb,WAAX,EAAwBa,CAAC,EAAzB,EAA6B;AAC5BC,UAAAA,KAAK,GAAGV,WAAW,CAAC5B,MAAM,CAACqC,CAAD,CAAP,EAAYP,IAAZ,CAAnB;AACA,cAAIQ,KAAK,IAAI,CAAb,EAAgB,OAAO,CAAP;AAChBN,UAAAA,GAAG,IAAIM,KAAP;AACA;;AACD,eAAON,GAAG,GAAGR,WAAb;AACA,OARD;AASA,KAVD,MAUO;AACN,aAAO,UAASM,IAAT,EAAe;AACrB,YAAIE,GAAG,GAAG,CAAV;AACAE,QAAAA,aAAO,CAAClC,MAAD,EAAS6B,KAAD,IAAgB;AAC9BG,UAAAA,GAAG,IAAIJ,WAAW,CAACC,KAAD,EAAQC,IAAR,CAAlB;AACA,SAFM,CAAP;AAGA,eAAOE,GAAG,GAAGR,WAAb;AACA,OAND;AAOA;AACD;;AAED;AACD;AACA;AACA;AACA;AACA;AACA;AACCe,EAAAA,eAAe,CAAC3C,KAAD,EAAewB,OAAf,EAAwB;AACtC,QAAIC,MAAM,GAAI,KAAKC,aAAL,CAAmB1B,KAAnB,EAA0BwB,OAA1B,CAAd;AACA,WAAO,KAAKoB,gBAAL,CAAsBnB,MAAtB,CAAP;AACA;;AAEDmB,EAAAA,gBAAgB,CAACnB,MAAD,EAAoB;AACnC,QAAIgB,CAAJ,EAAOI,CAAP,EAAUC,QAAV,EAAoBC,eAApB,EAAqCC,UAArC,EAAiDC,cAAjD;AAEA,UAAMC,IAAI,GAAG,IAAb;AAAA,UACA1B,OAAO,GAAIC,MAAM,CAACD,OADlB;AAAA,UAEA2B,IAAI,GAAK,CAAC1B,MAAM,CAACzB,KAAR,IAAiBwB,OAAO,CAAC4B,UAA1B,IAAyC5B,OAAO,CAAC2B,IAFzD;AAAA,UAGAE,SAAS,GAAG,EAHZ;AAAA,UAIAC,WAAW,GAAG,EAJd;AAOA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;AACE,UAAMC,SAAS,GAAG,SAAZA,SAAY,CAASC,IAAT,EAAeC,MAAf,EAAuB;AACxC,UAAID,IAAI,KAAK,QAAb,EAAuB,OAAOC,MAAM,CAACf,KAAd;AACvB,aAAOjB,MAAM,CAACM,SAAP,CAAiBmB,IAAI,CAACtD,KAAL,CAAW6D,MAAM,CAACC,EAAlB,CAAjB,EAAwCF,IAAxC,CAAP;AACA,KAHD,CAlBmC;;;AAwBnC,QAAIL,IAAJ,EAAU;AACT,WAAKV,CAAC,GAAG,CAAJ,EAAOI,CAAC,GAAGM,IAAI,CAAChD,MAArB,EAA6BsC,CAAC,GAAGI,CAAjC,EAAoCJ,CAAC,EAArC,EAAyC;AACxC,YAAIhB,MAAM,CAACzB,KAAP,IAAgBmD,IAAI,CAACV,CAAD,CAAJ,CAAQxB,KAAR,KAAkB,QAAtC,EAAgD;AAC/CoC,UAAAA,SAAS,CAAChC,IAAV,CAAe8B,IAAI,CAACV,CAAD,CAAnB;AACA;AACD;AACD,KA9BkC;AAiCnC;;;AACA,QAAIhB,MAAM,CAACzB,KAAX,EAAkB;AACjBiD,MAAAA,cAAc,GAAG,IAAjB;;AACA,WAAKR,CAAC,GAAG,CAAJ,EAAOI,CAAC,GAAGQ,SAAS,CAAClD,MAA1B,EAAkCsC,CAAC,GAAGI,CAAtC,EAAyCJ,CAAC,EAA1C,EAA8C;AAC7C,YAAIY,SAAS,CAACZ,CAAD,CAAT,CAAaxB,KAAb,KAAuB,QAA3B,EAAqC;AACpCgC,UAAAA,cAAc,GAAG,KAAjB;AACA;AACA;AACD;;AACD,UAAIA,cAAJ,EAAoB;AACnBI,QAAAA,SAAS,CAACM,OAAV,CAAkB;AAAC1C,UAAAA,KAAK,EAAE,QAAR;AAAkB2C,UAAAA,SAAS,EAAE;AAA7B,SAAlB;AACA;AACD,KAXD,MAWO;AACN,WAAKnB,CAAC,GAAG,CAAJ,EAAOI,CAAC,GAAGQ,SAAS,CAAClD,MAA1B,EAAkCsC,CAAC,GAAGI,CAAtC,EAAyCJ,CAAC,EAA1C,EAA8C;AAC7C,YAAIY,SAAS,CAACZ,CAAD,CAAT,CAAaxB,KAAb,KAAuB,QAA3B,EAAqC;AACpCoC,UAAAA,SAAS,CAACQ,MAAV,CAAiBpB,CAAjB,EAAoB,CAApB;AACA;AACA;AACD;AACD;;AAED,SAAKA,CAAC,GAAG,CAAJ,EAAOI,CAAC,GAAGQ,SAAS,CAAClD,MAA1B,EAAkCsC,CAAC,GAAGI,CAAtC,EAAyCJ,CAAC,EAA1C,EAA8C;AAC7Ca,MAAAA,WAAW,CAACjC,IAAZ,CAAiBgC,SAAS,CAACZ,CAAD,CAAT,CAAamB,SAAb,KAA2B,MAA3B,GAAoC,CAAC,CAArC,GAAyC,CAA1D;AACA,KAxDkC;;;AA2DnCb,IAAAA,eAAe,GAAGM,SAAS,CAAClD,MAA5B;;AACA,QAAI,CAAC4C,eAAL,EAAsB;AACrB,aAAO,IAAP;AACA,KAFD,MAEO,IAAIA,eAAe,KAAK,CAAxB,EAA2B;AACjCD,MAAAA,QAAQ,GAAGO,SAAS,CAAC,CAAD,CAAT,CAAapC,KAAxB;AACA+B,MAAAA,UAAU,GAAGM,WAAW,CAAC,CAAD,CAAxB;AACA,aAAO,UAASQ,CAAT,EAAYC,CAAZ,EAAe;AACrB,eAAOf,UAAU,GAAGgB,SAAG,CACtBT,SAAS,CAACT,QAAD,EAAWgB,CAAX,CADa,EAEtBP,SAAS,CAACT,QAAD,EAAWiB,CAAX,CAFa,CAAvB;AAIA,OALD;AAMA,KATM,MASA;AACN,aAAO,UAASD,CAAT,EAAYC,CAAZ,EAAe;AACrB,YAAItB,CAAJ,EAAOgB,MAAP,EAAexC,KAAf;;AACA,aAAKwB,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGM,eAAhB,EAAiCN,CAAC,EAAlC,EAAsC;AACrCxB,UAAAA,KAAK,GAAGoC,SAAS,CAACZ,CAAD,CAAT,CAAaxB,KAArB;AACAwC,UAAAA,MAAM,GAAGH,WAAW,CAACb,CAAD,CAAX,GAAiBuB,SAAG,CAC5BT,SAAS,CAACtC,KAAD,EAAQ6C,CAAR,CADmB,EAE5BP,SAAS,CAACtC,KAAD,EAAQ8C,CAAR,CAFmB,CAA7B;AAIA,cAAIN,MAAJ,EAAY,OAAOA,MAAP;AACZ;;AACD,eAAO,CAAP;AACA,OAXD;AAYA;AACD;;AAED;AACD;AACA;AACA;AACA;AACA;AACC/B,EAAAA,aAAa,CAAC1B,KAAD,EAAeiE,QAAf,EAAqC;AACjD,UAAM/D,OAAO,GAAG,EAAhB;AACA,QAAIsB,OAAO,GAAIf,MAAM,CAACyD,MAAP,CAAc,EAAd,EAAiBD,QAAjB,CAAf;AAEAE,IAAAA,iBAAW,CAAC3C,OAAD,EAAS,MAAT,CAAX;AACA2C,IAAAA,iBAAW,CAAC3C,OAAD,EAAS,YAAT,CAAX,CALiD;;AAQjD,QAAIA,OAAO,CAACK,MAAZ,EAAoB;AACnBsC,MAAAA,iBAAW,CAAC3C,OAAD,EAAS,QAAT,CAAX;;AACA,UAAI4C,KAAK,CAACC,OAAN,CAAc7C,OAAO,CAACK,MAAtB,KAAiC,OAAOL,OAAO,CAACK,MAAR,CAAe,CAAf,CAAP,KAA6B,QAAlE,EAA4E;AAC3E,YAAIA,MAAM,GAAG,EAAb;AACAL,QAAAA,OAAO,CAACK,MAAR,CAAef,OAAf,CAAwBwD,QAAD,IAAc;AACpCzC,UAAAA,MAAM,CAACR,IAAP,CAAY;AAACJ,YAAAA,KAAK,EAACqD;AAAP,WAAZ;AACA,SAFD;AAGA9C,QAAAA,OAAO,CAACK,MAAR,GAAiBA,MAAjB;AACA;;AAGDL,MAAAA,OAAO,CAACK,MAAR,CAAef,OAAf,CAAwByD,YAAD,IAAgB;AACtCrE,QAAAA,OAAO,CAACqE,YAAY,CAACtD,KAAd,CAAP,GAA+B,YAAYsD,YAAb,GAA6BA,YAAY,CAAChC,MAA1C,GAAmD,CAAjF;AACA,OAFD;AAGA;;AAEDvC,IAAAA,KAAK,GAAGwE,oBAAS,CAAExE,KAAK,GAAG,EAAV,CAAT,CAAwByE,WAAxB,GAAsCC,IAAtC,EAAR;AAEA,WAAO;AACNlD,MAAAA,OAAO,EAAIA,OADL;AAENxB,MAAAA,KAAK,EAAIA,KAFH;AAGNI,MAAAA,MAAM,EAAI,KAAKL,QAAL,CAAcC,KAAd,EAAqBwB,OAAO,CAACvB,uBAA7B,EAAsDC,OAAtD,CAHJ;AAINyE,MAAAA,KAAK,EAAI,CAJH;AAKN/E,MAAAA,KAAK,EAAI,EALH;AAMNM,MAAAA,OAAO,EAAIA,OANL;AAON6B,MAAAA,SAAS,EAAIP,OAAO,CAACoD,OAAT,GAAoBC,oBAApB,GAAqCC;AAP3C,KAAP;AASA;;AAED;AACD;AACA;AACA;AACCrD,EAAAA,MAAM,CAACzB,KAAD,EAAewB,OAAf,EAA+C;AACpD,QAAI0B,IAAI,GAAG,IAAX;AAAA,QAAiBR,KAAjB;AAAA,QAAwBjB,MAAxB;AACA,QAAIsD,OAAJ;AACA,QAAIC,QAAJ;AAEAvD,IAAAA,MAAM,GAAI,KAAKC,aAAL,CAAmB1B,KAAnB,EAA0BwB,OAA1B,CAAV;AACAA,IAAAA,OAAO,GAAGC,MAAM,CAACD,OAAjB;AACAxB,IAAAA,KAAK,GAAKyB,MAAM,CAACzB,KAAjB,CAPoD;;AAUpDgF,IAAAA,QAAQ,GAAGxD,OAAO,CAACkB,KAAR,IAAiBQ,IAAI,CAACvB,iBAAL,CAAuBF,MAAvB,CAA5B,CAVoD;;AAapD,QAAIzB,KAAK,CAACG,MAAV,EAAkB;AACjBmC,MAAAA,aAAO,CAACY,IAAI,CAACtD,KAAN,EAAa,CAACqF,IAAD,EAAOvB,EAAP,KAAc;AACjChB,QAAAA,KAAK,GAAGsC,QAAQ,CAACC,IAAD,CAAhB;;AACA,YAAIzD,OAAO,CAAC0D,MAAR,KAAmB,KAAnB,IAA4BxC,KAAK,GAAG,CAAxC,EAA2C;AAC1CjB,UAAAA,MAAM,CAAC7B,KAAP,CAAayB,IAAb,CAAkB;AAAC,qBAASqB,KAAV;AAAiB,kBAAMgB;AAAvB,WAAlB;AACA;AACD,OALM,CAAP;AAMA,KAPD,MAOO;AACNpB,MAAAA,aAAO,CAACY,IAAI,CAACtD,KAAN,EAAa,CAACqF,IAAD,EAAOvB,EAAP,KAAc;AACjCjC,QAAAA,MAAM,CAAC7B,KAAP,CAAayB,IAAb,CAAkB;AAAC,mBAAS,CAAV;AAAa,gBAAMqC;AAAnB,SAAlB;AACA,OAFM,CAAP;AAGA;;AAEDqB,IAAAA,OAAO,GAAG7B,IAAI,CAACN,gBAAL,CAAsBnB,MAAtB,CAAV;AACA,QAAIsD,OAAJ,EAAatD,MAAM,CAAC7B,KAAP,CAAauD,IAAb,CAAkB4B,OAAlB,EA3BuC;;AA8BpDtD,IAAAA,MAAM,CAACkD,KAAP,GAAelD,MAAM,CAAC7B,KAAP,CAAaO,MAA5B;;AACA,QAAI,OAAOqB,OAAO,CAAC2D,KAAf,KAAyB,QAA7B,EAAuC;AACtC1D,MAAAA,MAAM,CAAC7B,KAAP,GAAe6B,MAAM,CAAC7B,KAAP,CAAawF,KAAb,CAAmB,CAAnB,EAAsB5D,OAAO,CAAC2D,KAA9B,CAAf;AACA;;AAED,WAAO1D,MAAP;AACA;;AA9VyB;;;;"} \ No newline at end of file diff --git a/dist/esm/sifter.js b/dist/esm/sifter.js index dbef946..28621bc 100644 --- a/dist/esm/sifter.js +++ b/dist/esm/sifter.js @@ -108,6 +108,12 @@ class Sifter { weights = search.weights, field_count = fields.length, getAttrFn = search.getAttrFn; + + if (!field_count) { + return function () { + return 1; + }; + } /** * Calculates the score of an object * against the search query. @@ -117,13 +123,8 @@ class Sifter { * @return {number} */ - const scoreObject = function () { - if (!field_count) { - return function () { - return 0; - }; - } + const scoreObject = function () { if (field_count === 1) { return function (token, data) { const field = fields[0].field; diff --git a/dist/esm/sifter.js.map b/dist/esm/sifter.js.map index 2ff0c0b..9307df1 100644 --- a/dist/esm/sifter.js.map +++ b/dist/esm/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","a","b","cmp","optsUser","assign","propToArray","Array","isArray","fld_name","field_params","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","a","b","cmp","optsUser","assign","propToArray","Array","isArray","fld_name","field_params","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/umd/sifter.js b/dist/umd/sifter.js index e21e0c5..5e4b53c 100644 --- a/dist/umd/sifter.js +++ b/dist/umd/sifter.js @@ -320,6 +320,12 @@ weights = search.weights, field_count = fields.length, getAttrFn = search.getAttrFn; + + if (!field_count) { + return function () { + return 1; + }; + } /** * Calculates the score of an object * against the search query. @@ -329,13 +335,8 @@ * @return {number} */ - const scoreObject = function () { - if (!field_count) { - return function () { - return 0; - }; - } + const scoreObject = function () { if (field_count === 1) { return function (token, data) { const field = fields[0].field; diff --git a/dist/umd/sifter.js.map b/dist/umd/sifter.js.map index f95dd75..43b5bd6 100644 --- a/dist/umd/sifter.js.map +++ b/dist/umd/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","optsUser","assign","fld_name","field_params","trim","total","nesting","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","optsUser","assign","fld_name","field_params","trim","total","nesting","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/umd/sifter.min.js b/dist/umd/sifter.min.js index de7e37e..4ad0717 100644 --- a/dist/umd/sifter.min.js +++ b/dist/umd/sifter.min.js @@ -30,11 +30,13 @@ return r&&(s=new RegExp("^("+Object.keys(r).map(u).join("|")+"):(.*)$")),o.forEa s&&(r=e.match(s))&&(o=r[1],e=r[2]),e.length>0&&(f=u(e),this.settings.diacritics&&(f=n(f)),t&&(f="\\b"+f),f=new RegExp(f,"i")),i.push({string:e,regex:f,field:o})})),i}getScoreFunction(e,t){var r=this.prepareSearch(e,t) return this._getScoreFunction(r)}_getScoreFunction(e){const t=e.tokens,r=t.length if(!r)return function(){return 0} -const n=e.options.fields,i=e.weights,o=n.length,u=e.getAttrFn,f=o?1===o?function(e,t){const r=n[0].field +const n=e.options.fields,i=e.weights,o=n.length,u=e.getAttrFn +if(!o)return function(){return 1} +const f=1===o?function(e,t){const r=n[0].field return s(u(t,r),e,i[r])}:function(e,t){var r=0 if(e.field){const n=u(t,e.field) !e.regex&&n?r+=1/o:r+=s(n,e,1)}else c(i,((n,i)=>{r+=s(u(t,i),e,n)})) -return r/o}:function(){return 0} +return r/o} return 1===r?function(e){return f(t[0],e)}:"and"===e.options.conjunction?function(e){for(var n,i=0,o=0;i{n+=f(t,e)})),n/r}}getSortFunction(e,t){var r=this.prepareSearch(e,t) diff --git a/dist/umd/sifter.min.js.map b/dist/umd/sifter.min.js.map index 35f3171..c3dd37e 100644 --- a/dist/umd/sifter.min.js.map +++ b/dist/umd/sifter.min.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\t\t\tif (!field_count) {\n\t\t\t\treturn function() { return 0; };\n\t\t\t}\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","diacritics","diacriticRegexPoints","regex","latin_convert","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","generateDiacritics","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","this","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","optsUser","assign","fld_name","field_params","trim","total","nesting","fn_sort","fn_score","item","filter","limit","slice"],"mappings":";AA6GA,IAAIA,EAAc,CACjB,CAAE,GAAI,IACN,CAAE,IAAK,KACP,CAAE,IAAK,KACP,CAAE,IAAK,KACP,CAAE,IAAK,KACP,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO;AAQH,SAASC,EAAUC,UAClBA,EAAIC,UAAU,OAAOC,QAAQ,mBAAoB,IAAID,UAAU,QAAQE,cA4F/E,IAAIC,EAA4B;AACzB,SAASC,EAAqBC,GAEjB,OAAfF,IACHA,EAnDK,eAEFG,EAAgB,MACb,SACA,QACD,SACA,SACC,UACC,MAGJH,EAAa;OAEjBN,EAAYU,SAASC,QAEhB,IAAIC,EAAID,EAAW,GAAIC,GAAKD,EAAW,GAAIC,IAAI,KAC9CC,EAAYC,OAAOC,aAAaH,GAChCI,EAASH,EAAUV,UAAU,OAAOC,QAAQ,mBAAoB,IAAID,UAAU;AAE9Ea,GAASH,IAKbG,EAAQA,EAAMX,cAEVW,KAASP,IACZO,EAAQP,EAAcO,IAGjBA,KAASV,IACdA,EAAWU,GAASA,EAAQA,EAAMC,eAEnCX,EAAWU,IAAUH,OAMhBP,EAYOY;IAGT,IAAIF,KAASV,EACbA,EAAWa,eAAeH,KAC7BR,EAAQA,EAAMJ,QAAS,IAAIgB,OAAOJ,EAAM,KAAM,IAAIV,EAAWU,GAAO;OAG/DR,EC3OD,SAASa,EAAQC,EAAwBC,MACvCD,SACEA,EAAIC,GASR,SAASC,EAAeF,EAAwBC,MAC9CD,WACDG,EAAQF,EAAKG,MAAM,KACjBD,EAAME,SAAWL,EAAMA,EAAIG,EAAMG,mBAChCN,GAUJ,SAASO,EAAWC,EAAcC,EAAOC,OAC3CC,EAAOC;OAENJ,GAIQ,KADbI,GADAJ,GAAgB,IACJK,OAAOJ,EAAMvB,QACF,GAEvByB,EAAQF,EAAMK,OAAOT,OAASG,EAAMH,OACxB,IAARO,IAAWD,GAAS,IAEjBA,EAAQD,GATI,EAYb,SAASK,EAAanC,UACpBA,EAAM,IAAIE,QAAQ,yBAA0B,QAQ9C,SAASkC,EAAYhB,EAAKiB,OAC5BT,EAAQR,EAAIiB;AACZT,IAAUU,MAAMC,QAAQX,KAC3BR,EAAIiB,GAAO,CAACT,IAgBP,SAASY,EAAQC,EAAQC,MAE1BJ,MAAMC,QAAQE,GAClBA,EAAOjC,QAAQkC;SAIV,IAAIL,KAAOI,EACXA,EAAOxB,eAAeoB,IACzBK,EAASD,EAAOJ,GAAMA,GAQnB,SAASM,EAAIC,EAAGC,SACL,iBAAND,GAA+B,iBAANC,EAC5BD,EAAIC,EAAI,EAAKD,EAAIC,GAAK,EAAI,GAElCD,EAAI7C,EAAU6C,EAAI,IAAIzC,gBACtB0C,EAAI9C,EAAU8C,EAAI,IAAI1C,eACJ,EACd0C,EAAID,GAAW,EACZ;;;;;;;;;;;;;;;WC5CO,MAcdE,YAAYC,EAAOC,QAZZD,kBACAC,qBAYDD,MAAQA,OACRC,SAAWA,GAAY,CAAC5C,YAAY,GAQ1C6C,SAASC,EAAcC,EAAkCC,OACnDF,IAAUA,EAAMzB,OAAQ,MAAO;MAE9B4B,EAAS,GACTC,EAAQJ,EAAM1B,MAAM;IACtB+B;OAEAH,IACHG,EAAc,IAAIrC,OAAQ,KAAMsC,OAAOC,KAAKL,GAASM,IAAIvB,GAAcwB,KAAK,KAAK,YAGlFL,EAAM9C,SAASoD,QACVC,EACAC,EAAQ,KACRxD,EAAQ;AAGRiD,IAAgBM,EAAcD,EAAKG,MAAMR,MAC5CO,EAAQD,EAAY,GACpBD,EAAOC,EAAY,IAGhBD,EAAKnC,OAAS,IACjBnB,EAAQ6B,EAAayB,GACjBI,KAAKhB,SAAS5C,aACjBE,EAAQD,EAAqBC,IAE1B6C,IAA0B7C,EAAQ,MAAMA,GAC5CA,EAAQ,IAAIY,OAAOZ,EAAO,MAG3B+C,EAAOY,KAAK,CACX/B,OAAS0B,EACTtD,MAASA,EACTwD,MAASA,OAIJT,EAYRa,iBAAiBhB,EAAciB,OAC1BlC,EAAS+B,KAAKI,cAAclB,EAAOiB;OAChCH,KAAKK,kBAAkBpC,GAG/BoC,kBAAkBpC,SACXoB,EAAUpB,EAAOoB,OACvBiB,EAAgBjB,EAAO5B;IAElB6C,SACG,kBAAoB;MAGtBC,EAAStC,EAAOkC,QAAQI,OAC9BnB,EAAYnB,EAAOmB,QACnBoB,EAAeD,EAAO9C,OACtBgD,EAAaxC,EAAOwC,UAYdC,EAEAF,EAIe,IAAhBA,EACI,SAAS3C,EAAc8C,SACvBb,EAAQS,EAAO,GAAGT;OACjBnC,EAAW8C,EAAUE,EAAMb,GAAQjC,EAAOuB,EAAQU,KAIpD,SAASjC,EAAc8C,OACzBC,EAAM;GAGN/C,EAAMiC,MAAO,OAEVlC,EAAQ6C,EAAUE,EAAM9C,EAAMiC;CAE/BjC,EAAMvB,OAASsB,EACnBgD,GAAQ,EAAEJ,EAEVI,GAAOjD,EAAWC,EAAOC,EAAO,QAMjCW,EAAQY,GAAS,CAACtB,EAAQgC,KACzBc,GAAOjD,EAAW8C,EAAUE,EAAMb,GAAQjC,EAAOC;OAI5C8C,EAAMJ,GAhCN,kBAAoB;OAoCT,IAAhBF,EACI,SAASK,UACRD,EAAYrB,EAAO,GAAIsB,IAIG,QAA/B1C,EAAOkC,QAAQU,YACX,SAASF,WACJ5C,EAAPrB,EAAI,EAAUkE,EAAM,EACjBlE,EAAI4D,EAAa5D,IAAK,KAC5BqB,EAAQ2C,EAAYrB,EAAO3C,GAAIiE,KAClB,EAAG,OAAO;AACvBC,GAAO7C,SAED6C,EAAMN,GAGP,SAASK,OACXC,EAAM;OACVpC,EAAQa,GAAQxB,IACf+C,GAAOF,EAAY7C,EAAO8C,MAEpBC,EAAMN,GAYhBQ,gBAAgB5B,EAAciB,OACzBlC,EAAU+B,KAAKI,cAAclB,EAAOiB;OACjCH,KAAKe,iBAAiB9C,GAG9B8C,iBAAiB9C,OACZvB,EAAGsE,EAAGC,EAAUC,EAAiBC,EAAYC;MAE3CC,EAAOrB,KACbG,EAAWlC,EAAOkC,QAClBmB,GAAUrD,EAAOiB,OAASiB,EAAQoB,YAAepB,EAAQmB,KACzDE,EAAY,GACZC,EAAc,GAWRC,EAAY,SAASrE,EAAMsE,SACnB,WAATtE,EAA0BsE,EAAO5D,MAC9BE,EAAOwC,UAAUY,EAAKtC,MAAM4C,EAAOC,IAAKvE;GAI5CiE,MACE5E,EAAI,EAAGsE,EAAIM,EAAK7D,OAAQf,EAAIsE,EAAGtE,KAC/BuB,EAAOiB,OAA2B,WAAlBoC,EAAK5E,GAAGoD,QAC3B0B,EAAUvB,KAAKqB,EAAK5E;GAOnBuB,EAAOiB,MAAO,KACjBkC,GAAiB,EACZ1E,EAAI,EAAGsE,EAAIQ,EAAU/D,OAAQf,EAAIsE,EAAGtE,OACb,WAAvB8E,EAAU9E,GAAGoD,MAAoB,CACpCsB,GAAiB;MAIfA,GACHI,EAAUK,QAAQ,CAAC/B,MAAO,SAAUgC,UAAW,kBAG3CpF,EAAI,EAAGsE,EAAIQ,EAAU/D,OAAQf,EAAIsE,EAAGtE,OACb,WAAvB8E,EAAU9E,GAAGoD,MAAoB,CACpC0B,EAAUO,OAAOrF,EAAG;UAMlBA,EAAI,EAAGsE,EAAIQ,EAAU/D,OAAQf,EAAIsE,EAAGtE,IACxC+E,EAAYxB,KAAgC,SAA3BuB,EAAU9E,GAAGoF,WAAwB,EAAI;OAI3DZ,EAAkBM,EAAU/D,QAGG,IAApByD,GACVD,EAAWO,EAAU,GAAG1B,MACxBqB,EAAaM,EAAY,GAClB,SAAS7C,EAAGC,UACXsC,EAAaxC,EACnB+C,EAAUT,EAAUrC,GACpB8C,EAAUT,EAAUpC,MAIf,SAASD,EAAGC,OACdnC,EAAGiF,EAAQ7B;IACVpD,EAAI,EAAGA,EAAIwE,EAAiBxE,OAChCoD,EAAQ0B,EAAU9E,GAAGoD,MACrB6B,EAASF,EAAY/E,GAAKiC,EACzB+C,EAAU5B,EAAOlB,GACjB8C,EAAU5B,EAAOjB,IAEN,OAAO8C;OAEb,GArBD,KAgCTvB,cAAclB,EAAc8C,SACrB5C,EAAU;IACZe,EAAWX,OAAOyC,OAAO,GAAGD;GAEhC5D,EAAY+B,EAAQ,QACpB/B,EAAY+B,EAAQ,cAGhBA,EAAQI,OAAQ,IACnBnC,EAAY+B,EAAQ,UAChB7B,MAAMC,QAAQ4B,EAAQI,SAAwC,iBAAtBJ,EAAQI,OAAO,GAAiB,KACvEA,EAAS;AACbJ,EAAQI,OAAO/D,SAAS0F,IACvB3B,EAAON,KAAK,CAACH,MAAMoC,OAEpB/B,EAAQI,OAASA,EAIlBJ,EAAQI,OAAO/D,SAAS2F,IACvB/C,EAAQ+C,EAAarC,OAAU,WAAYqC,EAAgBA,EAAarE,OAAS,WAM5E,CACNqC,QAAWA,EACXjB,MAJDA,EAAQnD,EAAWmD,EAAQ,IAAK/C,cAAciG,OAK7C/C,OAAUW,KAAKf,SAASC,EAAOiB,EAAQhB,wBAAyBC,GAChEiD,MAAS,EACTtD,MAAS,GACTK,QAAWA,EACXqB,UAAaN,EAAQmC,QAAWhF,EAAiBH,GAQnDc,OAAOiB,EAAciB,OACHpC,EAAOE,EACpBsE,EACAC,EAFAnB,EAAOrB;OAIX/B,EAAU+B,KAAKI,cAAclB,EAAOiB,GACpCA,EAAUlC,EAAOkC,QACjBjB,EAAUjB,EAAOiB,MAGjBsD,EAAWrC,EAAQpC,OAASsD,EAAKhB,kBAAkBpC,GAG/CiB,EAAMzB,OACTe,EAAQ6C,EAAKtC,OAAO,CAAC0D,EAAMb,KAC1B7D,EAAQyE,EAASC,KACM,IAAnBtC,EAAQuC,QAAoB3E,EAAQ,IACvCE,EAAOc,MAAMkB,KAAK,OAAUlC,KAAa6D,OAI3CpD,EAAQ6C,EAAKtC,OAAO,CAAC0D,EAAMb,KAC1B3D,EAAOc,MAAMkB,KAAK,OAAU,KAAS2B,QAIvCW,EAAUlB,EAAKN,iBAAiB9C,KACnBA,EAAOc,MAAMuC,KAAKiB,GAG/BtE,EAAOoE,MAAQpE,EAAOc,MAAMtB,OACC,iBAAlB0C,EAAQwC,QAClB1E,EAAOc,MAAQd,EAAOc,MAAM6D,MAAM,EAAGzC,EAAQwC,QAGvC1E"} \ No newline at end of file +{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","diacritics","diacriticRegexPoints","regex","latin_convert","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","generateDiacritics","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","this","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","optsUser","assign","fld_name","field_params","trim","total","nesting","fn_sort","fn_score","item","filter","limit","slice"],"mappings":";AA6GA,IAAIA,EAAc,CACjB,CAAE,GAAI,IACN,CAAE,IAAK,KACP,CAAE,IAAK,KACP,CAAE,IAAK,KACP,CAAE,IAAK,KACP,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO;AAQH,SAASC,EAAUC,UAClBA,EAAIC,UAAU,OAAOC,QAAQ,mBAAoB,IAAID,UAAU,QAAQE,cA4F/E,IAAIC,EAA4B;AACzB,SAASC,EAAqBC,GAEjB,OAAfF,IACHA,EAnDK,eAEFG,EAAgB,MACb,SACA,QACD,SACA,SACC,UACC,MAGJH,EAAa;OAEjBN,EAAYU,SAASC,QAEhB,IAAIC,EAAID,EAAW,GAAIC,GAAKD,EAAW,GAAIC,IAAI,KAC9CC,EAAYC,OAAOC,aAAaH,GAChCI,EAASH,EAAUV,UAAU,OAAOC,QAAQ,mBAAoB,IAAID,UAAU;AAE9Ea,GAASH,IAKbG,EAAQA,EAAMX,cAEVW,KAASP,IACZO,EAAQP,EAAcO,IAGjBA,KAASV,IACdA,EAAWU,GAASA,EAAQA,EAAMC,eAEnCX,EAAWU,IAAUH,OAMhBP,EAYOY;IAGT,IAAIF,KAASV,EACbA,EAAWa,eAAeH,KAC7BR,EAAQA,EAAMJ,QAAS,IAAIgB,OAAOJ,EAAM,KAAM,IAAIV,EAAWU,GAAO;OAG/DR,EC3OD,SAASa,EAAQC,EAAwBC,MACvCD,SACEA,EAAIC,GASR,SAASC,EAAeF,EAAwBC,MAC9CD,WACDG,EAAQF,EAAKG,MAAM,KACjBD,EAAME,SAAWL,EAAMA,EAAIG,EAAMG,mBAChCN,GAUJ,SAASO,EAAWC,EAAcC,EAAOC,OAC3CC,EAAOC;OAENJ,GAIQ,KADbI,GADAJ,GAAgB,IACJK,OAAOJ,EAAMvB,QACF,GAEvByB,EAAQF,EAAMK,OAAOT,OAASG,EAAMH,OACxB,IAARO,IAAWD,GAAS,IAEjBA,EAAQD,GATI,EAYb,SAASK,EAAanC,UACpBA,EAAM,IAAIE,QAAQ,yBAA0B,QAQ9C,SAASkC,EAAYhB,EAAKiB,OAC5BT,EAAQR,EAAIiB;AACZT,IAAUU,MAAMC,QAAQX,KAC3BR,EAAIiB,GAAO,CAACT,IAgBP,SAASY,EAAQC,EAAQC,MAE1BJ,MAAMC,QAAQE,GAClBA,EAAOjC,QAAQkC;SAIV,IAAIL,KAAOI,EACXA,EAAOxB,eAAeoB,IACzBK,EAASD,EAAOJ,GAAMA,GAQnB,SAASM,EAAIC,EAAGC,SACL,iBAAND,GAA+B,iBAANC,EAC5BD,EAAIC,EAAI,EAAKD,EAAIC,GAAK,EAAI,GAElCD,EAAI7C,EAAU6C,EAAI,IAAIzC,gBACtB0C,EAAI9C,EAAU8C,EAAI,IAAI1C,eACJ,EACd0C,EAAID,GAAW,EACZ;;;;;;;;;;;;;;;WC5CO,MAcdE,YAAYC,EAAOC,QAZZD,kBACAC,qBAYDD,MAAQA,OACRC,SAAWA,GAAY,CAAC5C,YAAY,GAQ1C6C,SAASC,EAAcC,EAAkCC,OACnDF,IAAUA,EAAMzB,OAAQ,MAAO;MAE9B4B,EAAS,GACTC,EAAQJ,EAAM1B,MAAM;IACtB+B;OAEAH,IACHG,EAAc,IAAIrC,OAAQ,KAAMsC,OAAOC,KAAKL,GAASM,IAAIvB,GAAcwB,KAAK,KAAK,YAGlFL,EAAM9C,SAASoD,QACVC,EACAC,EAAQ,KACRxD,EAAQ;AAGRiD,IAAgBM,EAAcD,EAAKG,MAAMR,MAC5CO,EAAQD,EAAY,GACpBD,EAAOC,EAAY,IAGhBD,EAAKnC,OAAS,IACjBnB,EAAQ6B,EAAayB,GACjBI,KAAKhB,SAAS5C,aACjBE,EAAQD,EAAqBC,IAE1B6C,IAA0B7C,EAAQ,MAAMA,GAC5CA,EAAQ,IAAIY,OAAOZ,EAAO,MAG3B+C,EAAOY,KAAK,CACX/B,OAAS0B,EACTtD,MAASA,EACTwD,MAASA,OAIJT,EAYRa,iBAAiBhB,EAAciB,OAC1BlC,EAAS+B,KAAKI,cAAclB,EAAOiB;OAChCH,KAAKK,kBAAkBpC,GAG/BoC,kBAAkBpC,SACXoB,EAAUpB,EAAOoB,OACvBiB,EAAgBjB,EAAO5B;IAElB6C,SACG,kBAAoB;MAGtBC,EAAStC,EAAOkC,QAAQI,OAC9BnB,EAAYnB,EAAOmB,QACnBoB,EAAeD,EAAO9C,OACtBgD,EAAaxC,EAAOwC;IAEfD,SACG,kBAAoB;MAYtBE,EAGe,IAAhBF,EACI,SAAS3C,EAAc8C,SACvBb,EAAQS,EAAO,GAAGT;OACjBnC,EAAW8C,EAAUE,EAAMb,GAAQjC,EAAOuB,EAAQU,KAIpD,SAASjC,EAAc8C,OACzBC,EAAM;GAGN/C,EAAMiC,MAAO,OAEVlC,EAAQ6C,EAAUE,EAAM9C,EAAMiC;CAE/BjC,EAAMvB,OAASsB,EACnBgD,GAAQ,EAAEJ,EAEVI,GAAOjD,EAAWC,EAAOC,EAAO,QAMjCW,EAAQY,GAAS,CAACtB,EAAQgC,KACzBc,GAAOjD,EAAW8C,EAAUE,EAAMb,GAAQjC,EAAOC;OAI5C8C,EAAMJ;OAIK,IAAhBF,EACI,SAASK,UACRD,EAAYrB,EAAO,GAAIsB,IAIG,QAA/B1C,EAAOkC,QAAQU,YACX,SAASF,WACJ5C,EAAPrB,EAAI,EAAUkE,EAAM,EACjBlE,EAAI4D,EAAa5D,IAAK,KAC5BqB,EAAQ2C,EAAYrB,EAAO3C,GAAIiE,KAClB,EAAG,OAAO;AACvBC,GAAO7C,SAED6C,EAAMN,GAGP,SAASK,OACXC,EAAM;OACVpC,EAAQa,GAAQxB,IACf+C,GAAOF,EAAY7C,EAAO8C,MAEpBC,EAAMN,GAYhBQ,gBAAgB5B,EAAciB,OACzBlC,EAAU+B,KAAKI,cAAclB,EAAOiB;OACjCH,KAAKe,iBAAiB9C,GAG9B8C,iBAAiB9C,OACZvB,EAAGsE,EAAGC,EAAUC,EAAiBC,EAAYC;MAE3CC,EAAOrB,KACbG,EAAWlC,EAAOkC,QAClBmB,GAAUrD,EAAOiB,OAASiB,EAAQoB,YAAepB,EAAQmB,KACzDE,EAAY,GACZC,EAAc,GAWRC,EAAY,SAASrE,EAAMsE,SACnB,WAATtE,EAA0BsE,EAAO5D,MAC9BE,EAAOwC,UAAUY,EAAKtC,MAAM4C,EAAOC,IAAKvE;GAI5CiE,MACE5E,EAAI,EAAGsE,EAAIM,EAAK7D,OAAQf,EAAIsE,EAAGtE,KAC/BuB,EAAOiB,OAA2B,WAAlBoC,EAAK5E,GAAGoD,QAC3B0B,EAAUvB,KAAKqB,EAAK5E;GAOnBuB,EAAOiB,MAAO,KACjBkC,GAAiB,EACZ1E,EAAI,EAAGsE,EAAIQ,EAAU/D,OAAQf,EAAIsE,EAAGtE,OACb,WAAvB8E,EAAU9E,GAAGoD,MAAoB,CACpCsB,GAAiB;MAIfA,GACHI,EAAUK,QAAQ,CAAC/B,MAAO,SAAUgC,UAAW,kBAG3CpF,EAAI,EAAGsE,EAAIQ,EAAU/D,OAAQf,EAAIsE,EAAGtE,OACb,WAAvB8E,EAAU9E,GAAGoD,MAAoB,CACpC0B,EAAUO,OAAOrF,EAAG;UAMlBA,EAAI,EAAGsE,EAAIQ,EAAU/D,OAAQf,EAAIsE,EAAGtE,IACxC+E,EAAYxB,KAAgC,SAA3BuB,EAAU9E,GAAGoF,WAAwB,EAAI;OAI3DZ,EAAkBM,EAAU/D,QAGG,IAApByD,GACVD,EAAWO,EAAU,GAAG1B,MACxBqB,EAAaM,EAAY,GAClB,SAAS7C,EAAGC,UACXsC,EAAaxC,EACnB+C,EAAUT,EAAUrC,GACpB8C,EAAUT,EAAUpC,MAIf,SAASD,EAAGC,OACdnC,EAAGiF,EAAQ7B;IACVpD,EAAI,EAAGA,EAAIwE,EAAiBxE,OAChCoD,EAAQ0B,EAAU9E,GAAGoD,MACrB6B,EAASF,EAAY/E,GAAKiC,EACzB+C,EAAU5B,EAAOlB,GACjB8C,EAAU5B,EAAOjB,IAEN,OAAO8C;OAEb,GArBD,KAgCTvB,cAAclB,EAAc8C,SACrB5C,EAAU;IACZe,EAAWX,OAAOyC,OAAO,GAAGD;GAEhC5D,EAAY+B,EAAQ,QACpB/B,EAAY+B,EAAQ,cAGhBA,EAAQI,OAAQ,IACnBnC,EAAY+B,EAAQ,UAChB7B,MAAMC,QAAQ4B,EAAQI,SAAwC,iBAAtBJ,EAAQI,OAAO,GAAiB,KACvEA,EAAS;AACbJ,EAAQI,OAAO/D,SAAS0F,IACvB3B,EAAON,KAAK,CAACH,MAAMoC,OAEpB/B,EAAQI,OAASA,EAIlBJ,EAAQI,OAAO/D,SAAS2F,IACvB/C,EAAQ+C,EAAarC,OAAU,WAAYqC,EAAgBA,EAAarE,OAAS,WAM5E,CACNqC,QAAWA,EACXjB,MAJDA,EAAQnD,EAAWmD,EAAQ,IAAK/C,cAAciG,OAK7C/C,OAAUW,KAAKf,SAASC,EAAOiB,EAAQhB,wBAAyBC,GAChEiD,MAAS,EACTtD,MAAS,GACTK,QAAWA,EACXqB,UAAaN,EAAQmC,QAAWhF,EAAiBH,GAQnDc,OAAOiB,EAAciB,OACHpC,EAAOE,EACpBsE,EACAC,EAFAnB,EAAOrB;OAIX/B,EAAU+B,KAAKI,cAAclB,EAAOiB,GACpCA,EAAUlC,EAAOkC,QACjBjB,EAAUjB,EAAOiB,MAGjBsD,EAAWrC,EAAQpC,OAASsD,EAAKhB,kBAAkBpC,GAG/CiB,EAAMzB,OACTe,EAAQ6C,EAAKtC,OAAO,CAAC0D,EAAMb,KAC1B7D,EAAQyE,EAASC,KACM,IAAnBtC,EAAQuC,QAAoB3E,EAAQ,IACvCE,EAAOc,MAAMkB,KAAK,OAAUlC,KAAa6D,OAI3CpD,EAAQ6C,EAAKtC,OAAO,CAAC0D,EAAMb,KAC1B3D,EAAOc,MAAMkB,KAAK,OAAU,KAAS2B,QAIvCW,EAAUlB,EAAKN,iBAAiB9C,KACnBA,EAAOc,MAAMuC,KAAKiB,GAG/BtE,EAAOoE,MAAQpE,EAAOc,MAAMtB,OACC,iBAAlB0C,EAAQwC,QAClB1E,EAAOc,MAAQd,EAAOc,MAAM6D,MAAM,EAAGzC,EAAQwC,QAGvC1E"} \ No newline at end of file diff --git a/package.json b/package.json index 0d162b7..7e60636 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.7.1", + "version": "0.7.2", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 8986508a3a022a2273387eb04e8516687be96a0c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jun 2021 08:07:30 +0000 Subject: [PATCH 056/140] Bump jest from 26.6.3 to 27.0.5 Bumps [jest](https://github.com/facebook/jest) from 26.6.3 to 27.0.5. - [Release notes](https://github.com/facebook/jest/releases) - [Changelog](https://github.com/facebook/jest/blob/master/CHANGELOG.md) - [Commits](https://github.com/facebook/jest/compare/v26.6.3...v27.0.5) --- updated-dependencies: - dependency-name: jest dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7e60636..f8a76a4 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@rollup/plugin-babel": "^5.3.0", "coveralls": "^3.1.0", "humanize": "0.0.9", - "jest": "^26.6.3", + "jest": "^27.0.5", "rollup": "^2.45.2", "rollup-plugin-terser": "^7.0.2", "typescript": "^4.2.4" From 9d82757d4c6831217398a328dd064d54c641b10a Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 29 Jun 2021 18:38:05 -0600 Subject: [PATCH 057/140] typings --- lib/diacritics.ts | 14 +++++++++----- lib/sifter.ts | 18 +++++++++--------- lib/utils.ts | 6 +++--- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index d7fc4a1..b7e5f43 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -149,18 +149,19 @@ export function asciifold(str:string):string{ */ // @ts-ignore function toCodePoints(tolerance=8){ - var char_codes = []; + var char_codes:number[] = []; for( let letter in DIACRITICS ){ let _diacritics = DIACRITICS[letter]; for( let n = 0; n < _diacritics.length; n++ ){ var code_point = _diacritics.codePointAt(n); - char_codes.push( code_point ); + if( code_point ) char_codes.push( code_point ); } } //https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range char_codes.sort((a, b) => a - b); + var accumulator: number[][] = []; var result = char_codes.reduce(function (accumulator, currentValue, index, source) { if( !index ){ @@ -171,11 +172,14 @@ function toCodePoints(tolerance=8){ }else{ - accumulator.push( [accumulator.pop()[0],currentValue]); + let range = accumulator.pop(); + if( range ){ + accumulator.push( [range[0],currentValue]); + } } return accumulator; - }, []); + }, accumulator); console.log(`char_codes (${result.length})`,result); } @@ -231,7 +235,7 @@ export function generateDiacritics():TDiacraticList{ * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ * */ -var diacritics:TDiacraticList = null +var diacritics:null|TDiacraticList = null export function diacriticRegexPoints(regex:string):string{ if( diacritics === null ){ diff --git a/lib/sifter.ts b/lib/sifter.ts index d2a3093..183fc4e 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -23,6 +23,7 @@ import { diacriticRegexPoints, asciifold } from './diacritics.ts'; type TField = { field: string, weight?: number, + direction?: string, } type TOptions = { @@ -39,8 +40,8 @@ type TOptions = { type TToken = { string:string, - regex:RegExp, - field:string + regex:RegExp|null, + field:string|null, } type TWeights = {[key:string]:number} @@ -84,8 +85,8 @@ export default class Sifter{ tokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] { if (!query || !query.length) return []; - const tokens = []; - const words = query.split(/\s+/); + const tokens:TToken[] = []; + const words = query.split(/\s+/); var field_regex; if( weights ){ @@ -94,8 +95,8 @@ export default class Sifter{ words.forEach((word:string) => { let field_match; - let field = null; - let regex = null; + let field:null|string = null; + let regex:null|string = null; // look for "field:query" tokens if( field_regex && (field_match = word.match(field_regex)) ){ @@ -108,13 +109,12 @@ export default class Sifter{ if( this.settings.diacritics ){ regex = diacriticRegexPoints(regex); } - if( respect_word_boundaries ) regex = "\\b"+regex - regex = new RegExp(regex, 'i'); + if( respect_word_boundaries ) regex = "\\b"+regex; } tokens.push({ string : word, - regex : regex, + regex : regex ? new RegExp(regex,'i') : null, field : field, }); }); diff --git a/lib/utils.ts b/lib/utils.ts index 8800fd1..cfc71d6 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -21,8 +21,8 @@ export function getAttr(obj:{[key:string]:any}, name:string ) { */ export function getAttrNesting(obj:{[key:string]:any}, name:string ) { if (!obj ) return; - var names = name.split("."); - while(names.length && (obj = obj[names.shift()])); + var part, names = name.split("."); + while( (part = names.shift()) && (obj = obj[part])); return obj; }; @@ -48,7 +48,7 @@ export function scoreValue(value:string, token, weight:number ) { return score * weight; }; -export function escape_regex(str) { +export function escape_regex(str:string):string { return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); }; From 68562b5fba118955519f58da1d875709e24f047e Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 29 Jun 2021 20:14:03 -0600 Subject: [PATCH 058/140] strict:true for TypeScript --- .config/tsconfig.json | 2 +- lib/sifter.ts | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.config/tsconfig.json b/.config/tsconfig.json index d5c6f76..f7f448b 100644 --- a/.config/tsconfig.json +++ b/.config/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "allowJs": true, "checkJs": true, - "strict": false, + "strict": true, "target": "esnext", "module": "esnext", "noUnusedLocals": true, diff --git a/lib/sifter.ts b/lib/sifter.ts index 183fc4e..afb803e 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -23,16 +23,20 @@ import { diacriticRegexPoints, asciifold } from './diacritics.ts'; type TField = { field: string, weight?: number, +} + +type TSort = { + field: string, direction?: string, } type TOptions = { fields: TField[], - sort: any[], + sort: TSort[], score?: ()=>any, filter?: boolean, limit?: number, - sort_empty?: any, + sort_empty?: TSort[], nesting?: boolean, respect_word_boundaries?: boolean, conjunction?: string, @@ -242,9 +246,9 @@ export default class Sifter{ const self = this, options = search.options, - sort = (!search.query && options.sort_empty) || options.sort, - sort_flds = [], - multipliers = []; + sort = (!search.query && options.sort_empty) ? options.sort_empty : options.sort, + sort_flds:TSort[] = [], + multipliers:number[] = []; /** @@ -341,7 +345,7 @@ export default class Sifter{ if( options.fields ){ propToArray(options,'fields'); if( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){ - var fields = []; + const fields:TField[] = []; options.fields.forEach((fld_name) => { fields.push({field:fld_name}); }); From 58fbb354904fd4c23932ac4143477d257f0f73c8 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 30 Jun 2021 14:51:29 -0600 Subject: [PATCH 059/140] noImplicitAny:true --- .config/tsconfig.json | 1 - lib/diacritics.ts | 4 +- lib/sifter.ts | 99 +++++++++++++++++++++---------------------- lib/utils.ts | 17 ++++---- 4 files changed, 60 insertions(+), 61 deletions(-) diff --git a/.config/tsconfig.json b/.config/tsconfig.json index f7f448b..1ae82d9 100644 --- a/.config/tsconfig.json +++ b/.config/tsconfig.json @@ -7,7 +7,6 @@ "target": "esnext", "module": "esnext", "noUnusedLocals": true, - "noImplicitAny":false, "declaration": true, "declarationDir": "../dist/types", diff --git a/lib/diacritics.ts b/lib/diacritics.ts index b7e5f43..59a0bfa 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -190,7 +190,7 @@ function toCodePoints(tolerance=8){ */ export function generateDiacritics():TDiacraticList{ - var latin_convert = { + var latin_convert:{[key:string]:string} = { 'l·': 'l', 'ʼn': 'n', 'æ': 'ae', @@ -199,7 +199,7 @@ export function generateDiacritics():TDiacraticList{ 'dž': 'dz', }; - var diacritics = {}; + var diacritics:{[key:string]:string} = {}; //var no_latin = []; code_points.forEach((code_range)=>{ diff --git a/lib/sifter.ts b/lib/sifter.ts index afb803e..08d5af3 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -14,15 +14,15 @@ * @author Brian Reavis */ -// @ts-ignore + // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" import { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts'; -// @ts-ignore +// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" import { diacriticRegexPoints, asciifold } from './diacritics.ts'; type TField = { field: string, - weight?: number, + weight: number, } type TSort = { @@ -55,28 +55,35 @@ type TPrepareObj = { query: string, tokens: TToken[], total: number, - items: any[], + items: TResultItem[], weights: TWeights, - getAttrFn: (any,string)=>any, + getAttrFn: (data:any,field:string)=>any, } +type TSettings = { + diacritics:boolean +} + +type TResultItem = { + score: number, + id: number|string, +} + + export default class Sifter{ - public items: []|{}; - public settings: {diacritics:boolean}; + public items; // []|{}; + public settings: TSettings; /** * Textually searches arrays and hashes of objects * by property (or multiple properties). Designed * specifically for autocomplete. * - * @constructor - * @param {array|object} items - * @param {object} items */ - constructor(items, settings) { + constructor(items:any, settings:TSettings) { this.items = items; this.settings = settings || {diacritics: true}; }; @@ -91,7 +98,7 @@ export default class Sifter{ const tokens:TToken[] = []; const words = query.split(/\s+/); - var field_regex; + var field_regex:RegExp; if( weights ){ field_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\:(.*)$'); @@ -135,7 +142,7 @@ export default class Sifter{ * * @returns {function} */ - getScoreFunction(query:string, options ){ + getScoreFunction(query:string, options:TOptions ){ var search = this.prepareSearch(query, options); return this._getScoreFunction(search); } @@ -170,13 +177,13 @@ export default class Sifter{ if (field_count === 1) { - return function(token:TToken, data) { + return function(token:TToken, data:{}) { const field = fields[0].field; return scoreValue(getAttrFn(data, field), token, weights[field]); }; } - return function(token:TToken, data) { + return function(token:TToken, data:{}) { var sum = 0; // is the token specific to a field? @@ -193,7 +200,7 @@ export default class Sifter{ }else{ - iterate(weights, (weight, field) => { + iterate(weights, (weight:number, field:string) => { sum += scoreValue(getAttrFn(data, field), token, weight); }); } @@ -203,13 +210,13 @@ export default class Sifter{ })(); if (token_count === 1) { - return function(data) { + return function(data:{}) { return scoreObject(tokens[0], data); }; } if (search.options.conjunction === 'and') { - return function(data) { + return function(data:{}) { var i = 0, score, sum = 0; for (; i < token_count; i++) { score = scoreObject(tokens[i], data); @@ -219,7 +226,7 @@ export default class Sifter{ return sum / token_count; }; } else { - return function(data) { + return function(data:{}) { var sum = 0; iterate(tokens,(token:TToken)=>{ sum += scoreObject(token, data); @@ -236,13 +243,13 @@ export default class Sifter{ * * @return function(a,b) */ - getSortFunction(query:string, options) { + getSortFunction(query:string, options:TOptions) { var search = this.prepareSearch(query, options); return this._getSortFunction(search); } _getSortFunction(search:TPrepareObj){ - var i, n, sort_fld, sort_flds_count, multiplier, implicit_score; + var i, n, implicit_score; const self = this, options = search.options, @@ -255,11 +262,8 @@ export default class Sifter{ * Fetches the specified sort field value * from a search result item. * - * @param {string} name - * @param {object} result - * @return {string} */ - const get_field = function(name, result) { + const get_field = function(name:string, result:TResultItem):string|number { if (name === '$score') return result.score; return search.getAttrFn(self.items[result.id], name); }; @@ -300,20 +304,20 @@ export default class Sifter{ } // build function - sort_flds_count = sort_flds.length; + const sort_flds_count = sort_flds.length; if (!sort_flds_count) { return null; } else if (sort_flds_count === 1) { - sort_fld = sort_flds[0].field; - multiplier = multipliers[0]; - return function(a, b) { + const sort_fld = sort_flds[0].field; + const multiplier = multipliers[0]; + return function(a:TResultItem, b:TResultItem) { return multiplier * cmp( get_field(sort_fld, a), get_field(sort_fld, b) ); }; } else { - return function(a, b) { + return function(a:TResultItem, b:TResultItem) { var i, result, field; for (i = 0; i < sort_flds_count; i++) { field = sort_flds[i].field; @@ -334,8 +338,8 @@ export default class Sifter{ * with results. * */ - prepareSearch(query:string, optsUser):TPrepareObj { - const weights = {}; + prepareSearch(query:string, optsUser:TOptions):TPrepareObj { + const weights:TWeights = {}; var options = Object.assign({},optsUser); propToArray(options,'sort'); @@ -344,18 +348,15 @@ export default class Sifter{ // convert fields to new format if( options.fields ){ propToArray(options,'fields'); - if( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){ - const fields:TField[] = []; - options.fields.forEach((fld_name) => { - fields.push({field:fld_name}); - }); - options.fields = fields; - } - - - options.fields.forEach((field_params)=>{ - weights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1; + const fields:TField[] = []; + options.fields.forEach((field:string|TField) => { + if( typeof field == 'string' ){ + field = {field:field,weight:1}; + } + fields.push(field); + weights[field.field] = ('weight' in field) ? field.weight : 1; }); + options.fields = fields; } query = asciifold( query + '' ).toLowerCase().trim(); @@ -376,32 +377,30 @@ export default class Sifter{ * */ search(query:string, options:TOptions) : TPrepareObj { - var self = this, score, search; - var fn_sort; - var fn_score; + var self = this, score, search:TPrepareObj; search = this.prepareSearch(query, options); options = search.options; query = search.query; // generate result scoring function - fn_score = options.score || self._getScoreFunction(search); + const fn_score = options.score || self._getScoreFunction(search); // perform search and sort if (query.length) { - iterate(self.items, (item, id) => { + iterate(self.items, (item:TResultItem, id:string|number) => { score = fn_score(item); if (options.filter === false || score > 0) { search.items.push({'score': score, 'id': id}); } }); } else { - iterate(self.items, (item, id) => { + iterate(self.items, (item:TResultItem, id:string|number) => { search.items.push({'score': 1, 'id': id}); }); } - fn_sort = self._getSortFunction(search); + const fn_sort = self._getSortFunction(search); if (fn_sort) search.items.sort(fn_sort); // apply limits diff --git a/lib/utils.ts b/lib/utils.ts index cfc71d6..2801576 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -1,7 +1,11 @@ -// @ts-ignore +// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" import { asciifold } from './diacritics.ts'; +// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" +import { TToken } from './sifter.ts'; + + /** * A property getter resolving dot-notation * @param {Object} obj The root object to fetch property on @@ -30,10 +34,8 @@ export function getAttrNesting(obj:{[key:string]:any}, name:string ) { * Calculates how close of a match the * given value is against a search token. * - * @param {object} token - * @return {number} */ -export function scoreValue(value:string, token, weight:number ) { +export function scoreValue(value:string, token:TToken, weight:number ):number { var score, pos; if (!value) return 0; @@ -57,7 +59,7 @@ export function escape_regex(str:string):string { * Cast object property to an array if it exists and has a value * */ -export function propToArray(obj, key){ +export function propToArray(obj:{[key:string]:any}, key:string){ var value = obj[key]; if( value && !Array.isArray(value) ){ obj[key] = [value]; @@ -74,9 +76,8 @@ export function propToArray(obj, key){ * }); * ``` * - * @param {array|object} object */ -export function iterate(object, callback) { +export function iterate(object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) { if ( Array.isArray(object)) { object.forEach(callback); @@ -93,7 +94,7 @@ export function iterate(object, callback) { -export function cmp(a, b) { +export function cmp(a:number|string, b:number|string) { if (typeof a === 'number' && typeof b === 'number') { return a > b ? 1 : (a < b ? -1 : 0); } From 209b6630d59ae91fff3b2693a3d112b4e8fd474d Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 30 Jun 2021 15:08:32 -0600 Subject: [PATCH 060/140] add types --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 7e60636..dbb43e3 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "main": "dist/umd/sifter.js", "browser": "dist/umd/sifter.js", "module": "dist/esm/sifter.js", + "types": "lib/sifter.ts", "repository": { "type": "git", "url": "https://github.com/orchidjs/sifter.js.git" From 1652ef97492eb4b45441f667333f36841abb9b26 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 30 Jun 2021 15:12:58 -0600 Subject: [PATCH 061/140] v0.7.3 Release --- dist/cjs/diacritics.js.map | 2 +- dist/cjs/sifter.js | 52 ++++++++++++++----------------- dist/cjs/sifter.js.map | 2 +- dist/cjs/utils.js | 12 +++---- dist/cjs/utils.js.map | 2 +- dist/esm/diacritics.js.map | 2 +- dist/esm/sifter.js | 52 ++++++++++++++----------------- dist/esm/sifter.js.map | 2 +- dist/esm/utils.js | 12 +++---- dist/esm/utils.js.map | 2 +- dist/umd/sifter.js | 64 +++++++++++++++++--------------------- dist/umd/sifter.js.map | 2 +- dist/umd/sifter.min.js | 49 ++++++++++++++++------------- dist/umd/sifter.min.js.map | 2 +- package.json | 2 +- 15 files changed, 121 insertions(+), 138 deletions(-) diff --git a/dist/cjs/diacritics.js.map b/dist/cjs/diacritics.js.map index c77bb5e..5932313 100644 --- a/dist/cjs/diacritics.js.map +++ b/dist/cjs/diacritics.js.map @@ -1 +1 @@ -{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp"],"mappings":"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"} \ No newline at end of file diff --git a/dist/cjs/sifter.js b/dist/cjs/sifter.js index bc66761..aa20e92 100644 --- a/dist/cjs/sifter.js +++ b/dist/cjs/sifter.js @@ -20,14 +20,13 @@ var diacritics = require('./diacritics.js'); * @author Brian Reavis */ class Sifter { + // []|{}; + /** * Textually searches arrays and hashes of objects * by property (or multiple properties). Designed * specifically for autocomplete. * - * @constructor - * @param {array|object} items - * @param {object} items */ constructor(items, settings) { this.items = void 0; @@ -71,12 +70,11 @@ class Sifter { } if (respect_word_boundaries) regex = "\\b" + regex; - regex = new RegExp(regex, 'i'); } tokens.push({ string: word, - regex: regex, + regex: regex ? new RegExp(regex, 'i') : null, field: field }); }); @@ -199,19 +197,16 @@ class Sifter { } _getSortFunction(search) { - var i, n, sort_fld, sort_flds_count, multiplier, implicit_score; + var i, n, implicit_score; const self = this, options = search.options, - sort = !search.query && options.sort_empty || options.sort, + sort = !search.query && options.sort_empty ? options.sort_empty : options.sort, sort_flds = [], multipliers = []; /** * Fetches the specified sort field value * from a search result item. * - * @param {string} name - * @param {object} result - * @return {string} */ const get_field = function get_field(name, result) { @@ -260,13 +255,13 @@ class Sifter { } // build function - sort_flds_count = sort_flds.length; + const sort_flds_count = sort_flds.length; if (!sort_flds_count) { return null; } else if (sort_flds_count === 1) { - sort_fld = sort_flds[0].field; - multiplier = multipliers[0]; + const sort_fld = sort_flds[0].field; + const multiplier = multipliers[0]; return function (a, b) { return multiplier * utils.cmp(get_field(sort_fld, a), get_field(sort_fld, b)); }; @@ -299,20 +294,19 @@ class Sifter { if (options.fields) { utils.propToArray(options, 'fields'); + const fields = []; + options.fields.forEach(field => { + if (typeof field == 'string') { + field = { + field: field, + weight: 1 + }; + } - if (Array.isArray(options.fields) && typeof options.fields[0] !== 'object') { - var fields = []; - options.fields.forEach(fld_name => { - fields.push({ - field: fld_name - }); - }); - options.fields = fields; - } - - options.fields.forEach(field_params => { - weights[field_params.field] = 'weight' in field_params ? field_params.weight : 1; + fields.push(field); + weights[field.field] = 'weight' in field ? field.weight : 1; }); + options.fields = fields; } query = diacritics.asciifold(query + '').toLowerCase().trim(); @@ -335,13 +329,12 @@ class Sifter { var self = this, score, search; - var fn_sort; - var fn_score; search = this.prepareSearch(query, options); options = search.options; query = search.query; // generate result scoring function - fn_score = options.score || self._getScoreFunction(search); // perform search and sort + const fn_score = options.score || self._getScoreFunction(search); // perform search and sort + if (query.length) { utils.iterate(self.items, (item, id) => { @@ -363,7 +356,8 @@ class Sifter { }); } - fn_sort = self._getSortFunction(search); + const fn_sort = self._getSortFunction(search); + if (fn_sort) search.items.sort(fn_sort); // apply limits search.total = search.items.length; diff --git a/dist/cjs/sifter.js.map b/dist/cjs/sifter.js.map index d2ea6eb..e9d034b 100644 --- a/dist/cjs/sifter.js.map +++ b/dist/cjs/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","a","b","cmp","optsUser","assign","propToArray","Array","isArray","fld_name","field_params","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight: number,\n}\n\ntype TSort = {\n\tfield: string,\n\tdirection?: string,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: TSort[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: TSort[],\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp|null,\n\tfield:string|null,\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: TResultItem[],\n\tweights: TWeights,\n\tgetAttrFn: (data:any,field:string)=>any,\n\n}\n\ntype TSettings = {\n\tdiacritics:boolean\n}\n\ntype TResultItem = {\n\tscore: number,\n\tid: number|string,\n}\n\n\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: TSettings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:TSettings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:TToken[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:TOptions ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:TOptions) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:TSort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:TResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:TOptions):TPrepareObj {\n\t\tconst weights:TWeights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:TField[] = [];\n\t\t\toptions.fields.forEach((field:string|TField) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search:TPrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","a","b","cmp","optsUser","assign","propToArray","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/cjs/utils.js b/dist/cjs/utils.js index 638401e..6be7309 100644 --- a/dist/cjs/utils.js +++ b/dist/cjs/utils.js @@ -5,14 +5,14 @@ Object.defineProperty(exports, '__esModule', { value: true }); var diacritics = require('./diacritics.js'); -// @ts-ignore +// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" + /** * A property getter resolving dot-notation * @param {Object} obj The root object to fetch property on * @param {String} name The optionally dotted property name to fetch * @return {Object} The resolved property value */ - function getAttr(obj, name) { if (!obj) return; return obj[name]; @@ -26,9 +26,10 @@ function getAttr(obj, name) { function getAttrNesting(obj, name) { if (!obj) return; - var names = name.split("."); + var part, + names = name.split("."); - while (names.length && (obj = obj[names.shift()])); + while ((part = names.shift()) && (obj = obj[part])); return obj; } @@ -36,8 +37,6 @@ function getAttrNesting(obj, name) { * Calculates how close of a match the * given value is against a search token. * - * @param {object} token - * @return {number} */ function scoreValue(value, token, weight) { @@ -74,7 +73,6 @@ function propToArray(obj, key) { * }); * ``` * - * @param {array|object} object */ function iterate(object, callback) { diff --git a/dist/cjs/utils.js.map b/dist/cjs/utils.js.map index b86c3bf..213edae 100644 --- a/dist/cjs/utils.js.map +++ b/dist/cjs/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","regex","string","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":";;;;;;;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;;AACO,SAASA,OAAT,CAAiBC,GAAjB,EAAyCC,IAAzC,EAAuD;AAC1D,MAAI,CAACD,GAAL,EAAW;AACX,SAAOA,GAAG,CAACC,IAAD,CAAV;AACH;AAED;AACA;AACA;AACA;AACA;AACA;;AACO,SAASC,cAAT,CAAwBF,GAAxB,EAAgDC,IAAhD,EAA8D;AACjE,MAAI,CAACD,GAAL,EAAW;AACX,MAAIG,KAAK,GAAGF,IAAI,CAACG,KAAL,CAAW,GAAX,CAAZ;;AACA,SAAMD,KAAK,CAACE,MAAN,KAAiBL,GAAG,GAAGA,GAAG,CAACG,KAAK,CAACG,KAAN,EAAD,CAA1B,CAAN,CAAiD;;AACjD,SAAON,GAAP;AACH;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AACO,SAASO,UAAT,CAAoBC,KAApB,EAAkCC,KAAlC,EAAyCC,MAAzC,EAAyD;AAC/D,MAAIC,KAAJ,EAAWC,GAAX;AAEA,MAAI,CAACJ,KAAL,EAAY,OAAO,CAAP;AAEZA,EAAAA,KAAK,GAAGA,KAAK,GAAG,EAAhB;AACAI,EAAAA,GAAG,GAAGJ,KAAK,CAACK,MAAN,CAAaJ,KAAK,CAACK,KAAnB,CAAN;AACA,MAAIF,GAAG,KAAK,CAAC,CAAb,EAAgB,OAAO,CAAP;AAEhBD,EAAAA,KAAK,GAAGF,KAAK,CAACM,MAAN,CAAaV,MAAb,GAAsBG,KAAK,CAACH,MAApC;AACA,MAAIO,GAAG,KAAK,CAAZ,EAAeD,KAAK,IAAI,GAAT;AAEf,SAAOA,KAAK,GAAGD,MAAf;AACA;AAEM,SAASM,YAAT,CAAsBC,GAAtB,EAA2B;AACjC,SAAO,CAACA,GAAG,GAAG,EAAP,EAAWC,OAAX,CAAmB,wBAAnB,EAA6C,MAA7C,CAAP;AACA;AAGD;AACA;AACA;AACA;;AACO,SAASC,WAAT,CAAqBnB,GAArB,EAA0BoB,GAA1B,EAA8B;AACpC,MAAIZ,KAAK,GAAGR,GAAG,CAACoB,GAAD,CAAf;;AACA,MAAIZ,KAAK,IAAI,CAACa,KAAK,CAACC,OAAN,CAAcd,KAAd,CAAd,EAAoC;AACnCR,IAAAA,GAAG,CAACoB,GAAD,CAAH,GAAW,CAACZ,KAAD,CAAX;AACA;AACD;AAGD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACO,SAASe,OAAT,CAAiBC,MAAjB,EAAyBC,QAAzB,EAAmC;AAEzC,MAAKJ,KAAK,CAACC,OAAN,CAAcE,MAAd,CAAL,EAA4B;AAC3BA,IAAAA,MAAM,CAACE,OAAP,CAAeD,QAAf;AAEA,GAHD,MAGK;AAEJ,SAAK,IAAIL,GAAT,IAAgBI,MAAhB,EAAwB;AACvB,UAAIA,MAAM,CAACG,cAAP,CAAsBP,GAAtB,CAAJ,EAAgC;AAC/BK,QAAAA,QAAQ,CAACD,MAAM,CAACJ,GAAD,CAAP,EAAcA,GAAd,CAAR;AACA;AACD;AACD;AACD;AAIM,SAASQ,GAAT,CAAaC,CAAb,EAAgBC,CAAhB,EAAmB;AACzB,MAAI,OAAOD,CAAP,KAAa,QAAb,IAAyB,OAAOC,CAAP,KAAa,QAA1C,EAAoD;AACnD,WAAOD,CAAC,GAAGC,CAAJ,GAAQ,CAAR,GAAaD,CAAC,GAAGC,CAAJ,GAAQ,CAAC,CAAT,GAAa,CAAjC;AACA;;AACDD,EAAAA,CAAC,GAAGE,oBAAS,CAACF,CAAC,GAAG,EAAL,CAAT,CAAkBG,WAAlB,EAAJ;AACAF,EAAAA,CAAC,GAAGC,oBAAS,CAACD,CAAC,GAAG,EAAL,CAAT,CAAkBE,WAAlB,EAAJ;AACA,MAAIH,CAAC,GAAGC,CAAR,EAAW,OAAO,CAAP;AACX,MAAIA,CAAC,GAAGD,CAAR,EAAW,OAAO,CAAC,CAAR;AACX,SAAO,CAAP;AACA;;;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { TToken } from './sifter.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport function scoreValue(value:string, token:TToken, weight:number ):number {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str:string):string {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj:{[key:string]:any}, key:string){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport function iterate(object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a:number|string, b:number|string) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","regex","string","length","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/diacritics.js.map b/dist/esm/diacritics.js.map index 4ff2c5d..bcaff60 100644 --- a/dist/esm/diacritics.js.map +++ b/dist/esm/diacritics.js.map @@ -1 +1 @@ -{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/sifter.js b/dist/esm/sifter.js index 28621bc..88094d1 100644 --- a/dist/esm/sifter.js +++ b/dist/esm/sifter.js @@ -18,14 +18,13 @@ import { diacriticRegexPoints, asciifold } from './diacritics.js'; * @author Brian Reavis */ class Sifter { + // []|{}; + /** * Textually searches arrays and hashes of objects * by property (or multiple properties). Designed * specifically for autocomplete. * - * @constructor - * @param {array|object} items - * @param {object} items */ constructor(items, settings) { this.items = void 0; @@ -69,12 +68,11 @@ class Sifter { } if (respect_word_boundaries) regex = "\\b" + regex; - regex = new RegExp(regex, 'i'); } tokens.push({ string: word, - regex: regex, + regex: regex ? new RegExp(regex, 'i') : null, field: field }); }); @@ -197,19 +195,16 @@ class Sifter { } _getSortFunction(search) { - var i, n, sort_fld, sort_flds_count, multiplier, implicit_score; + var i, n, implicit_score; const self = this, options = search.options, - sort = !search.query && options.sort_empty || options.sort, + sort = !search.query && options.sort_empty ? options.sort_empty : options.sort, sort_flds = [], multipliers = []; /** * Fetches the specified sort field value * from a search result item. * - * @param {string} name - * @param {object} result - * @return {string} */ const get_field = function get_field(name, result) { @@ -258,13 +253,13 @@ class Sifter { } // build function - sort_flds_count = sort_flds.length; + const sort_flds_count = sort_flds.length; if (!sort_flds_count) { return null; } else if (sort_flds_count === 1) { - sort_fld = sort_flds[0].field; - multiplier = multipliers[0]; + const sort_fld = sort_flds[0].field; + const multiplier = multipliers[0]; return function (a, b) { return multiplier * cmp(get_field(sort_fld, a), get_field(sort_fld, b)); }; @@ -297,20 +292,19 @@ class Sifter { if (options.fields) { propToArray(options, 'fields'); + const fields = []; + options.fields.forEach(field => { + if (typeof field == 'string') { + field = { + field: field, + weight: 1 + }; + } - if (Array.isArray(options.fields) && typeof options.fields[0] !== 'object') { - var fields = []; - options.fields.forEach(fld_name => { - fields.push({ - field: fld_name - }); - }); - options.fields = fields; - } - - options.fields.forEach(field_params => { - weights[field_params.field] = 'weight' in field_params ? field_params.weight : 1; + fields.push(field); + weights[field.field] = 'weight' in field ? field.weight : 1; }); + options.fields = fields; } query = asciifold(query + '').toLowerCase().trim(); @@ -333,13 +327,12 @@ class Sifter { var self = this, score, search; - var fn_sort; - var fn_score; search = this.prepareSearch(query, options); options = search.options; query = search.query; // generate result scoring function - fn_score = options.score || self._getScoreFunction(search); // perform search and sort + const fn_score = options.score || self._getScoreFunction(search); // perform search and sort + if (query.length) { iterate(self.items, (item, id) => { @@ -361,7 +354,8 @@ class Sifter { }); } - fn_sort = self._getSortFunction(search); + const fn_sort = self._getSortFunction(search); + if (fn_sort) search.items.sort(fn_sort); // apply limits search.total = search.items.length; diff --git a/dist/esm/sifter.js.map b/dist/esm/sifter.js.map index 9307df1..3391229 100644 --- a/dist/esm/sifter.js.map +++ b/dist/esm/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","a","b","cmp","optsUser","assign","propToArray","Array","isArray","fld_name","field_params","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight: number,\n}\n\ntype TSort = {\n\tfield: string,\n\tdirection?: string,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: TSort[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: TSort[],\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp|null,\n\tfield:string|null,\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: TResultItem[],\n\tweights: TWeights,\n\tgetAttrFn: (data:any,field:string)=>any,\n\n}\n\ntype TSettings = {\n\tdiacritics:boolean\n}\n\ntype TResultItem = {\n\tscore: number,\n\tid: number|string,\n}\n\n\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: TSettings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:TSettings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:TToken[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:TOptions ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:TOptions) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:TSort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:TResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:TOptions):TPrepareObj {\n\t\tconst weights:TWeights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:TField[] = [];\n\t\t\toptions.fields.forEach((field:string|TField) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search:TPrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","a","b","cmp","optsUser","assign","propToArray","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/utils.js b/dist/esm/utils.js index 15afd56..645403f 100644 --- a/dist/esm/utils.js +++ b/dist/esm/utils.js @@ -1,14 +1,14 @@ /*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ import { asciifold } from './diacritics.js'; -// @ts-ignore +// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" + /** * A property getter resolving dot-notation * @param {Object} obj The root object to fetch property on * @param {String} name The optionally dotted property name to fetch * @return {Object} The resolved property value */ - function getAttr(obj, name) { if (!obj) return; return obj[name]; @@ -22,9 +22,10 @@ function getAttr(obj, name) { function getAttrNesting(obj, name) { if (!obj) return; - var names = name.split("."); + var part, + names = name.split("."); - while (names.length && (obj = obj[names.shift()])); + while ((part = names.shift()) && (obj = obj[part])); return obj; } @@ -32,8 +33,6 @@ function getAttrNesting(obj, name) { * Calculates how close of a match the * given value is against a search token. * - * @param {object} token - * @return {number} */ function scoreValue(value, token, weight) { @@ -70,7 +69,6 @@ function propToArray(obj, key) { * }); * ``` * - * @param {array|object} object */ function iterate(object, callback) { diff --git a/dist/esm/utils.js.map b/dist/esm/utils.js.map index 7a2c127..3d09cef 100644 --- a/dist/esm/utils.js.map +++ b/dist/esm/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","regex","string","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { TToken } from './sifter.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport function scoreValue(value:string, token:TToken, weight:number ):number {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str:string):string {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj:{[key:string]:any}, key:string){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport function iterate(object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a:number|string, b:number|string) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","regex","string","length","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file diff --git a/dist/umd/sifter.js b/dist/umd/sifter.js index 5e4b53c..c2d7f1b 100644 --- a/dist/umd/sifter.js +++ b/dist/umd/sifter.js @@ -119,14 +119,14 @@ })(); */ - // @ts-ignore + // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" + /** * A property getter resolving dot-notation * @param {Object} obj The root object to fetch property on * @param {String} name The optionally dotted property name to fetch * @return {Object} The resolved property value */ - function getAttr(obj, name) { if (!obj) return; return obj[name]; @@ -140,9 +140,10 @@ function getAttrNesting(obj, name) { if (!obj) return; - var names = name.split("."); + var part, + names = name.split("."); - while (names.length && (obj = obj[names.shift()])); + while ((part = names.shift()) && (obj = obj[part])); return obj; } @@ -150,8 +151,6 @@ * Calculates how close of a match the * given value is against a search token. * - * @param {object} token - * @return {number} */ function scoreValue(value, token, weight) { @@ -188,7 +187,6 @@ * }); * ``` * - * @param {array|object} object */ function iterate(object, callback) { @@ -230,14 +228,13 @@ * @author Brian Reavis */ class Sifter { + // []|{}; + /** * Textually searches arrays and hashes of objects * by property (or multiple properties). Designed * specifically for autocomplete. * - * @constructor - * @param {array|object} items - * @param {object} items */ constructor(items, settings) { this.items = void 0; @@ -281,12 +278,11 @@ } if (respect_word_boundaries) regex = "\\b" + regex; - regex = new RegExp(regex, 'i'); } tokens.push({ string: word, - regex: regex, + regex: regex ? new RegExp(regex, 'i') : null, field: field }); }); @@ -409,19 +405,16 @@ } _getSortFunction(search) { - var i, n, sort_fld, sort_flds_count, multiplier, implicit_score; + var i, n, implicit_score; const self = this, options = search.options, - sort = !search.query && options.sort_empty || options.sort, + sort = !search.query && options.sort_empty ? options.sort_empty : options.sort, sort_flds = [], multipliers = []; /** * Fetches the specified sort field value * from a search result item. * - * @param {string} name - * @param {object} result - * @return {string} */ const get_field = function get_field(name, result) { @@ -470,13 +463,13 @@ } // build function - sort_flds_count = sort_flds.length; + const sort_flds_count = sort_flds.length; if (!sort_flds_count) { return null; } else if (sort_flds_count === 1) { - sort_fld = sort_flds[0].field; - multiplier = multipliers[0]; + const sort_fld = sort_flds[0].field; + const multiplier = multipliers[0]; return function (a, b) { return multiplier * cmp(get_field(sort_fld, a), get_field(sort_fld, b)); }; @@ -509,20 +502,19 @@ if (options.fields) { propToArray(options, 'fields'); + const fields = []; + options.fields.forEach(field => { + if (typeof field == 'string') { + field = { + field: field, + weight: 1 + }; + } - if (Array.isArray(options.fields) && typeof options.fields[0] !== 'object') { - var fields = []; - options.fields.forEach(fld_name => { - fields.push({ - field: fld_name - }); - }); - options.fields = fields; - } - - options.fields.forEach(field_params => { - weights[field_params.field] = 'weight' in field_params ? field_params.weight : 1; + fields.push(field); + weights[field.field] = 'weight' in field ? field.weight : 1; }); + options.fields = fields; } query = asciifold(query + '').toLowerCase().trim(); @@ -545,13 +537,12 @@ var self = this, score, search; - var fn_sort; - var fn_score; search = this.prepareSearch(query, options); options = search.options; query = search.query; // generate result scoring function - fn_score = options.score || self._getScoreFunction(search); // perform search and sort + const fn_score = options.score || self._getScoreFunction(search); // perform search and sort + if (query.length) { iterate(self.items, (item, id) => { @@ -573,7 +564,8 @@ }); } - fn_sort = self._getSortFunction(search); + const fn_sort = self._getSortFunction(search); + if (fn_sort) search.items.sort(fn_sort); // apply limits search.total = search.items.length; diff --git a/dist/umd/sifter.js.map b/dist/umd/sifter.js.map index 43b5bd6..293f6ee 100644 --- a/dist/umd/sifter.js.map +++ b/dist/umd/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","optsUser","assign","fld_name","field_params","trim","total","nesting","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { TToken } from './sifter.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport function scoreValue(value:string, token:TToken, weight:number ):number {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str:string):string {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj:{[key:string]:any}, key:string){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport function iterate(object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a:number|string, b:number|string) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight: number,\n}\n\ntype TSort = {\n\tfield: string,\n\tdirection?: string,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: TSort[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: TSort[],\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp|null,\n\tfield:string|null,\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: TResultItem[],\n\tweights: TWeights,\n\tgetAttrFn: (data:any,field:string)=>any,\n\n}\n\ntype TSettings = {\n\tdiacritics:boolean\n}\n\ntype TResultItem = {\n\tscore: number,\n\tid: number|string,\n}\n\n\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: TSettings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:TSettings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:TToken[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:TOptions ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:TOptions) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:TSort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:TResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:TOptions):TPrepareObj {\n\t\tconst weights:TWeights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:TField[] = [];\n\t\t\toptions.fields.forEach((field:string|TField) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search:TPrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","string","length","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit","slice"],"mappings":";;;;;;;CAGA;CAsGA;CACA;CACA;CACA;;CACA,IAAIA,WAAW,GAAG,CACjB,CAAE,EAAF,EAAM,EAAN,CADiB,EAEjB,CAAE,GAAF,EAAO,GAAP,CAFiB,EAGjB,CAAE,GAAF,EAAO,GAAP,CAHiB,EAIjB,CAAE,GAAF,EAAO,GAAP,CAJiB,EAKjB,CAAE,GAAF,EAAO,GAAP,CALiB,EAMjB,CAAE,IAAF,EAAQ,IAAR,CANiB,EAOjB,CAAE,IAAF,EAAQ,IAAR,CAPiB,EAQjB,CAAE,IAAF,EAAQ,IAAR,CARiB,EASjB,CAAE,IAAF,EAAQ,IAAR,CATiB,EAUjB,CAAE,IAAF,EAAQ,IAAR,CAViB,EAWjB,CAAE,IAAF,EAAQ,IAAR,CAXiB,EAYjB,CAAE,IAAF,EAAQ,IAAR,CAZiB,EAajB,CAAE,IAAF,EAAQ,IAAR,CAbiB,EAcjB,CAAE,IAAF,EAAQ,IAAR,CAdiB,EAejB,CAAE,IAAF,EAAQ,IAAR,CAfiB,EAgBjB,CAAE,KAAF,EAAS,KAAT,CAhBiB,EAiBjB,CAAE,KAAF,EAAS,KAAT,CAjBiB,EAkBjB,CAAE,KAAF,EAAS,KAAT,CAlBiB,EAmBjB,CAAE,KAAF,EAAS,KAAT,CAnBiB,EAoBjB,CAAE,KAAF,EAAS,KAAT,CApBiB,EAqBjB,CAAE,KAAF,EAAS,KAAT,CArBiB,EAsBjB,CAAE,KAAF,EAAS,KAAT,CAtBiB,EAuBjB,CAAE,KAAF,EAAS,KAAT,CAvBiB,CAAlB;CA0BA;CACA;CACA;CACA;CACA;;CACO,SAASC,SAAT,CAAmBC,GAAnB,EAAqC;CAC3C,SAAOA,GAAG,CAACC,SAAJ,CAAc,KAAd,EAAqBC,OAArB,CAA6B,kBAA7B,EAAiD,EAAjD,EAAqDD,SAArD,CAA+D,MAA/D,EAAuEE,WAAvE,EAAP;CACA;CA4CD;CACA;CACA;CACA;;;CACO,SAASC,kBAAT,GAA4C;CAElD,MAAIC,aAAmC,GAAG;CACzC,UAAM,GADmC;CAEzC,UAAM,GAFmC;CAGzC,SAAK,IAHoC;CAIzC,SAAK,GAJoC;CAKzC,UAAM,GALmC;CAMzC,WAAO;CANkC,GAA1C;CASA,MAAIC,UAAgC,GAAG,EAAvC,CAXkD;;CAalDR,EAAAA,WAAW,CAACS,OAAZ,CAAqBC,UAAD,IAAc;CAEjC,SAAI,IAAIC,CAAC,GAAGD,UAAU,CAAC,CAAD,CAAtB,EAA2BC,CAAC,IAAID,UAAU,CAAC,CAAD,CAA1C,EAA+CC,CAAC,EAAhD,EAAmD;CAClD,UAAIC,SAAS,GAAGC,MAAM,CAACC,YAAP,CAAoBH,CAApB,CAAhB;CACA,UAAII,KAAK,GAAIH,SAAS,CAACT,SAAV,CAAoB,KAApB,EAA2BC,OAA3B,CAAmC,kBAAnC,EAAuD,EAAvD,EAA2DD,SAA3D,CAAqE,MAArE,CAAb;;CAEA,UAAIY,KAAK,IAAIH,SAAb,EAAwB;CACvB;CACA;CACA;;CAEDG,MAAAA,KAAK,GAAGA,KAAK,CAACV,WAAN,EAAR;;CAEA,UAAIU,KAAK,IAAIR,aAAb,EAA4B;CAC3BQ,QAAAA,KAAK,GAAGR,aAAa,CAACQ,KAAD,CAArB;CACA;;CAED,UAAI,EAAEA,KAAK,IAAIP,UAAX,CAAJ,EAA4B;CAC3BA,QAAAA,UAAU,CAACO,KAAD,CAAV,GAAoBA,KAAK,GAAGA,KAAK,CAACC,WAAN,EAA5B;CACA;;CACDR,MAAAA,UAAU,CAACO,KAAD,CAAV,IAAqBH,SAArB;CACA;CACD,GAtBD,EAbkD;;CAuClD,SAAOJ,UAAP;CACA;CAED;CACA;CACA;CACA;CACA;;CACA,IAAIA,UAA8B,GAAG,IAArC;CACO,SAASS,oBAAT,CAA8BC,KAA9B,EAAkD;CAExD,MAAIV,UAAU,KAAK,IAAnB,EAAyB;CACxBA,IAAAA,UAAU,GAAGF,kBAAkB,EAA/B;CACA;;CAED,OAAK,IAAIS,KAAT,IAAkBP,UAAlB,EAA8B;CAC7B,QAAIA,UAAU,CAACW,cAAX,CAA0BJ,KAA1B,CAAJ,EAAsC;CACrCG,MAAAA,KAAK,GAAGA,KAAK,CAACd,OAAN,CAAe,IAAIgB,MAAJ,CAAWL,KAAX,EAAiB,GAAjB,CAAf,EAAsC,MAAIP,UAAU,CAACO,KAAD,CAAd,GAAsB,GAA5D,CAAR;CACA;CACD;;CACD,SAAOG,KAAP;CACA;CAGD;CACA;CACA;CACA;CACA;CACA;CACA;AACA;CACA;CACA;AACA;CACA;CACA;CACA;AACA;CACA;AACA;CACA;CACA;CACA;CACA;AACA;CACA;CACA;CACA;AACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CC7RA;;CAOA;CACA;CACA;CACA;CACA;CACA;CACO,SAASG,OAAT,CAAiBC,GAAjB,EAAyCC,IAAzC,EAAuD;CAC1D,MAAI,CAACD,GAAL,EAAW;CACX,SAAOA,GAAG,CAACC,IAAD,CAAV;CACH;CAED;CACA;CACA;CACA;CACA;CACA;;CACO,SAASC,cAAT,CAAwBF,GAAxB,EAAgDC,IAAhD,EAA8D;CACjE,MAAI,CAACD,GAAL,EAAW;CACX,MAAIG,IAAJ;CAAA,MAAUC,KAAK,GAAGH,IAAI,CAACI,KAAL,CAAW,GAAX,CAAlB;;CACH,SAAO,CAACF,IAAI,GAAGC,KAAK,CAACE,KAAN,EAAR,MAA2BN,GAAG,GAAGA,GAAG,CAACG,IAAD,CAApC,CAAP,CAAmD;;CAChD,SAAOH,GAAP;CACH;CAED;CACA;CACA;CACA;CACA;;CACO,SAASO,UAAT,CAAoBC,KAApB,EAAkCC,KAAlC,EAAgDC,MAAhD,EAAuE;CAC7E,MAAIC,KAAJ,EAAWC,GAAX;CAEA,MAAI,CAACJ,KAAL,EAAY,OAAO,CAAP;CAEZA,EAAAA,KAAK,GAAGA,KAAK,GAAG,EAAhB;CACAI,EAAAA,GAAG,GAAGJ,KAAK,CAACK,MAAN,CAAaJ,KAAK,CAACb,KAAnB,CAAN;CACA,MAAIgB,GAAG,KAAK,CAAC,CAAb,EAAgB,OAAO,CAAP;CAEhBD,EAAAA,KAAK,GAAGF,KAAK,CAACK,MAAN,CAAaC,MAAb,GAAsBP,KAAK,CAACO,MAApC;CACA,MAAIH,GAAG,KAAK,CAAZ,EAAeD,KAAK,IAAI,GAAT;CAEf,SAAOA,KAAK,GAAGD,MAAf;CACA;CAEM,SAASM,YAAT,CAAsBpC,GAAtB,EAAyC;CAC/C,SAAO,CAACA,GAAG,GAAG,EAAP,EAAWE,OAAX,CAAmB,wBAAnB,EAA6C,MAA7C,CAAP;CACA;CAGD;CACA;CACA;CACA;;CACO,SAASmC,WAAT,CAAqBjB,GAArB,EAA6CkB,GAA7C,EAAwD;CAC9D,MAAIV,KAAK,GAAGR,GAAG,CAACkB,GAAD,CAAf;;CACA,MAAIV,KAAK,IAAI,CAACW,KAAK,CAACC,OAAN,CAAcZ,KAAd,CAAd,EAAoC;CACnCR,IAAAA,GAAG,CAACkB,GAAD,CAAH,GAAW,CAACV,KAAD,CAAX;CACA;CACD;CAGD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CACO,SAASa,OAAT,CAAiBC,MAAjB,EAA+CC,QAA/C,EAA4F;CAElG,MAAKJ,KAAK,CAACC,OAAN,CAAcE,MAAd,CAAL,EAA4B;CAC3BA,IAAAA,MAAM,CAACnC,OAAP,CAAeoC,QAAf;CAEA,GAHD,MAGK;CAEJ,SAAK,IAAIL,GAAT,IAAgBI,MAAhB,EAAwB;CACvB,UAAIA,MAAM,CAACzB,cAAP,CAAsBqB,GAAtB,CAAJ,EAAgC;CAC/BK,QAAAA,QAAQ,CAACD,MAAM,CAACJ,GAAD,CAAP,EAAcA,GAAd,CAAR;CACA;CACD;CACD;CACD;CAIM,SAASM,GAAT,CAAaC,CAAb,EAA8BC,CAA9B,EAA+C;CACrD,MAAI,OAAOD,CAAP,KAAa,QAAb,IAAyB,OAAOC,CAAP,KAAa,QAA1C,EAAoD;CACnD,WAAOD,CAAC,GAAGC,CAAJ,GAAQ,CAAR,GAAaD,CAAC,GAAGC,CAAJ,GAAQ,CAAC,CAAT,GAAa,CAAjC;CACA;;CACDD,EAAAA,CAAC,GAAG9C,SAAS,CAAC8C,CAAC,GAAG,EAAL,CAAT,CAAkB1C,WAAlB,EAAJ;CACA2C,EAAAA,CAAC,GAAG/C,SAAS,CAAC+C,CAAC,GAAG,EAAL,CAAT,CAAkB3C,WAAlB,EAAJ;CACA,MAAI0C,CAAC,GAAGC,CAAR,EAAW,OAAO,CAAP;CACX,MAAIA,CAAC,GAAGD,CAAR,EAAW,OAAO,CAAC,CAAR;CACX,SAAO,CAAP;CACA;;CCzGD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CA4De,MAAME,MAAN,CAAY;CAEZ;;CAGd;CACD;CACA;CACA;CACA;CACA;CACCC,EAAAA,WAAW,CAACC,KAAD,EAAYC,QAAZ,EAAgC;CAAA,SATpCD,KASoC;CAAA,SARpCC,QAQoC;CAC1C,SAAKD,KAAL,GAAaA,KAAb;CACA,SAAKC,QAAL,GAAgBA,QAAQ,IAAI;CAAC5C,MAAAA,UAAU,EAAE;CAAb,KAA5B;CACA;;CAED;CACD;CACA;CACA;CACA;CACC6C,EAAAA,QAAQ,CAACC,KAAD,EAAeC,uBAAf,EAAiDC,OAAjD,EAA8E;CACrF,QAAI,CAACF,KAAD,IAAU,CAACA,KAAK,CAACjB,MAArB,EAA6B,OAAO,EAAP;CAE7B,UAAMoB,MAAe,GAAG,EAAxB;CACA,UAAMC,KAAK,GAAMJ,KAAK,CAAC3B,KAAN,CAAY,KAAZ,CAAjB;CACA,QAAIgC,WAAJ;;CAEA,QAAIH,OAAJ,EAAa;CACZG,MAAAA,WAAW,GAAG,IAAIvC,MAAJ,CAAY,OAAMwC,MAAM,CAACC,IAAP,CAAYL,OAAZ,EAAqBM,GAArB,CAAyBxB,YAAzB,EAAuCyB,IAAvC,CAA4C,GAA5C,CAAN,GAAuD,UAAnE,CAAd;CACA;;CAEDL,IAAAA,KAAK,CAACjD,OAAN,CAAeuD,IAAD,IAAiB;CAC9B,UAAIC,WAAJ;CACA,UAAIC,KAAiB,GAAG,IAAxB;CACA,UAAIhD,KAAiB,GAAG,IAAxB,CAH8B;;CAM9B,UAAIyC,WAAW,KAAKM,WAAW,GAAGD,IAAI,CAACG,KAAL,CAAWR,WAAX,CAAnB,CAAf,EAA4D;CAC3DO,QAAAA,KAAK,GAAGD,WAAW,CAAC,CAAD,CAAnB;CACAD,QAAAA,IAAI,GAAGC,WAAW,CAAC,CAAD,CAAlB;CACA;;CAED,UAAID,IAAI,CAAC3B,MAAL,GAAc,CAAlB,EAAqB;CACpBnB,QAAAA,KAAK,GAAGoB,YAAY,CAAC0B,IAAD,CAApB;;CACA,YAAI,KAAKZ,QAAL,CAAc5C,UAAlB,EAA8B;CAC7BU,UAAAA,KAAK,GAAGD,oBAAoB,CAACC,KAAD,CAA5B;CACA;;CACD,YAAIqC,uBAAJ,EAA8BrC,KAAK,GAAG,QAAMA,KAAd;CAC9B;;CAEDuC,MAAAA,MAAM,CAACW,IAAP,CAAY;CACXhC,QAAAA,MAAM,EAAG4B,IADE;CAEX9C,QAAAA,KAAK,EAAIA,KAAK,GAAG,IAAIE,MAAJ,CAAWF,KAAX,EAAiB,GAAjB,CAAH,GAA2B,IAF9B;CAGXgD,QAAAA,KAAK,EAAIA;CAHE,OAAZ;CAKA,KAxBD;CA0BA,WAAOT,MAAP;CACA;;CAGD;CACD;CACA;CACA;CACA;CACA;CACA;CACA;CACCY,EAAAA,gBAAgB,CAACf,KAAD,EAAegB,OAAf,EAAiC;CAChD,QAAInC,MAAM,GAAG,KAAKoC,aAAL,CAAmBjB,KAAnB,EAA0BgB,OAA1B,CAAb;CACA,WAAO,KAAKE,iBAAL,CAAuBrC,MAAvB,CAAP;CACA;;CAEDqC,EAAAA,iBAAiB,CAACrC,MAAD,EAAqB;CACrC,UAAMsB,MAAM,GAAItB,MAAM,CAACsB,MAAvB;CAAA,UACAgB,WAAW,GAAKhB,MAAM,CAACpB,MADvB;;CAGA,QAAI,CAACoC,WAAL,EAAkB;CACjB,aAAO,YAAW;CAAE,eAAO,CAAP;CAAW,OAA/B;CACA;;CAED,UAAMC,MAAM,GAAGvC,MAAM,CAACmC,OAAP,CAAeI,MAA9B;CAAA,UACAlB,OAAO,GAAKrB,MAAM,CAACqB,OADnB;CAAA,UAEAmB,WAAW,GAAID,MAAM,CAACrC,MAFtB;CAAA,UAGAuC,SAAS,GAAIzC,MAAM,CAACyC,SAHpB;;CAKA,QAAI,CAACD,WAAL,EAAkB;CACjB,aAAO,YAAW;CAAE,eAAO,CAAP;CAAW,OAA/B;CACA;CAGD;CACF;CACA;CACA;CACA;CACA;CACA;CACA;;;CACE,UAAME,WAAW,GAAI,YAAW;CAG/B,UAAIF,WAAW,KAAK,CAApB,EAAuB;CACtB,eAAO,UAAS5C,KAAT,EAAuB+C,IAAvB,EAAgC;CACtC,gBAAMZ,KAAK,GAAGQ,MAAM,CAAC,CAAD,CAAN,CAAUR,KAAxB;CACA,iBAAOrC,UAAU,CAAC+C,SAAS,CAACE,IAAD,EAAOZ,KAAP,CAAV,EAAyBnC,KAAzB,EAAgCyB,OAAO,CAACU,KAAD,CAAvC,CAAjB;CACA,SAHD;CAIA;;CAED,aAAO,UAASnC,KAAT,EAAuB+C,IAAvB,EAAgC;CACtC,YAAIC,GAAG,GAAG,CAAV,CADsC;;CAItC,YAAIhD,KAAK,CAACmC,KAAV,EAAiB;CAEhB,gBAAMpC,KAAK,GAAG8C,SAAS,CAACE,IAAD,EAAO/C,KAAK,CAACmC,KAAb,CAAvB;;CAEA,cAAI,CAACnC,KAAK,CAACb,KAAP,IAAgBY,KAApB,EAA2B;CAC1BiD,YAAAA,GAAG,IAAK,IAAEJ,WAAV;CACA,WAFD,MAEK;CACJI,YAAAA,GAAG,IAAIlD,UAAU,CAACC,KAAD,EAAQC,KAAR,EAAe,CAAf,CAAjB;CACA;CAID,SAZD,MAYK;CACJY,UAAAA,OAAO,CAACa,OAAD,EAAU,CAACxB,MAAD,EAAgBkC,KAAhB,KAAiC;CACjDa,YAAAA,GAAG,IAAIlD,UAAU,CAAC+C,SAAS,CAACE,IAAD,EAAOZ,KAAP,CAAV,EAAyBnC,KAAzB,EAAgCC,MAAhC,CAAjB;CACA,WAFM,CAAP;CAGA;;CAED,eAAO+C,GAAG,GAAGJ,WAAb;CACA,OAvBD;CAwBA,KAlCmB,EAApB;;CAoCA,QAAIF,WAAW,KAAK,CAApB,EAAuB;CACtB,aAAO,UAASK,IAAT,EAAkB;CACxB,eAAOD,WAAW,CAACpB,MAAM,CAAC,CAAD,CAAP,EAAYqB,IAAZ,CAAlB;CACA,OAFD;CAGA;;CAED,QAAI3C,MAAM,CAACmC,OAAP,CAAeU,WAAf,KAA+B,KAAnC,EAA0C;CACzC,aAAO,UAASF,IAAT,EAAkB;CACxB,YAAInE,CAAC,GAAG,CAAR;CAAA,YAAWsB,KAAX;CAAA,YAAkB8C,GAAG,GAAG,CAAxB;;CACA,eAAOpE,CAAC,GAAG8D,WAAX,EAAwB9D,CAAC,EAAzB,EAA6B;CAC5BsB,UAAAA,KAAK,GAAG4C,WAAW,CAACpB,MAAM,CAAC9C,CAAD,CAAP,EAAYmE,IAAZ,CAAnB;CACA,cAAI7C,KAAK,IAAI,CAAb,EAAgB,OAAO,CAAP;CAChB8C,UAAAA,GAAG,IAAI9C,KAAP;CACA;;CACD,eAAO8C,GAAG,GAAGN,WAAb;CACA,OARD;CASA,KAVD,MAUO;CACN,aAAO,UAASK,IAAT,EAAkB;CACxB,YAAIC,GAAG,GAAG,CAAV;CACApC,QAAAA,OAAO,CAACc,MAAD,EAAS1B,KAAD,IAAgB;CAC9BgD,UAAAA,GAAG,IAAIF,WAAW,CAAC9C,KAAD,EAAQ+C,IAAR,CAAlB;CACA,SAFM,CAAP;CAGA,eAAOC,GAAG,GAAGN,WAAb;CACA,OAND;CAOA;CACD;;CAED;CACD;CACA;CACA;CACA;CACA;CACA;CACCQ,EAAAA,eAAe,CAAC3B,KAAD,EAAegB,OAAf,EAAiC;CAC/C,QAAInC,MAAM,GAAI,KAAKoC,aAAL,CAAmBjB,KAAnB,EAA0BgB,OAA1B,CAAd;CACA,WAAO,KAAKY,gBAAL,CAAsB/C,MAAtB,CAAP;CACA;;CAED+C,EAAAA,gBAAgB,CAAC/C,MAAD,EAAoB;CACnC,QAAIxB,CAAJ,EAAOwE,CAAP,EAAUC,cAAV;CAEA,UAAMC,IAAI,GAAG,IAAb;CAAA,UACAf,OAAO,GAAInC,MAAM,CAACmC,OADlB;CAAA,UAEAgB,IAAI,GAAK,CAACnD,MAAM,CAACmB,KAAR,IAAiBgB,OAAO,CAACiB,UAA1B,GAAwCjB,OAAO,CAACiB,UAAhD,GAA6DjB,OAAO,CAACgB,IAF7E;CAAA,UAGAE,SAAiB,GAAI,EAHrB;CAAA,UAIAC,WAAoB,GAAG,EAJvB;CAOA;CACF;CACA;CACA;CACA;;CACE,UAAMC,SAAS,GAAG,SAAZA,SAAY,CAASnE,IAAT,EAAsBoE,MAAtB,EAAwD;CACzE,UAAIpE,IAAI,KAAK,QAAb,EAAuB,OAAOoE,MAAM,CAAC1D,KAAd;CACvB,aAAOE,MAAM,CAACyC,SAAP,CAAiBS,IAAI,CAAClC,KAAL,CAAWwC,MAAM,CAACC,EAAlB,CAAjB,EAAwCrE,IAAxC,CAAP;CACA,KAHD,CAfmC;;;CAqBnC,QAAI+D,IAAJ,EAAU;CACT,WAAK3E,CAAC,GAAG,CAAJ,EAAOwE,CAAC,GAAGG,IAAI,CAACjD,MAArB,EAA6B1B,CAAC,GAAGwE,CAAjC,EAAoCxE,CAAC,EAArC,EAAyC;CACxC,YAAIwB,MAAM,CAACmB,KAAP,IAAgBgC,IAAI,CAAC3E,CAAD,CAAJ,CAAQuD,KAAR,KAAkB,QAAtC,EAAgD;CAC/CsB,UAAAA,SAAS,CAACpB,IAAV,CAAekB,IAAI,CAAC3E,CAAD,CAAnB;CACA;CACD;CACD,KA3BkC;CA8BnC;;;CACA,QAAIwB,MAAM,CAACmB,KAAX,EAAkB;CACjB8B,MAAAA,cAAc,GAAG,IAAjB;;CACA,WAAKzE,CAAC,GAAG,CAAJ,EAAOwE,CAAC,GAAGK,SAAS,CAACnD,MAA1B,EAAkC1B,CAAC,GAAGwE,CAAtC,EAAyCxE,CAAC,EAA1C,EAA8C;CAC7C,YAAI6E,SAAS,CAAC7E,CAAD,CAAT,CAAauD,KAAb,KAAuB,QAA3B,EAAqC;CACpCkB,UAAAA,cAAc,GAAG,KAAjB;CACA;CACA;CACD;;CACD,UAAIA,cAAJ,EAAoB;CACnBI,QAAAA,SAAS,CAACK,OAAV,CAAkB;CAAC3B,UAAAA,KAAK,EAAE,QAAR;CAAkB4B,UAAAA,SAAS,EAAE;CAA7B,SAAlB;CACA;CACD,KAXD,MAWO;CACN,WAAKnF,CAAC,GAAG,CAAJ,EAAOwE,CAAC,GAAGK,SAAS,CAACnD,MAA1B,EAAkC1B,CAAC,GAAGwE,CAAtC,EAAyCxE,CAAC,EAA1C,EAA8C;CAC7C,YAAI6E,SAAS,CAAC7E,CAAD,CAAT,CAAauD,KAAb,KAAuB,QAA3B,EAAqC;CACpCsB,UAAAA,SAAS,CAACO,MAAV,CAAiBpF,CAAjB,EAAoB,CAApB;CACA;CACA;CACD;CACD;;CAED,SAAKA,CAAC,GAAG,CAAJ,EAAOwE,CAAC,GAAGK,SAAS,CAACnD,MAA1B,EAAkC1B,CAAC,GAAGwE,CAAtC,EAAyCxE,CAAC,EAA1C,EAA8C;CAC7C8E,MAAAA,WAAW,CAACrB,IAAZ,CAAiBoB,SAAS,CAAC7E,CAAD,CAAT,CAAamF,SAAb,KAA2B,MAA3B,GAAoC,CAAC,CAArC,GAAyC,CAA1D;CACA,KArDkC;;;CAwDnC,UAAME,eAAe,GAAGR,SAAS,CAACnD,MAAlC;;CACA,QAAI,CAAC2D,eAAL,EAAsB;CACrB,aAAO,IAAP;CACA,KAFD,MAEO,IAAIA,eAAe,KAAK,CAAxB,EAA2B;CACjC,YAAMC,QAAQ,GAAGT,SAAS,CAAC,CAAD,CAAT,CAAatB,KAA9B;CACA,YAAMgC,UAAU,GAAGT,WAAW,CAAC,CAAD,CAA9B;CACA,aAAO,UAAS1C,CAAT,EAAwBC,CAAxB,EAAuC;CAC7C,eAAOkD,UAAU,GAAGpD,GAAG,CACtB4C,SAAS,CAACO,QAAD,EAAWlD,CAAX,CADa,EAEtB2C,SAAS,CAACO,QAAD,EAAWjD,CAAX,CAFa,CAAvB;CAIA,OALD;CAMA,KATM,MASA;CACN,aAAO,UAASD,CAAT,EAAwBC,CAAxB,EAAuC;CAC7C,YAAIrC,CAAJ,EAAOgF,MAAP,EAAezB,KAAf;;CACA,aAAKvD,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGqF,eAAhB,EAAiCrF,CAAC,EAAlC,EAAsC;CACrCuD,UAAAA,KAAK,GAAGsB,SAAS,CAAC7E,CAAD,CAAT,CAAauD,KAArB;CACAyB,UAAAA,MAAM,GAAGF,WAAW,CAAC9E,CAAD,CAAX,GAAiBmC,GAAG,CAC5B4C,SAAS,CAACxB,KAAD,EAAQnB,CAAR,CADmB,EAE5B2C,SAAS,CAACxB,KAAD,EAAQlB,CAAR,CAFmB,CAA7B;CAIA,cAAI2C,MAAJ,EAAY,OAAOA,MAAP;CACZ;;CACD,eAAO,CAAP;CACA,OAXD;CAYA;CACD;;CAED;CACD;CACA;CACA;CACA;CACA;CACCpB,EAAAA,aAAa,CAACjB,KAAD,EAAe6C,QAAf,EAA8C;CAC1D,UAAM3C,OAAgB,GAAG,EAAzB;CACA,QAAIc,OAAO,GAAIV,MAAM,CAACwC,MAAP,CAAc,EAAd,EAAiBD,QAAjB,CAAf;CAEA5D,IAAAA,WAAW,CAAC+B,OAAD,EAAS,MAAT,CAAX;CACA/B,IAAAA,WAAW,CAAC+B,OAAD,EAAS,YAAT,CAAX,CAL0D;;CAQ1D,QAAIA,OAAO,CAACI,MAAZ,EAAoB;CACnBnC,MAAAA,WAAW,CAAC+B,OAAD,EAAS,QAAT,CAAX;CACA,YAAMI,MAAe,GAAG,EAAxB;CACAJ,MAAAA,OAAO,CAACI,MAAR,CAAejE,OAAf,CAAwByD,KAAD,IAAyB;CAC/C,YAAI,OAAOA,KAAP,IAAgB,QAApB,EAA8B;CAC7BA,UAAAA,KAAK,GAAG;CAACA,YAAAA,KAAK,EAACA,KAAP;CAAalC,YAAAA,MAAM,EAAC;CAApB,WAAR;CACA;;CACD0C,QAAAA,MAAM,CAACN,IAAP,CAAYF,KAAZ;CACAV,QAAAA,OAAO,CAACU,KAAK,CAACA,KAAP,CAAP,GAAwB,YAAYA,KAAb,GAAsBA,KAAK,CAAClC,MAA5B,GAAqC,CAA5D;CACA,OAND;CAOAsC,MAAAA,OAAO,CAACI,MAAR,GAAiBA,MAAjB;CACA;;CAEDpB,IAAAA,KAAK,GAAGrD,SAAS,CAAEqD,KAAK,GAAG,EAAV,CAAT,CAAwBjD,WAAxB,GAAsCgG,IAAtC,EAAR;CAEA,WAAO;CACN/B,MAAAA,OAAO,EAAIA,OADL;CAENhB,MAAAA,KAAK,EAAIA,KAFH;CAGNG,MAAAA,MAAM,EAAI,KAAKJ,QAAL,CAAcC,KAAd,EAAqBgB,OAAO,CAACf,uBAA7B,EAAsDC,OAAtD,CAHJ;CAIN8C,MAAAA,KAAK,EAAI,CAJH;CAKNnD,MAAAA,KAAK,EAAI,EALH;CAMNK,MAAAA,OAAO,EAAIA,OANL;CAONoB,MAAAA,SAAS,EAAIN,OAAO,CAACiC,OAAT,GAAoB/E,cAApB,GAAqCH;CAP3C,KAAP;CASA;;CAED;CACD;CACA;CACA;CACCc,EAAAA,MAAM,CAACmB,KAAD,EAAegB,OAAf,EAA+C;CACpD,QAAIe,IAAI,GAAG,IAAX;CAAA,QAAiBpD,KAAjB;CAAA,QAAwBE,MAAxB;CAEAA,IAAAA,MAAM,GAAI,KAAKoC,aAAL,CAAmBjB,KAAnB,EAA0BgB,OAA1B,CAAV;CACAA,IAAAA,OAAO,GAAGnC,MAAM,CAACmC,OAAjB;CACAhB,IAAAA,KAAK,GAAKnB,MAAM,CAACmB,KAAjB,CALoD;;CAQpD,UAAMkD,QAAQ,GAAGlC,OAAO,CAACrC,KAAR,IAAiBoD,IAAI,CAACb,iBAAL,CAAuBrC,MAAvB,CAAlC,CARoD;;;CAWpD,QAAImB,KAAK,CAACjB,MAAV,EAAkB;CACjBM,MAAAA,OAAO,CAAC0C,IAAI,CAAClC,KAAN,EAAa,CAACsD,IAAD,EAAmBb,EAAnB,KAAwC;CAC3D3D,QAAAA,KAAK,GAAGuE,QAAQ,CAACC,IAAD,CAAhB;;CACA,YAAInC,OAAO,CAACoC,MAAR,KAAmB,KAAnB,IAA4BzE,KAAK,GAAG,CAAxC,EAA2C;CAC1CE,UAAAA,MAAM,CAACgB,KAAP,CAAaiB,IAAb,CAAkB;CAAC,qBAASnC,KAAV;CAAiB,kBAAM2D;CAAvB,WAAlB;CACA;CACD,OALM,CAAP;CAMA,KAPD,MAOO;CACNjD,MAAAA,OAAO,CAAC0C,IAAI,CAAClC,KAAN,EAAa,CAACsD,IAAD,EAAmBb,EAAnB,KAAwC;CAC3DzD,QAAAA,MAAM,CAACgB,KAAP,CAAaiB,IAAb,CAAkB;CAAC,mBAAS,CAAV;CAAa,gBAAMwB;CAAnB,SAAlB;CACA,OAFM,CAAP;CAGA;;CAED,UAAMe,OAAO,GAAGtB,IAAI,CAACH,gBAAL,CAAsB/C,MAAtB,CAAhB;;CACA,QAAIwE,OAAJ,EAAaxE,MAAM,CAACgB,KAAP,CAAamC,IAAb,CAAkBqB,OAAlB,EAzBuC;;CA4BpDxE,IAAAA,MAAM,CAACmE,KAAP,GAAenE,MAAM,CAACgB,KAAP,CAAad,MAA5B;;CACA,QAAI,OAAOiC,OAAO,CAACsC,KAAf,KAAyB,QAA7B,EAAuC;CACtCzE,MAAAA,MAAM,CAACgB,KAAP,GAAehB,MAAM,CAACgB,KAAP,CAAa0D,KAAb,CAAmB,CAAnB,EAAsBvC,OAAO,CAACsC,KAA9B,CAAf;CACA;;CAED,WAAOzE,MAAP;CACA;;CAlVyB;;;;;;;;"} \ No newline at end of file diff --git a/dist/umd/sifter.min.js b/dist/umd/sifter.min.js index 4ad0717..abd8cc5 100644 --- a/dist/umd/sifter.min.js +++ b/dist/umd/sifter.min.js @@ -5,9 +5,9 @@ function n(t){null===r&&(r=function(){var t={"l·":"l","ʼn":"n","æ":"ae","ø": return e.forEach((e=>{for(let n=e[0];n<=e[1];n++){let e=String.fromCharCode(n),i=e.normalize("NFD").replace(/[\u0300-\u036F]/g,"").normalize("NFKD") i!=e&&(i=i.toLowerCase(),i in t&&(i=t[i]),i in r||(r[i]=i+i.toUpperCase()),r[i]+=e)}})),r}()) for(let e in r)r.hasOwnProperty(e)&&(t=t.replace(new RegExp(e,"g"),"["+r[e]+"]")) -return t}function i(e,t){if(e)return e[t]}function o(e,t){if(e){for(var r=t.split(".");r.length&&(e=e[r.shift()]););return e}}function s(e,t,r){var n,i -return e?-1===(i=(e+="").search(t.regex))?0:(n=t.string.length/e.length,0===i&&(n+=.5),n*r):0}function u(e){return(e+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function f(e,t){var r=e[t] -r&&!Array.isArray(r)&&(e[t]=[r])}function c(e,t){if(Array.isArray(e))e.forEach(t) +return t}function i(e,t){if(e)return e[t]}function o(e,t){if(e){for(var r,n=t.split(".");(r=n.shift())&&(e=e[r]););return e}}function s(e,t,r){var n,i +return e?-1===(i=(e+="").search(t.regex))?0:(n=t.string.length/e.length,0===i&&(n+=.5),n*r):0}function u(e){return(e+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function c(e,t){var r=e[t] +r&&!Array.isArray(r)&&(e[t]=[r])}function f(e,t){if(Array.isArray(e))e.forEach(t) else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)}function l(e,r){return"number"==typeof e&&"number"==typeof r?e>r?1:e(r=t(r+"").toLowerCase())?1:r>e?-1:0} /** * sifter.js @@ -26,31 +26,38 @@ else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)}function l(e,r){return"number */return class{constructor(e,t){this.items=void 0,this.settings=void 0,this.items=e,this.settings=t||{diacritics:!0}}tokenize(e,t,r){if(!e||!e.length)return[] const i=[],o=e.split(/\s+/) var s -return r&&(s=new RegExp("^("+Object.keys(r).map(u).join("|")+"):(.*)$")),o.forEach((e=>{let r,o=null,f=null -s&&(r=e.match(s))&&(o=r[1],e=r[2]),e.length>0&&(f=u(e),this.settings.diacritics&&(f=n(f)),t&&(f="\\b"+f),f=new RegExp(f,"i")),i.push({string:e,regex:f,field:o})})),i}getScoreFunction(e,t){var r=this.prepareSearch(e,t) +return r&&(s=new RegExp("^("+Object.keys(r).map(u).join("|")+"):(.*)$")),o.forEach((e=>{let r,o=null,c=null +s&&(r=e.match(s))&&(o=r[1],e=r[2]),e.length>0&&(c=u(e),this.settings.diacritics&&(c=n(c)),t&&(c="\\b"+c)),i.push({string:e,regex:c?new RegExp(c,"i"):null,field:o})})),i}getScoreFunction(e,t){var r=this.prepareSearch(e,t) return this._getScoreFunction(r)}_getScoreFunction(e){const t=e.tokens,r=t.length if(!r)return function(){return 0} const n=e.options.fields,i=e.weights,o=n.length,u=e.getAttrFn if(!o)return function(){return 1} -const f=1===o?function(e,t){const r=n[0].field +const c=1===o?function(e,t){const r=n[0].field return s(u(t,r),e,i[r])}:function(e,t){var r=0 if(e.field){const n=u(t,e.field) -!e.regex&&n?r+=1/o:r+=s(n,e,1)}else c(i,((n,i)=>{r+=s(u(t,i),e,n)})) +!e.regex&&n?r+=1/o:r+=s(n,e,1)}else f(i,((n,i)=>{r+=s(u(t,i),e,n)})) return r/o} -return 1===r?function(e){return f(t[0],e)}:"and"===e.options.conjunction?function(e){for(var n,i=0,o=0;i{n+=f(t,e)})),n/r}}getSortFunction(e,t){var r=this.prepareSearch(e,t) -return this._getSortFunction(r)}_getSortFunction(e){var t,r,n,i,o,s -const u=this,f=e.options,c=!e.query&&f.sort_empty||f.sort,a=[],h=[],g=function(t,r){return"$score"===t?r.score:e.getAttrFn(u.items[r.id],t)} -if(c)for(t=0,r=c.length;t{n+=c(t,e)})),n/r}}getSortFunction(e,t){var r=this.prepareSearch(e,t) +return this._getSortFunction(r)}_getSortFunction(e){var t,r,n +const i=this,o=e.options,s=!e.query&&o.sort_empty?o.sort_empty:o.sort,u=[],c=[],f=function(t,r){return"$score"===t?r.score:e.getAttrFn(i.items[r.id],t)} +if(s)for(t=0,r=s.length;t{u.push({field:e})})),s.fields=u}s.fields.forEach((e=>{n[e.field]="weight"in e?e.weight:1}))}return{options:s,query:e=t(e+"").toLowerCase().trim(),tokens:this.tokenize(e,s.respect_word_boundaries,n),total:0,items:[],weights:n,getAttrFn:s.nesting?o:i}}search(e,t){var r,n,i,o,s=this -return n=this.prepareSearch(e,t),t=n.options,e=n.query,o=t.score||s._getScoreFunction(n),e.length?c(s.items,((e,i)=>{r=o(e),(!1===t.filter||r>0)&&n.items.push({score:r,id:i})})):c(s.items,((e,t)=>{n.items.push({score:1,id:t})})),(i=s._getSortFunction(n))&&n.items.sort(i),n.total=n.items.length,"number"==typeof t.limit&&(n.items=n.items.slice(0,t.limit)),n}}})) +if(c(s,"sort"),c(s,"sort_empty"),s.fields){c(s,"fields") +const e=[] +s.fields.forEach((t=>{"string"==typeof t&&(t={field:t,weight:1}),e.push(t),n[t.field]="weight"in t?t.weight:1})),s.fields=e}return{options:s,query:e=t(e+"").toLowerCase().trim(),tokens:this.tokenize(e,s.respect_word_boundaries,n),total:0,items:[],weights:n,getAttrFn:s.nesting?o:i}}search(e,t){var r,n,i=this +n=this.prepareSearch(e,t),t=n.options,e=n.query +const o=t.score||i._getScoreFunction(n) +e.length?f(i.items,((e,i)=>{r=o(e),(!1===t.filter||r>0)&&n.items.push({score:r,id:i})})):f(i.items,((e,t)=>{n.items.push({score:1,id:t})})) +const s=i._getSortFunction(n) +return s&&n.items.sort(s),n.total=n.items.length,"number"==typeof t.limit&&(n.items=n.items.slice(0,t.limit)),n}}})) //# sourceMappingURL=sifter.min.js.map diff --git a/dist/umd/sifter.min.js.map b/dist/umd/sifter.min.js.map index c3dd37e..c5eda00 100644 --- a/dist/umd/sifter.min.js.map +++ b/dist/umd/sifter.min.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tchar_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\taccumulator.push( [accumulator.pop()[0],currentValue]);\n\t\t}\n\n return accumulator;\n }, []);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics\t= {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore\nimport { asciifold } from './diacritics.ts';\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var names = name.split(\".\");\n while(names.length && (obj = obj[names.shift()]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n * @param {object} token\n * @return {number}\n */\nexport function scoreValue(value:string, token, weight:number ) {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str) {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj, key){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n * @param {array|object} object\n */\nexport function iterate(object, callback) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a, b) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n// @ts-ignore\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight?: number,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: any[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: any,\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp,\n\tfield:string\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: any[],\n\tweights: TWeights,\n\tgetAttrFn: (any,string)=>any,\n\n}\n\n\nexport default class Sifter{\n\n\tpublic items: []|{};\n\tpublic settings: {diacritics:boolean};\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t * @constructor\n\t * @param {array|object} items\n\t * @param {object} items\n\t */\n\tconstructor(items, settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens = [];\n\t\tconst words = query.split(/\\s+/);\n\t\tvar field_regex;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field\t= null;\n\t\t\tlet regex\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex\n\t\t\t\tregex = new RegExp(regex, 'i');\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight, field) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, sort_fld, sort_flds_count, multiplier, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) || options.sort,\n\t\tsort_flds\t= [],\n\t\tmultipliers = [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t * @param {string} name\n\t\t * @param {object} result\n\t\t * @return {string}\n\t\t */\n\t\tconst get_field = function(name, result) {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tsort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tsort_fld = sort_flds[0].field;\n\t\t\tmultiplier = multipliers[0];\n\t\t\treturn function(a, b) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a, b) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser):TPrepareObj {\n\t\tconst weights\t= {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tif( Array.isArray(options.fields) && typeof options.fields[0] !== 'object' ){\n\t\t\t\tvar fields = [];\n\t\t\t\toptions.fields.forEach((fld_name) => {\n\t\t\t\t\tfields.push({field:fld_name});\n\t\t\t\t});\n\t\t\t\toptions.fields = fields;\n\t\t\t}\n\n\n\t\t\toptions.fields.forEach((field_params)=>{\n\t\t\t\tweights[field_params.field] = ('weight' in field_params) ? field_params.weight : 1;\n\t\t\t});\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search;\n\t\tvar fn_sort;\n\t\tvar fn_score;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tfn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item, id) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tfn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","diacritics","diacriticRegexPoints","regex","latin_convert","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","generateDiacritics","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","names","split","length","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","this","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","sort_fld","sort_flds_count","multiplier","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","optsUser","assign","fld_name","field_params","trim","total","nesting","fn_sort","fn_score","item","filter","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { TToken } from './sifter.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport function scoreValue(value:string, token:TToken, weight:number ):number {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str:string):string {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj:{[key:string]:any}, key:string){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport function iterate(object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a:number|string, b:number|string) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight: number,\n}\n\ntype TSort = {\n\tfield: string,\n\tdirection?: string,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: TSort[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: TSort[],\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp|null,\n\tfield:string|null,\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: TResultItem[],\n\tweights: TWeights,\n\tgetAttrFn: (data:any,field:string)=>any,\n\n}\n\ntype TSettings = {\n\tdiacritics:boolean\n}\n\ntype TResultItem = {\n\tscore: number,\n\tid: number|string,\n}\n\n\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: TSettings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:TSettings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:TToken[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:TOptions ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:TOptions) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:TSort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:TResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:TOptions):TPrepareObj {\n\t\tconst weights:TWeights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:TField[] = [];\n\t\t\toptions.fields.forEach((field:string|TField) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search:TPrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","diacritics","diacriticRegexPoints","regex","latin_convert","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","generateDiacritics","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","string","length","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","this","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 118f741..4483c61 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.7.2", + "version": "0.7.3", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From a7ba01a27e062b73c685b1c40fc93584cf7884e2 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 30 Jun 2021 23:40:01 -0600 Subject: [PATCH 062/140] move types to lib/types.ts --- lib/sifter.ts | 104 ++++++++++++-------------------------------------- lib/types.ts | 50 ++++++++++++++++++++++++ lib/utils.ts | 4 +- 3 files changed, 77 insertions(+), 81 deletions(-) create mode 100644 lib/types.ts diff --git a/lib/sifter.ts b/lib/sifter.ts index 08d5af3..b515a03 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -18,64 +18,13 @@ import { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts'; // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" import { diacriticRegexPoints, asciifold } from './diacritics.ts'; - - -type TField = { - field: string, - weight: number, -} - -type TSort = { - field: string, - direction?: string, -} - -type TOptions = { - fields: TField[], - sort: TSort[], - score?: ()=>any, - filter?: boolean, - limit?: number, - sort_empty?: TSort[], - nesting?: boolean, - respect_word_boundaries?: boolean, - conjunction?: string, -} - -type TToken = { - string:string, - regex:RegExp|null, - field:string|null, -} - -type TWeights = {[key:string]:number} - -type TPrepareObj = { - options: TOptions, - query: string, - tokens: TToken[], - total: number, - items: TResultItem[], - weights: TWeights, - getAttrFn: (data:any,field:string)=>any, - -} - -type TSettings = { - diacritics:boolean -} - -type TResultItem = { - score: number, - id: number|string, -} - - +// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" +import * as T from 'types.ts'; export default class Sifter{ public items; // []|{}; - public settings: TSettings; + public settings: T.Settings; /** * Textually searches arrays and hashes of objects @@ -83,7 +32,7 @@ export default class Sifter{ * specifically for autocomplete. * */ - constructor(items:any, settings:TSettings) { + constructor(items:any, settings:T.Settings) { this.items = items; this.settings = settings || {diacritics: true}; }; @@ -93,10 +42,10 @@ export default class Sifter{ * regexps to be used to match results. * */ - tokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] { + tokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] { if (!query || !query.length) return []; - const tokens:TToken[] = []; + const tokens:T.Token[] = []; const words = query.split(/\s+/); var field_regex:RegExp; @@ -142,12 +91,12 @@ export default class Sifter{ * * @returns {function} */ - getScoreFunction(query:string, options:TOptions ){ + getScoreFunction(query:string, options:T.Options ){ var search = this.prepareSearch(query, options); return this._getScoreFunction(search); } - _getScoreFunction(search:TPrepareObj ){ + _getScoreFunction(search:T.PrepareObj ){ const tokens = search.tokens, token_count = tokens.length; @@ -169,21 +118,18 @@ export default class Sifter{ * Calculates the score of an object * against the search query. * - * @param {TToken} token - * @param {object} data - * @return {number} */ const scoreObject = (function() { if (field_count === 1) { - return function(token:TToken, data:{}) { + return function(token:T.Token, data:{}) { const field = fields[0].field; return scoreValue(getAttrFn(data, field), token, weights[field]); }; } - return function(token:TToken, data:{}) { + return function(token:T.Token, data:{}) { var sum = 0; // is the token specific to a field? @@ -228,7 +174,7 @@ export default class Sifter{ } else { return function(data:{}) { var sum = 0; - iterate(tokens,(token:TToken)=>{ + iterate(tokens,(token:T.Token)=>{ sum += scoreObject(token, data); }); return sum / token_count; @@ -243,18 +189,18 @@ export default class Sifter{ * * @return function(a,b) */ - getSortFunction(query:string, options:TOptions) { + getSortFunction(query:string, options:T.Options) { var search = this.prepareSearch(query, options); return this._getSortFunction(search); } - _getSortFunction(search:TPrepareObj){ + _getSortFunction(search:T.PrepareObj){ var i, n, implicit_score; const self = this, options = search.options, sort = (!search.query && options.sort_empty) ? options.sort_empty : options.sort, - sort_flds:TSort[] = [], + sort_flds:T.Sort[] = [], multipliers:number[] = []; @@ -263,7 +209,7 @@ export default class Sifter{ * from a search result item. * */ - const get_field = function(name:string, result:TResultItem):string|number { + const get_field = function(name:string, result:T.ResultItem):string|number { if (name === '$score') return result.score; return search.getAttrFn(self.items[result.id], name); }; @@ -310,14 +256,14 @@ export default class Sifter{ } else if (sort_flds_count === 1) { const sort_fld = sort_flds[0].field; const multiplier = multipliers[0]; - return function(a:TResultItem, b:TResultItem) { + return function(a:T.ResultItem, b:T.ResultItem) { return multiplier * cmp( get_field(sort_fld, a), get_field(sort_fld, b) ); }; } else { - return function(a:TResultItem, b:TResultItem) { + return function(a:T.ResultItem, b:T.ResultItem) { var i, result, field; for (i = 0; i < sort_flds_count; i++) { field = sort_flds[i].field; @@ -338,8 +284,8 @@ export default class Sifter{ * with results. * */ - prepareSearch(query:string, optsUser:TOptions):TPrepareObj { - const weights:TWeights = {}; + prepareSearch(query:string, optsUser:T.Options):T.PrepareObj { + const weights:T.Weights = {}; var options = Object.assign({},optsUser); propToArray(options,'sort'); @@ -348,8 +294,8 @@ export default class Sifter{ // convert fields to new format if( options.fields ){ propToArray(options,'fields'); - const fields:TField[] = []; - options.fields.forEach((field:string|TField) => { + const fields:T.Field[] = []; + options.fields.forEach((field:string|T.Field) => { if( typeof field == 'string' ){ field = {field:field,weight:1}; } @@ -376,8 +322,8 @@ export default class Sifter{ * Searches through all items and returns a sorted array of matches. * */ - search(query:string, options:TOptions) : TPrepareObj { - var self = this, score, search:TPrepareObj; + search(query:string, options:T.Options) : T.PrepareObj { + var self = this, score, search:T.PrepareObj; search = this.prepareSearch(query, options); options = search.options; @@ -388,14 +334,14 @@ export default class Sifter{ // perform search and sort if (query.length) { - iterate(self.items, (item:TResultItem, id:string|number) => { + iterate(self.items, (item:T.ResultItem, id:string|number) => { score = fn_score(item); if (options.filter === false || score > 0) { search.items.push({'score': score, 'id': id}); } }); } else { - iterate(self.items, (item:TResultItem, id:string|number) => { + iterate(self.items, (item:T.ResultItem, id:string|number) => { search.items.push({'score': 1, 'id': id}); }); } diff --git a/lib/types.ts b/lib/types.ts new file mode 100644 index 0000000..8adc3f1 --- /dev/null +++ b/lib/types.ts @@ -0,0 +1,50 @@ + +export type Field = { + field: string, + weight: number, +} + +export type Sort = { + field: string, + direction?: string, +} + +export type Options = { + fields: Field[], + sort: Sort[], + score?: ()=>any, + filter?: boolean, + limit?: number, + sort_empty?: Sort[], + nesting?: boolean, + respect_word_boundaries?: boolean, + conjunction?: string, +} + +export type Token = { + string:string, + regex:RegExp|null, + field:string|null, +} + +export type Weights = {[key:string]:number} + +export type PrepareObj = { + options: Options, + query: string, + tokens: Token[], + total: number, + items: ResultItem[], + weights: Weights, + getAttrFn: (data:any,field:string)=>any, + +} + +export type Settings = { + diacritics:boolean +} + +export type ResultItem = { + score: number, + id: number|string, +} diff --git a/lib/utils.ts b/lib/utils.ts index 2801576..7c06cb9 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -3,7 +3,7 @@ import { asciifold } from './diacritics.ts'; // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" -import { TToken } from './sifter.ts'; +import * as T from './types.ts'; /** @@ -35,7 +35,7 @@ export function getAttrNesting(obj:{[key:string]:any}, name:string ) { * given value is against a search token. * */ -export function scoreValue(value:string, token:TToken, weight:number ):number { +export function scoreValue(value:string, token:T.Token, weight:number ):number { var score, pos; if (!value) return 0; From 0f91aaa321dc4144bf36ba9e04b4d22a65ac542e Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 30 Jun 2021 23:48:20 -0600 Subject: [PATCH 063/140] arrow functions --- lib/diacritics.ts | 8 ++++---- lib/utils.ts | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index 59a0bfa..9758813 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -2,7 +2,7 @@ type TDiacraticList = {[key:string]:string}; // https://github.com/andrewrk/node-diacritics/blob/master/index.js -var DIACRITICS:TDiacraticList = { +export const DIACRITICS:TDiacraticList = { " ":" ", 0:"߀", A:"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ", @@ -138,7 +138,7 @@ var code_points = [ * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 * */ -export function asciifold(str:string):string{ +export const asciifold = (str:string):string => { return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD').toLowerCase(); }; @@ -188,7 +188,7 @@ function toCodePoints(tolerance=8){ * Generate a list of diacritics from the list of code points * */ -export function generateDiacritics():TDiacraticList{ +export const generateDiacritics = ():TDiacraticList => { var latin_convert:{[key:string]:string} = { 'l·': 'l', @@ -236,7 +236,7 @@ export function generateDiacritics():TDiacraticList{ * */ var diacritics:null|TDiacraticList = null -export function diacriticRegexPoints(regex:string):string{ +export const diacriticRegexPoints = (regex:string):string => { if( diacritics === null ){ diacritics = generateDiacritics(); diff --git a/lib/utils.ts b/lib/utils.ts index 7c06cb9..3ddb376 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -12,7 +12,7 @@ import * as T from './types.ts'; * @param {String} name The optionally dotted property name to fetch * @return {Object} The resolved property value */ -export function getAttr(obj:{[key:string]:any}, name:string ) { +export const getAttr = (obj:{[key:string]:any}, name:string ) => { if (!obj ) return; return obj[name]; }; @@ -23,7 +23,7 @@ export function getAttr(obj:{[key:string]:any}, name:string ) { * @param {String} name The optionally dotted property name to fetch * @return {Object} The resolved property value */ -export function getAttrNesting(obj:{[key:string]:any}, name:string ) { +export const getAttrNesting = (obj:{[key:string]:any}, name:string ) => { if (!obj ) return; var part, names = name.split("."); while( (part = names.shift()) && (obj = obj[part])); @@ -35,7 +35,7 @@ export function getAttrNesting(obj:{[key:string]:any}, name:string ) { * given value is against a search token. * */ -export function scoreValue(value:string, token:T.Token, weight:number ):number { +export const scoreValue = (value:string, token:T.Token, weight:number ):number => { var score, pos; if (!value) return 0; @@ -50,7 +50,7 @@ export function scoreValue(value:string, token:T.Token, weight:number ):number { return score * weight; }; -export function escape_regex(str:string):string { +export const escape_regex = (str:string):string => { return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); }; @@ -59,7 +59,7 @@ export function escape_regex(str:string):string { * Cast object property to an array if it exists and has a value * */ -export function propToArray(obj:{[key:string]:any}, key:string){ +export const propToArray = (obj:{[key:string]:any}, key:string) => { var value = obj[key]; if( value && !Array.isArray(value) ){ obj[key] = [value]; @@ -77,7 +77,7 @@ export function propToArray(obj:{[key:string]:any}, key:string){ * ``` * */ -export function iterate(object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) { +export const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => { if ( Array.isArray(object)) { object.forEach(callback); @@ -94,7 +94,7 @@ export function iterate(object:[]|{[key:string]:any}, callback:(value:any,key:nu -export function cmp(a:number|string, b:number|string) { +export const cmp = (a:number|string, b:number|string) => { if (typeof a === 'number' && typeof b === 'number') { return a > b ? 1 : (a < b ? -1 : 0); } From 8fdee0471b989e02ecaa6223b595fdda3dbcb577 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Fri, 2 Jul 2021 18:25:56 -0600 Subject: [PATCH 064/140] v0.7.4 Release --- dist/cjs/diacritics.js | 12 ++++---- dist/cjs/diacritics.js.map | 2 +- dist/cjs/sifter.js | 4 +-- dist/cjs/sifter.js.map | 2 +- dist/cjs/utils.js | 28 +++++++++---------- dist/cjs/utils.js.map | 2 +- dist/esm/diacritics.js | 12 ++++---- dist/esm/diacritics.js.map | 2 +- dist/esm/sifter.js | 4 +-- dist/esm/sifter.js.map | 2 +- dist/esm/utils.js | 28 +++++++++---------- dist/esm/utils.js.map | 2 +- dist/umd/sifter.js | 44 ++++++++++++++--------------- dist/umd/sifter.js.map | 2 +- dist/umd/sifter.min.js | 57 ++++++++++++++++++++------------------ dist/umd/sifter.min.js.map | 2 +- package.json | 2 +- 17 files changed, 102 insertions(+), 105 deletions(-) diff --git a/dist/cjs/diacritics.js b/dist/cjs/diacritics.js index 762c818..2b15cb5 100644 --- a/dist/cjs/diacritics.js +++ b/dist/cjs/diacritics.js @@ -16,16 +16,16 @@ var code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [10 * */ -function asciifold(str) { +const asciifold = str => { return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD').toLowerCase(); -} +}; /** * Generate a list of diacritics from the list of code points * */ -function generateDiacritics() { +const generateDiacritics = () => { var latin_convert = { 'l·': 'l', 'ʼn': 'n', @@ -61,7 +61,7 @@ function generateDiacritics() { }); //console.log('no_latin',JSON.stringify(no_latin)); return diacritics; -} +}; /** * Expand a regular expression pattern to include diacritics * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ @@ -69,7 +69,7 @@ function generateDiacritics() { */ var diacritics = null; -function diacriticRegexPoints(regex) { +const diacriticRegexPoints = regex => { if (diacritics === null) { diacritics = generateDiacritics(); } @@ -81,7 +81,7 @@ function diacriticRegexPoints(regex) { } return regex; -} +}; /** * Expand a regular expression pattern to include diacritics * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ diff --git a/dist/cjs/diacritics.js.map b/dist/cjs/diacritics.js.map index 5932313..3719d87 100644 --- a/dist/cjs/diacritics.js.map +++ b/dist/cjs/diacritics.js.map @@ -1 +1 @@ -{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp"],"mappings":"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"} \ No newline at end of file diff --git a/dist/cjs/sifter.js b/dist/cjs/sifter.js index aa20e92..9a0b049 100644 --- a/dist/cjs/sifter.js +++ b/dist/cjs/sifter.js @@ -19,6 +19,7 @@ var diacritics = require('./diacritics.js'); * * @author Brian Reavis */ + class Sifter { // []|{}; @@ -118,9 +119,6 @@ class Sifter { * Calculates the score of an object * against the search query. * - * @param {TToken} token - * @param {object} data - * @return {number} */ diff --git a/dist/cjs/sifter.js.map b/dist/cjs/sifter.js.map index e9d034b..eb67db2 100644 --- a/dist/cjs/sifter.js.map +++ b/dist/cjs/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight: number,\n}\n\ntype TSort = {\n\tfield: string,\n\tdirection?: string,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: TSort[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: TSort[],\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp|null,\n\tfield:string|null,\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: TResultItem[],\n\tweights: TWeights,\n\tgetAttrFn: (data:any,field:string)=>any,\n\n}\n\ntype TSettings = {\n\tdiacritics:boolean\n}\n\ntype TResultItem = {\n\tscore: number,\n\tid: number|string,\n}\n\n\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: TSettings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:TSettings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:TToken[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:TOptions ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:TOptions) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:TSort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:TResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:TOptions):TPrepareObj {\n\t\tconst weights:TWeights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:TField[] = [];\n\t\t\toptions.fields.forEach((field:string|TField) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search:TPrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","a","b","cmp","optsUser","assign","propToArray","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","a","b","cmp","optsUser","assign","propToArray","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/cjs/utils.js b/dist/cjs/utils.js index 6be7309..0e29649 100644 --- a/dist/cjs/utils.js +++ b/dist/cjs/utils.js @@ -13,10 +13,10 @@ var diacritics = require('./diacritics.js'); * @param {String} name The optionally dotted property name to fetch * @return {Object} The resolved property value */ -function getAttr(obj, name) { +const getAttr = (obj, name) => { if (!obj) return; return obj[name]; -} +}; /** * A property getter resolving dot-notation * @param {Object} obj The root object to fetch property on @@ -24,7 +24,7 @@ function getAttr(obj, name) { * @return {Object} The resolved property value */ -function getAttrNesting(obj, name) { +const getAttrNesting = (obj, name) => { if (!obj) return; var part, names = name.split("."); @@ -32,14 +32,14 @@ function getAttrNesting(obj, name) { while ((part = names.shift()) && (obj = obj[part])); return obj; -} +}; /** * Calculates how close of a match the * given value is against a search token. * */ -function scoreValue(value, token, weight) { +const scoreValue = (value, token, weight) => { var score, pos; if (!value) return 0; value = value + ''; @@ -48,22 +48,22 @@ function scoreValue(value, token, weight) { score = token.string.length / value.length; if (pos === 0) score += 0.5; return score * weight; -} -function escape_regex(str) { +}; +const escape_regex = str => { return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); -} +}; /** * Cast object property to an array if it exists and has a value * */ -function propToArray(obj, key) { +const propToArray = (obj, key) => { var value = obj[key]; if (value && !Array.isArray(value)) { obj[key] = [value]; } -} +}; /** * Iterates over arrays and hashes. * @@ -75,7 +75,7 @@ function propToArray(obj, key) { * */ -function iterate(object, callback) { +const iterate = (object, callback) => { if (Array.isArray(object)) { object.forEach(callback); } else { @@ -85,8 +85,8 @@ function iterate(object, callback) { } } } -} -function cmp(a, b) { +}; +const cmp = (a, b) => { if (typeof a === 'number' && typeof b === 'number') { return a > b ? 1 : a < b ? -1 : 0; } @@ -96,7 +96,7 @@ function cmp(a, b) { if (a > b) return 1; if (b > a) return -1; return 0; -} +}; exports.cmp = cmp; exports.escape_regex = escape_regex; diff --git a/dist/cjs/utils.js.map b/dist/cjs/utils.js.map index 213edae..f321b27 100644 --- a/dist/cjs/utils.js.map +++ b/dist/cjs/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { TToken } from './sifter.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport function scoreValue(value:string, token:TToken, weight:number ):number {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str:string):string {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj:{[key:string]:any}, key:string){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport function iterate(object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a:number|string, b:number|string) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","regex","string","length","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport const escape_regex = (str:string):string => {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","regex","string","length","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/diacritics.js b/dist/esm/diacritics.js index 9417e86..2824efa 100644 --- a/dist/esm/diacritics.js +++ b/dist/esm/diacritics.js @@ -12,16 +12,16 @@ var code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [10 * */ -function asciifold(str) { +const asciifold = str => { return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD').toLowerCase(); -} +}; /** * Generate a list of diacritics from the list of code points * */ -function generateDiacritics() { +const generateDiacritics = () => { var latin_convert = { 'l·': 'l', 'ʼn': 'n', @@ -57,7 +57,7 @@ function generateDiacritics() { }); //console.log('no_latin',JSON.stringify(no_latin)); return diacritics; -} +}; /** * Expand a regular expression pattern to include diacritics * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ @@ -65,7 +65,7 @@ function generateDiacritics() { */ var diacritics = null; -function diacriticRegexPoints(regex) { +const diacriticRegexPoints = regex => { if (diacritics === null) { diacritics = generateDiacritics(); } @@ -77,7 +77,7 @@ function diacriticRegexPoints(regex) { } return regex; -} +}; /** * Expand a regular expression pattern to include diacritics * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ diff --git a/dist/esm/diacritics.js.map b/dist/esm/diacritics.js.map index bcaff60..2f5cd9d 100644 --- a/dist/esm/diacritics.js.map +++ b/dist/esm/diacritics.js.map @@ -1 +1 @@ -{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/sifter.js b/dist/esm/sifter.js index 88094d1..5d93a90 100644 --- a/dist/esm/sifter.js +++ b/dist/esm/sifter.js @@ -17,6 +17,7 @@ import { diacriticRegexPoints, asciifold } from './diacritics.js'; * * @author Brian Reavis */ + class Sifter { // []|{}; @@ -116,9 +117,6 @@ class Sifter { * Calculates the score of an object * against the search query. * - * @param {TToken} token - * @param {object} data - * @return {number} */ diff --git a/dist/esm/sifter.js.map b/dist/esm/sifter.js.map index 3391229..abd94cb 100644 --- a/dist/esm/sifter.js.map +++ b/dist/esm/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight: number,\n}\n\ntype TSort = {\n\tfield: string,\n\tdirection?: string,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: TSort[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: TSort[],\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp|null,\n\tfield:string|null,\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: TResultItem[],\n\tweights: TWeights,\n\tgetAttrFn: (data:any,field:string)=>any,\n\n}\n\ntype TSettings = {\n\tdiacritics:boolean\n}\n\ntype TResultItem = {\n\tscore: number,\n\tid: number|string,\n}\n\n\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: TSettings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:TSettings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:TToken[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:TOptions ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:TOptions) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:TSort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:TResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:TOptions):TPrepareObj {\n\t\tconst weights:TWeights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:TField[] = [];\n\t\t\toptions.fields.forEach((field:string|TField) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search:TPrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","a","b","cmp","optsUser","assign","propToArray","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","a","b","cmp","optsUser","assign","propToArray","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/utils.js b/dist/esm/utils.js index 645403f..a840606 100644 --- a/dist/esm/utils.js +++ b/dist/esm/utils.js @@ -9,10 +9,10 @@ import { asciifold } from './diacritics.js'; * @param {String} name The optionally dotted property name to fetch * @return {Object} The resolved property value */ -function getAttr(obj, name) { +const getAttr = (obj, name) => { if (!obj) return; return obj[name]; -} +}; /** * A property getter resolving dot-notation * @param {Object} obj The root object to fetch property on @@ -20,7 +20,7 @@ function getAttr(obj, name) { * @return {Object} The resolved property value */ -function getAttrNesting(obj, name) { +const getAttrNesting = (obj, name) => { if (!obj) return; var part, names = name.split("."); @@ -28,14 +28,14 @@ function getAttrNesting(obj, name) { while ((part = names.shift()) && (obj = obj[part])); return obj; -} +}; /** * Calculates how close of a match the * given value is against a search token. * */ -function scoreValue(value, token, weight) { +const scoreValue = (value, token, weight) => { var score, pos; if (!value) return 0; value = value + ''; @@ -44,22 +44,22 @@ function scoreValue(value, token, weight) { score = token.string.length / value.length; if (pos === 0) score += 0.5; return score * weight; -} -function escape_regex(str) { +}; +const escape_regex = str => { return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); -} +}; /** * Cast object property to an array if it exists and has a value * */ -function propToArray(obj, key) { +const propToArray = (obj, key) => { var value = obj[key]; if (value && !Array.isArray(value)) { obj[key] = [value]; } -} +}; /** * Iterates over arrays and hashes. * @@ -71,7 +71,7 @@ function propToArray(obj, key) { * */ -function iterate(object, callback) { +const iterate = (object, callback) => { if (Array.isArray(object)) { object.forEach(callback); } else { @@ -81,8 +81,8 @@ function iterate(object, callback) { } } } -} -function cmp(a, b) { +}; +const cmp = (a, b) => { if (typeof a === 'number' && typeof b === 'number') { return a > b ? 1 : a < b ? -1 : 0; } @@ -92,7 +92,7 @@ function cmp(a, b) { if (a > b) return 1; if (b > a) return -1; return 0; -} +}; export { cmp, escape_regex, getAttr, getAttrNesting, iterate, propToArray, scoreValue }; //# sourceMappingURL=utils.js.map diff --git a/dist/esm/utils.js.map b/dist/esm/utils.js.map index 3d09cef..99d7975 100644 --- a/dist/esm/utils.js.map +++ b/dist/esm/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { TToken } from './sifter.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport function scoreValue(value:string, token:TToken, weight:number ):number {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str:string):string {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj:{[key:string]:any}, key:string){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport function iterate(object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a:number|string, b:number|string) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","regex","string","length","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport const escape_regex = (str:string):string => {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","regex","string","length","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file diff --git a/dist/umd/sifter.js b/dist/umd/sifter.js index c2d7f1b..72791ee 100644 --- a/dist/umd/sifter.js +++ b/dist/umd/sifter.js @@ -18,16 +18,16 @@ * */ - function asciifold(str) { + const asciifold = str => { return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD').toLowerCase(); - } + }; /** * Generate a list of diacritics from the list of code points * */ - function generateDiacritics() { + const generateDiacritics = () => { var latin_convert = { 'l·': 'l', 'ʼn': 'n', @@ -63,7 +63,7 @@ }); //console.log('no_latin',JSON.stringify(no_latin)); return diacritics; - } + }; /** * Expand a regular expression pattern to include diacritics * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ @@ -71,7 +71,7 @@ */ var diacritics = null; - function diacriticRegexPoints(regex) { + const diacriticRegexPoints = regex => { if (diacritics === null) { diacritics = generateDiacritics(); } @@ -83,7 +83,7 @@ } return regex; - } + }; /** * Expand a regular expression pattern to include diacritics * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ @@ -127,10 +127,10 @@ * @param {String} name The optionally dotted property name to fetch * @return {Object} The resolved property value */ - function getAttr(obj, name) { + const getAttr = (obj, name) => { if (!obj) return; return obj[name]; - } + }; /** * A property getter resolving dot-notation * @param {Object} obj The root object to fetch property on @@ -138,7 +138,7 @@ * @return {Object} The resolved property value */ - function getAttrNesting(obj, name) { + const getAttrNesting = (obj, name) => { if (!obj) return; var part, names = name.split("."); @@ -146,14 +146,14 @@ while ((part = names.shift()) && (obj = obj[part])); return obj; - } + }; /** * Calculates how close of a match the * given value is against a search token. * */ - function scoreValue(value, token, weight) { + const scoreValue = (value, token, weight) => { var score, pos; if (!value) return 0; value = value + ''; @@ -162,22 +162,22 @@ score = token.string.length / value.length; if (pos === 0) score += 0.5; return score * weight; - } - function escape_regex(str) { + }; + const escape_regex = str => { return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); - } + }; /** * Cast object property to an array if it exists and has a value * */ - function propToArray(obj, key) { + const propToArray = (obj, key) => { var value = obj[key]; if (value && !Array.isArray(value)) { obj[key] = [value]; } - } + }; /** * Iterates over arrays and hashes. * @@ -189,7 +189,7 @@ * */ - function iterate(object, callback) { + const iterate = (object, callback) => { if (Array.isArray(object)) { object.forEach(callback); } else { @@ -199,8 +199,8 @@ } } } - } - function cmp(a, b) { + }; + const cmp = (a, b) => { if (typeof a === 'number' && typeof b === 'number') { return a > b ? 1 : a < b ? -1 : 0; } @@ -210,7 +210,7 @@ if (a > b) return 1; if (b > a) return -1; return 0; - } + }; /** * sifter.js @@ -227,6 +227,7 @@ * * @author Brian Reavis */ + class Sifter { // []|{}; @@ -326,9 +327,6 @@ * Calculates the score of an object * against the search query. * - * @param {TToken} token - * @param {object} data - * @return {number} */ diff --git a/dist/umd/sifter.js.map b/dist/umd/sifter.js.map index 293f6ee..963c73d 100644 --- a/dist/umd/sifter.js.map +++ b/dist/umd/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { TToken } from './sifter.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport function scoreValue(value:string, token:TToken, weight:number ):number {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str:string):string {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj:{[key:string]:any}, key:string){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport function iterate(object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a:number|string, b:number|string) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight: number,\n}\n\ntype TSort = {\n\tfield: string,\n\tdirection?: string,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: TSort[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: TSort[],\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp|null,\n\tfield:string|null,\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: TResultItem[],\n\tweights: TWeights,\n\tgetAttrFn: (data:any,field:string)=>any,\n\n}\n\ntype TSettings = {\n\tdiacritics:boolean\n}\n\ntype TResultItem = {\n\tscore: number,\n\tid: number|string,\n}\n\n\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: TSettings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:TSettings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:TToken[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:TOptions ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:TOptions) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:TSort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:TResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:TOptions):TPrepareObj {\n\t\tconst weights:TWeights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:TField[] = [];\n\t\t\toptions.fields.forEach((field:string|TField) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search:TPrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","string","length","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport const escape_regex = (str:string):string => {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","string","length","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit","slice"],"mappings":";;;;;;;CAGA;CAsGA;CACA;CACA;CACA;;CACA,IAAIA,WAAW,GAAG,CACjB,CAAE,EAAF,EAAM,EAAN,CADiB,EAEjB,CAAE,GAAF,EAAO,GAAP,CAFiB,EAGjB,CAAE,GAAF,EAAO,GAAP,CAHiB,EAIjB,CAAE,GAAF,EAAO,GAAP,CAJiB,EAKjB,CAAE,GAAF,EAAO,GAAP,CALiB,EAMjB,CAAE,IAAF,EAAQ,IAAR,CANiB,EAOjB,CAAE,IAAF,EAAQ,IAAR,CAPiB,EAQjB,CAAE,IAAF,EAAQ,IAAR,CARiB,EASjB,CAAE,IAAF,EAAQ,IAAR,CATiB,EAUjB,CAAE,IAAF,EAAQ,IAAR,CAViB,EAWjB,CAAE,IAAF,EAAQ,IAAR,CAXiB,EAYjB,CAAE,IAAF,EAAQ,IAAR,CAZiB,EAajB,CAAE,IAAF,EAAQ,IAAR,CAbiB,EAcjB,CAAE,IAAF,EAAQ,IAAR,CAdiB,EAejB,CAAE,IAAF,EAAQ,IAAR,CAfiB,EAgBjB,CAAE,KAAF,EAAS,KAAT,CAhBiB,EAiBjB,CAAE,KAAF,EAAS,KAAT,CAjBiB,EAkBjB,CAAE,KAAF,EAAS,KAAT,CAlBiB,EAmBjB,CAAE,KAAF,EAAS,KAAT,CAnBiB,EAoBjB,CAAE,KAAF,EAAS,KAAT,CApBiB,EAqBjB,CAAE,KAAF,EAAS,KAAT,CArBiB,EAsBjB,CAAE,KAAF,EAAS,KAAT,CAtBiB,EAuBjB,CAAE,KAAF,EAAS,KAAT,CAvBiB,CAAlB;CA0BA;CACA;CACA;CACA;CACA;;CACO,MAAMC,SAAS,GAAIC,GAAD,IAAuB;CAC/C,SAAOA,GAAG,CAACC,SAAJ,CAAc,KAAd,EAAqBC,OAArB,CAA6B,kBAA7B,EAAiD,EAAjD,EAAqDD,SAArD,CAA+D,MAA/D,EAAuEE,WAAvE,EAAP;CACA,CAFM;CA8CP;CACA;CACA;CACA;;;CACO,MAAMC,kBAAkB,GAAG,MAAqB;CAEtD,MAAIC,aAAmC,GAAG;CACzC,UAAM,GADmC;CAEzC,UAAM,GAFmC;CAGzC,SAAK,IAHoC;CAIzC,SAAK,GAJoC;CAKzC,UAAM,GALmC;CAMzC,WAAO;CANkC,GAA1C;CASA,MAAIC,UAAgC,GAAG,EAAvC,CAXsD;;CAatDR,EAAAA,WAAW,CAACS,OAAZ,CAAqBC,UAAD,IAAc;CAEjC,SAAI,IAAIC,CAAC,GAAGD,UAAU,CAAC,CAAD,CAAtB,EAA2BC,CAAC,IAAID,UAAU,CAAC,CAAD,CAA1C,EAA+CC,CAAC,EAAhD,EAAmD;CAClD,UAAIC,SAAS,GAAGC,MAAM,CAACC,YAAP,CAAoBH,CAApB,CAAhB;CACA,UAAII,KAAK,GAAIH,SAAS,CAACT,SAAV,CAAoB,KAApB,EAA2BC,OAA3B,CAAmC,kBAAnC,EAAuD,EAAvD,EAA2DD,SAA3D,CAAqE,MAArE,CAAb;;CAEA,UAAIY,KAAK,IAAIH,SAAb,EAAwB;CACvB;CACA;CACA;;CAEDG,MAAAA,KAAK,GAAGA,KAAK,CAACV,WAAN,EAAR;;CAEA,UAAIU,KAAK,IAAIR,aAAb,EAA4B;CAC3BQ,QAAAA,KAAK,GAAGR,aAAa,CAACQ,KAAD,CAArB;CACA;;CAED,UAAI,EAAEA,KAAK,IAAIP,UAAX,CAAJ,EAA4B;CAC3BA,QAAAA,UAAU,CAACO,KAAD,CAAV,GAAoBA,KAAK,GAAGA,KAAK,CAACC,WAAN,EAA5B;CACA;;CACDR,MAAAA,UAAU,CAACO,KAAD,CAAV,IAAqBH,SAArB;CACA;CACD,GAtBD,EAbsD;;CAuCtD,SAAOJ,UAAP;CACA,CAxCM;CA0CP;CACA;CACA;CACA;CACA;;CACA,IAAIA,UAA8B,GAAG,IAArC;CACO,MAAMS,oBAAoB,GAAIC,KAAD,IAAyB;CAE5D,MAAIV,UAAU,KAAK,IAAnB,EAAyB;CACxBA,IAAAA,UAAU,GAAGF,kBAAkB,EAA/B;CACA;;CAED,OAAK,IAAIS,KAAT,IAAkBP,UAAlB,EAA8B;CAC7B,QAAIA,UAAU,CAACW,cAAX,CAA0BJ,KAA1B,CAAJ,EAAsC;CACrCG,MAAAA,KAAK,GAAGA,KAAK,CAACd,OAAN,CAAe,IAAIgB,MAAJ,CAAWL,KAAX,EAAiB,GAAjB,CAAf,EAAsC,MAAIP,UAAU,CAACO,KAAD,CAAd,GAAsB,GAA5D,CAAR;CACA;CACD;;CACD,SAAOG,KAAP;CACA,CAZM;CAeP;CACA;CACA;CACA;CACA;CACA;CACA;AACA;CACA;CACA;AACA;CACA;CACA;CACA;AACA;CACA;AACA;CACA;CACA;CACA;CACA;AACA;CACA;CACA;CACA;AACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CC7RA;;CAOA;CACA;CACA;CACA;CACA;CACA;CACO,MAAMG,OAAO,GAAG,CAACC,GAAD,EAAyBC,IAAzB,KAA0C;CAC7D,MAAI,CAACD,GAAL,EAAW;CACX,SAAOA,GAAG,CAACC,IAAD,CAAV;CACH,CAHM;CAKP;CACA;CACA;CACA;CACA;CACA;;CACO,MAAMC,cAAc,GAAG,CAACF,GAAD,EAAyBC,IAAzB,KAA0C;CACpE,MAAI,CAACD,GAAL,EAAW;CACX,MAAIG,IAAJ;CAAA,MAAUC,KAAK,GAAGH,IAAI,CAACI,KAAL,CAAW,GAAX,CAAlB;;CACH,SAAO,CAACF,IAAI,GAAGC,KAAK,CAACE,KAAN,EAAR,MAA2BN,GAAG,GAAGA,GAAG,CAACG,IAAD,CAApC,CAAP,CAAmD;;CAChD,SAAOH,GAAP;CACH,CALM;CAOP;CACA;CACA;CACA;CACA;;CACO,MAAMO,UAAU,GAAG,CAACC,KAAD,EAAeC,KAAf,EAA8BC,MAA9B,KAAwD;CACjF,MAAIC,KAAJ,EAAWC,GAAX;CAEA,MAAI,CAACJ,KAAL,EAAY,OAAO,CAAP;CAEZA,EAAAA,KAAK,GAAGA,KAAK,GAAG,EAAhB;CACAI,EAAAA,GAAG,GAAGJ,KAAK,CAACK,MAAN,CAAaJ,KAAK,CAACb,KAAnB,CAAN;CACA,MAAIgB,GAAG,KAAK,CAAC,CAAb,EAAgB,OAAO,CAAP;CAEhBD,EAAAA,KAAK,GAAGF,KAAK,CAACK,MAAN,CAAaC,MAAb,GAAsBP,KAAK,CAACO,MAApC;CACA,MAAIH,GAAG,KAAK,CAAZ,EAAeD,KAAK,IAAI,GAAT;CAEf,SAAOA,KAAK,GAAGD,MAAf;CACA,CAbM;CAeA,MAAMM,YAAY,GAAIpC,GAAD,IAAuB;CAClD,SAAO,CAACA,GAAG,GAAG,EAAP,EAAWE,OAAX,CAAmB,wBAAnB,EAA6C,MAA7C,CAAP;CACA,CAFM;CAKP;CACA;CACA;CACA;;CACO,MAAMmC,WAAW,GAAG,CAACjB,GAAD,EAAyBkB,GAAzB,KAAwC;CAClE,MAAIV,KAAK,GAAGR,GAAG,CAACkB,GAAD,CAAf;;CACA,MAAIV,KAAK,IAAI,CAACW,KAAK,CAACC,OAAN,CAAcZ,KAAd,CAAd,EAAoC;CACnCR,IAAAA,GAAG,CAACkB,GAAD,CAAH,GAAW,CAACV,KAAD,CAAX;CACA;CACD,CALM;CAQP;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CACO,MAAMa,OAAO,GAAG,CAACC,MAAD,EAA+BC,QAA/B,KAA+E;CAErG,MAAKJ,KAAK,CAACC,OAAN,CAAcE,MAAd,CAAL,EAA4B;CAC3BA,IAAAA,MAAM,CAACnC,OAAP,CAAeoC,QAAf;CAEA,GAHD,MAGK;CAEJ,SAAK,IAAIL,GAAT,IAAgBI,MAAhB,EAAwB;CACvB,UAAIA,MAAM,CAACzB,cAAP,CAAsBqB,GAAtB,CAAJ,EAAgC;CAC/BK,QAAAA,QAAQ,CAACD,MAAM,CAACJ,GAAD,CAAP,EAAcA,GAAd,CAAR;CACA;CACD;CACD;CACD,CAbM;CAiBA,MAAMM,GAAG,GAAG,CAACC,CAAD,EAAkBC,CAAlB,KAAsC;CACxD,MAAI,OAAOD,CAAP,KAAa,QAAb,IAAyB,OAAOC,CAAP,KAAa,QAA1C,EAAoD;CACnD,WAAOD,CAAC,GAAGC,CAAJ,GAAQ,CAAR,GAAaD,CAAC,GAAGC,CAAJ,GAAQ,CAAC,CAAT,GAAa,CAAjC;CACA;;CACDD,EAAAA,CAAC,GAAG9C,SAAS,CAAC8C,CAAC,GAAG,EAAL,CAAT,CAAkB1C,WAAlB,EAAJ;CACA2C,EAAAA,CAAC,GAAG/C,SAAS,CAAC+C,CAAC,GAAG,EAAL,CAAT,CAAkB3C,WAAlB,EAAJ;CACA,MAAI0C,CAAC,GAAGC,CAAR,EAAW,OAAO,CAAP;CACX,MAAIA,CAAC,GAAGD,CAAR,EAAW,OAAO,CAAC,CAAR;CACX,SAAO,CAAP;CACA,CATM;;CChGP;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;;CASe,MAAME,MAAN,CAAY;CAEZ;;CAGd;CACD;CACA;CACA;CACA;CACA;CACCC,EAAAA,WAAW,CAACC,KAAD,EAAYC,QAAZ,EAAiC;CAAA,SATrCD,KASqC;CAAA,SARrCC,QAQqC;CAC3C,SAAKD,KAAL,GAAaA,KAAb;CACA,SAAKC,QAAL,GAAgBA,QAAQ,IAAI;CAAC5C,MAAAA,UAAU,EAAE;CAAb,KAA5B;CACA;;CAED;CACD;CACA;CACA;CACA;CACC6C,EAAAA,QAAQ,CAACC,KAAD,EAAeC,uBAAf,EAAiDC,OAAjD,EAAgF;CACvF,QAAI,CAACF,KAAD,IAAU,CAACA,KAAK,CAACjB,MAArB,EAA6B,OAAO,EAAP;CAE7B,UAAMoB,MAAgB,GAAG,EAAzB;CACA,UAAMC,KAAK,GAAMJ,KAAK,CAAC3B,KAAN,CAAY,KAAZ,CAAjB;CACA,QAAIgC,WAAJ;;CAEA,QAAIH,OAAJ,EAAa;CACZG,MAAAA,WAAW,GAAG,IAAIvC,MAAJ,CAAY,OAAMwC,MAAM,CAACC,IAAP,CAAYL,OAAZ,EAAqBM,GAArB,CAAyBxB,YAAzB,EAAuCyB,IAAvC,CAA4C,GAA5C,CAAN,GAAuD,UAAnE,CAAd;CACA;;CAEDL,IAAAA,KAAK,CAACjD,OAAN,CAAeuD,IAAD,IAAiB;CAC9B,UAAIC,WAAJ;CACA,UAAIC,KAAiB,GAAG,IAAxB;CACA,UAAIhD,KAAiB,GAAG,IAAxB,CAH8B;;CAM9B,UAAIyC,WAAW,KAAKM,WAAW,GAAGD,IAAI,CAACG,KAAL,CAAWR,WAAX,CAAnB,CAAf,EAA4D;CAC3DO,QAAAA,KAAK,GAAGD,WAAW,CAAC,CAAD,CAAnB;CACAD,QAAAA,IAAI,GAAGC,WAAW,CAAC,CAAD,CAAlB;CACA;;CAED,UAAID,IAAI,CAAC3B,MAAL,GAAc,CAAlB,EAAqB;CACpBnB,QAAAA,KAAK,GAAGoB,YAAY,CAAC0B,IAAD,CAApB;;CACA,YAAI,KAAKZ,QAAL,CAAc5C,UAAlB,EAA8B;CAC7BU,UAAAA,KAAK,GAAGD,oBAAoB,CAACC,KAAD,CAA5B;CACA;;CACD,YAAIqC,uBAAJ,EAA8BrC,KAAK,GAAG,QAAMA,KAAd;CAC9B;;CAEDuC,MAAAA,MAAM,CAACW,IAAP,CAAY;CACXhC,QAAAA,MAAM,EAAG4B,IADE;CAEX9C,QAAAA,KAAK,EAAIA,KAAK,GAAG,IAAIE,MAAJ,CAAWF,KAAX,EAAiB,GAAjB,CAAH,GAA2B,IAF9B;CAGXgD,QAAAA,KAAK,EAAIA;CAHE,OAAZ;CAKA,KAxBD;CA0BA,WAAOT,MAAP;CACA;;CAGD;CACD;CACA;CACA;CACA;CACA;CACA;CACA;CACCY,EAAAA,gBAAgB,CAACf,KAAD,EAAegB,OAAf,EAAkC;CACjD,QAAInC,MAAM,GAAG,KAAKoC,aAAL,CAAmBjB,KAAnB,EAA0BgB,OAA1B,CAAb;CACA,WAAO,KAAKE,iBAAL,CAAuBrC,MAAvB,CAAP;CACA;;CAEDqC,EAAAA,iBAAiB,CAACrC,MAAD,EAAsB;CACtC,UAAMsB,MAAM,GAAItB,MAAM,CAACsB,MAAvB;CAAA,UACAgB,WAAW,GAAKhB,MAAM,CAACpB,MADvB;;CAGA,QAAI,CAACoC,WAAL,EAAkB;CACjB,aAAO,YAAW;CAAE,eAAO,CAAP;CAAW,OAA/B;CACA;;CAED,UAAMC,MAAM,GAAGvC,MAAM,CAACmC,OAAP,CAAeI,MAA9B;CAAA,UACAlB,OAAO,GAAKrB,MAAM,CAACqB,OADnB;CAAA,UAEAmB,WAAW,GAAID,MAAM,CAACrC,MAFtB;CAAA,UAGAuC,SAAS,GAAIzC,MAAM,CAACyC,SAHpB;;CAKA,QAAI,CAACD,WAAL,EAAkB;CACjB,aAAO,YAAW;CAAE,eAAO,CAAP;CAAW,OAA/B;CACA;CAGD;CACF;CACA;CACA;CACA;;;CACE,UAAME,WAAW,GAAI,YAAW;CAG/B,UAAIF,WAAW,KAAK,CAApB,EAAuB;CACtB,eAAO,UAAS5C,KAAT,EAAwB+C,IAAxB,EAAiC;CACvC,gBAAMZ,KAAK,GAAGQ,MAAM,CAAC,CAAD,CAAN,CAAUR,KAAxB;CACA,iBAAOrC,UAAU,CAAC+C,SAAS,CAACE,IAAD,EAAOZ,KAAP,CAAV,EAAyBnC,KAAzB,EAAgCyB,OAAO,CAACU,KAAD,CAAvC,CAAjB;CACA,SAHD;CAIA;;CAED,aAAO,UAASnC,KAAT,EAAwB+C,IAAxB,EAAiC;CACvC,YAAIC,GAAG,GAAG,CAAV,CADuC;;CAIvC,YAAIhD,KAAK,CAACmC,KAAV,EAAiB;CAEhB,gBAAMpC,KAAK,GAAG8C,SAAS,CAACE,IAAD,EAAO/C,KAAK,CAACmC,KAAb,CAAvB;;CAEA,cAAI,CAACnC,KAAK,CAACb,KAAP,IAAgBY,KAApB,EAA2B;CAC1BiD,YAAAA,GAAG,IAAK,IAAEJ,WAAV;CACA,WAFD,MAEK;CACJI,YAAAA,GAAG,IAAIlD,UAAU,CAACC,KAAD,EAAQC,KAAR,EAAe,CAAf,CAAjB;CACA;CAID,SAZD,MAYK;CACJY,UAAAA,OAAO,CAACa,OAAD,EAAU,CAACxB,MAAD,EAAgBkC,KAAhB,KAAiC;CACjDa,YAAAA,GAAG,IAAIlD,UAAU,CAAC+C,SAAS,CAACE,IAAD,EAAOZ,KAAP,CAAV,EAAyBnC,KAAzB,EAAgCC,MAAhC,CAAjB;CACA,WAFM,CAAP;CAGA;;CAED,eAAO+C,GAAG,GAAGJ,WAAb;CACA,OAvBD;CAwBA,KAlCmB,EAApB;;CAoCA,QAAIF,WAAW,KAAK,CAApB,EAAuB;CACtB,aAAO,UAASK,IAAT,EAAkB;CACxB,eAAOD,WAAW,CAACpB,MAAM,CAAC,CAAD,CAAP,EAAYqB,IAAZ,CAAlB;CACA,OAFD;CAGA;;CAED,QAAI3C,MAAM,CAACmC,OAAP,CAAeU,WAAf,KAA+B,KAAnC,EAA0C;CACzC,aAAO,UAASF,IAAT,EAAkB;CACxB,YAAInE,CAAC,GAAG,CAAR;CAAA,YAAWsB,KAAX;CAAA,YAAkB8C,GAAG,GAAG,CAAxB;;CACA,eAAOpE,CAAC,GAAG8D,WAAX,EAAwB9D,CAAC,EAAzB,EAA6B;CAC5BsB,UAAAA,KAAK,GAAG4C,WAAW,CAACpB,MAAM,CAAC9C,CAAD,CAAP,EAAYmE,IAAZ,CAAnB;CACA,cAAI7C,KAAK,IAAI,CAAb,EAAgB,OAAO,CAAP;CAChB8C,UAAAA,GAAG,IAAI9C,KAAP;CACA;;CACD,eAAO8C,GAAG,GAAGN,WAAb;CACA,OARD;CASA,KAVD,MAUO;CACN,aAAO,UAASK,IAAT,EAAkB;CACxB,YAAIC,GAAG,GAAG,CAAV;CACApC,QAAAA,OAAO,CAACc,MAAD,EAAS1B,KAAD,IAAiB;CAC/BgD,UAAAA,GAAG,IAAIF,WAAW,CAAC9C,KAAD,EAAQ+C,IAAR,CAAlB;CACA,SAFM,CAAP;CAGA,eAAOC,GAAG,GAAGN,WAAb;CACA,OAND;CAOA;CACD;;CAED;CACD;CACA;CACA;CACA;CACA;CACA;CACCQ,EAAAA,eAAe,CAAC3B,KAAD,EAAegB,OAAf,EAAkC;CAChD,QAAInC,MAAM,GAAI,KAAKoC,aAAL,CAAmBjB,KAAnB,EAA0BgB,OAA1B,CAAd;CACA,WAAO,KAAKY,gBAAL,CAAsB/C,MAAtB,CAAP;CACA;;CAED+C,EAAAA,gBAAgB,CAAC/C,MAAD,EAAqB;CACpC,QAAIxB,CAAJ,EAAOwE,CAAP,EAAUC,cAAV;CAEA,UAAMC,IAAI,GAAG,IAAb;CAAA,UACAf,OAAO,GAAInC,MAAM,CAACmC,OADlB;CAAA,UAEAgB,IAAI,GAAK,CAACnD,MAAM,CAACmB,KAAR,IAAiBgB,OAAO,CAACiB,UAA1B,GAAwCjB,OAAO,CAACiB,UAAhD,GAA6DjB,OAAO,CAACgB,IAF7E;CAAA,UAGAE,SAAkB,GAAI,EAHtB;CAAA,UAIAC,WAAoB,GAAG,EAJvB;CAOA;CACF;CACA;CACA;CACA;;CACE,UAAMC,SAAS,GAAG,SAAZA,SAAY,CAASnE,IAAT,EAAsBoE,MAAtB,EAAyD;CAC1E,UAAIpE,IAAI,KAAK,QAAb,EAAuB,OAAOoE,MAAM,CAAC1D,KAAd;CACvB,aAAOE,MAAM,CAACyC,SAAP,CAAiBS,IAAI,CAAClC,KAAL,CAAWwC,MAAM,CAACC,EAAlB,CAAjB,EAAwCrE,IAAxC,CAAP;CACA,KAHD,CAfoC;;;CAqBpC,QAAI+D,IAAJ,EAAU;CACT,WAAK3E,CAAC,GAAG,CAAJ,EAAOwE,CAAC,GAAGG,IAAI,CAACjD,MAArB,EAA6B1B,CAAC,GAAGwE,CAAjC,EAAoCxE,CAAC,EAArC,EAAyC;CACxC,YAAIwB,MAAM,CAACmB,KAAP,IAAgBgC,IAAI,CAAC3E,CAAD,CAAJ,CAAQuD,KAAR,KAAkB,QAAtC,EAAgD;CAC/CsB,UAAAA,SAAS,CAACpB,IAAV,CAAekB,IAAI,CAAC3E,CAAD,CAAnB;CACA;CACD;CACD,KA3BmC;CA8BpC;;;CACA,QAAIwB,MAAM,CAACmB,KAAX,EAAkB;CACjB8B,MAAAA,cAAc,GAAG,IAAjB;;CACA,WAAKzE,CAAC,GAAG,CAAJ,EAAOwE,CAAC,GAAGK,SAAS,CAACnD,MAA1B,EAAkC1B,CAAC,GAAGwE,CAAtC,EAAyCxE,CAAC,EAA1C,EAA8C;CAC7C,YAAI6E,SAAS,CAAC7E,CAAD,CAAT,CAAauD,KAAb,KAAuB,QAA3B,EAAqC;CACpCkB,UAAAA,cAAc,GAAG,KAAjB;CACA;CACA;CACD;;CACD,UAAIA,cAAJ,EAAoB;CACnBI,QAAAA,SAAS,CAACK,OAAV,CAAkB;CAAC3B,UAAAA,KAAK,EAAE,QAAR;CAAkB4B,UAAAA,SAAS,EAAE;CAA7B,SAAlB;CACA;CACD,KAXD,MAWO;CACN,WAAKnF,CAAC,GAAG,CAAJ,EAAOwE,CAAC,GAAGK,SAAS,CAACnD,MAA1B,EAAkC1B,CAAC,GAAGwE,CAAtC,EAAyCxE,CAAC,EAA1C,EAA8C;CAC7C,YAAI6E,SAAS,CAAC7E,CAAD,CAAT,CAAauD,KAAb,KAAuB,QAA3B,EAAqC;CACpCsB,UAAAA,SAAS,CAACO,MAAV,CAAiBpF,CAAjB,EAAoB,CAApB;CACA;CACA;CACD;CACD;;CAED,SAAKA,CAAC,GAAG,CAAJ,EAAOwE,CAAC,GAAGK,SAAS,CAACnD,MAA1B,EAAkC1B,CAAC,GAAGwE,CAAtC,EAAyCxE,CAAC,EAA1C,EAA8C;CAC7C8E,MAAAA,WAAW,CAACrB,IAAZ,CAAiBoB,SAAS,CAAC7E,CAAD,CAAT,CAAamF,SAAb,KAA2B,MAA3B,GAAoC,CAAC,CAArC,GAAyC,CAA1D;CACA,KArDmC;;;CAwDpC,UAAME,eAAe,GAAGR,SAAS,CAACnD,MAAlC;;CACA,QAAI,CAAC2D,eAAL,EAAsB;CACrB,aAAO,IAAP;CACA,KAFD,MAEO,IAAIA,eAAe,KAAK,CAAxB,EAA2B;CACjC,YAAMC,QAAQ,GAAGT,SAAS,CAAC,CAAD,CAAT,CAAatB,KAA9B;CACA,YAAMgC,UAAU,GAAGT,WAAW,CAAC,CAAD,CAA9B;CACA,aAAO,UAAS1C,CAAT,EAAyBC,CAAzB,EAAyC;CAC/C,eAAOkD,UAAU,GAAGpD,GAAG,CACtB4C,SAAS,CAACO,QAAD,EAAWlD,CAAX,CADa,EAEtB2C,SAAS,CAACO,QAAD,EAAWjD,CAAX,CAFa,CAAvB;CAIA,OALD;CAMA,KATM,MASA;CACN,aAAO,UAASD,CAAT,EAAyBC,CAAzB,EAAyC;CAC/C,YAAIrC,CAAJ,EAAOgF,MAAP,EAAezB,KAAf;;CACA,aAAKvD,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGqF,eAAhB,EAAiCrF,CAAC,EAAlC,EAAsC;CACrCuD,UAAAA,KAAK,GAAGsB,SAAS,CAAC7E,CAAD,CAAT,CAAauD,KAArB;CACAyB,UAAAA,MAAM,GAAGF,WAAW,CAAC9E,CAAD,CAAX,GAAiBmC,GAAG,CAC5B4C,SAAS,CAACxB,KAAD,EAAQnB,CAAR,CADmB,EAE5B2C,SAAS,CAACxB,KAAD,EAAQlB,CAAR,CAFmB,CAA7B;CAIA,cAAI2C,MAAJ,EAAY,OAAOA,MAAP;CACZ;;CACD,eAAO,CAAP;CACA,OAXD;CAYA;CACD;;CAED;CACD;CACA;CACA;CACA;CACA;CACCpB,EAAAA,aAAa,CAACjB,KAAD,EAAe6C,QAAf,EAAgD;CAC5D,UAAM3C,OAAiB,GAAG,EAA1B;CACA,QAAIc,OAAO,GAAIV,MAAM,CAACwC,MAAP,CAAc,EAAd,EAAiBD,QAAjB,CAAf;CAEA5D,IAAAA,WAAW,CAAC+B,OAAD,EAAS,MAAT,CAAX;CACA/B,IAAAA,WAAW,CAAC+B,OAAD,EAAS,YAAT,CAAX,CAL4D;;CAQ5D,QAAIA,OAAO,CAACI,MAAZ,EAAoB;CACnBnC,MAAAA,WAAW,CAAC+B,OAAD,EAAS,QAAT,CAAX;CACA,YAAMI,MAAgB,GAAG,EAAzB;CACAJ,MAAAA,OAAO,CAACI,MAAR,CAAejE,OAAf,CAAwByD,KAAD,IAA0B;CAChD,YAAI,OAAOA,KAAP,IAAgB,QAApB,EAA8B;CAC7BA,UAAAA,KAAK,GAAG;CAACA,YAAAA,KAAK,EAACA,KAAP;CAAalC,YAAAA,MAAM,EAAC;CAApB,WAAR;CACA;;CACD0C,QAAAA,MAAM,CAACN,IAAP,CAAYF,KAAZ;CACAV,QAAAA,OAAO,CAACU,KAAK,CAACA,KAAP,CAAP,GAAwB,YAAYA,KAAb,GAAsBA,KAAK,CAAClC,MAA5B,GAAqC,CAA5D;CACA,OAND;CAOAsC,MAAAA,OAAO,CAACI,MAAR,GAAiBA,MAAjB;CACA;;CAEDpB,IAAAA,KAAK,GAAGrD,SAAS,CAAEqD,KAAK,GAAG,EAAV,CAAT,CAAwBjD,WAAxB,GAAsCgG,IAAtC,EAAR;CAEA,WAAO;CACN/B,MAAAA,OAAO,EAAIA,OADL;CAENhB,MAAAA,KAAK,EAAIA,KAFH;CAGNG,MAAAA,MAAM,EAAI,KAAKJ,QAAL,CAAcC,KAAd,EAAqBgB,OAAO,CAACf,uBAA7B,EAAsDC,OAAtD,CAHJ;CAIN8C,MAAAA,KAAK,EAAI,CAJH;CAKNnD,MAAAA,KAAK,EAAI,EALH;CAMNK,MAAAA,OAAO,EAAIA,OANL;CAONoB,MAAAA,SAAS,EAAIN,OAAO,CAACiC,OAAT,GAAoB/E,cAApB,GAAqCH;CAP3C,KAAP;CASA;;CAED;CACD;CACA;CACA;CACCc,EAAAA,MAAM,CAACmB,KAAD,EAAegB,OAAf,EAAiD;CACtD,QAAIe,IAAI,GAAG,IAAX;CAAA,QAAiBpD,KAAjB;CAAA,QAAwBE,MAAxB;CAEAA,IAAAA,MAAM,GAAI,KAAKoC,aAAL,CAAmBjB,KAAnB,EAA0BgB,OAA1B,CAAV;CACAA,IAAAA,OAAO,GAAGnC,MAAM,CAACmC,OAAjB;CACAhB,IAAAA,KAAK,GAAKnB,MAAM,CAACmB,KAAjB,CALsD;;CAQtD,UAAMkD,QAAQ,GAAGlC,OAAO,CAACrC,KAAR,IAAiBoD,IAAI,CAACb,iBAAL,CAAuBrC,MAAvB,CAAlC,CARsD;;;CAWtD,QAAImB,KAAK,CAACjB,MAAV,EAAkB;CACjBM,MAAAA,OAAO,CAAC0C,IAAI,CAAClC,KAAN,EAAa,CAACsD,IAAD,EAAoBb,EAApB,KAAyC;CAC5D3D,QAAAA,KAAK,GAAGuE,QAAQ,CAACC,IAAD,CAAhB;;CACA,YAAInC,OAAO,CAACoC,MAAR,KAAmB,KAAnB,IAA4BzE,KAAK,GAAG,CAAxC,EAA2C;CAC1CE,UAAAA,MAAM,CAACgB,KAAP,CAAaiB,IAAb,CAAkB;CAAC,qBAASnC,KAAV;CAAiB,kBAAM2D;CAAvB,WAAlB;CACA;CACD,OALM,CAAP;CAMA,KAPD,MAOO;CACNjD,MAAAA,OAAO,CAAC0C,IAAI,CAAClC,KAAN,EAAa,CAACsD,IAAD,EAAoBb,EAApB,KAAyC;CAC5DzD,QAAAA,MAAM,CAACgB,KAAP,CAAaiB,IAAb,CAAkB;CAAC,mBAAS,CAAV;CAAa,gBAAMwB;CAAnB,SAAlB;CACA,OAFM,CAAP;CAGA;;CAED,UAAMe,OAAO,GAAGtB,IAAI,CAACH,gBAAL,CAAsB/C,MAAtB,CAAhB;;CACA,QAAIwE,OAAJ,EAAaxE,MAAM,CAACgB,KAAP,CAAamC,IAAb,CAAkBqB,OAAlB,EAzByC;;CA4BtDxE,IAAAA,MAAM,CAACmE,KAAP,GAAenE,MAAM,CAACgB,KAAP,CAAad,MAA5B;;CACA,QAAI,OAAOiC,OAAO,CAACsC,KAAf,KAAyB,QAA7B,EAAuC;CACtCzE,MAAAA,MAAM,CAACgB,KAAP,GAAehB,MAAM,CAACgB,KAAP,CAAa0D,KAAb,CAAmB,CAAnB,EAAsBvC,OAAO,CAACsC,KAA9B,CAAf;CACA;;CAED,WAAOzE,MAAP;CACA;;CA/UyB;;;;;;;;"} \ No newline at end of file diff --git a/dist/umd/sifter.min.js b/dist/umd/sifter.min.js index abd8cc5..ec64b7f 100644 --- a/dist/umd/sifter.min.js +++ b/dist/umd/sifter.min.js @@ -1,15 +1,17 @@ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).sifter=t()}(this,(function(){"use strict" var e=[[67,67],[160,160],[192,438],[452,652],[961,961],[1019,1019],[1083,1083],[1281,1289],[1984,1984],[5095,5095],[7429,7441],[7545,7549],[7680,7935],[8580,8580],[9398,9449],[11360,11391],[42792,42793],[42802,42851],[42873,42897],[42912,42922],[64256,64260],[65313,65338],[65345,65370]] -function t(e){return e.normalize("NFD").replace(/[\u0300-\u036F]/g,"").normalize("NFKD").toLowerCase()}var r=null -function n(t){null===r&&(r=function(){var t={"l·":"l","ʼn":"n","æ":"ae","ø":"o","aʾ":"a","dž":"dz"},r={} +const t=e=>e.normalize("NFD").replace(/[\u0300-\u036F]/g,"").normalize("NFKD").toLowerCase() +var r=null +const n=t=>{null===r&&(r=(()=>{var t={"l·":"l","ʼn":"n","æ":"ae","ø":"o","aʾ":"a","dž":"dz"},r={} return e.forEach((e=>{for(let n=e[0];n<=e[1];n++){let e=String.fromCharCode(n),i=e.normalize("NFD").replace(/[\u0300-\u036F]/g,"").normalize("NFKD") -i!=e&&(i=i.toLowerCase(),i in t&&(i=t[i]),i in r||(r[i]=i+i.toUpperCase()),r[i]+=e)}})),r}()) +i!=e&&(i=i.toLowerCase(),i in t&&(i=t[i]),i in r||(r[i]=i+i.toUpperCase()),r[i]+=e)}})),r})()) for(let e in r)r.hasOwnProperty(e)&&(t=t.replace(new RegExp(e,"g"),"["+r[e]+"]")) -return t}function i(e,t){if(e)return e[t]}function o(e,t){if(e){for(var r,n=t.split(".");(r=n.shift())&&(e=e[r]););return e}}function s(e,t,r){var n,i -return e?-1===(i=(e+="").search(t.regex))?0:(n=t.string.length/e.length,0===i&&(n+=.5),n*r):0}function u(e){return(e+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function c(e,t){var r=e[t] -r&&!Array.isArray(r)&&(e[t]=[r])}function f(e,t){if(Array.isArray(e))e.forEach(t) -else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)}function l(e,r){return"number"==typeof e&&"number"==typeof r?e>r?1:e(r=t(r+"").toLowerCase())?1:r>e?-1:0} -/** +return t},i=(e,t)=>{if(e)return e[t]},o=(e,t)=>{if(e){for(var r,n=t.split(".");(r=n.shift())&&(e=e[r]););return e}},s=(e,t,r)=>{var n,i +return e?-1===(i=(e+="").search(t.regex))?0:(n=t.string.length/e.length,0===i&&(n+=.5),n*r):0},c=e=>(e+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1"),u=(e,t)=>{var r=e[t] +r&&!Array.isArray(r)&&(e[t]=[r])},f=(e,t)=>{if(Array.isArray(e))e.forEach(t) +else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)},l=(e,r)=>"number"==typeof e&&"number"==typeof r?e>r?1:e(r=t(r+"").toLowerCase())?1:r>e?-1:0 + +;/** * sifter.js * Copyright (c) 2013–2020 Brian Reavis & contributors * @@ -23,36 +25,37 @@ else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)}function l(e,r){return"number * governing permissions and limitations under the License. * * @author Brian Reavis - */return class{constructor(e,t){this.items=void 0,this.settings=void 0,this.items=e,this.settings=t||{diacritics:!0}}tokenize(e,t,r){if(!e||!e.length)return[] + */ +return class{constructor(e,t){this.items=void 0,this.settings=void 0,this.items=e,this.settings=t||{diacritics:!0}}tokenize(e,t,r){if(!e||!e.length)return[] const i=[],o=e.split(/\s+/) var s -return r&&(s=new RegExp("^("+Object.keys(r).map(u).join("|")+"):(.*)$")),o.forEach((e=>{let r,o=null,c=null -s&&(r=e.match(s))&&(o=r[1],e=r[2]),e.length>0&&(c=u(e),this.settings.diacritics&&(c=n(c)),t&&(c="\\b"+c)),i.push({string:e,regex:c?new RegExp(c,"i"):null,field:o})})),i}getScoreFunction(e,t){var r=this.prepareSearch(e,t) +return r&&(s=new RegExp("^("+Object.keys(r).map(c).join("|")+"):(.*)$")),o.forEach((e=>{let r,o=null,u=null +s&&(r=e.match(s))&&(o=r[1],e=r[2]),e.length>0&&(u=c(e),this.settings.diacritics&&(u=n(u)),t&&(u="\\b"+u)),i.push({string:e,regex:u?new RegExp(u,"i"):null,field:o})})),i}getScoreFunction(e,t){var r=this.prepareSearch(e,t) return this._getScoreFunction(r)}_getScoreFunction(e){const t=e.tokens,r=t.length if(!r)return function(){return 0} -const n=e.options.fields,i=e.weights,o=n.length,u=e.getAttrFn +const n=e.options.fields,i=e.weights,o=n.length,c=e.getAttrFn if(!o)return function(){return 1} -const c=1===o?function(e,t){const r=n[0].field -return s(u(t,r),e,i[r])}:function(e,t){var r=0 -if(e.field){const n=u(t,e.field) -!e.regex&&n?r+=1/o:r+=s(n,e,1)}else f(i,((n,i)=>{r+=s(u(t,i),e,n)})) +const u=1===o?function(e,t){const r=n[0].field +return s(c(t,r),e,i[r])}:function(e,t){var r=0 +if(e.field){const n=c(t,e.field) +!e.regex&&n?r+=1/o:r+=s(n,e,1)}else f(i,((n,i)=>{r+=s(c(t,i),e,n)})) return r/o} -return 1===r?function(e){return c(t[0],e)}:"and"===e.options.conjunction?function(e){for(var n,i=0,o=0;i{n+=c(t,e)})),n/r}}getSortFunction(e,t){var r=this.prepareSearch(e,t) +return f(t,(t=>{n+=u(t,e)})),n/r}}getSortFunction(e,t){var r=this.prepareSearch(e,t) return this._getSortFunction(r)}_getSortFunction(e){var t,r,n -const i=this,o=e.options,s=!e.query&&o.sort_empty?o.sort_empty:o.sort,u=[],c=[],f=function(t,r){return"$score"===t?r.score:e.getAttrFn(i.items[r.id],t)} -if(s)for(t=0,r=s.length;t{"string"==typeof t&&(t={field:t,weight:1}),e.push(t),n[t.field]="weight"in t?t.weight:1})),s.fields=e}return{options:s,query:e=t(e+"").toLowerCase().trim(),tokens:this.tokenize(e,s.respect_word_boundaries,n),total:0,items:[],weights:n,getAttrFn:s.nesting?o:i}}search(e,t){var r,n,i=this n=this.prepareSearch(e,t),t=n.options,e=n.query diff --git a/dist/umd/sifter.min.js.map b/dist/umd/sifter.min.js.map index c5eda00..fc6b59d 100644 --- a/dist/umd/sifter.min.js.map +++ b/dist/umd/sifter.min.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nvar DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport function asciifold(str:string):string{\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport function generateDiacritics():TDiacraticList{\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport function diacriticRegexPoints(regex:string):string{\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { TToken } from './sifter.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttr(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport function getAttrNesting(obj:{[key:string]:any}, name:string ) {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport function scoreValue(value:string, token:TToken, weight:number ):number {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport function escape_regex(str:string):string {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport function propToArray(obj:{[key:string]:any}, key:string){\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport function iterate(object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport function cmp(a:number|string, b:number|string) {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n\n\ntype TField = {\n\tfield: string,\n\tweight: number,\n}\n\ntype TSort = {\n\tfield: string,\n\tdirection?: string,\n}\n\ntype TOptions = {\n \tfields: TField[],\n \tsort: TSort[],\n \tscore?: ()=>any,\n \tfilter?: boolean,\n \tlimit?: number,\n \tsort_empty?: TSort[],\n \tnesting?: boolean,\n\trespect_word_boundaries?: boolean,\n\tconjunction?: string,\n}\n\ntype TToken = {\n\tstring:string,\n\tregex:RegExp|null,\n\tfield:string|null,\n}\n\ntype TWeights = {[key:string]:number}\n\ntype TPrepareObj = {\n\toptions: TOptions,\n\tquery: string,\n\ttokens: TToken[],\n\ttotal: number,\n\titems: TResultItem[],\n\tweights: TWeights,\n\tgetAttrFn: (data:any,field:string)=>any,\n\n}\n\ntype TSettings = {\n\tdiacritics:boolean\n}\n\ntype TResultItem = {\n\tscore: number,\n\tid: number|string,\n}\n\n\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: TSettings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:TSettings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:TWeights ):TToken[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:TToken[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:TOptions ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:TPrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t * @param {TToken} token\n\t\t * @param {object} data\n\t\t * @return {number}\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:TToken, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:TToken)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:TOptions) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:TPrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:TSort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:TResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:TResultItem, b:TResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:TOptions):TPrepareObj {\n\t\tconst weights:TWeights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:TField[] = [];\n\t\t\toptions.fields.forEach((field:string|TField) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:TOptions) : TPrepareObj {\n\t\tvar self = this, score, search:TPrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:TResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","diacritics","diacriticRegexPoints","regex","latin_convert","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","generateDiacritics","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","string","length","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","this","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport const escape_regex = (str:string):string => {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","diacritics","diacriticRegexPoints","regex","latin_convert","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","generateDiacritics","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","string","length","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","this","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 4483c61..6aeb8bb 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.7.3", + "version": "0.7.4", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From c21e18827cbab18d3c68ba36e843e37e0945d0f3 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Jul 2021 18:02:07 -0600 Subject: [PATCH 065/140] *.d.ts in dist/types --- .config/tsconfig.json | 2 +- dist/types/diacritics.d.ts | 51 ++++++++++++++++++++++++++++++ dist/types/sifter.d.ts | 64 ++++++++++++++++++++++++++++++++++++++ dist/types/types.d.ts | 43 +++++++++++++++++++++++++ dist/types/utils.d.ts | 48 ++++++++++++++++++++++++++++ package.json | 3 +- release.sh | 7 +++++ 7 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 dist/types/diacritics.d.ts create mode 100644 dist/types/sifter.d.ts create mode 100644 dist/types/types.d.ts create mode 100644 dist/types/utils.d.ts diff --git a/.config/tsconfig.json b/.config/tsconfig.json index 1ae82d9..7ffa1d3 100644 --- a/.config/tsconfig.json +++ b/.config/tsconfig.json @@ -10,7 +10,7 @@ "declaration": true, "declarationDir": "../dist/types", - + "isolatedModules": true, "moduleResolution": "node" }, } diff --git a/dist/types/diacritics.d.ts b/dist/types/diacritics.d.ts new file mode 100644 index 0000000..0a71ec2 --- /dev/null +++ b/dist/types/diacritics.d.ts @@ -0,0 +1,51 @@ +declare type TDiacraticList = { + [key: string]: string; +}; +export declare const DIACRITICS: TDiacraticList; +/** + * Remove accents + * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 + * + */ +export declare const asciifold: (str: string) => string; +/** + * Generate a list of diacritics from the list of code points + * + */ +export declare const generateDiacritics: () => TDiacraticList; +export declare const diacriticRegexPoints: (regex: string) => string; +export {}; +/** + * Expand a regular expression pattern to include diacritics + * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ + * + * rollup will bundle this function (and the DIACRITICS constant) unless commented out + * +var diacriticRegex = (function() { + + var list = []; + for( let letter in DIACRITICS ){ + + if( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){ + continue; + } + + if( DIACRITICS.hasOwnProperty(letter) ){ + + var replace = letter + DIACRITICS[letter]; + if( letter.toUpperCase() in DIACRITICS ){ + replace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()]; + } + + list.push({let:letter,pat:'['+replace+']'}); + } + } + + return function(regex:string):string{ + list.forEach((item)=>{ + regex = regex.replace( new RegExp(item.let,'g'),item.pat); + }); + return regex; + } +})(); +*/ diff --git a/dist/types/sifter.d.ts b/dist/types/sifter.d.ts new file mode 100644 index 0000000..abf0dde --- /dev/null +++ b/dist/types/sifter.d.ts @@ -0,0 +1,64 @@ +/** + * sifter.js + * Copyright (c) 2013–2020 Brian Reavis & contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF + * ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + * + * @author Brian Reavis + */ +import * as T from 'types.ts'; +export default class Sifter { + items: any; + settings: T.Settings; + /** + * Textually searches arrays and hashes of objects + * by property (or multiple properties). Designed + * specifically for autocomplete. + * + */ + constructor(items: any, settings: T.Settings); + /** + * Splits a search string into an array of individual + * regexps to be used to match results. + * + */ + tokenize(query: string, respect_word_boundaries?: boolean, weights?: T.Weights): T.Token[]; + /** + * Returns a function to be used to score individual results. + * + * Good matches will have a higher score than poor matches. + * If an item is not a match, 0 will be returned by the function. + * + * @returns {function} + */ + getScoreFunction(query: string, options: T.Options): (data: {}) => any; + _getScoreFunction(search: T.PrepareObj): (data: {}) => any; + /** + * Returns a function that can be used to compare two + * results, for sorting purposes. If no sorting should + * be performed, `null` will be returned. + * + * @return function(a,b) + */ + getSortFunction(query: string, options: T.Options): ((a: any, b: any) => number) | null; + _getSortFunction(search: T.PrepareObj): ((a: any, b: any) => number) | null; + /** + * Parses a search query and returns an object + * with tokens and fields ready to be populated + * with results. + * + */ + prepareSearch(query: string, optsUser: T.Options): T.PrepareObj; + /** + * Searches through all items and returns a sorted array of matches. + * + */ + search(query: string, options: T.Options): T.PrepareObj; +} diff --git a/dist/types/types.d.ts b/dist/types/types.d.ts new file mode 100644 index 0000000..6669330 --- /dev/null +++ b/dist/types/types.d.ts @@ -0,0 +1,43 @@ +export declare type Field = { + field: string; + weight: number; +}; +export declare type Sort = { + field: string; + direction?: string; +}; +export declare type Options = { + fields: Field[]; + sort: Sort[]; + score?: () => any; + filter?: boolean; + limit?: number; + sort_empty?: Sort[]; + nesting?: boolean; + respect_word_boundaries?: boolean; + conjunction?: string; +}; +export declare type Token = { + string: string; + regex: RegExp | null; + field: string | null; +}; +export declare type Weights = { + [key: string]: number; +}; +export declare type PrepareObj = { + options: Options; + query: string; + tokens: Token[]; + total: number; + items: ResultItem[]; + weights: Weights; + getAttrFn: (data: any, field: string) => any; +}; +export declare type Settings = { + diacritics: boolean; +}; +export declare type ResultItem = { + score: number; + id: number | string; +}; diff --git a/dist/types/utils.d.ts b/dist/types/utils.d.ts new file mode 100644 index 0000000..8c40c60 --- /dev/null +++ b/dist/types/utils.d.ts @@ -0,0 +1,48 @@ +/** + * A property getter resolving dot-notation + * @param {Object} obj The root object to fetch property on + * @param {String} name The optionally dotted property name to fetch + * @return {Object} The resolved property value + */ +export declare const getAttr: (obj: { + [key: string]: any; +}, name: string) => any; +/** + * A property getter resolving dot-notation + * @param {Object} obj The root object to fetch property on + * @param {String} name The optionally dotted property name to fetch + * @return {Object} The resolved property value + */ +export declare const getAttrNesting: (obj: { + [key: string]: any; +}, name: string) => { + [key: string]: any; +} | undefined; +/** + * Calculates how close of a match the + * given value is against a search token. + * + */ +export declare const scoreValue: (value: string, token: any, weight: number) => number; +export declare const escape_regex: (str: string) => string; +/** + * Cast object property to an array if it exists and has a value + * + */ +export declare const propToArray: (obj: { + [key: string]: any; +}, key: string) => void; +/** + * Iterates over arrays and hashes. + * + * ``` + * iterate(this.items, function(item, id) { + * // invoked for each item + * }); + * ``` + * + */ +export declare const iterate: (object: [] | { + [key: string]: any; +}, callback: (value: any, key: number | string) => any) => void; +export declare const cmp: (a: number | string, b: number | string) => 1 | -1 | 0; diff --git a/package.json b/package.json index 6aeb8bb..c4436c2 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "main": "dist/umd/sifter.js", "browser": "dist/umd/sifter.js", "module": "dist/esm/sifter.js", - "types": "lib/sifter.ts", + "types": "dist/types/sifter.d.ts", "repository": { "type": "git", "url": "https://github.com/orchidjs/sifter.js.git" @@ -28,6 +28,7 @@ "pretest": "npm run build", "benchmark": "node --expose-gc benchmark/index.js", "build": "npx rollup -c .config/rollup.config.js", + "build:types": "tsc -p .config --emitDeclarationOnly", "coveralls": "jest --coverage && cat ./coverage/lcov.info | coveralls" }, "devDependencies": { diff --git a/release.sh b/release.sh index 416f849..deac877 100755 --- a/release.sh +++ b/release.sh @@ -96,6 +96,13 @@ if ! cp -r build/* dist; then fi +# make sure types are up-to-date +if ! npm run build:types; then + echo 'types not generated' + exit +fi + + # prompt before finalizing if ! ask "Version $VERSION is ready for release. Are you sure?"; then echo 'release aborted' From de9dc20388bcb273956e802c6e4f3371bf235ebc Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 22 Jul 2021 18:05:05 -0600 Subject: [PATCH 066/140] v0.7.5 Release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c4436c2..830ce86 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.7.4", + "version": "0.7.5", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 2ecb8179e5a03daa37a13bb34280af70787143ed Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Fri, 6 Aug 2021 22:46:30 -0600 Subject: [PATCH 067/140] add x-* to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ac03fef..1ab8027 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ benchmark/report*.json coverage package-lock.json build +x-* From 74a304a80d8fa9c64a4362d69f27b982deb4921e Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sun, 8 Aug 2021 13:31:49 -0600 Subject: [PATCH 068/140] tests: use strictEqual for utils.cmp test --- test/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/utils.js b/test/utils.js index e3c3260..ad73319 100644 --- a/test/utils.js +++ b/test/utils.js @@ -8,7 +8,7 @@ describe('#prepareSearch()', function() { var from = 'aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ'; var to = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; - assert.equal( utils.cmp(from,to), true); + assert.strictEqual( utils.cmp(from,to), 0 ); }); it('getAttr should return void when invalid object passed', function() { From 0c44b1ac8ebcc03bdf62769aaddc94a31ce2b343 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sun, 8 Aug 2021 13:35:52 -0600 Subject: [PATCH 069/140] consistent indent --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 830ce86..6b2e374 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "pretest": "npm run build", "benchmark": "node --expose-gc benchmark/index.js", "build": "npx rollup -c .config/rollup.config.js", - "build:types": "tsc -p .config --emitDeclarationOnly", + "build:types": "tsc -p .config --emitDeclarationOnly", "coveralls": "jest --coverage && cat ./coverage/lcov.info | coveralls" }, "devDependencies": { From b1a6dbd07167482bf25095679fbcf14196339e8d Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sun, 8 Aug 2021 13:39:57 -0600 Subject: [PATCH 070/140] match composed & uncomposed unicode characters --- lib/diacritics.ts | 206 ++++++++++++++++++++++++++++----------------- lib/sifter.ts | 5 +- test/diacritics.js | 64 ++++++++++++++ 3 files changed, 193 insertions(+), 82 deletions(-) create mode 100644 test/diacritics.js diff --git a/lib/diacritics.ts b/lib/diacritics.ts index 9758813..10940a4 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -2,6 +2,21 @@ type TDiacraticList = {[key:string]:string}; // https://github.com/andrewrk/node-diacritics/blob/master/index.js + +var latin_pat:RegExp; +const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}]'; // \u{2bc} +const accent_reg = new RegExp(accent_pat,'g'); +var diacritic_patterns:null|TDiacraticList = null; + +const latin_convert = { + 'æ': 'ae', + 'ⱥ': 'a', + 'ø': 'o', +}; + +const convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g'); + + export const DIACRITICS:TDiacraticList = { " ":" ", 0:"߀", @@ -107,7 +122,7 @@ export const DIACRITICS:TDiacraticList = { * code points generated from toCodePoints(); * removed 65339 to 65345 */ -var code_points = [ +export const code_points = [ [ 67, 67 ], [ 160, 160 ], [ 192, 438 ], @@ -139,7 +154,13 @@ var code_points = [ * */ export const asciifold = (str:string):string => { - return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD').toLowerCase(); + return str + .normalize('NFKD') + .replace(accent_reg, '') + .toLowerCase() + .replace(convert_pat,function(foreignletter) { + return latin_convert[foreignletter]; + }); }; @@ -162,7 +183,7 @@ function toCodePoints(tolerance=8){ //https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range char_codes.sort((a, b) => a - b); var accumulator: number[][] = []; - var result = char_codes.reduce(function (accumulator, currentValue, index, source) { + char_codes.reduce(function (accumulator, currentValue, index, source) { if( !index ){ accumulator.push( [currentValue,currentValue] ); @@ -178,56 +199,103 @@ function toCodePoints(tolerance=8){ } } - return accumulator; - }, accumulator); + return accumulator; + }, accumulator); - console.log(`char_codes (${result.length})`,result); } /** - * Generate a list of diacritics from the list of code points + * Convert array of strings to a regular expression + * ex ['ab','a'] => (?:ab|a) * */ -export const generateDiacritics = ():TDiacraticList => { +export const arrayToPattern = (chars:string[]):string =>{ + if( chars.length > 1 ){ + return '(?:'+chars.join('|')+')'; + } + return chars[0]; +}; - var latin_convert:{[key:string]:string} = { - 'l·': 'l', - 'ʼn': 'n', - 'æ': 'ae', - 'ø': 'o', - 'aʾ': 'a', - 'dž': 'dz', - }; +/** + * Get all possible combinations of substrings that add up to the given string + * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string + * + */ +export const allSubstrings = (input:string):string[][] => { + + if( input.length === 1) return [[input]]; + + var result:string[][] = []; + allSubstrings(input.substring(1)).forEach(function(subresult) { + var tmp = subresult.slice(0); + tmp[0] = input.charAt(0) + tmp[0]; + result.push(tmp); + + tmp = subresult.slice(0); + tmp.unshift(input.charAt(0)); + result.push(tmp); + }); + + return result; +} + +/** + * Generate a list of diacritics from the list of code points + * + */ +export const generateDiacritics = ():TDiacraticList => { - var diacritics:{[key:string]:string} = {}; - //var no_latin = []; + var diacritics:{[key:string]:string[]} = {}; code_points.forEach((code_range)=>{ for(let i = code_range[0]; i <= code_range[1]; i++){ - let diacritic = String.fromCharCode(i); - let latin = diacritic.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD'); - - if( latin == diacritic ){ - //no_latin.push(diacritic); + + let diacritic = String.fromCharCode(i); + let latin = asciifold(diacritic); + + if( latin == diacritic.toLowerCase() ){ continue; } - latin = latin.toLowerCase(); - - if( latin in latin_convert ){ - latin = latin_convert[latin]; - } - if( !(latin in diacritics) ){ - diacritics[latin] = latin + latin.toUpperCase(); + diacritics[latin] = [latin,latin.toUpperCase()]; } - diacritics[latin] += diacritic; + diacritics[latin].push(diacritic); } }); - - //console.log('no_latin',JSON.stringify(no_latin)); - - return diacritics; + + var latin_chars = Object.keys(diacritics); + + + // latin character pattern + // match longer substrings first + latin_chars = latin_chars.sort((a, b) => b.length - a.length ); + latin_pat = new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g'); + + + // build diacritic patterns + // ae needs: + // (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...)) + var diacritic_patterns:TDiacraticList = {}; + latin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{ + + var substrings = allSubstrings(latin); + var pattern = substrings.map((sub_pat)=>{ + + sub_pat = sub_pat.map((l)=>{ + if( diacritics.hasOwnProperty(l) ){ + return arrayToPattern(diacritics[l]); + } + return l; + }); + + return arrayToPattern(sub_pat); + }); + + diacritic_patterns[latin] = arrayToPattern(pattern); + }); + + return diacritic_patterns; } /** @@ -235,53 +303,33 @@ export const generateDiacritics = ():TDiacraticList => { * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ * */ -var diacritics:null|TDiacraticList = null export const diacriticRegexPoints = (regex:string):string => { - if( diacritics === null ){ - diacritics = generateDiacritics(); + if( diacritic_patterns === null ){ + diacritic_patterns = generateDiacritics(); } - - for( let latin in diacritics ){ - if( diacritics.hasOwnProperty(latin) ){ - regex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']'); + + const decomposed = regex.normalize('NFKD').toLowerCase(); + + return decomposed.split(latin_pat).map((part:string)=>{ + + if( part == '' ){ + return ''; } - } - return regex; -} - - -/** - * Expand a regular expression pattern to include diacritics - * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ - * - * rollup will bundle this function (and the DIACRITICS constant) unless commented out - * -var diacriticRegex = (function() { - - var list = []; - for( let letter in DIACRITICS ){ - - if( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){ - continue; + + // "ffl" or "ffl" + const no_accent = asciifold(part); + if( diacritic_patterns.hasOwnProperty(no_accent) ){ + return diacritic_patterns[no_accent]; } - - if( DIACRITICS.hasOwnProperty(letter) ){ - - var replace = letter + DIACRITICS[letter]; - if( letter.toUpperCase() in DIACRITICS ){ - replace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()]; - } - - list.push({let:letter,pat:'['+replace+']'}); + + // 'أهلا' (\u{623}\u{647}\u{644}\u{627}) or 'أهلا' (\u{627}\u{654}\u{647}\u{644}\u{627}) + const composed_part = part.normalize('NFC'); + if( composed_part != part ){ + return arrayToPattern([part,composed_part]); } - } - - return function(regex:string):string{ - list.forEach((item)=>{ - regex = regex.replace( new RegExp(item.let,'g'),item.pat); - }); - return regex; - } -})(); -*/ + + return part; + }).join(''); + +} diff --git a/lib/sifter.ts b/lib/sifter.ts index b515a03..d568f8f 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -17,7 +17,7 @@ // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" import { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts'; // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" -import { diacriticRegexPoints, asciifold } from './diacritics.ts'; +import { diacriticRegexPoints } from './diacritics.ts'; // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" import * as T from 'types.ts'; @@ -305,11 +305,10 @@ export default class Sifter{ options.fields = fields; } - query = asciifold( query + '' ).toLowerCase().trim(); return { options : options, - query : query, + query : query.toLowerCase().trim(), tokens : this.tokenize(query, options.respect_word_boundaries, weights), total : 0, items : [], diff --git a/test/diacritics.js b/test/diacritics.js new file mode 100644 index 0000000..ff7fd1e --- /dev/null +++ b/test/diacritics.js @@ -0,0 +1,64 @@ +var assert = require('assert'); +var diacritics = require('../build/cjs/diacritics.js'); +var utils = require('../build/cjs/utils.js'); +var Sifter = require('../build/cjs/sifter.js'); + +describe('diacritics', () => { + + it('Should match composed and decomposed strings', () => { + + const sifter = new Sifter([]); + const composed = 'أهلا'; // '\u{623}\u{647}\u{644}\u{627}' + const decomposed = 'أهلا'; // '\u{627}\u{654}\u{647}\u{644}\u{627}' + + assert.notEqual(composed,decomposed); + + + tokens = sifter.tokenize(composed); + assert.equal(tokens[0].regex.test(composed), true); + + tokens = sifter.tokenize(decomposed); + assert.equal(tokens[0].regex.test(decomposed), true); + + tokens = sifter.tokenize(composed); + assert.equal(tokens[0].regex.test(decomposed), true); + + tokens = sifter.tokenize(decomposed); + assert.equal(tokens[0].regex.test(composed), true); + + }); + + + it('Should match all diacritic code points',()=>{ + + const sifter = new Sifter([]); + + diacritics.code_points.forEach((code_range)=>{ + for(let i = code_range[0]; i <= code_range[1]; i++){ + + let composed = String.fromCharCode(i); + let decomposed = composed.normalize('NFKD'); + + if( composed.trim().length == 0 ){ + continue; + } + + tokens = sifter.tokenize(composed); + assert.equal(tokens[0].regex.test(composed), true); + + tokens = sifter.tokenize(decomposed); + assert.equal(tokens[0].regex.test(decomposed), true); + + tokens = sifter.tokenize(composed); + assert.equal(tokens[0].regex.test(decomposed), true); + + tokens = sifter.tokenize(decomposed); + assert.equal(tokens[0].regex.test(composed), true); + + }; + }); + + }); + + +}); From a3cab10d7d6fca0c2790abfd1fda8bd369906311 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sun, 8 Aug 2021 15:33:43 -0600 Subject: [PATCH 071/140] fix matching too many rows --- lib/diacritics.ts | 6 +++--- test/search.js | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index 10940a4..c551246 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -209,9 +209,9 @@ function toCodePoints(tolerance=8){ * ex ['ab','a'] => (?:ab|a) * */ -export const arrayToPattern = (chars:string[]):string =>{ +export const arrayToPattern = (chars:string[],glue:string='|'):string =>{ if( chars.length > 1 ){ - return '(?:'+chars.join('|')+')'; + return '(?:'+chars.join(glue)+')'; } return chars[0]; }; @@ -289,7 +289,7 @@ export const generateDiacritics = ():TDiacraticList => { return l; }); - return arrayToPattern(sub_pat); + return arrayToPattern(sub_pat,''); }); diacritic_patterns[latin] = arrayToPattern(pattern); diff --git a/test/search.js b/test/search.js index abab18c..1c7fd98 100644 --- a/test/search.js +++ b/test/search.js @@ -303,5 +303,19 @@ describe('#search()', function() { assert.equal(result.items[0].id,0); }); + it('should match one item', function() { + + var data = [ + {fieldx: 'ffal'}, + {fieldx: 'ffla'} + ]; + var sifter = new Sifter(data); + + var result = sifter.search('ffl', { + fields: ['fieldx'] + }); + + assert.equal(result.items.length,1); + }); }); From ba7d5b98eb25a8d61e6cb48ce57ee499b3c93d83 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sun, 8 Aug 2021 15:53:25 -0600 Subject: [PATCH 072/140] add custom assert message --- test/diacritics.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/diacritics.js b/test/diacritics.js index ff7fd1e..655926a 100644 --- a/test/diacritics.js +++ b/test/diacritics.js @@ -44,16 +44,16 @@ describe('diacritics', () => { } tokens = sifter.tokenize(composed); - assert.equal(tokens[0].regex.test(composed), true); + assert.equal(tokens[0].regex.test(composed), false, 'composed should match composed for ' + composed + ' regex: '+tokens[0].regex); tokens = sifter.tokenize(decomposed); - assert.equal(tokens[0].regex.test(decomposed), true); + assert.equal(tokens[0].regex.test(decomposed), true, 'decomposed should match composed for ' + decomposed + ' and ' + composed + ' regex: '+tokens[0].regex); tokens = sifter.tokenize(composed); - assert.equal(tokens[0].regex.test(decomposed), true); + assert.equal(tokens[0].regex.test(decomposed), true, 'composed should match decomposed for ' + composed + ' and ' + decomposed + ' regex: '+tokens[0].regex); tokens = sifter.tokenize(decomposed); - assert.equal(tokens[0].regex.test(composed), true); + assert.equal(tokens[0].regex.test(composed), true, 'decomposed should match composed for ' + decomposed + ' and ' + composed + ' regex: '+tokens[0].regex); }; }); From b7e6610f6b2b24cebf2c58b2bf16b19615a4ba11 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sun, 8 Aug 2021 15:55:05 -0600 Subject: [PATCH 073/140] fix wrong assertion value --- test/diacritics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/diacritics.js b/test/diacritics.js index 655926a..f4d0d94 100644 --- a/test/diacritics.js +++ b/test/diacritics.js @@ -44,7 +44,7 @@ describe('diacritics', () => { } tokens = sifter.tokenize(composed); - assert.equal(tokens[0].regex.test(composed), false, 'composed should match composed for ' + composed + ' regex: '+tokens[0].regex); + assert.equal(tokens[0].regex.test(composed), true, 'composed should match composed for ' + composed + ' regex: '+tokens[0].regex); tokens = sifter.tokenize(decomposed); assert.equal(tokens[0].regex.test(decomposed), true, 'decomposed should match composed for ' + decomposed + ' and ' + composed + ' regex: '+tokens[0].regex); From 2d946f955430932a5b1e5a1cb6923fee66ddcc9a Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sun, 8 Aug 2021 16:30:29 -0600 Subject: [PATCH 074/140] regex will be case-insensitive and doesn't need latin.toUpperCase --- lib/diacritics.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index c551246..c2df8a5 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -258,7 +258,7 @@ export const generateDiacritics = ():TDiacraticList => { } if( !(latin in diacritics) ){ - diacritics[latin] = [latin,latin.toUpperCase()]; + diacritics[latin] = [latin]; } diacritics[latin].push(diacritic); } From 3536ef4bd6a57da74eb6f394c5864f1a091b2cf6 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sun, 8 Aug 2021 16:36:51 -0600 Subject: [PATCH 075/140] unicode RegExp flag --- lib/sifter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index d568f8f..24f14be 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -74,7 +74,7 @@ export default class Sifter{ tokens.push({ string : word, - regex : regex ? new RegExp(regex,'i') : null, + regex : regex ? new RegExp(regex,'iu') : null, field : field, }); }); From c2350d8f9007679420288942a05138d453f95117 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sun, 8 Aug 2021 21:34:44 -0600 Subject: [PATCH 076/140] fix typescript notices --- lib/diacritics.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index c2df8a5..67b82cd 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -6,9 +6,9 @@ type TDiacraticList = {[key:string]:string}; var latin_pat:RegExp; const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}]'; // \u{2bc} const accent_reg = new RegExp(accent_pat,'g'); -var diacritic_patterns:null|TDiacraticList = null; +var diacritic_patterns:TDiacraticList; -const latin_convert = { +const latin_convert:TDiacraticList = { 'æ': 'ae', 'ⱥ': 'a', 'ø': 'o', @@ -305,7 +305,7 @@ export const generateDiacritics = ():TDiacraticList => { */ export const diacriticRegexPoints = (regex:string):string => { - if( diacritic_patterns === null ){ + if( diacritic_patterns === undefined ){ diacritic_patterns = generateDiacritics(); } From ee013a55be60aad8b0ab3a703cd23f62b547eebf Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sun, 8 Aug 2021 21:40:00 -0600 Subject: [PATCH 077/140] v0.8.0 Release --- dist/cjs/diacritics.js | 164 ++++++++++++++++++++++--------------- dist/cjs/diacritics.js.map | 2 +- dist/cjs/sifter.js | 5 +- dist/cjs/sifter.js.map | 2 +- dist/esm/diacritics.js | 163 +++++++++++++++++++++--------------- dist/esm/diacritics.js.map | 2 +- dist/esm/sifter.js | 7 +- dist/esm/sifter.js.map | 2 +- dist/types/diacritics.d.ts | 52 +++++------- dist/umd/sifter.js | 164 ++++++++++++++++++++++--------------- dist/umd/sifter.js.map | 2 +- dist/umd/sifter.min.js | 69 +++++++++------- dist/umd/sifter.min.js.map | 2 +- package.json | 2 +- 14 files changed, 365 insertions(+), 273 deletions(-) diff --git a/dist/cjs/diacritics.js b/dist/cjs/diacritics.js index 2b15cb5..dab3ee1 100644 --- a/dist/cjs/diacritics.js +++ b/dist/cjs/diacritics.js @@ -4,12 +4,23 @@ Object.defineProperty(exports, '__esModule', { value: true }); // https://github.com/andrewrk/node-diacritics/blob/master/index.js +var latin_pat; +const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}]'; // \u{2bc} + +const accent_reg = new RegExp(accent_pat, 'g'); +var diacritic_patterns; +const latin_convert = { + 'æ': 'ae', + 'ⱥ': 'a', + 'ø': 'o' +}; +const convert_pat = new RegExp(Object.keys(latin_convert).join('|'), 'g'); /** * code points generated from toCodePoints(); * removed 65339 to 65345 */ -var code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [1019, 1019], [1083, 1083], [1281, 1289], [1984, 1984], [5095, 5095], [7429, 7441], [7545, 7549], [7680, 7935], [8580, 8580], [9398, 9449], [11360, 11391], [42792, 42793], [42802, 42851], [42873, 42897], [42912, 42922], [64256, 64260], [65313, 65338], [65345, 65370]]; +const code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [1019, 1019], [1083, 1083], [1281, 1289], [1984, 1984], [5095, 5095], [7429, 7441], [7545, 7549], [7680, 7935], [8580, 8580], [9398, 9449], [11360, 11391], [42792, 42793], [42802, 42851], [42873, 42897], [42912, 42922], [64256, 64260], [65313, 65338], [65345, 65370]]; /** * Remove accents * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 @@ -17,50 +28,90 @@ var code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [10 */ const asciifold = str => { - return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD').toLowerCase(); + return str.normalize('NFKD').replace(accent_reg, '').toLowerCase().replace(convert_pat, function (foreignletter) { + return latin_convert[foreignletter]; + }); }; /** - * Generate a list of diacritics from the list of code points + * Convert array of strings to a regular expression + * ex ['ab','a'] => (?:ab|a) * */ -const generateDiacritics = () => { - var latin_convert = { - 'l·': 'l', - 'ʼn': 'n', - 'æ': 'ae', - 'ø': 'o', - 'aʾ': 'a', - 'dž': 'dz' - }; - var diacritics = {}; //var no_latin = []; +const arrayToPattern = (chars, glue = '|') => { + if (chars.length > 1) { + return '(?:' + chars.join(glue) + ')'; + } + + return chars[0]; +}; +/** + * Get all possible combinations of substrings that add up to the given string + * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string + * + */ + +const allSubstrings = input => { + if (input.length === 1) return [[input]]; + var result = []; + allSubstrings(input.substring(1)).forEach(function (subresult) { + var tmp = subresult.slice(0); + tmp[0] = input.charAt(0) + tmp[0]; + result.push(tmp); + tmp = subresult.slice(0); + tmp.unshift(input.charAt(0)); + result.push(tmp); + }); + return result; +}; +/** + * Generate a list of diacritics from the list of code points + * + */ +const generateDiacritics = () => { + var diacritics = {}; code_points.forEach(code_range => { for (let i = code_range[0]; i <= code_range[1]; i++) { let diacritic = String.fromCharCode(i); - let latin = diacritic.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD'); + let latin = asciifold(diacritic); - if (latin == diacritic) { - //no_latin.push(diacritic); + if (latin == diacritic.toLowerCase()) { continue; } - latin = latin.toLowerCase(); - - if (latin in latin_convert) { - latin = latin_convert[latin]; - } - if (!(latin in diacritics)) { - diacritics[latin] = latin + latin.toUpperCase(); + diacritics[latin] = [latin]; } - diacritics[latin] += diacritic; + diacritics[latin].push(diacritic); } - }); //console.log('no_latin',JSON.stringify(no_latin)); - - return diacritics; + }); + var latin_chars = Object.keys(diacritics); // latin character pattern + // match longer substrings first + + latin_chars = latin_chars.sort((a, b) => b.length - a.length); + latin_pat = new RegExp('(' + arrayToPattern(latin_chars) + accent_pat + '*)', 'g'); // build diacritic patterns + // ae needs: + // (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...)) + + var diacritic_patterns = {}; + latin_chars.sort((a, b) => a.length - b.length).forEach(latin => { + var substrings = allSubstrings(latin); + var pattern = substrings.map(sub_pat => { + sub_pat = sub_pat.map(l => { + if (diacritics.hasOwnProperty(l)) { + return arrayToPattern(diacritics[l]); + } + + return l; + }); + return arrayToPattern(sub_pat, ''); + }); + diacritic_patterns[latin] = arrayToPattern(pattern); + }); + return diacritic_patterns; }; /** * Expand a regular expression pattern to include diacritics @@ -68,56 +119,39 @@ const generateDiacritics = () => { * */ -var diacritics = null; const diacriticRegexPoints = regex => { - if (diacritics === null) { - diacritics = generateDiacritics(); + if (diacritic_patterns === undefined) { + diacritic_patterns = generateDiacritics(); } - for (let latin in diacritics) { - if (diacritics.hasOwnProperty(latin)) { - regex = regex.replace(new RegExp(latin, 'g'), '[' + diacritics[latin] + ']'); - } - } + const decomposed = regex.normalize('NFKD').toLowerCase(); + return decomposed.split(latin_pat).map(part => { + if (part == '') { + return ''; + } // "ffl" or "ffl" - return regex; -}; -/** - * Expand a regular expression pattern to include diacritics - * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ - * - * rollup will bundle this function (and the DIACRITICS constant) unless commented out - * -var diacriticRegex = (function() { - var list = []; - for( let letter in DIACRITICS ){ + const no_accent = asciifold(part); - if( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){ - continue; - } + if (diacritic_patterns.hasOwnProperty(no_accent)) { + return diacritic_patterns[no_accent]; + } // 'أهلا' (\u{623}\u{647}\u{644}\u{627}) or 'أهلا' (\u{627}\u{654}\u{647}\u{644}\u{627}) - if( DIACRITICS.hasOwnProperty(letter) ){ - var replace = letter + DIACRITICS[letter]; - if( letter.toUpperCase() in DIACRITICS ){ - replace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()]; - } + const composed_part = part.normalize('NFC'); - list.push({let:letter,pat:'['+replace+']'}); - } - } + if (composed_part != part) { + return arrayToPattern([part, composed_part]); + } - return function(regex:string):string{ - list.forEach((item)=>{ - regex = regex.replace( new RegExp(item.let,'g'),item.pat); - }); - return regex; - } -})(); -*/ + return part; + }).join(''); +}; +exports.allSubstrings = allSubstrings; +exports.arrayToPattern = arrayToPattern; exports.asciifold = asciifold; +exports.code_points = code_points; exports.diacriticRegexPoints = diacriticRegexPoints; exports.generateDiacritics = generateDiacritics; //# sourceMappingURL=diacritics.js.map diff --git a/dist/cjs/diacritics.js.map b/dist/cjs/diacritics.js.map index 3719d87..7646deb 100644 --- a/dist/cjs/diacritics.js.map +++ b/dist/cjs/diacritics.js.map @@ -1 +1 @@ -{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\tif( chars.length > 1 ){\n\t\treturn '(?:'+chars.join(glue)+')';\n\t}\n\treturn chars[0];\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\t\t\t\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\t\t\t\n\t\t\t\t\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","allSubstrings","input","result","substring","forEach","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","latin_chars","sort","a","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part"],"mappings":"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"} \ No newline at end of file diff --git a/dist/cjs/sifter.js b/dist/cjs/sifter.js index 9a0b049..8d49879 100644 --- a/dist/cjs/sifter.js +++ b/dist/cjs/sifter.js @@ -75,7 +75,7 @@ class Sifter { tokens.push({ string: word, - regex: regex ? new RegExp(regex, 'i') : null, + regex: regex ? new RegExp(regex, 'iu') : null, field: field }); }); @@ -307,10 +307,9 @@ class Sifter { options.fields = fields; } - query = diacritics.asciifold(query + '').toLowerCase().trim(); return { options: options, - query: query, + query: query.toLowerCase().trim(), tokens: this.tokenize(query, options.respect_word_boundaries, weights), total: 0, items: [], diff --git a/dist/cjs/sifter.js.map b/dist/cjs/sifter.js.map index eb67db2..3fa777d 100644 --- a/dist/cjs/sifter.js.map +++ b/dist/cjs/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","a","b","cmp","optsUser","assign","propToArray","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","a","b","cmp","optsUser","assign","propToArray","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/diacritics.js b/dist/esm/diacritics.js index 2824efa..6c29fa3 100644 --- a/dist/esm/diacritics.js +++ b/dist/esm/diacritics.js @@ -1,11 +1,22 @@ /*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ // https://github.com/andrewrk/node-diacritics/blob/master/index.js +var latin_pat; +const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}]'; // \u{2bc} + +const accent_reg = new RegExp(accent_pat, 'g'); +var diacritic_patterns; +const latin_convert = { + 'æ': 'ae', + 'ⱥ': 'a', + 'ø': 'o' +}; +const convert_pat = new RegExp(Object.keys(latin_convert).join('|'), 'g'); /** * code points generated from toCodePoints(); * removed 65339 to 65345 */ -var code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [1019, 1019], [1083, 1083], [1281, 1289], [1984, 1984], [5095, 5095], [7429, 7441], [7545, 7549], [7680, 7935], [8580, 8580], [9398, 9449], [11360, 11391], [42792, 42793], [42802, 42851], [42873, 42897], [42912, 42922], [64256, 64260], [65313, 65338], [65345, 65370]]; +const code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [1019, 1019], [1083, 1083], [1281, 1289], [1984, 1984], [5095, 5095], [7429, 7441], [7545, 7549], [7680, 7935], [8580, 8580], [9398, 9449], [11360, 11391], [42792, 42793], [42802, 42851], [42873, 42897], [42912, 42922], [64256, 64260], [65313, 65338], [65345, 65370]]; /** * Remove accents * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 @@ -13,50 +24,90 @@ var code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [10 */ const asciifold = str => { - return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD').toLowerCase(); + return str.normalize('NFKD').replace(accent_reg, '').toLowerCase().replace(convert_pat, function (foreignletter) { + return latin_convert[foreignletter]; + }); }; /** - * Generate a list of diacritics from the list of code points + * Convert array of strings to a regular expression + * ex ['ab','a'] => (?:ab|a) * */ -const generateDiacritics = () => { - var latin_convert = { - 'l·': 'l', - 'ʼn': 'n', - 'æ': 'ae', - 'ø': 'o', - 'aʾ': 'a', - 'dž': 'dz' - }; - var diacritics = {}; //var no_latin = []; +const arrayToPattern = (chars, glue = '|') => { + if (chars.length > 1) { + return '(?:' + chars.join(glue) + ')'; + } + + return chars[0]; +}; +/** + * Get all possible combinations of substrings that add up to the given string + * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string + * + */ + +const allSubstrings = input => { + if (input.length === 1) return [[input]]; + var result = []; + allSubstrings(input.substring(1)).forEach(function (subresult) { + var tmp = subresult.slice(0); + tmp[0] = input.charAt(0) + tmp[0]; + result.push(tmp); + tmp = subresult.slice(0); + tmp.unshift(input.charAt(0)); + result.push(tmp); + }); + return result; +}; +/** + * Generate a list of diacritics from the list of code points + * + */ +const generateDiacritics = () => { + var diacritics = {}; code_points.forEach(code_range => { for (let i = code_range[0]; i <= code_range[1]; i++) { let diacritic = String.fromCharCode(i); - let latin = diacritic.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD'); + let latin = asciifold(diacritic); - if (latin == diacritic) { - //no_latin.push(diacritic); + if (latin == diacritic.toLowerCase()) { continue; } - latin = latin.toLowerCase(); - - if (latin in latin_convert) { - latin = latin_convert[latin]; - } - if (!(latin in diacritics)) { - diacritics[latin] = latin + latin.toUpperCase(); + diacritics[latin] = [latin]; } - diacritics[latin] += diacritic; + diacritics[latin].push(diacritic); } - }); //console.log('no_latin',JSON.stringify(no_latin)); - - return diacritics; + }); + var latin_chars = Object.keys(diacritics); // latin character pattern + // match longer substrings first + + latin_chars = latin_chars.sort((a, b) => b.length - a.length); + latin_pat = new RegExp('(' + arrayToPattern(latin_chars) + accent_pat + '*)', 'g'); // build diacritic patterns + // ae needs: + // (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...)) + + var diacritic_patterns = {}; + latin_chars.sort((a, b) => a.length - b.length).forEach(latin => { + var substrings = allSubstrings(latin); + var pattern = substrings.map(sub_pat => { + sub_pat = sub_pat.map(l => { + if (diacritics.hasOwnProperty(l)) { + return arrayToPattern(diacritics[l]); + } + + return l; + }); + return arrayToPattern(sub_pat, ''); + }); + diacritic_patterns[latin] = arrayToPattern(pattern); + }); + return diacritic_patterns; }; /** * Expand a regular expression pattern to include diacritics @@ -64,54 +115,34 @@ const generateDiacritics = () => { * */ -var diacritics = null; const diacriticRegexPoints = regex => { - if (diacritics === null) { - diacritics = generateDiacritics(); + if (diacritic_patterns === undefined) { + diacritic_patterns = generateDiacritics(); } - for (let latin in diacritics) { - if (diacritics.hasOwnProperty(latin)) { - regex = regex.replace(new RegExp(latin, 'g'), '[' + diacritics[latin] + ']'); - } - } + const decomposed = regex.normalize('NFKD').toLowerCase(); + return decomposed.split(latin_pat).map(part => { + if (part == '') { + return ''; + } // "ffl" or "ffl" - return regex; -}; -/** - * Expand a regular expression pattern to include diacritics - * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ - * - * rollup will bundle this function (and the DIACRITICS constant) unless commented out - * -var diacriticRegex = (function() { - var list = []; - for( let letter in DIACRITICS ){ + const no_accent = asciifold(part); - if( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){ - continue; - } + if (diacritic_patterns.hasOwnProperty(no_accent)) { + return diacritic_patterns[no_accent]; + } // 'أهلا' (\u{623}\u{647}\u{644}\u{627}) or 'أهلا' (\u{627}\u{654}\u{647}\u{644}\u{627}) - if( DIACRITICS.hasOwnProperty(letter) ){ - var replace = letter + DIACRITICS[letter]; - if( letter.toUpperCase() in DIACRITICS ){ - replace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()]; - } + const composed_part = part.normalize('NFC'); - list.push({let:letter,pat:'['+replace+']'}); - } - } + if (composed_part != part) { + return arrayToPattern([part, composed_part]); + } - return function(regex:string):string{ - list.forEach((item)=>{ - regex = regex.replace( new RegExp(item.let,'g'),item.pat); - }); - return regex; - } -})(); -*/ + return part; + }).join(''); +}; -export { asciifold, diacriticRegexPoints, generateDiacritics }; +export { allSubstrings, arrayToPattern, asciifold, code_points, diacriticRegexPoints, generateDiacritics }; //# sourceMappingURL=diacritics.js.map diff --git a/dist/esm/diacritics.js.map b/dist/esm/diacritics.js.map index 2f5cd9d..4b3bf1f 100644 --- a/dist/esm/diacritics.js.map +++ b/dist/esm/diacritics.js.map @@ -1 +1 @@ -{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\tif( chars.length > 1 ){\n\t\treturn '(?:'+chars.join(glue)+')';\n\t}\n\treturn chars[0];\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\t\t\t\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\t\t\t\n\t\t\t\t\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","allSubstrings","input","result","substring","forEach","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","latin_chars","sort","a","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/sifter.js b/dist/esm/sifter.js index 5d93a90..a7c2a7e 100644 --- a/dist/esm/sifter.js +++ b/dist/esm/sifter.js @@ -1,6 +1,6 @@ /*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ import { escape_regex, iterate, cmp, propToArray, getAttrNesting, getAttr, scoreValue } from './utils.js'; -import { diacriticRegexPoints, asciifold } from './diacritics.js'; +import { diacriticRegexPoints } from './diacritics.js'; /** * sifter.js @@ -73,7 +73,7 @@ class Sifter { tokens.push({ string: word, - regex: regex ? new RegExp(regex, 'i') : null, + regex: regex ? new RegExp(regex, 'iu') : null, field: field }); }); @@ -305,10 +305,9 @@ class Sifter { options.fields = fields; } - query = asciifold(query + '').toLowerCase().trim(); return { options: options, - query: query, + query: query.toLowerCase().trim(), tokens: this.tokenize(query, options.respect_word_boundaries, weights), total: 0, items: [], diff --git a/dist/esm/sifter.js.map b/dist/esm/sifter.js.map index abd94cb..7c684a8 100644 --- a/dist/esm/sifter.js.map +++ b/dist/esm/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","a","b","cmp","optsUser","assign","propToArray","asciifold","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","a","b","cmp","optsUser","assign","propToArray","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/types/diacritics.d.ts b/dist/types/diacritics.d.ts index 0a71ec2..fe03ef1 100644 --- a/dist/types/diacritics.d.ts +++ b/dist/types/diacritics.d.ts @@ -2,50 +2,38 @@ declare type TDiacraticList = { [key: string]: string; }; export declare const DIACRITICS: TDiacraticList; +/** + * code points generated from toCodePoints(); + * removed 65339 to 65345 + */ +export declare const code_points: number[][]; /** * Remove accents * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 * */ export declare const asciifold: (str: string) => string; +/** + * Convert array of strings to a regular expression + * ex ['ab','a'] => (?:ab|a) + * + */ +export declare const arrayToPattern: (chars: string[], glue?: string) => string; +/** + * Get all possible combinations of substrings that add up to the given string + * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string + * + */ +export declare const allSubstrings: (input: string) => string[][]; /** * Generate a list of diacritics from the list of code points * */ export declare const generateDiacritics: () => TDiacraticList; -export declare const diacriticRegexPoints: (regex: string) => string; -export {}; /** * Expand a regular expression pattern to include diacritics * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ * - * rollup will bundle this function (and the DIACRITICS constant) unless commented out - * -var diacriticRegex = (function() { - - var list = []; - for( let letter in DIACRITICS ){ - - if( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){ - continue; - } - - if( DIACRITICS.hasOwnProperty(letter) ){ - - var replace = letter + DIACRITICS[letter]; - if( letter.toUpperCase() in DIACRITICS ){ - replace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()]; - } - - list.push({let:letter,pat:'['+replace+']'}); - } - } - - return function(regex:string):string{ - list.forEach((item)=>{ - regex = regex.replace( new RegExp(item.let,'g'),item.pat); - }); - return regex; - } -})(); -*/ + */ +export declare const diacriticRegexPoints: (regex: string) => string; +export {}; diff --git a/dist/umd/sifter.js b/dist/umd/sifter.js index 72791ee..02ad512 100644 --- a/dist/umd/sifter.js +++ b/dist/umd/sifter.js @@ -6,12 +6,23 @@ }(this, (function () { 'use strict'; // https://github.com/andrewrk/node-diacritics/blob/master/index.js + var latin_pat; + const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}]'; // \u{2bc} + + const accent_reg = new RegExp(accent_pat, 'g'); + var diacritic_patterns; + const latin_convert = { + 'æ': 'ae', + 'ⱥ': 'a', + 'ø': 'o' + }; + const convert_pat = new RegExp(Object.keys(latin_convert).join('|'), 'g'); /** * code points generated from toCodePoints(); * removed 65339 to 65345 */ - var code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [1019, 1019], [1083, 1083], [1281, 1289], [1984, 1984], [5095, 5095], [7429, 7441], [7545, 7549], [7680, 7935], [8580, 8580], [9398, 9449], [11360, 11391], [42792, 42793], [42802, 42851], [42873, 42897], [42912, 42922], [64256, 64260], [65313, 65338], [65345, 65370]]; + const code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [1019, 1019], [1083, 1083], [1281, 1289], [1984, 1984], [5095, 5095], [7429, 7441], [7545, 7549], [7680, 7935], [8580, 8580], [9398, 9449], [11360, 11391], [42792, 42793], [42802, 42851], [42873, 42897], [42912, 42922], [64256, 64260], [65313, 65338], [65345, 65370]]; /** * Remove accents * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 @@ -19,50 +30,90 @@ */ const asciifold = str => { - return str.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD').toLowerCase(); + return str.normalize('NFKD').replace(accent_reg, '').toLowerCase().replace(convert_pat, function (foreignletter) { + return latin_convert[foreignletter]; + }); }; /** - * Generate a list of diacritics from the list of code points + * Convert array of strings to a regular expression + * ex ['ab','a'] => (?:ab|a) * */ - const generateDiacritics = () => { - var latin_convert = { - 'l·': 'l', - 'ʼn': 'n', - 'æ': 'ae', - 'ø': 'o', - 'aʾ': 'a', - 'dž': 'dz' - }; - var diacritics = {}; //var no_latin = []; + const arrayToPattern = (chars, glue = '|') => { + if (chars.length > 1) { + return '(?:' + chars.join(glue) + ')'; + } + + return chars[0]; + }; + /** + * Get all possible combinations of substrings that add up to the given string + * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string + * + */ + + const allSubstrings = input => { + if (input.length === 1) return [[input]]; + var result = []; + allSubstrings(input.substring(1)).forEach(function (subresult) { + var tmp = subresult.slice(0); + tmp[0] = input.charAt(0) + tmp[0]; + result.push(tmp); + tmp = subresult.slice(0); + tmp.unshift(input.charAt(0)); + result.push(tmp); + }); + return result; + }; + /** + * Generate a list of diacritics from the list of code points + * + */ + const generateDiacritics = () => { + var diacritics = {}; code_points.forEach(code_range => { for (let i = code_range[0]; i <= code_range[1]; i++) { let diacritic = String.fromCharCode(i); - let latin = diacritic.normalize('NFD').replace(/[\u0300-\u036F]/g, '').normalize('NFKD'); + let latin = asciifold(diacritic); - if (latin == diacritic) { - //no_latin.push(diacritic); + if (latin == diacritic.toLowerCase()) { continue; } - latin = latin.toLowerCase(); - - if (latin in latin_convert) { - latin = latin_convert[latin]; - } - if (!(latin in diacritics)) { - diacritics[latin] = latin + latin.toUpperCase(); + diacritics[latin] = [latin]; } - diacritics[latin] += diacritic; + diacritics[latin].push(diacritic); } - }); //console.log('no_latin',JSON.stringify(no_latin)); + }); + var latin_chars = Object.keys(diacritics); // latin character pattern + // match longer substrings first + + latin_chars = latin_chars.sort((a, b) => b.length - a.length); + latin_pat = new RegExp('(' + arrayToPattern(latin_chars) + accent_pat + '*)', 'g'); // build diacritic patterns + // ae needs: + // (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...)) + + var diacritic_patterns = {}; + latin_chars.sort((a, b) => a.length - b.length).forEach(latin => { + var substrings = allSubstrings(latin); + var pattern = substrings.map(sub_pat => { + sub_pat = sub_pat.map(l => { + if (diacritics.hasOwnProperty(l)) { + return arrayToPattern(diacritics[l]); + } - return diacritics; + return l; + }); + return arrayToPattern(sub_pat, ''); + }); + diacritic_patterns[latin] = arrayToPattern(pattern); + }); + return diacritic_patterns; }; /** * Expand a regular expression pattern to include diacritics @@ -70,54 +121,34 @@ * */ - var diacritics = null; const diacriticRegexPoints = regex => { - if (diacritics === null) { - diacritics = generateDiacritics(); + if (diacritic_patterns === undefined) { + diacritic_patterns = generateDiacritics(); } - for (let latin in diacritics) { - if (diacritics.hasOwnProperty(latin)) { - regex = regex.replace(new RegExp(latin, 'g'), '[' + diacritics[latin] + ']'); - } - } + const decomposed = regex.normalize('NFKD').toLowerCase(); + return decomposed.split(latin_pat).map(part => { + if (part == '') { + return ''; + } // "ffl" or "ffl" - return regex; - }; - /** - * Expand a regular expression pattern to include diacritics - * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ - * - * rollup will bundle this function (and the DIACRITICS constant) unless commented out - * - var diacriticRegex = (function() { - var list = []; - for( let letter in DIACRITICS ){ + const no_accent = asciifold(part); - if( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){ - continue; - } + if (diacritic_patterns.hasOwnProperty(no_accent)) { + return diacritic_patterns[no_accent]; + } // 'أهلا' (\u{623}\u{647}\u{644}\u{627}) or 'أهلا' (\u{627}\u{654}\u{647}\u{644}\u{627}) - if( DIACRITICS.hasOwnProperty(letter) ){ - var replace = letter + DIACRITICS[letter]; - if( letter.toUpperCase() in DIACRITICS ){ - replace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()]; - } + const composed_part = part.normalize('NFC'); - list.push({let:letter,pat:'['+replace+']'}); - } - } + if (composed_part != part) { + return arrayToPattern([part, composed_part]); + } - return function(regex:string):string{ - list.forEach((item)=>{ - regex = regex.replace( new RegExp(item.let,'g'),item.pat); - }); - return regex; - } - })(); - */ + return part; + }).join(''); + }; // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" @@ -283,7 +314,7 @@ tokens.push({ string: word, - regex: regex ? new RegExp(regex, 'i') : null, + regex: regex ? new RegExp(regex, 'iu') : null, field: field }); }); @@ -515,10 +546,9 @@ options.fields = fields; } - query = asciifold(query + '').toLowerCase().trim(); return { options: options, - query: query, + query: query.toLowerCase().trim(), tokens: this.tokenize(query, options.respect_word_boundaries, weights), total: 0, items: [], diff --git a/dist/umd/sifter.js.map b/dist/umd/sifter.js.map index 963c73d..aa130db 100644 --- a/dist/umd/sifter.js.map +++ b/dist/umd/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport const escape_regex = (str:string):string => {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","generateDiacritics","latin_convert","diacritics","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","diacriticRegexPoints","regex","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","string","length","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\tif( chars.length > 1 ){\n\t\treturn '(?:'+chars.join(glue)+')';\n\t}\n\treturn chars[0];\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\t\t\t\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\t\t\t\n\t\t\t\t\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport const escape_regex = (str:string):string => {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","allSubstrings","input","result","substring","forEach","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","latin_chars","sort","a","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","match","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort_empty","sort_flds","multipliers","get_field","id","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit"],"mappings":"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"} \ No newline at end of file diff --git a/dist/umd/sifter.min.js b/dist/umd/sifter.min.js index ec64b7f..27bd17d 100644 --- a/dist/umd/sifter.min.js +++ b/dist/umd/sifter.min.js @@ -1,15 +1,26 @@ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).sifter=t()}(this,(function(){"use strict" -var e=[[67,67],[160,160],[192,438],[452,652],[961,961],[1019,1019],[1083,1083],[1281,1289],[1984,1984],[5095,5095],[7429,7441],[7545,7549],[7680,7935],[8580,8580],[9398,9449],[11360,11391],[42792,42793],[42802,42851],[42873,42897],[42912,42922],[64256,64260],[65313,65338],[65345,65370]] -const t=e=>e.normalize("NFD").replace(/[\u0300-\u036F]/g,"").normalize("NFKD").toLowerCase() -var r=null -const n=t=>{null===r&&(r=(()=>{var t={"l·":"l","ʼn":"n","æ":"ae","ø":"o","aʾ":"a","dž":"dz"},r={} -return e.forEach((e=>{for(let n=e[0];n<=e[1];n++){let e=String.fromCharCode(n),i=e.normalize("NFD").replace(/[\u0300-\u036F]/g,"").normalize("NFKD") -i!=e&&(i=i.toLowerCase(),i in t&&(i=t[i]),i in r||(r[i]=i+i.toUpperCase()),r[i]+=e)}})),r})()) -for(let e in r)r.hasOwnProperty(e)&&(t=t.replace(new RegExp(e,"g"),"["+r[e]+"]")) -return t},i=(e,t)=>{if(e)return e[t]},o=(e,t)=>{if(e){for(var r,n=t.split(".");(r=n.shift())&&(e=e[r]););return e}},s=(e,t,r)=>{var n,i -return e?-1===(i=(e+="").search(t.regex))?0:(n=t.string.length/e.length,0===i&&(n+=.5),n*r):0},c=e=>(e+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1"),u=(e,t)=>{var r=e[t] -r&&!Array.isArray(r)&&(e[t]=[r])},f=(e,t)=>{if(Array.isArray(e))e.forEach(t) -else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)},l=(e,r)=>"number"==typeof e&&"number"==typeof r?e>r?1:e(r=t(r+"").toLowerCase())?1:r>e?-1:0 +var e +const t="[̀-ͯ·ʾ]",r=new RegExp(t,"g") +var n +const i={"æ":"ae","ⱥ":"a","ø":"o"},o=new RegExp(Object.keys(i).join("|"),"g"),s=[[67,67],[160,160],[192,438],[452,652],[961,961],[1019,1019],[1083,1083],[1281,1289],[1984,1984],[5095,5095],[7429,7441],[7545,7549],[7680,7935],[8580,8580],[9398,9449],[11360,11391],[42792,42793],[42802,42851],[42873,42897],[42912,42922],[64256,64260],[65313,65338],[65345,65370]],c=e=>e.normalize("NFKD").replace(r,"").toLowerCase().replace(o,(function(e){return i[e]})),u=(e,t="|")=>e.length>1?"(?:"+e.join(t)+")":e[0],f=e=>{if(1===e.length)return[[e]] +var t=[] +return f(e.substring(1)).forEach((function(r){var n=r.slice(0) +n[0]=e.charAt(0)+n[0],t.push(n),(n=r.slice(0)).unshift(e.charAt(0)),t.push(n)})),t},a=t=>{void 0===n&&(n=(()=>{var t={} +s.forEach((e=>{for(let r=e[0];r<=e[1];r++){let e=String.fromCharCode(r),n=c(e) +n!=e.toLowerCase()&&(n in t||(t[n]=[n]),t[n].push(e))}})) +var r=Object.keys(t) +r=r.sort(((e,t)=>t.length-e.length)),e=new RegExp("("+u(r)+"[̀-ͯ·ʾ]*)","g") +var n={} +return r.sort(((e,t)=>e.length-t.length)).forEach((e=>{var r=f(e).map((e=>(e=e.map((e=>t.hasOwnProperty(e)?u(t[e]):e)),u(e,"")))) +n[e]=u(r)})),n})()) +return t.normalize("NFKD").toLowerCase().split(e).map((e=>{if(""==e)return"" +const t=c(e) +if(n.hasOwnProperty(t))return n[t] +const r=e.normalize("NFC") +return r!=e?u([e,r]):e})).join("")},l=(e,t)=>{if(e)return e[t]},h=(e,t)=>{if(e){for(var r,n=t.split(".");(r=n.shift())&&(e=e[r]););return e}},g=(e,t,r)=>{var n,i +return e?-1===(i=(e+="").search(t.regex))?0:(n=t.string.length/e.length,0===i&&(n+=.5),n*r):0},p=e=>(e+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1"),d=(e,t)=>{var r=e[t] +r&&!Array.isArray(r)&&(e[t]=[r])},m=(e,t)=>{if(Array.isArray(e))e.forEach(t) +else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)},y=(e,t)=>"number"==typeof e&&"number"==typeof t?e>t?1:e(t=c(t+"").toLowerCase())?1:t>e?-1:0 ;/** * sifter.js @@ -27,22 +38,22 @@ else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)},l=(e,r)=>"number"==typeof e& * @author Brian Reavis */ return class{constructor(e,t){this.items=void 0,this.settings=void 0,this.items=e,this.settings=t||{diacritics:!0}}tokenize(e,t,r){if(!e||!e.length)return[] -const i=[],o=e.split(/\s+/) -var s -return r&&(s=new RegExp("^("+Object.keys(r).map(c).join("|")+"):(.*)$")),o.forEach((e=>{let r,o=null,u=null -s&&(r=e.match(s))&&(o=r[1],e=r[2]),e.length>0&&(u=c(e),this.settings.diacritics&&(u=n(u)),t&&(u="\\b"+u)),i.push({string:e,regex:u?new RegExp(u,"i"):null,field:o})})),i}getScoreFunction(e,t){var r=this.prepareSearch(e,t) +const n=[],i=e.split(/\s+/) +var o +return r&&(o=new RegExp("^("+Object.keys(r).map(p).join("|")+"):(.*)$")),i.forEach((e=>{let r,i=null,s=null +o&&(r=e.match(o))&&(i=r[1],e=r[2]),e.length>0&&(s=p(e),this.settings.diacritics&&(s=a(s)),t&&(s="\\b"+s)),n.push({string:e,regex:s?new RegExp(s,"iu"):null,field:i})})),n}getScoreFunction(e,t){var r=this.prepareSearch(e,t) return this._getScoreFunction(r)}_getScoreFunction(e){const t=e.tokens,r=t.length if(!r)return function(){return 0} -const n=e.options.fields,i=e.weights,o=n.length,c=e.getAttrFn +const n=e.options.fields,i=e.weights,o=n.length,s=e.getAttrFn if(!o)return function(){return 1} -const u=1===o?function(e,t){const r=n[0].field -return s(c(t,r),e,i[r])}:function(e,t){var r=0 -if(e.field){const n=c(t,e.field) -!e.regex&&n?r+=1/o:r+=s(n,e,1)}else f(i,((n,i)=>{r+=s(c(t,i),e,n)})) +const c=1===o?function(e,t){const r=n[0].field +return g(s(t,r),e,i[r])}:function(e,t){var r=0 +if(e.field){const n=s(t,e.field) +!e.regex&&n?r+=1/o:r+=g(n,e,1)}else m(i,((n,i)=>{r+=g(s(t,i),e,n)})) return r/o} -return 1===r?function(e){return u(t[0],e)}:"and"===e.options.conjunction?function(e){for(var n,i=0,o=0;i{n+=u(t,e)})),n/r}}getSortFunction(e,t){var r=this.prepareSearch(e,t) +return m(t,(t=>{n+=c(t,e)})),n/r}}getSortFunction(e,t){var r=this.prepareSearch(e,t) return this._getSortFunction(r)}_getSortFunction(e){var t,r,n const i=this,o=e.options,s=!e.query&&o.sort_empty?o.sort_empty:o.sort,c=[],u=[],f=function(t,r){return"$score"===t?r.score:e.getAttrFn(i.items[r.id],t)} if(s)for(t=0,r=s.length;t{"string"==typeof t&&(t={field:t,weight:1}),e.push(t),n[t.field]="weight"in t?t.weight:1})),s.fields=e}return{options:s,query:e=t(e+"").toLowerCase().trim(),tokens:this.tokenize(e,s.respect_word_boundaries,n),total:0,items:[],weights:n,getAttrFn:s.nesting?o:i}}search(e,t){var r,n,i=this +n.fields.forEach((t=>{"string"==typeof t&&(t={field:t,weight:1}),e.push(t),r[t.field]="weight"in t?t.weight:1})),n.fields=e}return{options:n,query:e.toLowerCase().trim(),tokens:this.tokenize(e,n.respect_word_boundaries,r),total:0,items:[],weights:r,getAttrFn:n.nesting?h:l}}search(e,t){var r,n,i=this n=this.prepareSearch(e,t),t=n.options,e=n.query const o=t.score||i._getScoreFunction(n) -e.length?f(i.items,((e,i)=>{r=o(e),(!1===t.filter||r>0)&&n.items.push({score:r,id:i})})):f(i.items,((e,t)=>{n.items.push({score:1,id:t})})) +e.length?m(i.items,((e,i)=>{r=o(e),(!1===t.filter||r>0)&&n.items.push({score:r,id:i})})):m(i.items,((e,t)=>{n.items.push({score:1,id:t})})) const s=i._getSortFunction(n) return s&&n.items.sort(s),n.total=n.items.length,"number"==typeof t.limit&&(n.items=n.items.slice(0,t.limit)),n}}})) //# sourceMappingURL=sifter.min.js.map diff --git a/dist/umd/sifter.min.js.map b/dist/umd/sifter.min.js.map index fc6b59d..b1ba4ad 100644 --- a/dist/umd/sifter.min.js.map +++ b/dist/umd/sifter.min.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nvar code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD').toLowerCase();\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n var result = char_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n return accumulator;\n }, accumulator);\n\n\tconsole.log(`char_codes (${result.length})`,result);\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\n\n\tvar latin_convert:{[key:string]:string} = {\n\t\t'l·': 'l',\n\t\t'ʼn': 'n',\n\t\t'æ': 'ae',\n\t\t'ø': 'o',\n\t\t'aʾ': 'a',\n\t\t'dž': 'dz',\n\t};\n\n\tvar diacritics:{[key:string]:string} = {};\n\t//var no_latin\t= [];\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet latin\t\t= diacritic.normalize('NFD').replace(/[\\u0300-\\u036F]/g, '').normalize('NFKD');\n\n\t\t\tif( latin == diacritic ){\n\t\t\t\t//no_latin.push(diacritic);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlatin = latin.toLowerCase();\n\n\t\t\tif( latin in latin_convert ){\n\t\t\t\tlatin = latin_convert[latin];\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = latin + latin.toUpperCase();\n\t\t\t}\n\t\t\tdiacritics[latin] += diacritic;\n\t\t}\n\t});\n\n\t//console.log('no_latin',JSON.stringify(no_latin));\n\n\treturn diacritics;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nvar diacritics:null|TDiacraticList = null\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritics === null ){\n\t\tdiacritics = generateDiacritics();\n\t}\n\n\tfor( let latin in diacritics ){\n\t\tif( diacritics.hasOwnProperty(latin) ){\n\t\t\tregex = regex.replace( new RegExp(latin,'g'), '['+diacritics[latin]+']');\n\t\t}\n\t}\n\treturn regex;\n}\n\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * rollup will bundle this function (and the DIACRITICS constant) unless commented out\n *\nvar diacriticRegex = (function() {\n\n\tvar list = [];\n\tfor( let letter in DIACRITICS ){\n\n\t\tif( letter.toLowerCase() != letter && letter.toLowerCase() in DIACRITICS ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( DIACRITICS.hasOwnProperty(letter) ){\n\n\t\t\tvar replace = letter + DIACRITICS[letter];\n\t\t\tif( letter.toUpperCase() in DIACRITICS ){\n\t\t\t\treplace += letter.toUpperCase() + DIACRITICS[letter.toUpperCase()];\n\t\t\t}\n\n\t\t\tlist.push({let:letter,pat:'['+replace+']'});\n\t\t}\n\t}\n\n\treturn function(regex:string):string{\n\t\tlist.forEach((item)=>{\n\t\t\tregex = regex.replace( new RegExp(item.let,'g'),item.pat);\n\t\t});\n\t\treturn regex;\n\t}\n})();\n*/\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport const escape_regex = (str:string):string => {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints, asciifold } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'i') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\t\tquery = asciifold( query + '' ).toLowerCase().trim();\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query,\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["code_points","asciifold","str","normalize","replace","toLowerCase","diacritics","diacriticRegexPoints","regex","latin_convert","forEach","code_range","i","diacritic","String","fromCharCode","latin","toUpperCase","generateDiacritics","hasOwnProperty","RegExp","getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","string","length","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","a","b","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","Object","keys","map","join","word","field_match","field","match","this","push","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\tif( chars.length > 1 ){\n\t\treturn '(?:'+chars.join(glue)+')';\n\t}\n\treturn chars[0];\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\t\t\t\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\t\t\t\n\t\t\t\t\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport const escape_regex = (str:string):string => {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","allSubstrings","input","result","substring","forEach","subresult","tmp","slice","charAt","push","unshift","diacriticRegexPoints","regex","undefined","diacritics","code_range","i","diacritic","String","fromCharCode","latin","latin_chars","sort","a","b","pattern","map","sub_pat","l","hasOwnProperty","generateDiacritics","split","part","no_accent","composed_part","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","match","this","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort_empty","sort_flds","multipliers","get_field","id","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 6b2e374..858c544 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.7.5", + "version": "0.8.0", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 03f4e74214a3ab421a2901bdcbdae35c568c23e7 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 10 Aug 2021 15:01:42 -0600 Subject: [PATCH 078/140] fix escape_regex() for patterns with /u flag --- lib/utils.ts | 8 ++++++-- test/search.js | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/utils.ts b/lib/utils.ts index 3ddb376..e1a5d68 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -50,8 +50,12 @@ export const scoreValue = (value:string, token:T.Token, weight:number ):number = return score * weight; }; -export const escape_regex = (str:string):string => { - return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); +/** + * + * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error + */ +export const escape_regex = (str:string):string => { + return (str + '').replace(/([\$\(\)\*\+\.\?\[\]\^\{\|\}\\])/gu, '\\$1'); }; diff --git a/test/search.js b/test/search.js index 1c7fd98..c79cc5a 100644 --- a/test/search.js +++ b/test/search.js @@ -318,4 +318,18 @@ describe('#search()', function() { assert.equal(result.items.length,1); }); + it('should escape regex characters', function() { + + var data = [ + {fieldx: '$()*+.?[]^{|}\\'} + ]; + var sifter = new Sifter(data); + + var result = sifter.search('$()*+.?[]^{|}\\', { + fields: ['fieldx'] + }); + + assert.equal(result.items.length,1); + }); + }); From 79178022152d18ff30f1f293eb4118e31df391ea Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 10 Aug 2021 15:11:16 -0600 Subject: [PATCH 079/140] v0.8.1 Release --- dist/cjs/utils.js | 7 ++++++- dist/cjs/utils.js.map | 2 +- dist/esm/utils.js | 7 ++++++- dist/esm/utils.js.map | 2 +- dist/types/utils.d.ts | 4 ++++ dist/umd/sifter.js | 7 ++++++- dist/umd/sifter.js.map | 2 +- dist/umd/sifter.min.js | 2 +- dist/umd/sifter.min.js.map | 2 +- package.json | 2 +- 10 files changed, 28 insertions(+), 9 deletions(-) diff --git a/dist/cjs/utils.js b/dist/cjs/utils.js index 0e29649..13d9821 100644 --- a/dist/cjs/utils.js +++ b/dist/cjs/utils.js @@ -49,8 +49,13 @@ const scoreValue = (value, token, weight) => { if (pos === 0) score += 0.5; return score * weight; }; +/** + * + * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error + */ + const escape_regex = str => { - return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); + return (str + '').replace(/([\$\(-\+\.\?\[-\^\{-\}])/g, '\\$1'); }; /** * Cast object property to an array if it exists and has a value diff --git a/dist/cjs/utils.js.map b/dist/cjs/utils.js.map index f321b27..b4928b8 100644 --- a/dist/cjs/utils.js.map +++ b/dist/cjs/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport const escape_regex = (str:string):string => {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","regex","string","length","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":";;;;;;;AACA;;AAOA;AACA;AACA;AACA;AACA;AACA;MACaA,OAAO,GAAG,CAACC,GAAD,EAAyBC,IAAzB,KAA0C;AAC7D,MAAI,CAACD,GAAL,EAAW;AACX,SAAOA,GAAG,CAACC,IAAD,CAAV;AACH;AAED;AACA;AACA;AACA;AACA;AACA;;MACaC,cAAc,GAAG,CAACF,GAAD,EAAyBC,IAAzB,KAA0C;AACpE,MAAI,CAACD,GAAL,EAAW;AACX,MAAIG,IAAJ;AAAA,MAAUC,KAAK,GAAGH,IAAI,CAACI,KAAL,CAAW,GAAX,CAAlB;;AACH,SAAO,CAACF,IAAI,GAAGC,KAAK,CAACE,KAAN,EAAR,MAA2BN,GAAG,GAAGA,GAAG,CAACG,IAAD,CAApC,CAAP,CAAmD;;AAChD,SAAOH,GAAP;AACH;AAED;AACA;AACA;AACA;AACA;;MACaO,UAAU,GAAG,CAACC,KAAD,EAAeC,KAAf,EAA8BC,MAA9B,KAAwD;AACjF,MAAIC,KAAJ,EAAWC,GAAX;AAEA,MAAI,CAACJ,KAAL,EAAY,OAAO,CAAP;AAEZA,EAAAA,KAAK,GAAGA,KAAK,GAAG,EAAhB;AACAI,EAAAA,GAAG,GAAGJ,KAAK,CAACK,MAAN,CAAaJ,KAAK,CAACK,KAAnB,CAAN;AACA,MAAIF,GAAG,KAAK,CAAC,CAAb,EAAgB,OAAO,CAAP;AAEhBD,EAAAA,KAAK,GAAGF,KAAK,CAACM,MAAN,CAAaC,MAAb,GAAsBR,KAAK,CAACQ,MAApC;AACA,MAAIJ,GAAG,KAAK,CAAZ,EAAeD,KAAK,IAAI,GAAT;AAEf,SAAOA,KAAK,GAAGD,MAAf;AACA;MAEYO,YAAY,GAAIC,GAAD,IAAuB;AAClD,SAAO,CAACA,GAAG,GAAG,EAAP,EAAWC,OAAX,CAAmB,wBAAnB,EAA6C,MAA7C,CAAP;AACA;AAGD;AACA;AACA;AACA;;MACaC,WAAW,GAAG,CAACpB,GAAD,EAAyBqB,GAAzB,KAAwC;AAClE,MAAIb,KAAK,GAAGR,GAAG,CAACqB,GAAD,CAAf;;AACA,MAAIb,KAAK,IAAI,CAACc,KAAK,CAACC,OAAN,CAAcf,KAAd,CAAd,EAAoC;AACnCR,IAAAA,GAAG,CAACqB,GAAD,CAAH,GAAW,CAACb,KAAD,CAAX;AACA;AACD;AAGD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;MACagB,OAAO,GAAG,CAACC,MAAD,EAA+BC,QAA/B,KAA+E;AAErG,MAAKJ,KAAK,CAACC,OAAN,CAAcE,MAAd,CAAL,EAA4B;AAC3BA,IAAAA,MAAM,CAACE,OAAP,CAAeD,QAAf;AAEA,GAHD,MAGK;AAEJ,SAAK,IAAIL,GAAT,IAAgBI,MAAhB,EAAwB;AACvB,UAAIA,MAAM,CAACG,cAAP,CAAsBP,GAAtB,CAAJ,EAAgC;AAC/BK,QAAAA,QAAQ,CAACD,MAAM,CAACJ,GAAD,CAAP,EAAcA,GAAd,CAAR;AACA;AACD;AACD;AACD;MAIYQ,GAAG,GAAG,CAACC,CAAD,EAAkBC,CAAlB,KAAsC;AACxD,MAAI,OAAOD,CAAP,KAAa,QAAb,IAAyB,OAAOC,CAAP,KAAa,QAA1C,EAAoD;AACnD,WAAOD,CAAC,GAAGC,CAAJ,GAAQ,CAAR,GAAaD,CAAC,GAAGC,CAAJ,GAAQ,CAAC,CAAT,GAAa,CAAjC;AACA;;AACDD,EAAAA,CAAC,GAAGE,oBAAS,CAACF,CAAC,GAAG,EAAL,CAAT,CAAkBG,WAAlB,EAAJ;AACAF,EAAAA,CAAC,GAAGC,oBAAS,CAACD,CAAC,GAAG,EAAL,CAAT,CAAkBE,WAAlB,EAAJ;AACA,MAAIH,CAAC,GAAGC,CAAR,EAAW,OAAO,CAAP;AACX,MAAIA,CAAC,GAAGD,CAAR,EAAW,OAAO,CAAC,CAAR;AACX,SAAO,CAAP;AACA;;;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\t\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","regex","string","length","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/utils.js b/dist/esm/utils.js index a840606..402bb40 100644 --- a/dist/esm/utils.js +++ b/dist/esm/utils.js @@ -45,8 +45,13 @@ const scoreValue = (value, token, weight) => { if (pos === 0) score += 0.5; return score * weight; }; +/** + * + * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error + */ + const escape_regex = str => { - return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); + return (str + '').replace(/([\$\(-\+\.\?\[-\^\{-\}])/g, '\\$1'); }; /** * Cast object property to an array if it exists and has a value diff --git a/dist/esm/utils.js.map b/dist/esm/utils.js.map index 99d7975..515719d 100644 --- a/dist/esm/utils.js.map +++ b/dist/esm/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport const escape_regex = (str:string):string => {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","regex","string","length","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\t\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","regex","string","length","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file diff --git a/dist/types/utils.d.ts b/dist/types/utils.d.ts index 8c40c60..37ff048 100644 --- a/dist/types/utils.d.ts +++ b/dist/types/utils.d.ts @@ -24,6 +24,10 @@ export declare const getAttrNesting: (obj: { * */ export declare const scoreValue: (value: string, token: any, weight: number) => number; +/** + * + * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error + */ export declare const escape_regex: (str: string) => string; /** * Cast object property to an array if it exists and has a value diff --git a/dist/umd/sifter.js b/dist/umd/sifter.js index 02ad512..3bfb50f 100644 --- a/dist/umd/sifter.js +++ b/dist/umd/sifter.js @@ -194,8 +194,13 @@ if (pos === 0) score += 0.5; return score * weight; }; + /** + * + * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error + */ + const escape_regex = str => { - return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); + return (str + '').replace(/([\$\(-\+\.\?\[-\^\{-\}])/g, '\\$1'); }; /** * Cast object property to an array if it exists and has a value diff --git a/dist/umd/sifter.js.map b/dist/umd/sifter.js.map index aa130db..65b7d10 100644 --- a/dist/umd/sifter.js.map +++ b/dist/umd/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\tif( chars.length > 1 ){\n\t\treturn '(?:'+chars.join(glue)+')';\n\t}\n\treturn chars[0];\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\t\t\t\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\t\t\t\n\t\t\t\t\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport const escape_regex = (str:string):string => {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","allSubstrings","input","result","substring","forEach","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","latin_chars","sort","a","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","match","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort_empty","sort_flds","multipliers","get_field","id","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\tif( chars.length > 1 ){\n\t\treturn '(?:'+chars.join(glue)+')';\n\t}\n\treturn chars[0];\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\t\t\t\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\t\t\t\n\t\t\t\t\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\t\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","allSubstrings","input","result","substring","forEach","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","latin_chars","sort","a","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","match","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort_empty","sort_flds","multipliers","get_field","id","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit"],"mappings":"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"} \ No newline at end of file diff --git a/dist/umd/sifter.min.js b/dist/umd/sifter.min.js index 27bd17d..f2aba70 100644 --- a/dist/umd/sifter.min.js +++ b/dist/umd/sifter.min.js @@ -18,7 +18,7 @@ const t=c(e) if(n.hasOwnProperty(t))return n[t] const r=e.normalize("NFC") return r!=e?u([e,r]):e})).join("")},l=(e,t)=>{if(e)return e[t]},h=(e,t)=>{if(e){for(var r,n=t.split(".");(r=n.shift())&&(e=e[r]););return e}},g=(e,t,r)=>{var n,i -return e?-1===(i=(e+="").search(t.regex))?0:(n=t.string.length/e.length,0===i&&(n+=.5),n*r):0},p=e=>(e+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1"),d=(e,t)=>{var r=e[t] +return e?-1===(i=(e+="").search(t.regex))?0:(n=t.string.length/e.length,0===i&&(n+=.5),n*r):0},p=e=>(e+"").replace(/([\$\(-\+\.\?\[-\^\{-\}])/g,"\\$1"),d=(e,t)=>{var r=e[t] r&&!Array.isArray(r)&&(e[t]=[r])},m=(e,t)=>{if(Array.isArray(e))e.forEach(t) else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)},y=(e,t)=>"number"==typeof e&&"number"==typeof t?e>t?1:e(t=c(t+"").toLowerCase())?1:t>e?-1:0 diff --git a/dist/umd/sifter.min.js.map b/dist/umd/sifter.min.js.map index b1ba4ad..be5bff8 100644 --- a/dist/umd/sifter.min.js.map +++ b/dist/umd/sifter.min.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\tif( chars.length > 1 ){\n\t\treturn '(?:'+chars.join(glue)+')';\n\t}\n\treturn chars[0];\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\t\t\t\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\t\t\t\n\t\t\t\t\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\nexport const escape_regex = (str:string):string => {\n\treturn (str + '').replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","allSubstrings","input","result","substring","forEach","subresult","tmp","slice","charAt","push","unshift","diacriticRegexPoints","regex","undefined","diacritics","code_range","i","diacritic","String","fromCharCode","latin","latin_chars","sort","a","b","pattern","map","sub_pat","l","hasOwnProperty","generateDiacritics","split","part","no_accent","composed_part","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","match","this","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort_empty","sort_flds","multipliers","get_field","id","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\tif( chars.length > 1 ){\n\t\treturn '(?:'+chars.join(glue)+')';\n\t}\n\treturn chars[0];\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\t\t\t\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\t\t\t\n\t\t\t\t\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\t\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","allSubstrings","input","result","substring","forEach","subresult","tmp","slice","charAt","push","unshift","diacriticRegexPoints","regex","undefined","diacritics","code_range","i","diacritic","String","fromCharCode","latin","latin_chars","sort","a","b","pattern","map","sub_pat","l","hasOwnProperty","generateDiacritics","split","part","no_accent","composed_part","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","match","this","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort_empty","sort_flds","multipliers","get_field","id","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 858c544..dc49cb7 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.8.0", + "version": "0.8.1", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 0a9f0b1799d3aeedb962d47c20c5f83fcf1b5ad1 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 24 Aug 2021 15:58:53 -0600 Subject: [PATCH 080/140] generate more efficient regex. for orchidjs/tom-select#186 --- lib/diacritics.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index 67b82cd..0c10553 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -207,13 +207,23 @@ function toCodePoints(tolerance=8){ /** * Convert array of strings to a regular expression * ex ['ab','a'] => (?:ab|a) + * ex ['a','b'] => [ab] * */ export const arrayToPattern = (chars:string[],glue:string='|'):string =>{ - if( chars.length > 1 ){ - return '(?:'+chars.join(glue)+')'; + + if( chars.length == 1 ){ + return chars[0]; } - return chars[0]; + + var longest = 1; + chars.forEach((a)=>{longest = Math.max(longest,a.length)}); + + if( longest == 1 ){ + return '['+chars.join('')+']'; + } + + return '(?:'+chars.join(glue)+')'; }; /** From 778c770e35e9e1c111d6da9577376249ba9ad3c1 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 24 Aug 2021 16:37:23 -0600 Subject: [PATCH 081/140] add only one of lowercase or uppercase of a diacritic --- lib/diacritics.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index 0c10553..71729d8 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -260,9 +260,9 @@ export const generateDiacritics = ():TDiacraticList => { for(let i = code_range[0]; i <= code_range[1]; i++){ - let diacritic = String.fromCharCode(i); - let latin = asciifold(diacritic); - + let diacritic = String.fromCharCode(i); + let latin = asciifold(diacritic); + if( latin == diacritic.toLowerCase() ){ continue; } @@ -270,6 +270,12 @@ export const generateDiacritics = ():TDiacraticList => { if( !(latin in diacritics) ){ diacritics[latin] = [latin]; } + + var patt = new RegExp( arrayToPattern(diacritics[latin]),'iu'); + if( diacritic.match(patt) ){ + continue; + } + diacritics[latin].push(diacritic); } }); From 5a24784b1430c36969e9b2363ecf908cbe74ebb6 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 24 Aug 2021 16:54:07 -0600 Subject: [PATCH 082/140] v0.8.2 Release --- dist/cjs/diacritics.js | 22 +++++++++++++++++++--- dist/cjs/diacritics.js.map | 2 +- dist/esm/diacritics.js | 22 +++++++++++++++++++--- dist/esm/diacritics.js.map | 2 +- dist/types/diacritics.d.ts | 1 + dist/umd/sifter.js | 22 +++++++++++++++++++--- dist/umd/sifter.js.map | 2 +- dist/umd/sifter.min.js | 16 ++++++++++------ dist/umd/sifter.min.js.map | 2 +- package.json | 2 +- 10 files changed, 73 insertions(+), 20 deletions(-) diff --git a/dist/cjs/diacritics.js b/dist/cjs/diacritics.js index dab3ee1..126599b 100644 --- a/dist/cjs/diacritics.js +++ b/dist/cjs/diacritics.js @@ -35,16 +35,26 @@ const asciifold = str => { /** * Convert array of strings to a regular expression * ex ['ab','a'] => (?:ab|a) + * ex ['a','b'] => [ab] * */ const arrayToPattern = (chars, glue = '|') => { - if (chars.length > 1) { - return '(?:' + chars.join(glue) + ')'; + if (chars.length == 1) { + return chars[0]; } - return chars[0]; + var longest = 1; + chars.forEach(a => { + longest = Math.max(longest, a.length); + }); + + if (longest == 1) { + return '[' + chars.join('') + ']'; + } + + return '(?:' + chars.join(glue) + ')'; }; /** * Get all possible combinations of substrings that add up to the given string @@ -85,6 +95,12 @@ const generateDiacritics = () => { diacritics[latin] = [latin]; } + var patt = new RegExp(arrayToPattern(diacritics[latin]), 'iu'); + + if (diacritic.match(patt)) { + continue; + } + diacritics[latin].push(diacritic); } }); diff --git a/dist/cjs/diacritics.js.map b/dist/cjs/diacritics.js.map index 7646deb..7191a6d 100644 --- a/dist/cjs/diacritics.js.map +++ b/dist/cjs/diacritics.js.map @@ -1 +1 @@ -{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\tif( chars.length > 1 ){\n\t\treturn '(?:'+chars.join(glue)+')';\n\t}\n\treturn chars[0];\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\t\t\t\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\t\t\t\n\t\t\t\t\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","allSubstrings","input","result","substring","forEach","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","latin_chars","sort","a","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\t\n\tif( chars.length == 1 ){\n\t\treturn chars[0];\n\t}\n\t\n\tvar longest = 1;\n\tchars.forEach((a)=>{longest = Math.max(longest,a.length)});\n\n\tif( longest == 1 ){\n\t\treturn '['+chars.join('')+']';\n\t}\n\n\treturn '(?:'+chars.join(glue)+')';\t\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\n\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\t\n\t\t\tvar patt = new RegExp( arrayToPattern(diacritics[latin]),'iu');\n\t\t\tif( diacritic.match(patt) ){\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","longest","forEach","a","Math","max","allSubstrings","input","result","substring","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","patt","match","latin_chars","sort","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/diacritics.js b/dist/esm/diacritics.js index 6c29fa3..2f894b7 100644 --- a/dist/esm/diacritics.js +++ b/dist/esm/diacritics.js @@ -31,16 +31,26 @@ const asciifold = str => { /** * Convert array of strings to a regular expression * ex ['ab','a'] => (?:ab|a) + * ex ['a','b'] => [ab] * */ const arrayToPattern = (chars, glue = '|') => { - if (chars.length > 1) { - return '(?:' + chars.join(glue) + ')'; + if (chars.length == 1) { + return chars[0]; } - return chars[0]; + var longest = 1; + chars.forEach(a => { + longest = Math.max(longest, a.length); + }); + + if (longest == 1) { + return '[' + chars.join('') + ']'; + } + + return '(?:' + chars.join(glue) + ')'; }; /** * Get all possible combinations of substrings that add up to the given string @@ -81,6 +91,12 @@ const generateDiacritics = () => { diacritics[latin] = [latin]; } + var patt = new RegExp(arrayToPattern(diacritics[latin]), 'iu'); + + if (diacritic.match(patt)) { + continue; + } + diacritics[latin].push(diacritic); } }); diff --git a/dist/esm/diacritics.js.map b/dist/esm/diacritics.js.map index 4b3bf1f..7b65d24 100644 --- a/dist/esm/diacritics.js.map +++ b/dist/esm/diacritics.js.map @@ -1 +1 @@ -{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\tif( chars.length > 1 ){\n\t\treturn '(?:'+chars.join(glue)+')';\n\t}\n\treturn chars[0];\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\t\t\t\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\t\t\t\n\t\t\t\t\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","allSubstrings","input","result","substring","forEach","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","latin_chars","sort","a","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\t\n\tif( chars.length == 1 ){\n\t\treturn chars[0];\n\t}\n\t\n\tvar longest = 1;\n\tchars.forEach((a)=>{longest = Math.max(longest,a.length)});\n\n\tif( longest == 1 ){\n\t\treturn '['+chars.join('')+']';\n\t}\n\n\treturn '(?:'+chars.join(glue)+')';\t\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\n\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\t\n\t\t\tvar patt = new RegExp( arrayToPattern(diacritics[latin]),'iu');\n\t\t\tif( diacritic.match(patt) ){\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","longest","forEach","a","Math","max","allSubstrings","input","result","substring","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","patt","match","latin_chars","sort","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part"],"mappings":"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"} \ No newline at end of file diff --git a/dist/types/diacritics.d.ts b/dist/types/diacritics.d.ts index fe03ef1..b483e94 100644 --- a/dist/types/diacritics.d.ts +++ b/dist/types/diacritics.d.ts @@ -16,6 +16,7 @@ export declare const asciifold: (str: string) => string; /** * Convert array of strings to a regular expression * ex ['ab','a'] => (?:ab|a) + * ex ['a','b'] => [ab] * */ export declare const arrayToPattern: (chars: string[], glue?: string) => string; diff --git a/dist/umd/sifter.js b/dist/umd/sifter.js index 3bfb50f..f245705 100644 --- a/dist/umd/sifter.js +++ b/dist/umd/sifter.js @@ -37,16 +37,26 @@ /** * Convert array of strings to a regular expression * ex ['ab','a'] => (?:ab|a) + * ex ['a','b'] => [ab] * */ const arrayToPattern = (chars, glue = '|') => { - if (chars.length > 1) { - return '(?:' + chars.join(glue) + ')'; + if (chars.length == 1) { + return chars[0]; } - return chars[0]; + var longest = 1; + chars.forEach(a => { + longest = Math.max(longest, a.length); + }); + + if (longest == 1) { + return '[' + chars.join('') + ']'; + } + + return '(?:' + chars.join(glue) + ')'; }; /** * Get all possible combinations of substrings that add up to the given string @@ -87,6 +97,12 @@ diacritics[latin] = [latin]; } + var patt = new RegExp(arrayToPattern(diacritics[latin]), 'iu'); + + if (diacritic.match(patt)) { + continue; + } + diacritics[latin].push(diacritic); } }); diff --git a/dist/umd/sifter.js.map b/dist/umd/sifter.js.map index 65b7d10..7b73bf1 100644 --- a/dist/umd/sifter.js.map +++ b/dist/umd/sifter.js.map @@ -1 +1 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\tif( chars.length > 1 ){\n\t\treturn '(?:'+chars.join(glue)+')';\n\t}\n\treturn chars[0];\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\t\t\t\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\t\t\t\n\t\t\t\t\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\t\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","allSubstrings","input","result","substring","forEach","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","latin_chars","sort","a","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","match","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort_empty","sort_flds","multipliers","get_field","id","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\t\n\tif( chars.length == 1 ){\n\t\treturn chars[0];\n\t}\n\t\n\tvar longest = 1;\n\tchars.forEach((a)=>{longest = Math.max(longest,a.length)});\n\n\tif( longest == 1 ){\n\t\treturn '['+chars.join('')+']';\n\t}\n\n\treturn '(?:'+chars.join(glue)+')';\t\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\n\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\t\n\t\t\tvar patt = new RegExp( arrayToPattern(diacritics[latin]),'iu');\n\t\t\tif( diacritic.match(patt) ){\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\t\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","longest","forEach","a","Math","max","allSubstrings","input","result","substring","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","patt","match","latin_chars","sort","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort_empty","sort_flds","multipliers","get_field","id","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit"],"mappings":"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"} \ No newline at end of file diff --git a/dist/umd/sifter.min.js b/dist/umd/sifter.min.js index f2aba70..fc96a6b 100644 --- a/dist/umd/sifter.min.js +++ b/dist/umd/sifter.min.js @@ -2,12 +2,16 @@ var e const t="[̀-ͯ·ʾ]",r=new RegExp(t,"g") var n -const i={"æ":"ae","ⱥ":"a","ø":"o"},o=new RegExp(Object.keys(i).join("|"),"g"),s=[[67,67],[160,160],[192,438],[452,652],[961,961],[1019,1019],[1083,1083],[1281,1289],[1984,1984],[5095,5095],[7429,7441],[7545,7549],[7680,7935],[8580,8580],[9398,9449],[11360,11391],[42792,42793],[42802,42851],[42873,42897],[42912,42922],[64256,64260],[65313,65338],[65345,65370]],c=e=>e.normalize("NFKD").replace(r,"").toLowerCase().replace(o,(function(e){return i[e]})),u=(e,t="|")=>e.length>1?"(?:"+e.join(t)+")":e[0],f=e=>{if(1===e.length)return[[e]] +const i={"æ":"ae","ⱥ":"a","ø":"o"},o=new RegExp(Object.keys(i).join("|"),"g"),s=[[67,67],[160,160],[192,438],[452,652],[961,961],[1019,1019],[1083,1083],[1281,1289],[1984,1984],[5095,5095],[7429,7441],[7545,7549],[7680,7935],[8580,8580],[9398,9449],[11360,11391],[42792,42793],[42802,42851],[42873,42897],[42912,42922],[64256,64260],[65313,65338],[65345,65370]],c=e=>e.normalize("NFKD").replace(r,"").toLowerCase().replace(o,(function(e){return i[e]})),u=(e,t="|")=>{if(1==e.length)return e[0] +var r=1 +return e.forEach((e=>{r=Math.max(r,e.length)})),1==r?"["+e.join("")+"]":"(?:"+e.join(t)+")"},f=e=>{if(1===e.length)return[[e]] var t=[] return f(e.substring(1)).forEach((function(r){var n=r.slice(0) n[0]=e.charAt(0)+n[0],t.push(n),(n=r.slice(0)).unshift(e.charAt(0)),t.push(n)})),t},a=t=>{void 0===n&&(n=(()=>{var t={} -s.forEach((e=>{for(let r=e[0];r<=e[1];r++){let e=String.fromCharCode(r),n=c(e) -n!=e.toLowerCase()&&(n in t||(t[n]=[n]),t[n].push(e))}})) +s.forEach((e=>{for(let n=e[0];n<=e[1];n++){let e=String.fromCharCode(n),i=c(e) +if(i!=e.toLowerCase()){i in t||(t[i]=[i]) +var r=new RegExp(u(t[i]),"iu") +e.match(r)||t[i].push(e)}}})) var r=Object.keys(t) r=r.sort(((e,t)=>t.length-e.length)),e=new RegExp("("+u(r)+"[̀-ͯ·ʾ]*)","g") var n={} @@ -20,7 +24,7 @@ const r=e.normalize("NFC") return r!=e?u([e,r]):e})).join("")},l=(e,t)=>{if(e)return e[t]},h=(e,t)=>{if(e){for(var r,n=t.split(".");(r=n.shift())&&(e=e[r]););return e}},g=(e,t,r)=>{var n,i return e?-1===(i=(e+="").search(t.regex))?0:(n=t.string.length/e.length,0===i&&(n+=.5),n*r):0},p=e=>(e+"").replace(/([\$\(-\+\.\?\[-\^\{-\}])/g,"\\$1"),d=(e,t)=>{var r=e[t] r&&!Array.isArray(r)&&(e[t]=[r])},m=(e,t)=>{if(Array.isArray(e))e.forEach(t) -else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)},y=(e,t)=>"number"==typeof e&&"number"==typeof t?e>t?1:e(t=c(t+"").toLowerCase())?1:t>e?-1:0 +else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)},v=(e,t)=>"number"==typeof e&&"number"==typeof t?e>t?1:e(t=c(t+"").toLowerCase())?1:t>e?-1:0 ;/** * sifter.js @@ -62,8 +66,8 @@ break}n&&c.unshift({field:"$score",direction:"desc"})}else for(t=0,r=c.length;t< break}for(t=0,r=c.length;t {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\tif( chars.length > 1 ){\n\t\treturn '(?:'+chars.join(glue)+')';\n\t}\n\treturn chars[0];\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\t\t\t\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\t\t\t\n\t\t\t\t\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\t\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","allSubstrings","input","result","substring","forEach","subresult","tmp","slice","charAt","push","unshift","diacriticRegexPoints","regex","undefined","diacritics","code_range","i","diacritic","String","fromCharCode","latin","latin_chars","sort","a","b","pattern","map","sub_pat","l","hasOwnProperty","generateDiacritics","split","part","no_accent","composed_part","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","match","this","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort_empty","sort_flds","multipliers","get_field","id","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit"],"mappings":";AAKA,IAAIA;AACJ,MAAMC,EAAa,UACbC,EAAa,IAAIC,OAAOF,EAAW;AACzC,IAAIG;AAEJ,MAAMC,EAA+B,KAC/B,SACA,QACA,KAGAC,EAAc,IAAIH,OAAOI,OAAOC,KAAKH,GAAeI,KAAK,KAAK,KA4GvDC,EAAc,CAC1B,CAAE,GAAI,IACN,CAAE,IAAK,KACP,CAAE,IAAK,KACP,CAAE,IAAK,KACP,CAAE,IAAK,KACP,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,KAAM,MACR,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,OACT,CAAE,MAAO,QAQGC,EAAaC,GAClBA,EACLC,UAAU,QACVC,QAAQZ,EAAY,IACpBa,cACAD,QAAQR,GAAY,SAASU,UACtBX,EAAcW,MAkDXC,EAAiB,CAACC,EAAeC,EAAY,MACrDD,EAAME,OAAS,EACX,MAAMF,EAAMT,KAAKU,GAAM,IAExBD,EAAM,GAQDG,EAAiBC,OAEL,IAAjBA,EAAMF,OAAc,MAAO,CAAC,CAACE;IAE7BC,EAAoB;OACxBF,EAAcC,EAAME,UAAU,IAAIC,SAAQ,SAASC,OAC3CC,EAAMD,EAAUE,MAAM;AAC1BD,EAAI,GAAKL,EAAMO,OAAO,GAAKF,EAAI,GAC/BJ,EAAOO,KAAKH,IAEZA,EAAMD,EAAUE,MAAM,IAClBG,QAAQT,EAAMO,OAAO,IACzBN,EAAOO,KAAKH,MAGTJ,GAmEES,EAAwBC,SAETC,IAAvB9B,IACHA,EA/DgC,UAE7B+B,EAAqC;AACzCzB,EAAYe,SAASW,QAEhB,IAAIC,EAAID,EAAW,GAAIC,GAAKD,EAAW,GAAIC,IAAI,KAE9CC,EAAYC,OAAOC,aAAaH,GAChCI,EAAS9B,EAAU2B;AAEnBG,GAASH,EAAUvB,gBAIjB0B,KAASN,IACdA,EAAWM,GAAS,CAACA,IAEtBN,EAAWM,GAAOX,KAAKQ;IAIrBI,EAAcnC,OAAOC,KAAK2B;AAK9BO,EAAeA,EAAYC,MAAK,CAACC,EAAGC,IAAMA,EAAEzB,OAASwB,EAAExB,SACvDpB,EAAa,IAAIG,OAAO,IAAKc,EAAeyB,GAApB,YAAqD;IAMzEtC,EAAoC;OACxCsC,EAAYC,MAAK,CAACC,EAAEC,IAAMD,EAAExB,OAAQyB,EAAEzB,SAAQK,SAASgB,QAGlDK,EADazB,EAAcoB,GACNM,KAAKC,IAE7BA,EAAUA,EAAQD,KAAKE,GAClBd,EAAWe,eAAeD,GACtBhC,EAAekB,EAAWc,IAE3BA,IAGDhC,EAAe+B,EAAQ;AAG/B5C,EAAmBqC,GAASxB,EAAe6B,MAGrC1C,GAWe+C;OAGFlB,EAAMpB,UAAU,QAAQE,cAE1BqC,MAAMpD,GAAW+C,KAAKM,OAE3B,IAARA,QACI;MAIFC,EAAY3C,EAAU0C;GACxBjD,EAAmB8C,eAAeI,UAC9BlD,EAAmBkD;MAIrBC,EAAgBF,EAAKxC,UAAU;OACjC0C,GAAiBF,EACbpC,EAAe,CAACoC,EAAKE,IAGtBF,KACL5C,KAAK,KC9TI+C,EAAU,CAACC,EAAwBC,QACvCD,SACEA,EAAIC,IASFC,EAAiB,CAACF,EAAwBC,QAC9CD,WACDJ,EAAMO,EAAQF,EAAKN,MAAM,MACxBC,EAAOO,EAAMC,WAAaJ,EAAMA,EAAIJ,aAClCI,IAQEK,EAAa,CAACC,EAAcC,EAAeC,SACnDC,EAAOC;OAENJ,GAIQ,KADbI,GADAJ,GAAgB,IACJK,OAAOJ,EAAM/B,QACF,GAEvBiC,EAAQF,EAAMK,OAAOjD,OAAS2C,EAAM3C,OACxB,IAAR+C,IAAWD,GAAS,IAEjBA,EAAQD,GATI,GAgBPK,EAAgB1D,IACpBA,EAAM,IAAIE,QAAQ,6BAAsC,QAQpDyD,EAAc,CAACd,EAAwBe,SAC/CT,EAAQN,EAAIe;AACZT,IAAUU,MAAMC,QAAQX,KAC3BN,EAAIe,GAAO,CAACT,KAeDY,EAAU,CAACC,EAA8BC,QAEhDJ,MAAMC,QAAQE,GAClBA,EAAOnD,QAAQoD;SAIV,IAAIL,KAAOI,EACXA,EAAO1B,eAAesB,IACzBK,EAASD,EAAOJ,GAAMA,IAQbM,EAAM,CAAClC,EAAiBC,IACnB,iBAAND,GAA+B,iBAANC,EAC5BD,EAAIC,EAAI,EAAKD,EAAIC,GAAK,EAAI,GAElCD,EAAIjC,EAAUiC,EAAI,IAAI7B,gBACtB8B,EAAIlC,EAAUkC,EAAI,IAAI9B,eACJ,EACd8B,EAAID,GAAW,EACZ;;;;;;;;;;;;;;;;;OCrFO,MAWdmC,YAAYC,EAAWC,QAThBD,kBACAC,qBASDD,MAAQA,OACRC,SAAWA,GAAY,CAAC9C,YAAY,GAQ1C+C,SAASC,EAAcC,EAAkCC,OACnDF,IAAUA,EAAM/D,OAAQ,MAAO;MAE9BkE,EAAmB,GACnBC,EAAWJ,EAAM/B,MAAM;IACzBoC;OAEAH,IACHG,EAAc,IAAIrF,OAAQ,KAAMI,OAAOC,KAAK6E,GAAStC,IAAIuB,GAAc7D,KAAK,KAAK,YAGlF8E,EAAM9D,SAASgE,QACVC,EACAC,EAAoB,KACpB1D,EAAoB;AAGpBuD,IAAgBE,EAAcD,EAAKG,MAAMJ,MAC5CG,EAAQD,EAAY,GACpBD,EAAOC,EAAY,IAGhBD,EAAKrE,OAAS,IACjBa,EAAQqC,EAAamB,GACjBI,KAAKZ,SAAS9C,aACjBF,EAAQD,EAAqBC,IAE1BmD,IAA0BnD,EAAQ,MAAMA,IAG7CqD,EAAOxD,KAAK,CACXuC,OAASoB,EACTxD,MAASA,EAAQ,IAAI9B,OAAO8B,EAAM,MAAQ,KAC1C0D,MAASA,OAIJL,EAYRQ,iBAAiBX,EAAcY,OAC1B3B,EAASyB,KAAKG,cAAcb,EAAOY;OAChCF,KAAKI,kBAAkB7B,GAG/B6B,kBAAkB7B,SACXkB,EAAUlB,EAAOkB,OACvBY,EAAgBZ,EAAOlE;IAElB8E,SACG,kBAAoB;MAGtBC,EAAS/B,EAAO2B,QAAQI,OAC9Bd,EAAYjB,EAAOiB,QACnBe,EAAeD,EAAO/E,OACtBiF,EAAajC,EAAOiC;IAEfD,SACG,kBAAoB;MAStBE,EAGe,IAAhBF,EACI,SAASpC,EAAeuC,SACxBZ,EAAQQ,EAAO,GAAGR;OACjB7B,EAAWuC,EAAUE,EAAMZ,GAAQ3B,EAAOqB,EAAQM,KAIpD,SAAS3B,EAAeuC,OAC1BC,EAAM;GAGNxC,EAAM2B,MAAO,OAEV5B,EAAQsC,EAAUE,EAAMvC,EAAM2B;CAE/B3B,EAAM/B,OAAS8B,EACnByC,GAAQ,EAAEJ,EAEVI,GAAO1C,EAAWC,EAAOC,EAAO,QAMjCW,EAAQU,GAAS,CAACpB,EAAe0B,KAChCa,GAAO1C,EAAWuC,EAAUE,EAAMZ,GAAQ3B,EAAOC;OAI5CuC,EAAMJ;OAIK,IAAhBF,EACI,SAASK,UACRD,EAAYhB,EAAO,GAAIiB,IAIG,QAA/BnC,EAAO2B,QAAQU,YACX,SAASF,WACJrC,EAAP7B,EAAI,EAAUmE,EAAM,EACjBnE,EAAI6D,EAAa7D,IAAK,KAC5B6B,EAAQoC,EAAYhB,EAAOjD,GAAIkE,KAClB,EAAG,OAAO;AACvBC,GAAOtC,SAEDsC,EAAMN,GAGP,SAASK,OACXC,EAAM;OACV7B,EAAQW,GAAQtB,IACfwC,GAAOF,EAAYtC,EAAOuC,MAEpBC,EAAMN,GAYhBQ,gBAAgBvB,EAAcY,OACzB3B,EAAUyB,KAAKG,cAAcb,EAAOY;OACjCF,KAAKc,iBAAiBvC,GAG9BuC,iBAAiBvC,OACZ/B,EAAGuE,EAAGC;MAEJC,EAAOjB,KACbE,EAAW3B,EAAO2B,QAClBpD,GAAUyB,EAAOe,OAASY,EAAQgB,WAAchB,EAAQgB,WAAahB,EAAQpD,KAC7EqE,EAAsB,GACtBC,EAAuB,GAQjBC,EAAY,SAASxD,EAAanC,SAC1B,WAATmC,EAA0BnC,EAAO2C,MAC9BE,EAAOiC,UAAUS,EAAK9B,MAAMzD,EAAO4F,IAAKzD;GAI5Cf,MACEN,EAAI,EAAGuE,EAAIjE,EAAKvB,OAAQiB,EAAIuE,EAAGvE,KAC/B+B,EAAOe,OAA2B,WAAlBxC,EAAKN,GAAGsD,QAC3BqB,EAAUlF,KAAKa,EAAKN;GAOnB+B,EAAOe,MAAO,KACjB0B,GAAiB,EACZxE,EAAI,EAAGuE,EAAII,EAAU5F,OAAQiB,EAAIuE,EAAGvE,OACb,WAAvB2E,EAAU3E,GAAGsD,MAAoB,CACpCkB,GAAiB;MAIfA,GACHG,EAAUjF,QAAQ,CAAC4D,MAAO,SAAUyB,UAAW,kBAG3C/E,EAAI,EAAGuE,EAAII,EAAU5F,OAAQiB,EAAIuE,EAAGvE,OACb,WAAvB2E,EAAU3E,GAAGsD,MAAoB,CACpCqB,EAAUK,OAAOhF,EAAG;UAMlBA,EAAI,EAAGuE,EAAII,EAAU5F,OAAQiB,EAAIuE,EAAGvE,IACxC4E,EAAYnF,KAAgC,SAA3BkF,EAAU3E,GAAG+E,WAAwB,EAAI;MAIrDE,EAAkBN,EAAU5F;GAC7BkG,EAEE,CAAA,GAAwB,IAApBA,EAAuB,OAC3BC,EAAWP,EAAU,GAAGrB,MACxB6B,EAAaP,EAAY;OACxB,SAASrE,EAAgBC,UACxB2E,EAAa1C,EACnBoC,EAAUK,EAAU3E,GACpBsE,EAAUK,EAAU1E,YAIf,SAASD,EAAgBC,OAC3BR,EAAGd,EAAQoE;IACVtD,EAAI,EAAGA,EAAIiF,EAAiBjF,OAChCsD,EAAQqB,EAAU3E,GAAGsD,MACrBpE,EAAS0F,EAAY5E,GAAKyC,EACzBoC,EAAUvB,EAAO/C,GACjBsE,EAAUvB,EAAO9C,IAEN,OAAOtB;OAEb,UArBD,KAgCTyE,cAAcb,EAAcsC,SACrBpC,EAAoB;IACtBU,EAAWxF,OAAOmH,OAAO,GAAGD;GAEhClD,EAAYwB,EAAQ,QACpBxB,EAAYwB,EAAQ,cAGhBA,EAAQI,OAAQ,CACnB5B,EAAYwB,EAAQ;MACdI,EAAmB;AACzBJ,EAAQI,OAAO1E,SAASkE,IACH,iBAATA,IACVA,EAAQ,CAACA,MAAMA,EAAM1B,OAAO,IAE7BkC,EAAOrE,KAAK6D,GACZN,EAAQM,EAAMA,OAAU,WAAYA,EAASA,EAAM1B,OAAS,KAE7D8B,EAAQI,OAASA,QAIX,CACNJ,QAAWA,EACXZ,MAASA,EAAMpE,cAAc4G,OAC7BrC,OAAUO,KAAKX,SAASC,EAAOY,EAAQX,wBAAyBC,GAChEuC,MAAS,EACT5C,MAAS,GACTK,QAAWA,EACXgB,UAAaN,EAAQ8B,QAAWlE,EAAiBH,GAQnDY,OAAOe,EAAcY,OACH7B,EAAOE,EAApB0C,EAAOjB;AAEXzB,EAAUyB,KAAKG,cAAcb,EAAOY,GACpCA,EAAU3B,EAAO2B,QACjBZ,EAAUf,EAAOe;MAGX2C,EAAW/B,EAAQ7B,OAAS4C,EAAKb,kBAAkB7B;AAGrDe,EAAM/D,OACTuD,EAAQmC,EAAK9B,OAAO,CAAC+C,EAAmBZ,KACvCjD,EAAQ4D,EAASC,KACM,IAAnBhC,EAAQiC,QAAoB9D,EAAQ,IACvCE,EAAOY,MAAMlD,KAAK,OAAUoC,KAAaiD,OAI3CxC,EAAQmC,EAAK9B,OAAO,CAAC+C,EAAmBZ,KACvC/C,EAAOY,MAAMlD,KAAK,OAAU,KAASqF;MAIjCc,EAAUnB,EAAKH,iBAAiBvC;OAClC6D,GAAS7D,EAAOY,MAAMrC,KAAKsF,GAG/B7D,EAAOwD,MAAQxD,EAAOY,MAAM5D,OACC,iBAAlB2E,EAAQmC,QAClB9D,EAAOY,MAAQZ,EAAOY,MAAMpD,MAAM,EAAGmE,EAAQmC,QAGvC9D"} \ No newline at end of file +{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\t\n\tif( chars.length == 1 ){\n\t\treturn chars[0];\n\t}\n\t\n\tvar longest = 1;\n\tchars.forEach((a)=>{longest = Math.max(longest,a.length)});\n\n\tif( longest == 1 ){\n\t\treturn '['+chars.join('')+']';\n\t}\n\n\treturn '(?:'+chars.join(glue)+')';\t\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\n\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\t\n\t\t\tvar patt = new RegExp( arrayToPattern(diacritics[latin]),'iu');\n\t\t\tif( diacritic.match(patt) ){\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\t\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","longest","forEach","a","Math","max","allSubstrings","input","result","substring","subresult","tmp","slice","charAt","push","unshift","diacriticRegexPoints","regex","undefined","diacritics","code_range","i","diacritic","String","fromCharCode","latin","patt","match","latin_chars","sort","b","pattern","map","sub_pat","l","hasOwnProperty","generateDiacritics","split","part","no_accent","composed_part","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","this","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort_empty","sort_flds","multipliers","get_field","id","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index dc49cb7..28ecafc 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.8.1", + "version": "0.8.2", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 1ec86ea89ccc89d0e466e21c925fa65e28586bee Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 7 Sep 2021 10:55:56 -0600 Subject: [PATCH 083/140] use TypeScript Partial utility for user options --- lib/sifter.ts | 2 +- lib/types.ts | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 24f14be..14f1735 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -284,7 +284,7 @@ export default class Sifter{ * with results. * */ - prepareSearch(query:string, optsUser:T.Options):T.PrepareObj { + prepareSearch(query:string, optsUser:Partial):T.PrepareObj { const weights:T.Weights = {}; var options = Object.assign({},optsUser); diff --git a/lib/types.ts b/lib/types.ts index 8adc3f1..5c4402a 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -11,14 +11,14 @@ export type Sort = { export type Options = { fields: Field[], - sort: Sort[], - score?: ()=>any, - filter?: boolean, - limit?: number, - sort_empty?: Sort[], - nesting?: boolean, - respect_word_boundaries?: boolean, - conjunction?: string, + score: ()=>any, + filter: boolean, + limit: number, + sort: Sort[], + sort_empty: Sort[], + nesting: boolean, + respect_word_boundaries: boolean, + conjunction: string, } export type Token = { From 5f8d934a2e2abfd8bcab27732604fa6076ae76a3 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 7 Sep 2021 15:54:14 -0600 Subject: [PATCH 084/140] sort option as a callback --- lib/sifter.ts | 4 ++++ lib/types.ts | 8 ++++++-- lib/utils.ts | 3 +++ test/sorting.js | 31 ++++++++++++++++++++++++++++++- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 14f1735..821e225 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -204,6 +204,10 @@ export default class Sifter{ multipliers:number[] = []; + if( typeof sort == 'function' ){ + return sort.bind(this); + } + /** * Fetches the specified sort field value * from a search result item. diff --git a/lib/types.ts b/lib/types.ts index 5c4402a..a1da94c 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -1,3 +1,5 @@ +// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" +import Sifter from 'sifter.ts'; export type Field = { field: string, @@ -9,13 +11,15 @@ export type Sort = { direction?: string, } +export type SortFn = (this:Sifter, a:ResultItem, b:ResultItem)=>number; + export type Options = { fields: Field[], score: ()=>any, filter: boolean, limit: number, - sort: Sort[], - sort_empty: Sort[], + sort: SortFn|Sort[], + sort_empty: SortFn|Sort[], nesting: boolean, respect_word_boundaries: boolean, conjunction: string, diff --git a/lib/utils.ts b/lib/utils.ts index e1a5d68..9fb0850 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -65,6 +65,9 @@ export const escape_regex = (str:string):string => { */ export const propToArray = (obj:{[key:string]:any}, key:string) => { var value = obj[key]; + + if( typeof value == 'function' ) return value; + if( value && !Array.isArray(value) ){ obj[key] = [value]; } diff --git a/test/sorting.js b/test/sorting.js index 1171633..c5bcb3c 100644 --- a/test/sorting.js +++ b/test/sorting.js @@ -164,7 +164,7 @@ describe('sorting', function() { assert.equal(result.items[2].id, 1); }); - it('should not order results by $score', function() { + it('should not order results by $score (use original order)', function() { var data = [ {fielda:'aaab',$order:1}, @@ -190,4 +190,33 @@ describe('sorting', function() { assert.equal(search.items[5].id,5); }); + it('user defined sort function', function() { + + var data = [ + {fielda:'af'}, + {fielda:'ad'}, + {fielda:'aa'}, + {fielda:'ac'}, + {fielda:'ae'}, + {fielda:'ab'}, + ]; + + var sifter = new Sifter(data); + var search = sifter.search('a', { + fields: [{field: 'fielda'}], + sort: function(a,b){ + var item_a = this.items[a.id]; + var item_b = this.items[b.id]; + return item_a.fielda.localeCompare(item_b.fielda); + }, + }); + + assert.equal(search.items[0].id,2); // aa + assert.equal(search.items[1].id,5); // ab + assert.equal(search.items[2].id,3); // ac + assert.equal(search.items[3].id,1); // ad + assert.equal(search.items[4].id,4); // ae + assert.equal(search.items[5].id,0); // af + }); + }); From 320ecc8f75ce822d456f68b5edcf967f477dc42c Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 7 Sep 2021 16:02:12 -0600 Subject: [PATCH 085/140] remove dist folder from revision control --- .gitignore | 1 + dist/cjs/diacritics.js | 173 ---------- dist/cjs/diacritics.js.map | 1 - dist/cjs/sifter.js | 372 ---------------------- dist/cjs/sifter.js.map | 1 - dist/cjs/utils.js | 113 ------- dist/cjs/utils.js.map | 1 - dist/esm/diacritics.js | 164 ---------- dist/esm/diacritics.js.map | 1 - dist/esm/sifter.js | 370 ---------------------- dist/esm/sifter.js.map | 1 - dist/esm/utils.js | 103 ------ dist/esm/utils.js.map | 1 - dist/types/diacritics.d.ts | 40 --- dist/types/sifter.d.ts | 64 ---- dist/types/types.d.ts | 43 --- dist/types/utils.d.ts | 52 --- dist/umd/sifter.js | 634 ------------------------------------- dist/umd/sifter.js.map | 1 - dist/umd/sifter.min.js | 81 ----- dist/umd/sifter.min.js.map | 1 - package.json | 7 +- 22 files changed, 7 insertions(+), 2218 deletions(-) delete mode 100644 dist/cjs/diacritics.js delete mode 100644 dist/cjs/diacritics.js.map delete mode 100644 dist/cjs/sifter.js delete mode 100644 dist/cjs/sifter.js.map delete mode 100644 dist/cjs/utils.js delete mode 100644 dist/cjs/utils.js.map delete mode 100644 dist/esm/diacritics.js delete mode 100644 dist/esm/diacritics.js.map delete mode 100644 dist/esm/sifter.js delete mode 100644 dist/esm/sifter.js.map delete mode 100644 dist/esm/utils.js delete mode 100644 dist/esm/utils.js.map delete mode 100644 dist/types/diacritics.d.ts delete mode 100644 dist/types/sifter.d.ts delete mode 100644 dist/types/types.d.ts delete mode 100644 dist/types/utils.d.ts delete mode 100644 dist/umd/sifter.js delete mode 100644 dist/umd/sifter.js.map delete mode 100644 dist/umd/sifter.min.js delete mode 100644 dist/umd/sifter.min.js.map diff --git a/.gitignore b/.gitignore index 1ab8027..29f81e4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ coverage package-lock.json build x-* +dist diff --git a/dist/cjs/diacritics.js b/dist/cjs/diacritics.js deleted file mode 100644 index 126599b..0000000 --- a/dist/cjs/diacritics.js +++ /dev/null @@ -1,173 +0,0 @@ -/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -// https://github.com/andrewrk/node-diacritics/blob/master/index.js -var latin_pat; -const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}]'; // \u{2bc} - -const accent_reg = new RegExp(accent_pat, 'g'); -var diacritic_patterns; -const latin_convert = { - 'æ': 'ae', - 'ⱥ': 'a', - 'ø': 'o' -}; -const convert_pat = new RegExp(Object.keys(latin_convert).join('|'), 'g'); -/** - * code points generated from toCodePoints(); - * removed 65339 to 65345 - */ - -const code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [1019, 1019], [1083, 1083], [1281, 1289], [1984, 1984], [5095, 5095], [7429, 7441], [7545, 7549], [7680, 7935], [8580, 8580], [9398, 9449], [11360, 11391], [42792, 42793], [42802, 42851], [42873, 42897], [42912, 42922], [64256, 64260], [65313, 65338], [65345, 65370]]; -/** - * Remove accents - * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 - * - */ - -const asciifold = str => { - return str.normalize('NFKD').replace(accent_reg, '').toLowerCase().replace(convert_pat, function (foreignletter) { - return latin_convert[foreignletter]; - }); -}; -/** - * Convert array of strings to a regular expression - * ex ['ab','a'] => (?:ab|a) - * ex ['a','b'] => [ab] - * - */ - - -const arrayToPattern = (chars, glue = '|') => { - if (chars.length == 1) { - return chars[0]; - } - - var longest = 1; - chars.forEach(a => { - longest = Math.max(longest, a.length); - }); - - if (longest == 1) { - return '[' + chars.join('') + ']'; - } - - return '(?:' + chars.join(glue) + ')'; -}; -/** - * Get all possible combinations of substrings that add up to the given string - * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string - * - */ - -const allSubstrings = input => { - if (input.length === 1) return [[input]]; - var result = []; - allSubstrings(input.substring(1)).forEach(function (subresult) { - var tmp = subresult.slice(0); - tmp[0] = input.charAt(0) + tmp[0]; - result.push(tmp); - tmp = subresult.slice(0); - tmp.unshift(input.charAt(0)); - result.push(tmp); - }); - return result; -}; -/** - * Generate a list of diacritics from the list of code points - * - */ - -const generateDiacritics = () => { - var diacritics = {}; - code_points.forEach(code_range => { - for (let i = code_range[0]; i <= code_range[1]; i++) { - let diacritic = String.fromCharCode(i); - let latin = asciifold(diacritic); - - if (latin == diacritic.toLowerCase()) { - continue; - } - - if (!(latin in diacritics)) { - diacritics[latin] = [latin]; - } - - var patt = new RegExp(arrayToPattern(diacritics[latin]), 'iu'); - - if (diacritic.match(patt)) { - continue; - } - - diacritics[latin].push(diacritic); - } - }); - var latin_chars = Object.keys(diacritics); // latin character pattern - // match longer substrings first - - latin_chars = latin_chars.sort((a, b) => b.length - a.length); - latin_pat = new RegExp('(' + arrayToPattern(latin_chars) + accent_pat + '*)', 'g'); // build diacritic patterns - // ae needs: - // (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...)) - - var diacritic_patterns = {}; - latin_chars.sort((a, b) => a.length - b.length).forEach(latin => { - var substrings = allSubstrings(latin); - var pattern = substrings.map(sub_pat => { - sub_pat = sub_pat.map(l => { - if (diacritics.hasOwnProperty(l)) { - return arrayToPattern(diacritics[l]); - } - - return l; - }); - return arrayToPattern(sub_pat, ''); - }); - diacritic_patterns[latin] = arrayToPattern(pattern); - }); - return diacritic_patterns; -}; -/** - * Expand a regular expression pattern to include diacritics - * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ - * - */ - -const diacriticRegexPoints = regex => { - if (diacritic_patterns === undefined) { - diacritic_patterns = generateDiacritics(); - } - - const decomposed = regex.normalize('NFKD').toLowerCase(); - return decomposed.split(latin_pat).map(part => { - if (part == '') { - return ''; - } // "ffl" or "ffl" - - - const no_accent = asciifold(part); - - if (diacritic_patterns.hasOwnProperty(no_accent)) { - return diacritic_patterns[no_accent]; - } // 'أهلا' (\u{623}\u{647}\u{644}\u{627}) or 'أهلا' (\u{627}\u{654}\u{647}\u{644}\u{627}) - - - const composed_part = part.normalize('NFC'); - - if (composed_part != part) { - return arrayToPattern([part, composed_part]); - } - - return part; - }).join(''); -}; - -exports.allSubstrings = allSubstrings; -exports.arrayToPattern = arrayToPattern; -exports.asciifold = asciifold; -exports.code_points = code_points; -exports.diacriticRegexPoints = diacriticRegexPoints; -exports.generateDiacritics = generateDiacritics; -//# sourceMappingURL=diacritics.js.map diff --git a/dist/cjs/diacritics.js.map b/dist/cjs/diacritics.js.map deleted file mode 100644 index 7191a6d..0000000 --- a/dist/cjs/diacritics.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\t\n\tif( chars.length == 1 ){\n\t\treturn chars[0];\n\t}\n\t\n\tvar longest = 1;\n\tchars.forEach((a)=>{longest = Math.max(longest,a.length)});\n\n\tif( longest == 1 ){\n\t\treturn '['+chars.join('')+']';\n\t}\n\n\treturn '(?:'+chars.join(glue)+')';\t\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\n\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\t\n\t\t\tvar patt = new RegExp( arrayToPattern(diacritics[latin]),'iu');\n\t\t\tif( diacritic.match(patt) ){\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","longest","forEach","a","Math","max","allSubstrings","input","result","substring","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","patt","match","latin_chars","sort","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part"],"mappings":"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"} \ No newline at end of file diff --git a/dist/cjs/sifter.js b/dist/cjs/sifter.js deleted file mode 100644 index 8d49879..0000000 --- a/dist/cjs/sifter.js +++ /dev/null @@ -1,372 +0,0 @@ -/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ -'use strict'; - -var utils = require('./utils.js'); -var diacritics = require('./diacritics.js'); - -/** - * sifter.js - * Copyright (c) 2013–2020 Brian Reavis & contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this - * file except in compliance with the License. You may obtain a copy of the License at: - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under - * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF - * ANY KIND, either express or implied. See the License for the specific language - * governing permissions and limitations under the License. - * - * @author Brian Reavis - */ - -class Sifter { - // []|{}; - - /** - * Textually searches arrays and hashes of objects - * by property (or multiple properties). Designed - * specifically for autocomplete. - * - */ - constructor(items, settings) { - this.items = void 0; - this.settings = void 0; - this.items = items; - this.settings = settings || { - diacritics: true - }; - } - - /** - * Splits a search string into an array of individual - * regexps to be used to match results. - * - */ - tokenize(query, respect_word_boundaries, weights) { - if (!query || !query.length) return []; - const tokens = []; - const words = query.split(/\s+/); - var field_regex; - - if (weights) { - field_regex = new RegExp('^(' + Object.keys(weights).map(utils.escape_regex).join('|') + ')\:(.*)$'); - } - - words.forEach(word => { - let field_match; - let field = null; - let regex = null; // look for "field:query" tokens - - if (field_regex && (field_match = word.match(field_regex))) { - field = field_match[1]; - word = field_match[2]; - } - - if (word.length > 0) { - regex = utils.escape_regex(word); - - if (this.settings.diacritics) { - regex = diacritics.diacriticRegexPoints(regex); - } - - if (respect_word_boundaries) regex = "\\b" + regex; - } - - tokens.push({ - string: word, - regex: regex ? new RegExp(regex, 'iu') : null, - field: field - }); - }); - return tokens; - } - - /** - * Returns a function to be used to score individual results. - * - * Good matches will have a higher score than poor matches. - * If an item is not a match, 0 will be returned by the function. - * - * @returns {function} - */ - getScoreFunction(query, options) { - var search = this.prepareSearch(query, options); - return this._getScoreFunction(search); - } - - _getScoreFunction(search) { - const tokens = search.tokens, - token_count = tokens.length; - - if (!token_count) { - return function () { - return 0; - }; - } - - const fields = search.options.fields, - weights = search.weights, - field_count = fields.length, - getAttrFn = search.getAttrFn; - - if (!field_count) { - return function () { - return 1; - }; - } - /** - * Calculates the score of an object - * against the search query. - * - */ - - - const scoreObject = function () { - if (field_count === 1) { - return function (token, data) { - const field = fields[0].field; - return utils.scoreValue(getAttrFn(data, field), token, weights[field]); - }; - } - - return function (token, data) { - var sum = 0; // is the token specific to a field? - - if (token.field) { - const value = getAttrFn(data, token.field); - - if (!token.regex && value) { - sum += 1 / field_count; - } else { - sum += utils.scoreValue(value, token, 1); - } - } else { - utils.iterate(weights, (weight, field) => { - sum += utils.scoreValue(getAttrFn(data, field), token, weight); - }); - } - - return sum / field_count; - }; - }(); - - if (token_count === 1) { - return function (data) { - return scoreObject(tokens[0], data); - }; - } - - if (search.options.conjunction === 'and') { - return function (data) { - var i = 0, - score, - sum = 0; - - for (; i < token_count; i++) { - score = scoreObject(tokens[i], data); - if (score <= 0) return 0; - sum += score; - } - - return sum / token_count; - }; - } else { - return function (data) { - var sum = 0; - utils.iterate(tokens, token => { - sum += scoreObject(token, data); - }); - return sum / token_count; - }; - } - } - - /** - * Returns a function that can be used to compare two - * results, for sorting purposes. If no sorting should - * be performed, `null` will be returned. - * - * @return function(a,b) - */ - getSortFunction(query, options) { - var search = this.prepareSearch(query, options); - return this._getSortFunction(search); - } - - _getSortFunction(search) { - var i, n, implicit_score; - const self = this, - options = search.options, - sort = !search.query && options.sort_empty ? options.sort_empty : options.sort, - sort_flds = [], - multipliers = []; - /** - * Fetches the specified sort field value - * from a search result item. - * - */ - - const get_field = function get_field(name, result) { - if (name === '$score') return result.score; - return search.getAttrFn(self.items[result.id], name); - }; // parse options - - - if (sort) { - for (i = 0, n = sort.length; i < n; i++) { - if (search.query || sort[i].field !== '$score') { - sort_flds.push(sort[i]); - } - } - } // the "$score" field is implied to be the primary - // sort field, unless it's manually specified - - - if (search.query) { - implicit_score = true; - - for (i = 0, n = sort_flds.length; i < n; i++) { - if (sort_flds[i].field === '$score') { - implicit_score = false; - break; - } - } - - if (implicit_score) { - sort_flds.unshift({ - field: '$score', - direction: 'desc' - }); - } - } else { - for (i = 0, n = sort_flds.length; i < n; i++) { - if (sort_flds[i].field === '$score') { - sort_flds.splice(i, 1); - break; - } - } - } - - for (i = 0, n = sort_flds.length; i < n; i++) { - multipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1); - } // build function - - - const sort_flds_count = sort_flds.length; - - if (!sort_flds_count) { - return null; - } else if (sort_flds_count === 1) { - const sort_fld = sort_flds[0].field; - const multiplier = multipliers[0]; - return function (a, b) { - return multiplier * utils.cmp(get_field(sort_fld, a), get_field(sort_fld, b)); - }; - } else { - return function (a, b) { - var i, result, field; - - for (i = 0; i < sort_flds_count; i++) { - field = sort_flds[i].field; - result = multipliers[i] * utils.cmp(get_field(field, a), get_field(field, b)); - if (result) return result; - } - - return 0; - }; - } - } - - /** - * Parses a search query and returns an object - * with tokens and fields ready to be populated - * with results. - * - */ - prepareSearch(query, optsUser) { - const weights = {}; - var options = Object.assign({}, optsUser); - utils.propToArray(options, 'sort'); - utils.propToArray(options, 'sort_empty'); // convert fields to new format - - if (options.fields) { - utils.propToArray(options, 'fields'); - const fields = []; - options.fields.forEach(field => { - if (typeof field == 'string') { - field = { - field: field, - weight: 1 - }; - } - - fields.push(field); - weights[field.field] = 'weight' in field ? field.weight : 1; - }); - options.fields = fields; - } - - return { - options: options, - query: query.toLowerCase().trim(), - tokens: this.tokenize(query, options.respect_word_boundaries, weights), - total: 0, - items: [], - weights: weights, - getAttrFn: options.nesting ? utils.getAttrNesting : utils.getAttr - }; - } - - /** - * Searches through all items and returns a sorted array of matches. - * - */ - search(query, options) { - var self = this, - score, - search; - search = this.prepareSearch(query, options); - options = search.options; - query = search.query; // generate result scoring function - - const fn_score = options.score || self._getScoreFunction(search); // perform search and sort - - - if (query.length) { - utils.iterate(self.items, (item, id) => { - score = fn_score(item); - - if (options.filter === false || score > 0) { - search.items.push({ - 'score': score, - 'id': id - }); - } - }); - } else { - utils.iterate(self.items, (item, id) => { - search.items.push({ - 'score': 1, - 'id': id - }); - }); - } - - const fn_sort = self._getSortFunction(search); - - if (fn_sort) search.items.sort(fn_sort); // apply limits - - search.total = search.items.length; - - if (typeof options.limit === 'number') { - search.items = search.items.slice(0, options.limit); - } - - return search; - } - -} - -module.exports = Sifter; -//# sourceMappingURL=sifter.js.map diff --git a/dist/cjs/sifter.js.map b/dist/cjs/sifter.js.map deleted file mode 100644 index 3fa777d..0000000 --- a/dist/cjs/sifter.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","a","b","cmp","optsUser","assign","propToArray","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/cjs/utils.js b/dist/cjs/utils.js deleted file mode 100644 index 13d9821..0000000 --- a/dist/cjs/utils.js +++ /dev/null @@ -1,113 +0,0 @@ -/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -var diacritics = require('./diacritics.js'); - -// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" - -/** - * A property getter resolving dot-notation - * @param {Object} obj The root object to fetch property on - * @param {String} name The optionally dotted property name to fetch - * @return {Object} The resolved property value - */ -const getAttr = (obj, name) => { - if (!obj) return; - return obj[name]; -}; -/** - * A property getter resolving dot-notation - * @param {Object} obj The root object to fetch property on - * @param {String} name The optionally dotted property name to fetch - * @return {Object} The resolved property value - */ - -const getAttrNesting = (obj, name) => { - if (!obj) return; - var part, - names = name.split("."); - - while ((part = names.shift()) && (obj = obj[part])); - - return obj; -}; -/** - * Calculates how close of a match the - * given value is against a search token. - * - */ - -const scoreValue = (value, token, weight) => { - var score, pos; - if (!value) return 0; - value = value + ''; - pos = value.search(token.regex); - if (pos === -1) return 0; - score = token.string.length / value.length; - if (pos === 0) score += 0.5; - return score * weight; -}; -/** - * - * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error - */ - -const escape_regex = str => { - return (str + '').replace(/([\$\(-\+\.\?\[-\^\{-\}])/g, '\\$1'); -}; -/** - * Cast object property to an array if it exists and has a value - * - */ - -const propToArray = (obj, key) => { - var value = obj[key]; - - if (value && !Array.isArray(value)) { - obj[key] = [value]; - } -}; -/** - * Iterates over arrays and hashes. - * - * ``` - * iterate(this.items, function(item, id) { - * // invoked for each item - * }); - * ``` - * - */ - -const iterate = (object, callback) => { - if (Array.isArray(object)) { - object.forEach(callback); - } else { - for (var key in object) { - if (object.hasOwnProperty(key)) { - callback(object[key], key); - } - } - } -}; -const cmp = (a, b) => { - if (typeof a === 'number' && typeof b === 'number') { - return a > b ? 1 : a < b ? -1 : 0; - } - - a = diacritics.asciifold(a + '').toLowerCase(); - b = diacritics.asciifold(b + '').toLowerCase(); - if (a > b) return 1; - if (b > a) return -1; - return 0; -}; - -exports.cmp = cmp; -exports.escape_regex = escape_regex; -exports.getAttr = getAttr; -exports.getAttrNesting = getAttrNesting; -exports.iterate = iterate; -exports.propToArray = propToArray; -exports.scoreValue = scoreValue; -//# sourceMappingURL=utils.js.map diff --git a/dist/cjs/utils.js.map b/dist/cjs/utils.js.map deleted file mode 100644 index b4928b8..0000000 --- a/dist/cjs/utils.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\t\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","regex","string","length","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/diacritics.js b/dist/esm/diacritics.js deleted file mode 100644 index 2f894b7..0000000 --- a/dist/esm/diacritics.js +++ /dev/null @@ -1,164 +0,0 @@ -/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ -// https://github.com/andrewrk/node-diacritics/blob/master/index.js -var latin_pat; -const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}]'; // \u{2bc} - -const accent_reg = new RegExp(accent_pat, 'g'); -var diacritic_patterns; -const latin_convert = { - 'æ': 'ae', - 'ⱥ': 'a', - 'ø': 'o' -}; -const convert_pat = new RegExp(Object.keys(latin_convert).join('|'), 'g'); -/** - * code points generated from toCodePoints(); - * removed 65339 to 65345 - */ - -const code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [1019, 1019], [1083, 1083], [1281, 1289], [1984, 1984], [5095, 5095], [7429, 7441], [7545, 7549], [7680, 7935], [8580, 8580], [9398, 9449], [11360, 11391], [42792, 42793], [42802, 42851], [42873, 42897], [42912, 42922], [64256, 64260], [65313, 65338], [65345, 65370]]; -/** - * Remove accents - * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 - * - */ - -const asciifold = str => { - return str.normalize('NFKD').replace(accent_reg, '').toLowerCase().replace(convert_pat, function (foreignletter) { - return latin_convert[foreignletter]; - }); -}; -/** - * Convert array of strings to a regular expression - * ex ['ab','a'] => (?:ab|a) - * ex ['a','b'] => [ab] - * - */ - - -const arrayToPattern = (chars, glue = '|') => { - if (chars.length == 1) { - return chars[0]; - } - - var longest = 1; - chars.forEach(a => { - longest = Math.max(longest, a.length); - }); - - if (longest == 1) { - return '[' + chars.join('') + ']'; - } - - return '(?:' + chars.join(glue) + ')'; -}; -/** - * Get all possible combinations of substrings that add up to the given string - * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string - * - */ - -const allSubstrings = input => { - if (input.length === 1) return [[input]]; - var result = []; - allSubstrings(input.substring(1)).forEach(function (subresult) { - var tmp = subresult.slice(0); - tmp[0] = input.charAt(0) + tmp[0]; - result.push(tmp); - tmp = subresult.slice(0); - tmp.unshift(input.charAt(0)); - result.push(tmp); - }); - return result; -}; -/** - * Generate a list of diacritics from the list of code points - * - */ - -const generateDiacritics = () => { - var diacritics = {}; - code_points.forEach(code_range => { - for (let i = code_range[0]; i <= code_range[1]; i++) { - let diacritic = String.fromCharCode(i); - let latin = asciifold(diacritic); - - if (latin == diacritic.toLowerCase()) { - continue; - } - - if (!(latin in diacritics)) { - diacritics[latin] = [latin]; - } - - var patt = new RegExp(arrayToPattern(diacritics[latin]), 'iu'); - - if (diacritic.match(patt)) { - continue; - } - - diacritics[latin].push(diacritic); - } - }); - var latin_chars = Object.keys(diacritics); // latin character pattern - // match longer substrings first - - latin_chars = latin_chars.sort((a, b) => b.length - a.length); - latin_pat = new RegExp('(' + arrayToPattern(latin_chars) + accent_pat + '*)', 'g'); // build diacritic patterns - // ae needs: - // (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...)) - - var diacritic_patterns = {}; - latin_chars.sort((a, b) => a.length - b.length).forEach(latin => { - var substrings = allSubstrings(latin); - var pattern = substrings.map(sub_pat => { - sub_pat = sub_pat.map(l => { - if (diacritics.hasOwnProperty(l)) { - return arrayToPattern(diacritics[l]); - } - - return l; - }); - return arrayToPattern(sub_pat, ''); - }); - diacritic_patterns[latin] = arrayToPattern(pattern); - }); - return diacritic_patterns; -}; -/** - * Expand a regular expression pattern to include diacritics - * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ - * - */ - -const diacriticRegexPoints = regex => { - if (diacritic_patterns === undefined) { - diacritic_patterns = generateDiacritics(); - } - - const decomposed = regex.normalize('NFKD').toLowerCase(); - return decomposed.split(latin_pat).map(part => { - if (part == '') { - return ''; - } // "ffl" or "ffl" - - - const no_accent = asciifold(part); - - if (diacritic_patterns.hasOwnProperty(no_accent)) { - return diacritic_patterns[no_accent]; - } // 'أهلا' (\u{623}\u{647}\u{644}\u{627}) or 'أهلا' (\u{627}\u{654}\u{647}\u{644}\u{627}) - - - const composed_part = part.normalize('NFC'); - - if (composed_part != part) { - return arrayToPattern([part, composed_part]); - } - - return part; - }).join(''); -}; - -export { allSubstrings, arrayToPattern, asciifold, code_points, diacriticRegexPoints, generateDiacritics }; -//# sourceMappingURL=diacritics.js.map diff --git a/dist/esm/diacritics.js.map b/dist/esm/diacritics.js.map deleted file mode 100644 index 7b65d24..0000000 --- a/dist/esm/diacritics.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"diacritics.js","sources":["../../lib/diacritics.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\t\n\tif( chars.length == 1 ){\n\t\treturn chars[0];\n\t}\n\t\n\tvar longest = 1;\n\tchars.forEach((a)=>{longest = Math.max(longest,a.length)});\n\n\tif( longest == 1 ){\n\t\treturn '['+chars.join('')+']';\n\t}\n\n\treturn '(?:'+chars.join(glue)+')';\t\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\n\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\t\n\t\t\tvar patt = new RegExp( arrayToPattern(diacritics[latin]),'iu');\n\t\t\tif( diacritic.match(patt) ){\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","longest","forEach","a","Math","max","allSubstrings","input","result","substring","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","patt","match","latin_chars","sort","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/sifter.js b/dist/esm/sifter.js deleted file mode 100644 index a7c2a7e..0000000 --- a/dist/esm/sifter.js +++ /dev/null @@ -1,370 +0,0 @@ -/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ -import { escape_regex, iterate, cmp, propToArray, getAttrNesting, getAttr, scoreValue } from './utils.js'; -import { diacriticRegexPoints } from './diacritics.js'; - -/** - * sifter.js - * Copyright (c) 2013–2020 Brian Reavis & contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this - * file except in compliance with the License. You may obtain a copy of the License at: - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under - * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF - * ANY KIND, either express or implied. See the License for the specific language - * governing permissions and limitations under the License. - * - * @author Brian Reavis - */ - -class Sifter { - // []|{}; - - /** - * Textually searches arrays and hashes of objects - * by property (or multiple properties). Designed - * specifically for autocomplete. - * - */ - constructor(items, settings) { - this.items = void 0; - this.settings = void 0; - this.items = items; - this.settings = settings || { - diacritics: true - }; - } - - /** - * Splits a search string into an array of individual - * regexps to be used to match results. - * - */ - tokenize(query, respect_word_boundaries, weights) { - if (!query || !query.length) return []; - const tokens = []; - const words = query.split(/\s+/); - var field_regex; - - if (weights) { - field_regex = new RegExp('^(' + Object.keys(weights).map(escape_regex).join('|') + ')\:(.*)$'); - } - - words.forEach(word => { - let field_match; - let field = null; - let regex = null; // look for "field:query" tokens - - if (field_regex && (field_match = word.match(field_regex))) { - field = field_match[1]; - word = field_match[2]; - } - - if (word.length > 0) { - regex = escape_regex(word); - - if (this.settings.diacritics) { - regex = diacriticRegexPoints(regex); - } - - if (respect_word_boundaries) regex = "\\b" + regex; - } - - tokens.push({ - string: word, - regex: regex ? new RegExp(regex, 'iu') : null, - field: field - }); - }); - return tokens; - } - - /** - * Returns a function to be used to score individual results. - * - * Good matches will have a higher score than poor matches. - * If an item is not a match, 0 will be returned by the function. - * - * @returns {function} - */ - getScoreFunction(query, options) { - var search = this.prepareSearch(query, options); - return this._getScoreFunction(search); - } - - _getScoreFunction(search) { - const tokens = search.tokens, - token_count = tokens.length; - - if (!token_count) { - return function () { - return 0; - }; - } - - const fields = search.options.fields, - weights = search.weights, - field_count = fields.length, - getAttrFn = search.getAttrFn; - - if (!field_count) { - return function () { - return 1; - }; - } - /** - * Calculates the score of an object - * against the search query. - * - */ - - - const scoreObject = function () { - if (field_count === 1) { - return function (token, data) { - const field = fields[0].field; - return scoreValue(getAttrFn(data, field), token, weights[field]); - }; - } - - return function (token, data) { - var sum = 0; // is the token specific to a field? - - if (token.field) { - const value = getAttrFn(data, token.field); - - if (!token.regex && value) { - sum += 1 / field_count; - } else { - sum += scoreValue(value, token, 1); - } - } else { - iterate(weights, (weight, field) => { - sum += scoreValue(getAttrFn(data, field), token, weight); - }); - } - - return sum / field_count; - }; - }(); - - if (token_count === 1) { - return function (data) { - return scoreObject(tokens[0], data); - }; - } - - if (search.options.conjunction === 'and') { - return function (data) { - var i = 0, - score, - sum = 0; - - for (; i < token_count; i++) { - score = scoreObject(tokens[i], data); - if (score <= 0) return 0; - sum += score; - } - - return sum / token_count; - }; - } else { - return function (data) { - var sum = 0; - iterate(tokens, token => { - sum += scoreObject(token, data); - }); - return sum / token_count; - }; - } - } - - /** - * Returns a function that can be used to compare two - * results, for sorting purposes. If no sorting should - * be performed, `null` will be returned. - * - * @return function(a,b) - */ - getSortFunction(query, options) { - var search = this.prepareSearch(query, options); - return this._getSortFunction(search); - } - - _getSortFunction(search) { - var i, n, implicit_score; - const self = this, - options = search.options, - sort = !search.query && options.sort_empty ? options.sort_empty : options.sort, - sort_flds = [], - multipliers = []; - /** - * Fetches the specified sort field value - * from a search result item. - * - */ - - const get_field = function get_field(name, result) { - if (name === '$score') return result.score; - return search.getAttrFn(self.items[result.id], name); - }; // parse options - - - if (sort) { - for (i = 0, n = sort.length; i < n; i++) { - if (search.query || sort[i].field !== '$score') { - sort_flds.push(sort[i]); - } - } - } // the "$score" field is implied to be the primary - // sort field, unless it's manually specified - - - if (search.query) { - implicit_score = true; - - for (i = 0, n = sort_flds.length; i < n; i++) { - if (sort_flds[i].field === '$score') { - implicit_score = false; - break; - } - } - - if (implicit_score) { - sort_flds.unshift({ - field: '$score', - direction: 'desc' - }); - } - } else { - for (i = 0, n = sort_flds.length; i < n; i++) { - if (sort_flds[i].field === '$score') { - sort_flds.splice(i, 1); - break; - } - } - } - - for (i = 0, n = sort_flds.length; i < n; i++) { - multipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1); - } // build function - - - const sort_flds_count = sort_flds.length; - - if (!sort_flds_count) { - return null; - } else if (sort_flds_count === 1) { - const sort_fld = sort_flds[0].field; - const multiplier = multipliers[0]; - return function (a, b) { - return multiplier * cmp(get_field(sort_fld, a), get_field(sort_fld, b)); - }; - } else { - return function (a, b) { - var i, result, field; - - for (i = 0; i < sort_flds_count; i++) { - field = sort_flds[i].field; - result = multipliers[i] * cmp(get_field(field, a), get_field(field, b)); - if (result) return result; - } - - return 0; - }; - } - } - - /** - * Parses a search query and returns an object - * with tokens and fields ready to be populated - * with results. - * - */ - prepareSearch(query, optsUser) { - const weights = {}; - var options = Object.assign({}, optsUser); - propToArray(options, 'sort'); - propToArray(options, 'sort_empty'); // convert fields to new format - - if (options.fields) { - propToArray(options, 'fields'); - const fields = []; - options.fields.forEach(field => { - if (typeof field == 'string') { - field = { - field: field, - weight: 1 - }; - } - - fields.push(field); - weights[field.field] = 'weight' in field ? field.weight : 1; - }); - options.fields = fields; - } - - return { - options: options, - query: query.toLowerCase().trim(), - tokens: this.tokenize(query, options.respect_word_boundaries, weights), - total: 0, - items: [], - weights: weights, - getAttrFn: options.nesting ? getAttrNesting : getAttr - }; - } - - /** - * Searches through all items and returns a sorted array of matches. - * - */ - search(query, options) { - var self = this, - score, - search; - search = this.prepareSearch(query, options); - options = search.options; - query = search.query; // generate result scoring function - - const fn_score = options.score || self._getScoreFunction(search); // perform search and sort - - - if (query.length) { - iterate(self.items, (item, id) => { - score = fn_score(item); - - if (options.filter === false || score > 0) { - search.items.push({ - 'score': score, - 'id': id - }); - } - }); - } else { - iterate(self.items, (item, id) => { - search.items.push({ - 'score': 1, - 'id': id - }); - }); - } - - const fn_sort = self._getSortFunction(search); - - if (fn_sort) search.items.sort(fn_sort); // apply limits - - search.total = search.items.length; - - if (typeof options.limit === 'number') { - search.items = search.items.slice(0, options.limit); - } - - return search; - } - -} - -export default Sifter; -//# sourceMappingURL=sifter.js.map diff --git a/dist/esm/sifter.js.map b/dist/esm/sifter.js.map deleted file mode 100644 index 7c684a8..0000000 --- a/dist/esm/sifter.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/sifter.ts"],"sourcesContent":["/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["Sifter","constructor","items","settings","diacritics","tokenize","query","respect_word_boundaries","weights","length","tokens","words","split","field_regex","RegExp","Object","keys","map","escape_regex","join","forEach","word","field_match","field","regex","match","diacriticRegexPoints","push","string","getScoreFunction","options","search","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","token","data","scoreValue","sum","value","iterate","weight","conjunction","i","score","getSortFunction","_getSortFunction","n","implicit_score","self","sort","sort_empty","sort_flds","multipliers","get_field","name","result","id","unshift","direction","splice","sort_flds_count","sort_fld","multiplier","a","b","cmp","optsUser","assign","propToArray","toLowerCase","trim","total","nesting","getAttrNesting","getAttr","fn_score","item","filter","fn_sort","limit","slice"],"mappings":"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"} \ No newline at end of file diff --git a/dist/esm/utils.js b/dist/esm/utils.js deleted file mode 100644 index 402bb40..0000000 --- a/dist/esm/utils.js +++ /dev/null @@ -1,103 +0,0 @@ -/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ -import { asciifold } from './diacritics.js'; - -// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" - -/** - * A property getter resolving dot-notation - * @param {Object} obj The root object to fetch property on - * @param {String} name The optionally dotted property name to fetch - * @return {Object} The resolved property value - */ -const getAttr = (obj, name) => { - if (!obj) return; - return obj[name]; -}; -/** - * A property getter resolving dot-notation - * @param {Object} obj The root object to fetch property on - * @param {String} name The optionally dotted property name to fetch - * @return {Object} The resolved property value - */ - -const getAttrNesting = (obj, name) => { - if (!obj) return; - var part, - names = name.split("."); - - while ((part = names.shift()) && (obj = obj[part])); - - return obj; -}; -/** - * Calculates how close of a match the - * given value is against a search token. - * - */ - -const scoreValue = (value, token, weight) => { - var score, pos; - if (!value) return 0; - value = value + ''; - pos = value.search(token.regex); - if (pos === -1) return 0; - score = token.string.length / value.length; - if (pos === 0) score += 0.5; - return score * weight; -}; -/** - * - * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error - */ - -const escape_regex = str => { - return (str + '').replace(/([\$\(-\+\.\?\[-\^\{-\}])/g, '\\$1'); -}; -/** - * Cast object property to an array if it exists and has a value - * - */ - -const propToArray = (obj, key) => { - var value = obj[key]; - - if (value && !Array.isArray(value)) { - obj[key] = [value]; - } -}; -/** - * Iterates over arrays and hashes. - * - * ``` - * iterate(this.items, function(item, id) { - * // invoked for each item - * }); - * ``` - * - */ - -const iterate = (object, callback) => { - if (Array.isArray(object)) { - object.forEach(callback); - } else { - for (var key in object) { - if (object.hasOwnProperty(key)) { - callback(object[key], key); - } - } - } -}; -const cmp = (a, b) => { - if (typeof a === 'number' && typeof b === 'number') { - return a > b ? 1 : a < b ? -1 : 0; - } - - a = asciifold(a + '').toLowerCase(); - b = asciifold(b + '').toLowerCase(); - if (a > b) return 1; - if (b > a) return -1; - return 0; -}; - -export { cmp, escape_regex, getAttr, getAttrNesting, iterate, propToArray, scoreValue }; -//# sourceMappingURL=utils.js.map diff --git a/dist/esm/utils.js.map b/dist/esm/utils.js.map deleted file mode 100644 index 515719d..0000000 --- a/dist/esm/utils.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"utils.js","sources":["../../lib/utils.ts"],"sourcesContent":["\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\t\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n"],"names":["getAttr","obj","name","getAttrNesting","part","names","split","shift","scoreValue","value","token","weight","score","pos","search","regex","string","length","escape_regex","str","replace","propToArray","key","Array","isArray","iterate","object","callback","forEach","hasOwnProperty","cmp","a","b","asciifold","toLowerCase"],"mappings":";;;AACA;;AAOA;AACA;AACA;AACA;AACA;AACA;MACaA,OAAO,GAAG,CAACC,GAAD,EAAyBC,IAAzB,KAA0C;AAC7D,MAAI,CAACD,GAAL,EAAW;AACX,SAAOA,GAAG,CAACC,IAAD,CAAV;AACH;AAED;AACA;AACA;AACA;AACA;AACA;;MACaC,cAAc,GAAG,CAACF,GAAD,EAAyBC,IAAzB,KAA0C;AACpE,MAAI,CAACD,GAAL,EAAW;AACX,MAAIG,IAAJ;AAAA,MAAUC,KAAK,GAAGH,IAAI,CAACI,KAAL,CAAW,GAAX,CAAlB;;AACH,SAAO,CAACF,IAAI,GAAGC,KAAK,CAACE,KAAN,EAAR,MAA2BN,GAAG,GAAGA,GAAG,CAACG,IAAD,CAApC,CAAP,CAAmD;;AAChD,SAAOH,GAAP;AACH;AAED;AACA;AACA;AACA;AACA;;MACaO,UAAU,GAAG,CAACC,KAAD,EAAeC,KAAf,EAA8BC,MAA9B,KAAwD;AACjF,MAAIC,KAAJ,EAAWC,GAAX;AAEA,MAAI,CAACJ,KAAL,EAAY,OAAO,CAAP;AAEZA,EAAAA,KAAK,GAAGA,KAAK,GAAG,EAAhB;AACAI,EAAAA,GAAG,GAAGJ,KAAK,CAACK,MAAN,CAAaJ,KAAK,CAACK,KAAnB,CAAN;AACA,MAAIF,GAAG,KAAK,CAAC,CAAb,EAAgB,OAAO,CAAP;AAEhBD,EAAAA,KAAK,GAAGF,KAAK,CAACM,MAAN,CAAaC,MAAb,GAAsBR,KAAK,CAACQ,MAApC;AACA,MAAIJ,GAAG,KAAK,CAAZ,EAAeD,KAAK,IAAI,GAAT;AAEf,SAAOA,KAAK,GAAGD,MAAf;AACA;AAED;AACA;AACA;AACA;;MACaO,YAAY,GAAIC,GAAD,IAAuB;AAClD,SAAO,CAACA,GAAG,GAAG,EAAP,EAAWC,OAAX,CAAmB,4BAAnB,EAAyD,MAAzD,CAAP;AACA;AAGD;AACA;AACA;AACA;;MACaC,WAAW,GAAG,CAACpB,GAAD,EAAyBqB,GAAzB,KAAwC;AAClE,MAAIb,KAAK,GAAGR,GAAG,CAACqB,GAAD,CAAf;;AACA,MAAIb,KAAK,IAAI,CAACc,KAAK,CAACC,OAAN,CAAcf,KAAd,CAAd,EAAoC;AACnCR,IAAAA,GAAG,CAACqB,GAAD,CAAH,GAAW,CAACb,KAAD,CAAX;AACA;AACD;AAGD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;MACagB,OAAO,GAAG,CAACC,MAAD,EAA+BC,QAA/B,KAA+E;AAErG,MAAKJ,KAAK,CAACC,OAAN,CAAcE,MAAd,CAAL,EAA4B;AAC3BA,IAAAA,MAAM,CAACE,OAAP,CAAeD,QAAf;AAEA,GAHD,MAGK;AAEJ,SAAK,IAAIL,GAAT,IAAgBI,MAAhB,EAAwB;AACvB,UAAIA,MAAM,CAACG,cAAP,CAAsBP,GAAtB,CAAJ,EAAgC;AAC/BK,QAAAA,QAAQ,CAACD,MAAM,CAACJ,GAAD,CAAP,EAAcA,GAAd,CAAR;AACA;AACD;AACD;AACD;MAIYQ,GAAG,GAAG,CAACC,CAAD,EAAkBC,CAAlB,KAAsC;AACxD,MAAI,OAAOD,CAAP,KAAa,QAAb,IAAyB,OAAOC,CAAP,KAAa,QAA1C,EAAoD;AACnD,WAAOD,CAAC,GAAGC,CAAJ,GAAQ,CAAR,GAAaD,CAAC,GAAGC,CAAJ,GAAQ,CAAC,CAAT,GAAa,CAAjC;AACA;;AACDD,EAAAA,CAAC,GAAGE,SAAS,CAACF,CAAC,GAAG,EAAL,CAAT,CAAkBG,WAAlB,EAAJ;AACAF,EAAAA,CAAC,GAAGC,SAAS,CAACD,CAAC,GAAG,EAAL,CAAT,CAAkBE,WAAlB,EAAJ;AACA,MAAIH,CAAC,GAAGC,CAAR,EAAW,OAAO,CAAP;AACX,MAAIA,CAAC,GAAGD,CAAR,EAAW,OAAO,CAAC,CAAR;AACX,SAAO,CAAP;AACA;;;;"} \ No newline at end of file diff --git a/dist/types/diacritics.d.ts b/dist/types/diacritics.d.ts deleted file mode 100644 index b483e94..0000000 --- a/dist/types/diacritics.d.ts +++ /dev/null @@ -1,40 +0,0 @@ -declare type TDiacraticList = { - [key: string]: string; -}; -export declare const DIACRITICS: TDiacraticList; -/** - * code points generated from toCodePoints(); - * removed 65339 to 65345 - */ -export declare const code_points: number[][]; -/** - * Remove accents - * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 - * - */ -export declare const asciifold: (str: string) => string; -/** - * Convert array of strings to a regular expression - * ex ['ab','a'] => (?:ab|a) - * ex ['a','b'] => [ab] - * - */ -export declare const arrayToPattern: (chars: string[], glue?: string) => string; -/** - * Get all possible combinations of substrings that add up to the given string - * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string - * - */ -export declare const allSubstrings: (input: string) => string[][]; -/** - * Generate a list of diacritics from the list of code points - * - */ -export declare const generateDiacritics: () => TDiacraticList; -/** - * Expand a regular expression pattern to include diacritics - * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ - * - */ -export declare const diacriticRegexPoints: (regex: string) => string; -export {}; diff --git a/dist/types/sifter.d.ts b/dist/types/sifter.d.ts deleted file mode 100644 index abf0dde..0000000 --- a/dist/types/sifter.d.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * sifter.js - * Copyright (c) 2013–2020 Brian Reavis & contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this - * file except in compliance with the License. You may obtain a copy of the License at: - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under - * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF - * ANY KIND, either express or implied. See the License for the specific language - * governing permissions and limitations under the License. - * - * @author Brian Reavis - */ -import * as T from 'types.ts'; -export default class Sifter { - items: any; - settings: T.Settings; - /** - * Textually searches arrays and hashes of objects - * by property (or multiple properties). Designed - * specifically for autocomplete. - * - */ - constructor(items: any, settings: T.Settings); - /** - * Splits a search string into an array of individual - * regexps to be used to match results. - * - */ - tokenize(query: string, respect_word_boundaries?: boolean, weights?: T.Weights): T.Token[]; - /** - * Returns a function to be used to score individual results. - * - * Good matches will have a higher score than poor matches. - * If an item is not a match, 0 will be returned by the function. - * - * @returns {function} - */ - getScoreFunction(query: string, options: T.Options): (data: {}) => any; - _getScoreFunction(search: T.PrepareObj): (data: {}) => any; - /** - * Returns a function that can be used to compare two - * results, for sorting purposes. If no sorting should - * be performed, `null` will be returned. - * - * @return function(a,b) - */ - getSortFunction(query: string, options: T.Options): ((a: any, b: any) => number) | null; - _getSortFunction(search: T.PrepareObj): ((a: any, b: any) => number) | null; - /** - * Parses a search query and returns an object - * with tokens and fields ready to be populated - * with results. - * - */ - prepareSearch(query: string, optsUser: T.Options): T.PrepareObj; - /** - * Searches through all items and returns a sorted array of matches. - * - */ - search(query: string, options: T.Options): T.PrepareObj; -} diff --git a/dist/types/types.d.ts b/dist/types/types.d.ts deleted file mode 100644 index 6669330..0000000 --- a/dist/types/types.d.ts +++ /dev/null @@ -1,43 +0,0 @@ -export declare type Field = { - field: string; - weight: number; -}; -export declare type Sort = { - field: string; - direction?: string; -}; -export declare type Options = { - fields: Field[]; - sort: Sort[]; - score?: () => any; - filter?: boolean; - limit?: number; - sort_empty?: Sort[]; - nesting?: boolean; - respect_word_boundaries?: boolean; - conjunction?: string; -}; -export declare type Token = { - string: string; - regex: RegExp | null; - field: string | null; -}; -export declare type Weights = { - [key: string]: number; -}; -export declare type PrepareObj = { - options: Options; - query: string; - tokens: Token[]; - total: number; - items: ResultItem[]; - weights: Weights; - getAttrFn: (data: any, field: string) => any; -}; -export declare type Settings = { - diacritics: boolean; -}; -export declare type ResultItem = { - score: number; - id: number | string; -}; diff --git a/dist/types/utils.d.ts b/dist/types/utils.d.ts deleted file mode 100644 index 37ff048..0000000 --- a/dist/types/utils.d.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * A property getter resolving dot-notation - * @param {Object} obj The root object to fetch property on - * @param {String} name The optionally dotted property name to fetch - * @return {Object} The resolved property value - */ -export declare const getAttr: (obj: { - [key: string]: any; -}, name: string) => any; -/** - * A property getter resolving dot-notation - * @param {Object} obj The root object to fetch property on - * @param {String} name The optionally dotted property name to fetch - * @return {Object} The resolved property value - */ -export declare const getAttrNesting: (obj: { - [key: string]: any; -}, name: string) => { - [key: string]: any; -} | undefined; -/** - * Calculates how close of a match the - * given value is against a search token. - * - */ -export declare const scoreValue: (value: string, token: any, weight: number) => number; -/** - * - * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error - */ -export declare const escape_regex: (str: string) => string; -/** - * Cast object property to an array if it exists and has a value - * - */ -export declare const propToArray: (obj: { - [key: string]: any; -}, key: string) => void; -/** - * Iterates over arrays and hashes. - * - * ``` - * iterate(this.items, function(item, id) { - * // invoked for each item - * }); - * ``` - * - */ -export declare const iterate: (object: [] | { - [key: string]: any; -}, callback: (value: any, key: number | string) => any) => void; -export declare const cmp: (a: number | string, b: number | string) => 1 | -1 | 0; diff --git a/dist/umd/sifter.js b/dist/umd/sifter.js deleted file mode 100644 index f245705..0000000 --- a/dist/umd/sifter.js +++ /dev/null @@ -1,634 +0,0 @@ -/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.sifter = factory()); -}(this, (function () { 'use strict'; - - // https://github.com/andrewrk/node-diacritics/blob/master/index.js - var latin_pat; - const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}]'; // \u{2bc} - - const accent_reg = new RegExp(accent_pat, 'g'); - var diacritic_patterns; - const latin_convert = { - 'æ': 'ae', - 'ⱥ': 'a', - 'ø': 'o' - }; - const convert_pat = new RegExp(Object.keys(latin_convert).join('|'), 'g'); - /** - * code points generated from toCodePoints(); - * removed 65339 to 65345 - */ - - const code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [1019, 1019], [1083, 1083], [1281, 1289], [1984, 1984], [5095, 5095], [7429, 7441], [7545, 7549], [7680, 7935], [8580, 8580], [9398, 9449], [11360, 11391], [42792, 42793], [42802, 42851], [42873, 42897], [42912, 42922], [64256, 64260], [65313, 65338], [65345, 65370]]; - /** - * Remove accents - * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 - * - */ - - const asciifold = str => { - return str.normalize('NFKD').replace(accent_reg, '').toLowerCase().replace(convert_pat, function (foreignletter) { - return latin_convert[foreignletter]; - }); - }; - /** - * Convert array of strings to a regular expression - * ex ['ab','a'] => (?:ab|a) - * ex ['a','b'] => [ab] - * - */ - - - const arrayToPattern = (chars, glue = '|') => { - if (chars.length == 1) { - return chars[0]; - } - - var longest = 1; - chars.forEach(a => { - longest = Math.max(longest, a.length); - }); - - if (longest == 1) { - return '[' + chars.join('') + ']'; - } - - return '(?:' + chars.join(glue) + ')'; - }; - /** - * Get all possible combinations of substrings that add up to the given string - * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string - * - */ - - const allSubstrings = input => { - if (input.length === 1) return [[input]]; - var result = []; - allSubstrings(input.substring(1)).forEach(function (subresult) { - var tmp = subresult.slice(0); - tmp[0] = input.charAt(0) + tmp[0]; - result.push(tmp); - tmp = subresult.slice(0); - tmp.unshift(input.charAt(0)); - result.push(tmp); - }); - return result; - }; - /** - * Generate a list of diacritics from the list of code points - * - */ - - const generateDiacritics = () => { - var diacritics = {}; - code_points.forEach(code_range => { - for (let i = code_range[0]; i <= code_range[1]; i++) { - let diacritic = String.fromCharCode(i); - let latin = asciifold(diacritic); - - if (latin == diacritic.toLowerCase()) { - continue; - } - - if (!(latin in diacritics)) { - diacritics[latin] = [latin]; - } - - var patt = new RegExp(arrayToPattern(diacritics[latin]), 'iu'); - - if (diacritic.match(patt)) { - continue; - } - - diacritics[latin].push(diacritic); - } - }); - var latin_chars = Object.keys(diacritics); // latin character pattern - // match longer substrings first - - latin_chars = latin_chars.sort((a, b) => b.length - a.length); - latin_pat = new RegExp('(' + arrayToPattern(latin_chars) + accent_pat + '*)', 'g'); // build diacritic patterns - // ae needs: - // (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...)) - - var diacritic_patterns = {}; - latin_chars.sort((a, b) => a.length - b.length).forEach(latin => { - var substrings = allSubstrings(latin); - var pattern = substrings.map(sub_pat => { - sub_pat = sub_pat.map(l => { - if (diacritics.hasOwnProperty(l)) { - return arrayToPattern(diacritics[l]); - } - - return l; - }); - return arrayToPattern(sub_pat, ''); - }); - diacritic_patterns[latin] = arrayToPattern(pattern); - }); - return diacritic_patterns; - }; - /** - * Expand a regular expression pattern to include diacritics - * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ - * - */ - - const diacriticRegexPoints = regex => { - if (diacritic_patterns === undefined) { - diacritic_patterns = generateDiacritics(); - } - - const decomposed = regex.normalize('NFKD').toLowerCase(); - return decomposed.split(latin_pat).map(part => { - if (part == '') { - return ''; - } // "ffl" or "ffl" - - - const no_accent = asciifold(part); - - if (diacritic_patterns.hasOwnProperty(no_accent)) { - return diacritic_patterns[no_accent]; - } // 'أهلا' (\u{623}\u{647}\u{644}\u{627}) or 'أهلا' (\u{627}\u{654}\u{647}\u{644}\u{627}) - - - const composed_part = part.normalize('NFC'); - - if (composed_part != part) { - return arrayToPattern([part, composed_part]); - } - - return part; - }).join(''); - }; - - // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" - - /** - * A property getter resolving dot-notation - * @param {Object} obj The root object to fetch property on - * @param {String} name The optionally dotted property name to fetch - * @return {Object} The resolved property value - */ - const getAttr = (obj, name) => { - if (!obj) return; - return obj[name]; - }; - /** - * A property getter resolving dot-notation - * @param {Object} obj The root object to fetch property on - * @param {String} name The optionally dotted property name to fetch - * @return {Object} The resolved property value - */ - - const getAttrNesting = (obj, name) => { - if (!obj) return; - var part, - names = name.split("."); - - while ((part = names.shift()) && (obj = obj[part])); - - return obj; - }; - /** - * Calculates how close of a match the - * given value is against a search token. - * - */ - - const scoreValue = (value, token, weight) => { - var score, pos; - if (!value) return 0; - value = value + ''; - pos = value.search(token.regex); - if (pos === -1) return 0; - score = token.string.length / value.length; - if (pos === 0) score += 0.5; - return score * weight; - }; - /** - * - * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error - */ - - const escape_regex = str => { - return (str + '').replace(/([\$\(-\+\.\?\[-\^\{-\}])/g, '\\$1'); - }; - /** - * Cast object property to an array if it exists and has a value - * - */ - - const propToArray = (obj, key) => { - var value = obj[key]; - - if (value && !Array.isArray(value)) { - obj[key] = [value]; - } - }; - /** - * Iterates over arrays and hashes. - * - * ``` - * iterate(this.items, function(item, id) { - * // invoked for each item - * }); - * ``` - * - */ - - const iterate = (object, callback) => { - if (Array.isArray(object)) { - object.forEach(callback); - } else { - for (var key in object) { - if (object.hasOwnProperty(key)) { - callback(object[key], key); - } - } - } - }; - const cmp = (a, b) => { - if (typeof a === 'number' && typeof b === 'number') { - return a > b ? 1 : a < b ? -1 : 0; - } - - a = asciifold(a + '').toLowerCase(); - b = asciifold(b + '').toLowerCase(); - if (a > b) return 1; - if (b > a) return -1; - return 0; - }; - - /** - * sifter.js - * Copyright (c) 2013–2020 Brian Reavis & contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this - * file except in compliance with the License. You may obtain a copy of the License at: - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under - * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF - * ANY KIND, either express or implied. See the License for the specific language - * governing permissions and limitations under the License. - * - * @author Brian Reavis - */ - - class Sifter { - // []|{}; - - /** - * Textually searches arrays and hashes of objects - * by property (or multiple properties). Designed - * specifically for autocomplete. - * - */ - constructor(items, settings) { - this.items = void 0; - this.settings = void 0; - this.items = items; - this.settings = settings || { - diacritics: true - }; - } - - /** - * Splits a search string into an array of individual - * regexps to be used to match results. - * - */ - tokenize(query, respect_word_boundaries, weights) { - if (!query || !query.length) return []; - const tokens = []; - const words = query.split(/\s+/); - var field_regex; - - if (weights) { - field_regex = new RegExp('^(' + Object.keys(weights).map(escape_regex).join('|') + ')\:(.*)$'); - } - - words.forEach(word => { - let field_match; - let field = null; - let regex = null; // look for "field:query" tokens - - if (field_regex && (field_match = word.match(field_regex))) { - field = field_match[1]; - word = field_match[2]; - } - - if (word.length > 0) { - regex = escape_regex(word); - - if (this.settings.diacritics) { - regex = diacriticRegexPoints(regex); - } - - if (respect_word_boundaries) regex = "\\b" + regex; - } - - tokens.push({ - string: word, - regex: regex ? new RegExp(regex, 'iu') : null, - field: field - }); - }); - return tokens; - } - - /** - * Returns a function to be used to score individual results. - * - * Good matches will have a higher score than poor matches. - * If an item is not a match, 0 will be returned by the function. - * - * @returns {function} - */ - getScoreFunction(query, options) { - var search = this.prepareSearch(query, options); - return this._getScoreFunction(search); - } - - _getScoreFunction(search) { - const tokens = search.tokens, - token_count = tokens.length; - - if (!token_count) { - return function () { - return 0; - }; - } - - const fields = search.options.fields, - weights = search.weights, - field_count = fields.length, - getAttrFn = search.getAttrFn; - - if (!field_count) { - return function () { - return 1; - }; - } - /** - * Calculates the score of an object - * against the search query. - * - */ - - - const scoreObject = function () { - if (field_count === 1) { - return function (token, data) { - const field = fields[0].field; - return scoreValue(getAttrFn(data, field), token, weights[field]); - }; - } - - return function (token, data) { - var sum = 0; // is the token specific to a field? - - if (token.field) { - const value = getAttrFn(data, token.field); - - if (!token.regex && value) { - sum += 1 / field_count; - } else { - sum += scoreValue(value, token, 1); - } - } else { - iterate(weights, (weight, field) => { - sum += scoreValue(getAttrFn(data, field), token, weight); - }); - } - - return sum / field_count; - }; - }(); - - if (token_count === 1) { - return function (data) { - return scoreObject(tokens[0], data); - }; - } - - if (search.options.conjunction === 'and') { - return function (data) { - var i = 0, - score, - sum = 0; - - for (; i < token_count; i++) { - score = scoreObject(tokens[i], data); - if (score <= 0) return 0; - sum += score; - } - - return sum / token_count; - }; - } else { - return function (data) { - var sum = 0; - iterate(tokens, token => { - sum += scoreObject(token, data); - }); - return sum / token_count; - }; - } - } - - /** - * Returns a function that can be used to compare two - * results, for sorting purposes. If no sorting should - * be performed, `null` will be returned. - * - * @return function(a,b) - */ - getSortFunction(query, options) { - var search = this.prepareSearch(query, options); - return this._getSortFunction(search); - } - - _getSortFunction(search) { - var i, n, implicit_score; - const self = this, - options = search.options, - sort = !search.query && options.sort_empty ? options.sort_empty : options.sort, - sort_flds = [], - multipliers = []; - /** - * Fetches the specified sort field value - * from a search result item. - * - */ - - const get_field = function get_field(name, result) { - if (name === '$score') return result.score; - return search.getAttrFn(self.items[result.id], name); - }; // parse options - - - if (sort) { - for (i = 0, n = sort.length; i < n; i++) { - if (search.query || sort[i].field !== '$score') { - sort_flds.push(sort[i]); - } - } - } // the "$score" field is implied to be the primary - // sort field, unless it's manually specified - - - if (search.query) { - implicit_score = true; - - for (i = 0, n = sort_flds.length; i < n; i++) { - if (sort_flds[i].field === '$score') { - implicit_score = false; - break; - } - } - - if (implicit_score) { - sort_flds.unshift({ - field: '$score', - direction: 'desc' - }); - } - } else { - for (i = 0, n = sort_flds.length; i < n; i++) { - if (sort_flds[i].field === '$score') { - sort_flds.splice(i, 1); - break; - } - } - } - - for (i = 0, n = sort_flds.length; i < n; i++) { - multipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1); - } // build function - - - const sort_flds_count = sort_flds.length; - - if (!sort_flds_count) { - return null; - } else if (sort_flds_count === 1) { - const sort_fld = sort_flds[0].field; - const multiplier = multipliers[0]; - return function (a, b) { - return multiplier * cmp(get_field(sort_fld, a), get_field(sort_fld, b)); - }; - } else { - return function (a, b) { - var i, result, field; - - for (i = 0; i < sort_flds_count; i++) { - field = sort_flds[i].field; - result = multipliers[i] * cmp(get_field(field, a), get_field(field, b)); - if (result) return result; - } - - return 0; - }; - } - } - - /** - * Parses a search query and returns an object - * with tokens and fields ready to be populated - * with results. - * - */ - prepareSearch(query, optsUser) { - const weights = {}; - var options = Object.assign({}, optsUser); - propToArray(options, 'sort'); - propToArray(options, 'sort_empty'); // convert fields to new format - - if (options.fields) { - propToArray(options, 'fields'); - const fields = []; - options.fields.forEach(field => { - if (typeof field == 'string') { - field = { - field: field, - weight: 1 - }; - } - - fields.push(field); - weights[field.field] = 'weight' in field ? field.weight : 1; - }); - options.fields = fields; - } - - return { - options: options, - query: query.toLowerCase().trim(), - tokens: this.tokenize(query, options.respect_word_boundaries, weights), - total: 0, - items: [], - weights: weights, - getAttrFn: options.nesting ? getAttrNesting : getAttr - }; - } - - /** - * Searches through all items and returns a sorted array of matches. - * - */ - search(query, options) { - var self = this, - score, - search; - search = this.prepareSearch(query, options); - options = search.options; - query = search.query; // generate result scoring function - - const fn_score = options.score || self._getScoreFunction(search); // perform search and sort - - - if (query.length) { - iterate(self.items, (item, id) => { - score = fn_score(item); - - if (options.filter === false || score > 0) { - search.items.push({ - 'score': score, - 'id': id - }); - } - }); - } else { - iterate(self.items, (item, id) => { - search.items.push({ - 'score': 1, - 'id': id - }); - }); - } - - const fn_sort = self._getSortFunction(search); - - if (fn_sort) search.items.sort(fn_sort); // apply limits - - search.total = search.items.length; - - if (typeof options.limit === 'number') { - search.items = search.items.slice(0, options.limit); - } - - return search; - } - - } - - return Sifter; - -}))); -//# sourceMappingURL=sifter.js.map diff --git a/dist/umd/sifter.js.map b/dist/umd/sifter.js.map deleted file mode 100644 index 7b73bf1..0000000 --- a/dist/umd/sifter.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sifter.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\t\n\tif( chars.length == 1 ){\n\t\treturn chars[0];\n\t}\n\t\n\tvar longest = 1;\n\tchars.forEach((a)=>{longest = Math.max(longest,a.length)});\n\n\tif( longest == 1 ){\n\t\treturn '['+chars.join('')+']';\n\t}\n\n\treturn '(?:'+chars.join(glue)+')';\t\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\n\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\t\n\t\t\tvar patt = new RegExp( arrayToPattern(diacritics[latin]),'iu');\n\t\t\tif( diacritic.match(patt) ){\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\t\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","longest","forEach","a","Math","max","allSubstrings","input","result","substring","subresult","tmp","slice","charAt","push","unshift","generateDiacritics","diacritics","code_range","i","diacritic","String","fromCharCode","latin","patt","match","latin_chars","sort","b","substrings","pattern","map","sub_pat","l","hasOwnProperty","diacriticRegexPoints","regex","undefined","decomposed","split","part","no_accent","composed_part","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","Sifter","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort_empty","sort_flds","multipliers","get_field","id","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit"],"mappings":"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"} \ No newline at end of file diff --git a/dist/umd/sifter.min.js b/dist/umd/sifter.min.js deleted file mode 100644 index fc96a6b..0000000 --- a/dist/umd/sifter.min.js +++ /dev/null @@ -1,81 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).sifter=t()}(this,(function(){"use strict" -var e -const t="[̀-ͯ·ʾ]",r=new RegExp(t,"g") -var n -const i={"æ":"ae","ⱥ":"a","ø":"o"},o=new RegExp(Object.keys(i).join("|"),"g"),s=[[67,67],[160,160],[192,438],[452,652],[961,961],[1019,1019],[1083,1083],[1281,1289],[1984,1984],[5095,5095],[7429,7441],[7545,7549],[7680,7935],[8580,8580],[9398,9449],[11360,11391],[42792,42793],[42802,42851],[42873,42897],[42912,42922],[64256,64260],[65313,65338],[65345,65370]],c=e=>e.normalize("NFKD").replace(r,"").toLowerCase().replace(o,(function(e){return i[e]})),u=(e,t="|")=>{if(1==e.length)return e[0] -var r=1 -return e.forEach((e=>{r=Math.max(r,e.length)})),1==r?"["+e.join("")+"]":"(?:"+e.join(t)+")"},f=e=>{if(1===e.length)return[[e]] -var t=[] -return f(e.substring(1)).forEach((function(r){var n=r.slice(0) -n[0]=e.charAt(0)+n[0],t.push(n),(n=r.slice(0)).unshift(e.charAt(0)),t.push(n)})),t},a=t=>{void 0===n&&(n=(()=>{var t={} -s.forEach((e=>{for(let n=e[0];n<=e[1];n++){let e=String.fromCharCode(n),i=c(e) -if(i!=e.toLowerCase()){i in t||(t[i]=[i]) -var r=new RegExp(u(t[i]),"iu") -e.match(r)||t[i].push(e)}}})) -var r=Object.keys(t) -r=r.sort(((e,t)=>t.length-e.length)),e=new RegExp("("+u(r)+"[̀-ͯ·ʾ]*)","g") -var n={} -return r.sort(((e,t)=>e.length-t.length)).forEach((e=>{var r=f(e).map((e=>(e=e.map((e=>t.hasOwnProperty(e)?u(t[e]):e)),u(e,"")))) -n[e]=u(r)})),n})()) -return t.normalize("NFKD").toLowerCase().split(e).map((e=>{if(""==e)return"" -const t=c(e) -if(n.hasOwnProperty(t))return n[t] -const r=e.normalize("NFC") -return r!=e?u([e,r]):e})).join("")},l=(e,t)=>{if(e)return e[t]},h=(e,t)=>{if(e){for(var r,n=t.split(".");(r=n.shift())&&(e=e[r]););return e}},g=(e,t,r)=>{var n,i -return e?-1===(i=(e+="").search(t.regex))?0:(n=t.string.length/e.length,0===i&&(n+=.5),n*r):0},p=e=>(e+"").replace(/([\$\(-\+\.\?\[-\^\{-\}])/g,"\\$1"),d=(e,t)=>{var r=e[t] -r&&!Array.isArray(r)&&(e[t]=[r])},m=(e,t)=>{if(Array.isArray(e))e.forEach(t) -else for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)},v=(e,t)=>"number"==typeof e&&"number"==typeof t?e>t?1:e(t=c(t+"").toLowerCase())?1:t>e?-1:0 - -;/** - * sifter.js - * Copyright (c) 2013–2020 Brian Reavis & contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this - * file except in compliance with the License. You may obtain a copy of the License at: - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under - * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF - * ANY KIND, either express or implied. See the License for the specific language - * governing permissions and limitations under the License. - * - * @author Brian Reavis - */ -return class{constructor(e,t){this.items=void 0,this.settings=void 0,this.items=e,this.settings=t||{diacritics:!0}}tokenize(e,t,r){if(!e||!e.length)return[] -const n=[],i=e.split(/\s+/) -var o -return r&&(o=new RegExp("^("+Object.keys(r).map(p).join("|")+"):(.*)$")),i.forEach((e=>{let r,i=null,s=null -o&&(r=e.match(o))&&(i=r[1],e=r[2]),e.length>0&&(s=p(e),this.settings.diacritics&&(s=a(s)),t&&(s="\\b"+s)),n.push({string:e,regex:s?new RegExp(s,"iu"):null,field:i})})),n}getScoreFunction(e,t){var r=this.prepareSearch(e,t) -return this._getScoreFunction(r)}_getScoreFunction(e){const t=e.tokens,r=t.length -if(!r)return function(){return 0} -const n=e.options.fields,i=e.weights,o=n.length,s=e.getAttrFn -if(!o)return function(){return 1} -const c=1===o?function(e,t){const r=n[0].field -return g(s(t,r),e,i[r])}:function(e,t){var r=0 -if(e.field){const n=s(t,e.field) -!e.regex&&n?r+=1/o:r+=g(n,e,1)}else m(i,((n,i)=>{r+=g(s(t,i),e,n)})) -return r/o} -return 1===r?function(e){return c(t[0],e)}:"and"===e.options.conjunction?function(e){for(var n,i=0,o=0;i{n+=c(t,e)})),n/r}}getSortFunction(e,t){var r=this.prepareSearch(e,t) -return this._getSortFunction(r)}_getSortFunction(e){var t,r,n -const i=this,o=e.options,s=!e.query&&o.sort_empty?o.sort_empty:o.sort,c=[],u=[],f=function(t,r){return"$score"===t?r.score:e.getAttrFn(i.items[r.id],t)} -if(s)for(t=0,r=s.length;t{"string"==typeof t&&(t={field:t,weight:1}),e.push(t),r[t.field]="weight"in t?t.weight:1})),n.fields=e}return{options:n,query:e.toLowerCase().trim(),tokens:this.tokenize(e,n.respect_word_boundaries,r),total:0,items:[],weights:r,getAttrFn:n.nesting?h:l}}search(e,t){var r,n,i=this -n=this.prepareSearch(e,t),t=n.options,e=n.query -const o=t.score||i._getScoreFunction(n) -e.length?m(i.items,((e,i)=>{r=o(e),(!1===t.filter||r>0)&&n.items.push({score:r,id:i})})):m(i.items,((e,t)=>{n.items.push({score:1,id:t})})) -const s=i._getSortFunction(n) -return s&&n.items.sort(s),n.total=n.items.length,"number"==typeof t.limit&&(n.items=n.items.slice(0,t.limit)),n}}})) -//# sourceMappingURL=sifter.min.js.map diff --git a/dist/umd/sifter.min.js.map b/dist/umd/sifter.min.js.map deleted file mode 100644 index f2cabec..0000000 --- a/dist/umd/sifter.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sifter.min.js","sources":["../../lib/diacritics.ts","../../lib/utils.ts","../../lib/sifter.ts"],"sourcesContent":["\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\t\n\tif( chars.length == 1 ){\n\t\treturn chars[0];\n\t}\n\t\n\tvar longest = 1;\n\tchars.forEach((a)=>{longest = Math.max(longest,a.length)});\n\n\tif( longest == 1 ){\n\t\treturn '['+chars.join('')+']';\n\t}\n\n\treturn '(?:'+chars.join(glue)+')';\t\n};\n\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\n\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\t\n\t\t\tvar patt = new RegExp( arrayToPattern(diacritics[latin]),'iu');\n\t\t\tif( diacritic.match(patt) ){\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\t\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis \n */\n\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:T.Options):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n"],"names":["latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","length","longest","forEach","a","Math","max","allSubstrings","input","result","substring","subresult","tmp","slice","charAt","push","unshift","diacriticRegexPoints","regex","undefined","diacritics","code_range","i","diacritic","String","fromCharCode","latin","patt","match","latin_chars","sort","b","pattern","map","sub_pat","l","hasOwnProperty","generateDiacritics","split","part","no_accent","composed_part","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","callback","cmp","constructor","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","this","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","n","implicit_score","self","sort_empty","sort_flds","multipliers","get_field","id","direction","splice","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","fn_sort","limit"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 28ecafc..1092de7 100644 --- a/package.json +++ b/package.json @@ -59,5 +59,10 @@ "testMatch": [ "**/test/**/*.js" ] - } + }, + "files": [ + "/dist", + "/lib" + ], + } From 13ea2d932e2564c7c3b34eaeb694904074861fb1 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 7 Sep 2021 16:14:53 -0600 Subject: [PATCH 086/140] build directly to dist folder --- .config/rollup.config.js | 8 ++++---- benchmark/index.js | 2 +- package.json | 3 +-- release.sh | 13 ------------- test/diacritics.js | 6 +++--- test/getScoreFunction.js | 2 +- test/prepareSearch.js | 2 +- test/search.js | 2 +- test/sorting.js | 2 +- test/tokenize.js | 2 +- test/utils.js | 2 +- 11 files changed, 15 insertions(+), 29 deletions(-) diff --git a/.config/rollup.config.js b/.config/rollup.config.js index e35658d..d1f5d27 100644 --- a/.config/rollup.config.js +++ b/.config/rollup.config.js @@ -37,7 +37,7 @@ var terser_config = terser({ configs.push({ input: path.resolve(__dirname,'../lib/sifter.ts'), output:{ - dir: path.resolve(__dirname,'../build/esm'), + dir: path.resolve(__dirname,'../dist/esm'), format: 'esm', preserveModules: true, sourcemap: true, @@ -50,7 +50,7 @@ configs.push({ configs.push({ input: path.resolve(__dirname,'../lib/sifter.ts'), output:{ - dir: path.resolve(__dirname,'../build/cjs'), + dir: path.resolve(__dirname,'../dist/cjs'), format: 'cjs', preserveModules: true, sourcemap: true, @@ -65,7 +65,7 @@ configs.push({ input: path.resolve(__dirname,'../lib/sifter.ts'), output: { name: 'sifter', - file: `build/umd/sifter.js`, + file: `dist/umd/sifter.js`, format: 'umd', sourcemap: true, banner: banner @@ -80,7 +80,7 @@ configs.push({ input: path.resolve(__dirname,'../lib/sifter.ts'), output: { name: 'sifter', - file: `build/umd/sifter.min.js`, + file: `dist/umd/sifter.min.js`, format: 'umd', sourcemap: true, banner: banner diff --git a/benchmark/index.js b/benchmark/index.js index 56629d4..f322370 100644 --- a/benchmark/index.js +++ b/benchmark/index.js @@ -18,7 +18,7 @@ process.chdir(__dirname); var fs = require('fs'); var humanize = require('humanize'); -var Sifter = require('../build/umd/sifter.js'); +var Sifter = require('../dist/umd/sifter.js'); var microtime; try { diff --git a/package.json b/package.json index 1092de7..2e0ed10 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,5 @@ "files": [ "/dist", "/lib" - ], - + ] } diff --git a/release.sh b/release.sh index deac877..cf67ab3 100755 --- a/release.sh +++ b/release.sh @@ -82,19 +82,6 @@ if ! npm run build; then exit fi -# remove contents of dist folder -if ! rm -r dist/*; then - echo '/dist not emptied... cannot create release' - exit -fi - - -# copy /build to /dist -if ! cp -r build/* dist; then - echo '/build not copied to /dist... cannot create release' - exit -fi - # make sure types are up-to-date if ! npm run build:types; then diff --git a/test/diacritics.js b/test/diacritics.js index f4d0d94..b705d32 100644 --- a/test/diacritics.js +++ b/test/diacritics.js @@ -1,7 +1,7 @@ var assert = require('assert'); -var diacritics = require('../build/cjs/diacritics.js'); -var utils = require('../build/cjs/utils.js'); -var Sifter = require('../build/cjs/sifter.js'); +var diacritics = require('../dist/cjs/diacritics.js'); +var utils = require('../dist/cjs/utils.js'); +var Sifter = require('../dist/cjs/sifter.js'); describe('diacritics', () => { diff --git a/test/getScoreFunction.js b/test/getScoreFunction.js index b8a179d..dc788d7 100644 --- a/test/getScoreFunction.js +++ b/test/getScoreFunction.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../build/cjs/sifter.js'); +var Sifter = require('../dist/cjs/sifter.js'); describe('#getScoreFunction()', function() { diff --git a/test/prepareSearch.js b/test/prepareSearch.js index ce8107b..9f5fcaa 100644 --- a/test/prepareSearch.js +++ b/test/prepareSearch.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../build/cjs/sifter.js'); +var Sifter = require('../dist/cjs/sifter.js'); describe('#prepareSearch()', function() { diff --git a/test/search.js b/test/search.js index c79cc5a..d120553 100644 --- a/test/search.js +++ b/test/search.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../build/cjs/sifter.js'); +var Sifter = require('../dist/cjs/sifter.js'); describe('#search()', function() { diff --git a/test/sorting.js b/test/sorting.js index c5bcb3c..1cff669 100644 --- a/test/sorting.js +++ b/test/sorting.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../build/cjs/sifter.js'); +var Sifter = require('../dist/cjs/sifter.js'); describe('sorting', function() { diff --git a/test/tokenize.js b/test/tokenize.js index 1eff87b..f85a983 100644 --- a/test/tokenize.js +++ b/test/tokenize.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../build/cjs/sifter.js'); +var Sifter = require('../dist/cjs/sifter.js'); describe('#tokenize()', function() { var sifter, tokens; diff --git a/test/utils.js b/test/utils.js index ad73319..620e312 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var utils = require('../build/cjs/utils.js'); +var utils = require('../dist/cjs/utils.js'); describe('#prepareSearch()', function() { From e5edbcef72865543f4e958bff430409628b01488 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 7 Sep 2021 16:28:52 -0600 Subject: [PATCH 087/140] add sort callback option to readme --- README.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5bd3912..6857920 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ Performs a search for `query` with the provided `options`. fields array An array of property names and optional weights to be searched. + ```js fields: [{field:"title",weight:2},{field:"location",weight:1}, {field:"continent",weight:0.5}], ``` @@ -100,8 +101,24 @@ fields: [{field:"title",weight:2},{field:"location",weight:1}, {field:"continent sort - array - An array of fields to sort by. Each item should be an object containing at least a "field" property. Optionally, direction can be set to "asc" or "desc". The order of the array defines the sort precedence.

Unless present, a special "$score" property will be automatically added to the beginning of the sort list. This will make results sorted primarily by match quality (descending). + array|function + + An array of fields to sort by. + Each item should be an object containing at least a "field" property. Optionally, direction can be set to "asc" or "desc". + The order of the array defines the sort precedence. +

+ Unless present, a special "$score" property will be automatically added to the beginning of the sort list. + This will make results sorted primarily by match quality (descending). +

+ Alternatively, you can define a callback function to handle sorting. For example: +```js +sort: function(a,b){ + var item_a = this.items[a.id]; + var item_b = this.items[b.id]; + return item_a.fielda.localeCompare(item_b.fielda); +}, +``` + sort_empty From e519ffcfee30a6d5d130eb13358694330136715c Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 7 Sep 2021 16:35:43 -0600 Subject: [PATCH 088/140] readme formatting --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6857920..d958bda 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,11 @@ Performs a search for `query` with the provided `options`. An array of property names and optional weights to be searched. ```js -fields: [{field:"title",weight:2},{field:"location",weight:1}, {field:"continent",weight:0.5}], +fields: [ + {field:"title",weight:2}, + {field:"location",weight:1}, + {field:"continent",weight:0.5} +], ``` @@ -111,6 +115,7 @@ fields: [{field:"title",weight:2},{field:"location",weight:1}, {field:"continent This will make results sorted primarily by match quality (descending).

Alternatively, you can define a callback function to handle sorting. For example: + ```js sort: function(a,b){ var item_a = this.items[a.id]; From 1a7a59fe86634628989361b0295ee81eade4a9fb Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 7 Sep 2021 16:41:31 -0600 Subject: [PATCH 089/140] v0.9.0 Release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2e0ed10..1c39b71 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.8.2", + "version": "0.9.0", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 21c7d934d5a37642e1cd5b70ceaa99f8596766e5 Mon Sep 17 00:00:00 2001 From: Adriaan Marain Date: Thu, 4 Nov 2021 10:42:25 +0100 Subject: [PATCH 090/140] Fix ts error `item` isn't used here so TypeScript throws an `unused variable` error. For some reason, this error bubbles up when using `tsc` in my project, even with `skipLibCheck` enabled and adding `node_modules` to the `exclude` array in my tsconfig. --- lib/sifter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 821e225..bb2f526 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -344,7 +344,7 @@ export default class Sifter{ } }); } else { - iterate(self.items, (item:T.ResultItem, id:string|number) => { + iterate(self.items, (_:T.ResultItem, id:string|number) => { search.items.push({'score': 1, 'id': id}); }); } From c845e74741aeafe1654f4e724f39c745cc6c9220 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Mon, 28 Feb 2022 22:34:38 -0700 Subject: [PATCH 091/140] noUnusedParameters: true --- .config/tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.config/tsconfig.json b/.config/tsconfig.json index 7ffa1d3..197de2a 100644 --- a/.config/tsconfig.json +++ b/.config/tsconfig.json @@ -7,6 +7,7 @@ "target": "esnext", "module": "esnext", "noUnusedLocals": true, + "noUnusedParameters": true, "declaration": true, "declarationDir": "../dist/types", From b87bf3808ce61b77b1420fd58f69bee52d825cc0 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Mon, 28 Feb 2022 22:43:48 -0700 Subject: [PATCH 092/140] v0.7.6 Release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1c39b71..aae6283 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.9.0", + "version": "0.7.6", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 4df31281634346a727008775027a58ece99ec88d Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Mon, 28 Feb 2022 22:45:58 -0700 Subject: [PATCH 093/140] v0.9.1 Release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aae6283..c870cbe 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.7.6", + "version": "0.9.1", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 6291f8019367a533a9b3be266ee0d520a366e601 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 1 Mar 2022 10:08:19 -0700 Subject: [PATCH 094/140] add npm badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d958bda..3edc3c1 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # sifter.js [![Build Status](https://travis-ci.org/orchidjs/sifter.js.svg)](https://travis-ci.org/orchidjs/sifter.js) [![Coverage Status](http://img.shields.io/coveralls/orchidjs/sifter.js/master.svg?style=flat)](https://coveralls.io/r/orchidjs/sifter.js) - +npm (scoped) Sifter is a fast and small (<6kb) client and server-side library (coded in TypeScript and available in [CJS, UMD, and ESM](https://irian.to/blogs/what-are-cjs-amd-umd-and-esm-in-javascript/)) for textually searching arrays and hashes of objects by property – or multiple properties. It's designed specifically for autocomplete. The process is three-step: *score*, *filter*, *sort*. From 5a8b5259f769cc0e5f02fbfe634c28e950e5091f Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 29 Jun 2022 22:52:29 -0600 Subject: [PATCH 095/140] add node versions 16 & 18, remove 10 --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 68e0bcb..7e14f15 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,10 @@ sudo: false language: node_js node_js: - - "10" - "12" - "14" + - "16" + - "18" script: - npm test - npm run coveralls From d01d394de29e83591342d426a1510fbc3ea9a674 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 29 Jun 2022 22:58:43 -0600 Subject: [PATCH 096/140] update travis urls --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3edc3c1..c8bf092 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # sifter.js -[![Build Status](https://travis-ci.org/orchidjs/sifter.js.svg)](https://travis-ci.org/orchidjs/sifter.js) +[![Build Status](https://img.shields.io/travis/com/orchidjs/sifter.js)](https://travis-ci.com/github/orchidjs/sifter.js) [![Coverage Status](http://img.shields.io/coveralls/orchidjs/sifter.js/master.svg?style=flat)](https://coveralls.io/r/orchidjs/sifter.js) npm (scoped) @@ -88,7 +88,7 @@ Performs a search for `query` with the provided `options`. fields array An array of property names and optional weights to be searched. - + ```js fields: [ {field:"title",weight:2}, @@ -107,11 +107,11 @@ fields: [ sort array|function - An array of fields to sort by. - Each item should be an object containing at least a "field" property. Optionally, direction can be set to "asc" or "desc". + An array of fields to sort by. + Each item should be an object containing at least a "field" property. Optionally, direction can be set to "asc" or "desc". The order of the array defines the sort precedence.

- Unless present, a special "$score" property will be automatically added to the beginning of the sort list. + Unless present, a special "$score" property will be automatically added to the beginning of the sort list. This will make results sorted primarily by match quality (descending).

Alternatively, you can define a callback function to handle sorting. For example: From 4fd04da18261c13fd455233c9574e4cdb88c333a Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 29 Jun 2022 23:06:11 -0600 Subject: [PATCH 097/140] target dist: focal for node 18 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 7e14f15..2f51727 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ sudo: false +dist: focal language: node_js node_js: - "12" From 84b3d1a663413bffb1f6bd72647a0698a8a17e1a Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 30 Jun 2022 07:54:41 -0600 Subject: [PATCH 098/140] only run tests once in travis --- .travis.yml | 3 +-- package.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2f51727..ed6b70d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,5 +7,4 @@ node_js: - "16" - "18" script: - - npm test - - npm run coveralls + - npm run test:coveralls diff --git a/package.json b/package.json index c870cbe..2787540 100644 --- a/package.json +++ b/package.json @@ -25,11 +25,11 @@ "scripts": { "test": "jest --coverage", "test:typescript": "tsc -p .config --noemit", + "test:coveralls": "jest --coverage && cat ./coverage/lcov.info | coveralls" "pretest": "npm run build", "benchmark": "node --expose-gc benchmark/index.js", "build": "npx rollup -c .config/rollup.config.js", "build:types": "tsc -p .config --emitDeclarationOnly", - "coveralls": "jest --coverage && cat ./coverage/lcov.info | coveralls" }, "devDependencies": { "@babel/core": "^7.13.16", From 3501f2d6c073cb969da4d8b4c4331817562ec1ec Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 30 Jun 2022 08:43:48 -0600 Subject: [PATCH 099/140] fix package.json --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2787540..d8d88b0 100644 --- a/package.json +++ b/package.json @@ -25,11 +25,11 @@ "scripts": { "test": "jest --coverage", "test:typescript": "tsc -p .config --noemit", - "test:coveralls": "jest --coverage && cat ./coverage/lcov.info | coveralls" + "test:coveralls": "jest --coverage && cat ./coverage/lcov.info | coveralls", "pretest": "npm run build", "benchmark": "node --expose-gc benchmark/index.js", "build": "npx rollup -c .config/rollup.config.js", - "build:types": "tsc -p .config --emitDeclarationOnly", + "build:types": "tsc -p .config --emitDeclarationOnly" }, "devDependencies": { "@babel/core": "^7.13.16", From ce973c0aac00dd1efe70eb090092cbfedbea835b Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 30 Jun 2022 08:47:40 -0600 Subject: [PATCH 100/140] need to build first --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d8d88b0..73ad2fd 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "scripts": { "test": "jest --coverage", "test:typescript": "tsc -p .config --noemit", - "test:coveralls": "jest --coverage && cat ./coverage/lcov.info | coveralls", + "test:coveralls": "npm run build && jest --coverage && cat ./coverage/lcov.info | coveralls", "pretest": "npm run build", "benchmark": "node --expose-gc benchmark/index.js", "build": "npx rollup -c .config/rollup.config.js", From ec78f146f060c61df7222a2ec6e23ac6cc1e17ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Jun 2022 15:31:32 +0000 Subject: [PATCH 101/140] Bump jest from 27.5.1 to 28.1.2 Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 27.5.1 to 28.1.2. - [Release notes](https://github.com/facebook/jest/releases) - [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/facebook/jest/commits/v28.1.2/packages/jest) --- updated-dependencies: - dependency-name: jest dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 73ad2fd..50e0fef 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@rollup/plugin-babel": "^5.3.0", "coveralls": "^3.1.0", "humanize": "0.0.9", - "jest": "^27.0.5", + "jest": "^28.1.2", "rollup": "^2.45.2", "rollup-plugin-terser": "^7.0.2", "typescript": "^4.2.4" From b5696c39555f57778a91e6e950299c9974761b6e Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 5 Jul 2022 11:10:34 -0600 Subject: [PATCH 102/140] now() instead of microtime.now() --- benchmark/index.js | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/benchmark/index.js b/benchmark/index.js index f322370..c31056c 100644 --- a/benchmark/index.js +++ b/benchmark/index.js @@ -21,22 +21,15 @@ var humanize = require('humanize'); var Sifter = require('../dist/umd/sifter.js'); var microtime; -try { - microtime = require('microtime'); -} catch(error) { - microtime = { - now: function now() { - return +new Date(); - } - }; -} +const now = () => Date.now(); + var measure_time = function(fn) { var start, end; global.gc(); - start = microtime.now(); + start = now(); fn(); - end = microtime.now(); + end = now(); global.gc(); return end - start; }; From 47259f56f3dbace221c73762c44f672d48092dfb Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 5 Jul 2022 11:11:39 -0600 Subject: [PATCH 103/140] build before running benchmark --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 73ad2fd..f7243ff 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "test:typescript": "tsc -p .config --noemit", "test:coveralls": "npm run build && jest --coverage && cat ./coverage/lcov.info | coveralls", "pretest": "npm run build", - "benchmark": "node --expose-gc benchmark/index.js", + "benchmark": "npm run build && node --expose-gc benchmark/index.js", "build": "npx rollup -c .config/rollup.config.js", "build:types": "tsc -p .config --emitDeclarationOnly" }, @@ -63,5 +63,6 @@ "files": [ "/dist", "/lib" - ] + ], + "dependencies": {} } From 23596bc8019b5c5fa50d75bf25437d3ecab3b42c Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 5 Jul 2022 11:11:58 -0600 Subject: [PATCH 104/140] whitespace --- lib/utils.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/utils.ts b/lib/utils.ts index 9fb0850..9a09cd6 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -54,7 +54,7 @@ export const scoreValue = (value:string, token:T.Token, weight:number ):number = * * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error */ -export const escape_regex = (str:string):string => { +export const escape_regex = (str:string):string => { return (str + '').replace(/([\$\(\)\*\+\.\?\[\]\^\{\|\}\\])/gu, '\\$1'); }; @@ -65,9 +65,9 @@ export const escape_regex = (str:string):string => { */ export const propToArray = (obj:{[key:string]:any}, key:string) => { var value = obj[key]; - + if( typeof value == 'function' ) return value; - + if( value && !Array.isArray(value) ){ obj[key] = [value]; } From 79aac6a024b1836c666c8921c67816365b6809de Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 5 Jul 2022 18:01:22 -0600 Subject: [PATCH 105/140] escape() or diacriticRegexPoints() --- lib/sifter.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index bb2f526..cd35439 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -65,9 +65,10 @@ export default class Sifter{ } if( word.length > 0 ){ - regex = escape_regex(word); if( this.settings.diacritics ){ - regex = diacriticRegexPoints(regex); + regex = diacriticRegexPoints(word); + }else{ + regex = escape_regex(word); } if( respect_word_boundaries ) regex = "\\b"+regex; } @@ -206,7 +207,7 @@ export default class Sifter{ if( typeof sort == 'function' ){ return sort.bind(this); - } + } /** * Fetches the specified sort field value From b26c5eeed74b9326c85723a1e74daa369310fad3 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 5 Jul 2022 18:01:34 -0600 Subject: [PATCH 106/140] test all codepoints --- test/diacritics.js | 72 +++++++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/test/diacritics.js b/test/diacritics.js index b705d32..c2d32fc 100644 --- a/test/diacritics.js +++ b/test/diacritics.js @@ -6,59 +6,71 @@ var Sifter = require('../dist/cjs/sifter.js'); describe('diacritics', () => { it('Should match composed and decomposed strings', () => { - + const sifter = new Sifter([]); const composed = 'أهلا'; // '\u{623}\u{647}\u{644}\u{627}' const decomposed = 'أهلا'; // '\u{627}\u{654}\u{647}\u{644}\u{627}' - + assert.notEqual(composed,decomposed); tokens = sifter.tokenize(composed); assert.equal(tokens[0].regex.test(composed), true); - + tokens = sifter.tokenize(decomposed); assert.equal(tokens[0].regex.test(decomposed), true); - + tokens = sifter.tokenize(composed); assert.equal(tokens[0].regex.test(decomposed), true); tokens = sifter.tokenize(decomposed); assert.equal(tokens[0].regex.test(composed), true); - + }); - + it('Should match all diacritic code points',()=>{ const sifter = new Sifter([]); - - diacritics.code_points.forEach((code_range)=>{ - for(let i = code_range[0]; i <= code_range[1]; i++){ - - let composed = String.fromCharCode(i); - let decomposed = composed.normalize('NFKD'); - - if( composed.trim().length == 0 ){ - continue; - } - - tokens = sifter.tokenize(composed); - assert.equal(tokens[0].regex.test(composed), true, 'composed should match composed for ' + composed + ' regex: '+tokens[0].regex); - - tokens = sifter.tokenize(decomposed); + + + for(let i = 0; i <= 65535; i++){ + + let composed = String.fromCharCode(i); + let decomposed = composed.normalize('NFKD'); + + + if( decomposed.length > 3 ){ + continue; + } + + if( composed.trim().length == 0 ){ + continue; + } + + tokens = sifter.tokenize(composed); + if( tokens.length && tokens[0].regex ){ + assert.equal(tokens[0].regex.test(composed), true, 'composed should match composed for ' + composed + ' regex: '+tokens[0].regex + ' code point: '+i); + } + + tokens = sifter.tokenize(decomposed); + if( tokens.length && tokens[0].regex ){ assert.equal(tokens[0].regex.test(decomposed), true, 'decomposed should match composed for ' + decomposed + ' and ' + composed + ' regex: '+tokens[0].regex); - - tokens = sifter.tokenize(composed); + } + + tokens = sifter.tokenize(composed); + if( tokens.length && tokens[0].regex ){ assert.equal(tokens[0].regex.test(decomposed), true, 'composed should match decomposed for ' + composed + ' and ' + decomposed + ' regex: '+tokens[0].regex); + } + + tokens = sifter.tokenize(decomposed); + if( tokens.length && tokens[0].regex ){ + assert.equal(tokens[0].regex.test(composed), true, 'decomposed should match composed for ' + decomposed + ' and ' + composed + ' regex: '+tokens[0].regex+ ' code point: '+i); + } - tokens = sifter.tokenize(decomposed); - assert.equal(tokens[0].regex.test(composed), true, 'decomposed should match composed for ' + decomposed + ' and ' + composed + ' regex: '+tokens[0].regex); - - }; - }); + }; }); - - + + }); From b6c44a00d85dae4df16121aeaf4dfa1204f0f8b8 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 5 Jul 2022 19:11:03 -0600 Subject: [PATCH 107/140] generateDiacritics from all code points --- lib/diacritics.ts | 273 +++++++++++----------------------------------- 1 file changed, 63 insertions(+), 210 deletions(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index 71729d8..e5af882 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -1,11 +1,13 @@ +import { escape_regex } from './utils.ts'; + type TDiacraticList = {[key:string]:string}; // https://github.com/andrewrk/node-diacritics/blob/master/index.js var latin_pat:RegExp; const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}]'; // \u{2bc} -const accent_reg = new RegExp(accent_pat,'g'); +const accent_reg = new RegExp(accent_pat,'gu'); var diacritic_patterns:TDiacraticList; const latin_convert:TDiacraticList = { @@ -14,139 +16,9 @@ const latin_convert:TDiacraticList = { 'ø': 'o', }; -const convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g'); - - -export const DIACRITICS:TDiacraticList = { - " ":" ", - 0:"߀", - A:"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ", - AA:"Ꜳ", - AE:"ÆǼǢ", - AO:"Ꜵ", - AU:"Ꜷ", - AV:"ꜸꜺ", - AY:"Ꜽ", - B:"ⒷBḂḄḆɃƁ", - C:"ⒸCꜾḈĆCĈĊČÇƇȻ", - D:"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ", - Dh:"Ð", - DZ:"DZDŽ", - Dz:"DzDž", - E:"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ", - F:"ꝼⒻFḞƑꝻ", - G:"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ", - H:"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ", - I:"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ", - J:"ⒿJĴɈȷ", - K:"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ", - L:"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ", - LJ:"LJ", - Lj:"Lj", - M:"ⓂMḾṀṂⱮƜϻ", - N:"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ", - NJ:"NJ", - Nj:"Nj", - O:"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ", - OE:"Œ", - OI:"Ƣ", - OO:"Ꝏ", - OU:"Ȣ", - P:"ⓅPṔṖƤⱣꝐꝒꝔ", - Q:"ⓆQꝖꝘɊ", - R:"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ", - S:"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ", - T:"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ", - Th:"Þ", - TZ:"Ꜩ", - U:"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ", - V:"ⓋVṼṾƲꝞɅ", - VY:"Ꝡ", - W:"ⓌWẀẂŴẆẄẈⱲ", - X:"ⓍXẊẌ", - Y:"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ", - Z:"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ", - a:"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ", - aa:"ꜳ", - ae:"æǽǣ", - ao:"ꜵ", - au:"ꜷ", - av:"ꜹꜻ", - ay:"ꜽ", - b:"ⓑbḃḅḇƀƃɓƂ", - c:"cⓒćĉċčçḉƈȼꜿↄ", - d:"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ", - dh:"ð", - dz:"dzdž", - e:"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ", - f:"ⓕfḟƒ", - ff:"ff", - fi:"fi", - fl:"fl", - ffi:"ffi", - ffl:"ffl", - g:"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ", - h:"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ", - hv:"ƕ", - i:"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı", - j:"ⓙjĵǰɉ", - k:"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ", - l:"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ", - lj:"lj", - m:"ⓜmḿṁṃɱɯ", - n:"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ", - nj:"nj", - o:"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ", - oe:"œ", - oi:"ƣ", - oo:"ꝏ", - ou:"ȣ", - p:"ⓟpṕṗƥᵽꝑꝓꝕρ", - q:"ⓠqɋꝗꝙ", - r:"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ", - s:"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ", - ss:"ß", - t:"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ", - th:"þ", - tz:"ꜩ", - u:"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ", - v:"ⓥvṽṿʋꝟʌ", - vy:"ꝡ", - w:"ⓦwẁẃŵẇẅẘẉⱳ", - x:"ⓧxẋẍ", - y:"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ", - z:"ⓩzźẑżžẓẕƶȥɀⱬꝣ" -} +const convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'gu'); -/** - * code points generated from toCodePoints(); - * removed 65339 to 65345 - */ -export const code_points = [ - [ 67, 67 ], - [ 160, 160 ], - [ 192, 438 ], - [ 452, 652 ], - [ 961, 961 ], - [ 1019, 1019 ], - [ 1083, 1083 ], - [ 1281, 1289 ], - [ 1984, 1984 ], - [ 5095, 5095 ], - [ 7429, 7441 ], - [ 7545, 7549 ], - [ 7680, 7935 ], - [ 8580, 8580 ], - [ 9398, 9449 ], - [ 11360, 11391 ], - [ 42792, 42793 ], - [ 42802, 42851 ], - [ 42873, 42897 ], - [ 42912, 42922 ], - [ 64256, 64260 ], - [ 65313, 65338 ], - [ 65345, 65370 ] -]; +const code_points = [[ 0, 65535 ]]; /** * Remove accents @@ -163,47 +35,6 @@ export const asciifold = (str:string):string => { }); }; - -/** - * Convert list of diacritics to array of code points - * - */ -// @ts-ignore -function toCodePoints(tolerance=8){ - var char_codes:number[] = []; - - for( let letter in DIACRITICS ){ - let _diacritics = DIACRITICS[letter]; - for( let n = 0; n < _diacritics.length; n++ ){ - var code_point = _diacritics.codePointAt(n); - if( code_point ) char_codes.push( code_point ); - } - } - - //https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range - char_codes.sort((a, b) => a - b); - var accumulator: number[][] = []; - char_codes.reduce(function (accumulator, currentValue, index, source) { - - if( !index ){ - accumulator.push( [currentValue,currentValue] ); - - }else if( currentValue - source[index - 1] > tolerance ){ - accumulator.push( [currentValue,currentValue] ); - - }else{ - - let range = accumulator.pop(); - if( range ){ - accumulator.push( [range[0],currentValue]); - } - } - - return accumulator; - }, accumulator); - -} - /** * Convert array of strings to a regular expression * ex ['ab','a'] => (?:ab|a) @@ -211,11 +42,11 @@ function toCodePoints(tolerance=8){ * */ export const arrayToPattern = (chars:string[],glue:string='|'):string =>{ - + if( chars.length == 1 ){ return chars[0]; } - + var longest = 1; chars.forEach((a)=>{longest = Math.max(longest,a.length)}); @@ -223,7 +54,12 @@ export const arrayToPattern = (chars:string[],glue:string='|'):string =>{ return '['+chars.join('')+']'; } - return '(?:'+chars.join(glue)+')'; + return '(?:'+chars.join(glue)+')'; +}; + +export const escapeToPattern = (chars:string[]):string =>{ + const escaped = chars.map((diacritic) => escape_regex(diacritic)); + return arrayToPattern(escaped); }; /** @@ -245,7 +81,7 @@ export const allSubstrings = (input:string):string[][] => { tmp.unshift(input.charAt(0)); result.push(tmp); }); - + return result; } @@ -253,13 +89,13 @@ export const allSubstrings = (input:string):string[][] => { * Generate a list of diacritics from the list of code points * */ -export const generateDiacritics = ():TDiacraticList => { +export const generateDiacritics = (code_points):TDiacraticList => { var diacritics:{[key:string]:string[]} = {}; code_points.forEach((code_range)=>{ for(let i = code_range[0]; i <= code_range[1]; i++){ - + let diacritic = String.fromCharCode(i); let latin = asciifold(diacritic); @@ -267,50 +103,67 @@ export const generateDiacritics = ():TDiacraticList => { continue; } + // skip when latin is a string longer than 3 characters long + // bc the resulting regex patterns will be long + // eg: + // latin صلى الله عليه وسلم length 18 code point 65018 + // latin جل جلاله length 8 code point 65019 + if( latin.length > 3 ){ + continue; + } + if( !(latin in diacritics) ){ diacritics[latin] = [latin]; } - - var patt = new RegExp( arrayToPattern(diacritics[latin]),'iu'); + + var patt = new RegExp( escapeToPattern(diacritics[latin]),'iu'); if( diacritic.match(patt) ){ continue; } - + diacritics[latin].push(diacritic); } }); - - var latin_chars = Object.keys(diacritics); - - + + // filter out if there's only one character in the list + let latin_chars = Object.keys(diacritics); + for( let i = 0; i < latin_chars.length; i++){ + const latin = latin_chars[i]; + if( diacritics[latin].length < 2 ){ + delete diacritics[latin]; + } + } + + // latin character pattern // match longer substrings first - latin_chars = latin_chars.sort((a, b) => b.length - a.length ); - latin_pat = new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g'); - - + latin_chars = Object.keys(diacritics).sort((a, b) => b.length - a.length ); + latin_pat = new RegExp('('+ escapeToPattern(latin_chars) + accent_pat + '*)','gu'); + + // build diacritic patterns - // ae needs: + // ae needs: // (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...)) var diacritic_patterns:TDiacraticList = {}; latin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{ - + var substrings = allSubstrings(latin); var pattern = substrings.map((sub_pat)=>{ - + sub_pat = sub_pat.map((l)=>{ if( diacritics.hasOwnProperty(l) ){ - return arrayToPattern(diacritics[l]); + return escapeToPattern(diacritics[l]); } return l; }); - + return arrayToPattern(sub_pat,''); }); - - diacritic_patterns[latin] = arrayToPattern(pattern); + + diacritic_patterns[latin] = arrayToPattern(pattern); }); - + + return diacritic_patterns; } @@ -322,30 +175,30 @@ export const generateDiacritics = ():TDiacraticList => { export const diacriticRegexPoints = (regex:string):string => { if( diacritic_patterns === undefined ){ - diacritic_patterns = generateDiacritics(); + diacritic_patterns = generateDiacritics(code_points); } - + const decomposed = regex.normalize('NFKD').toLowerCase(); - + return decomposed.split(latin_pat).map((part:string)=>{ - - if( part == '' ){ + + // "ffl" or "ffl" + const no_accent = asciifold(part); + if( no_accent == '' ){ return ''; } - - // "ffl" or "ffl" - const no_accent = asciifold(part); + if( diacritic_patterns.hasOwnProperty(no_accent) ){ return diacritic_patterns[no_accent]; } - + // 'أهلا' (\u{623}\u{647}\u{644}\u{627}) or 'أهلا' (\u{627}\u{654}\u{647}\u{644}\u{627}) const composed_part = part.normalize('NFC'); if( composed_part != part ){ return arrayToPattern([part,composed_part]); } - + return part; }).join(''); - + } From ecf2782e36d4f4dd3ad96b458d80fd0bc75e333e Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 5 Jul 2022 19:18:59 -0600 Subject: [PATCH 108/140] types --- lib/diacritics.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index e5af882..8b7be50 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -1,4 +1,5 @@ +// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" import { escape_regex } from './utils.ts'; type TDiacraticList = {[key:string]:string}; @@ -18,7 +19,7 @@ const latin_convert:TDiacraticList = { const convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'gu'); -const code_points = [[ 0, 65535 ]]; +const code_points:[[number,number]] = [[ 0, 65535 ]]; /** * Remove accents @@ -89,7 +90,7 @@ export const allSubstrings = (input:string):string[][] => { * Generate a list of diacritics from the list of code points * */ -export const generateDiacritics = (code_points):TDiacraticList => { +export const generateDiacritics = (code_points:[[number,number]]):TDiacraticList => { var diacritics:{[key:string]:string[]} = {}; code_points.forEach((code_range)=>{ From b1f11f6b264084c54cb69376d8e3e91ef51c4743 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 5 Jul 2022 19:23:59 -0600 Subject: [PATCH 109/140] remove unused code --- lib/diacritics.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index 8b7be50..b7f7683 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -193,12 +193,6 @@ export const diacriticRegexPoints = (regex:string):string => { return diacritic_patterns[no_accent]; } - // 'أهلا' (\u{623}\u{647}\u{644}\u{627}) or 'أهلا' (\u{627}\u{654}\u{647}\u{644}\u{627}) - const composed_part = part.normalize('NFC'); - if( composed_part != part ){ - return arrayToPattern([part,composed_part]); - } - return part; }).join(''); From 0ceaf0527983a99fa40f76b31c72806dfdca445a Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 5 Jul 2022 19:31:03 -0600 Subject: [PATCH 110/140] v0.9.2 Release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4491469..4af1a5e 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.9.1", + "version": "0.9.2", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 2f9faf95730776931e9dd101634b07ea857833f8 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 2 Aug 2022 17:02:49 -0600 Subject: [PATCH 111/140] fixes for noUncheckedIndexedAccess --- lib/diacritics.ts | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/lib/diacritics.ts b/lib/diacritics.ts index b7f7683..8cdec3f 100644 --- a/lib/diacritics.ts +++ b/lib/diacritics.ts @@ -32,7 +32,7 @@ export const asciifold = (str:string):string => { .replace(accent_reg, '') .toLowerCase() .replace(convert_pat,function(foreignletter) { - return latin_convert[foreignletter]; + return latin_convert[foreignletter] || foreignletter; }); }; @@ -44,7 +44,7 @@ export const asciifold = (str:string):string => { */ export const arrayToPattern = (chars:string[],glue:string='|'):string =>{ - if( chars.length == 1 ){ + if( chars.length === 1 && chars[0] != undefined ){ return chars[0]; } @@ -113,32 +113,29 @@ export const generateDiacritics = (code_points:[[number,number]]):TDiacraticList continue; } - if( !(latin in diacritics) ){ - diacritics[latin] = [latin]; - } - - var patt = new RegExp( escapeToPattern(diacritics[latin]),'iu'); + const latin_diacritics:string[] = diacritics[latin] || [latin]; + const patt = new RegExp( escapeToPattern(latin_diacritics),'iu'); if( diacritic.match(patt) ){ continue; } - - diacritics[latin].push(diacritic); + latin_diacritics.push(diacritic); + diacritics[latin] = latin_diacritics; } }); // filter out if there's only one character in the list - let latin_chars = Object.keys(diacritics); - for( let i = 0; i < latin_chars.length; i++){ - const latin = latin_chars[i]; - if( diacritics[latin].length < 2 ){ + // todo: this may not be needed + Object.keys(diacritics).forEach(latin => { + const latin_diacritics = diacritics[latin] || []; + if( latin_diacritics.length < 2 ){ delete diacritics[latin]; } - } + }); // latin character pattern // match longer substrings first - latin_chars = Object.keys(diacritics).sort((a, b) => b.length - a.length ); + let latin_chars = Object.keys(diacritics).sort((a, b) => b.length - a.length ); latin_pat = new RegExp('('+ escapeToPattern(latin_chars) + accent_pat + '*)','gu'); @@ -153,7 +150,7 @@ export const generateDiacritics = (code_points:[[number,number]]):TDiacraticList sub_pat = sub_pat.map((l)=>{ if( diacritics.hasOwnProperty(l) ){ - return escapeToPattern(diacritics[l]); + return escapeToPattern(diacritics[l]!); } return l; }); From c295c9f439b265b102b3161cae9a2e64c9d96780 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 2 Aug 2022 17:25:50 -0600 Subject: [PATCH 112/140] fixes for noUncheckedIndexedAccess --- lib/sifter.ts | 49 ++++++++++++++++++++++--------------------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index cd35439..e1c3439 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -60,8 +60,8 @@ export default class Sifter{ // look for "field:query" tokens if( field_regex && (field_match = word.match(field_regex)) ){ - field = field_match[1]; - word = field_match[2]; + field = field_match[1]!; + word = field_match[2]!; } if( word.length > 0 ){ @@ -250,37 +250,32 @@ export default class Sifter{ } } - for (i = 0, n = sort_flds.length; i < n; i++) { - multipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1); - } // build function const sort_flds_count = sort_flds.length; if (!sort_flds_count) { return null; - } else if (sort_flds_count === 1) { - const sort_fld = sort_flds[0].field; - const multiplier = multipliers[0]; - return function(a:T.ResultItem, b:T.ResultItem) { - return multiplier * cmp( - get_field(sort_fld, a), - get_field(sort_fld, b) - ); - }; - } else { - return function(a:T.ResultItem, b:T.ResultItem) { - var i, result, field; - for (i = 0; i < sort_flds_count; i++) { - field = sort_flds[i].field; - result = multipliers[i] * cmp( - get_field(field, a), - get_field(field, b) - ); - if (result) return result; - } - return 0; - }; } + + return function(a:T.ResultItem, b:T.ResultItem) { + var i, result, field; + for (i = 0; i < sort_flds_count; i++) { + field = sort_flds[i].field; + + let multiplier = multipliers[i]; + if( multiplier == undefined ){ + multiplier = sort_flds[i].direction === 'desc' ? -1 : 1; + } + + result = multiplier * cmp( + get_field(field, a), + get_field(field, b) + ); + if (result) return result; + } + return 0; + }; + }; /** From 0bc230695f160b75a62fdd6f5efd238687aed415 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 2 Aug 2022 17:26:07 -0600 Subject: [PATCH 113/140] allowUnreachableCode and noUncheckedIndexedAccess --- .config/tsconfig.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.config/tsconfig.json b/.config/tsconfig.json index 197de2a..56cc31a 100644 --- a/.config/tsconfig.json +++ b/.config/tsconfig.json @@ -8,6 +8,8 @@ "module": "esnext", "noUnusedLocals": true, "noUnusedParameters": true, + "allowUnreachableCode": false, + "noUncheckedIndexedAccess": true, "declaration": true, "declarationDir": "../dist/types", From 32970f06c61b562bb6000719cedb5e4b2dba1e0b Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 2 Aug 2022 17:26:21 -0600 Subject: [PATCH 114/140] typescript 4.7.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4af1a5e..58dcf12 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "jest": "^28.1.2", "rollup": "^2.45.2", "rollup-plugin-terser": "^7.0.2", - "typescript": "^4.2.4" + "typescript": "^4.7.4" }, "browserslist": [ ">= 0.5%", From b1a5c29b660eef5b25a76b897223f9c50e0f68e3 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 2 Aug 2022 17:27:56 -0600 Subject: [PATCH 115/140] v0.9.3 Release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 58dcf12..2f8762f 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.9.2", + "version": "0.9.3", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From e7612001feef8434ac0ceccb1678a33cafeaf244 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 4 Aug 2022 14:08:36 -0600 Subject: [PATCH 116/140] use orchidjs/diacritics --- lib/diacritics.ts | 196 --------------------------------------------- lib/sifter.ts | 8 +- lib/utils.ts | 12 +-- package.json | 4 +- test/diacritics.js | 76 ------------------ 5 files changed, 9 insertions(+), 287 deletions(-) delete mode 100644 lib/diacritics.ts delete mode 100644 test/diacritics.js diff --git a/lib/diacritics.ts b/lib/diacritics.ts deleted file mode 100644 index 8cdec3f..0000000 --- a/lib/diacritics.ts +++ /dev/null @@ -1,196 +0,0 @@ - -// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" -import { escape_regex } from './utils.ts'; - -type TDiacraticList = {[key:string]:string}; - -// https://github.com/andrewrk/node-diacritics/blob/master/index.js - -var latin_pat:RegExp; -const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}]'; // \u{2bc} -const accent_reg = new RegExp(accent_pat,'gu'); -var diacritic_patterns:TDiacraticList; - -const latin_convert:TDiacraticList = { - 'æ': 'ae', - 'ⱥ': 'a', - 'ø': 'o', -}; - -const convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'gu'); - -const code_points:[[number,number]] = [[ 0, 65535 ]]; - -/** - * Remove accents - * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703 - * - */ -export const asciifold = (str:string):string => { - return str - .normalize('NFKD') - .replace(accent_reg, '') - .toLowerCase() - .replace(convert_pat,function(foreignletter) { - return latin_convert[foreignletter] || foreignletter; - }); -}; - -/** - * Convert array of strings to a regular expression - * ex ['ab','a'] => (?:ab|a) - * ex ['a','b'] => [ab] - * - */ -export const arrayToPattern = (chars:string[],glue:string='|'):string =>{ - - if( chars.length === 1 && chars[0] != undefined ){ - return chars[0]; - } - - var longest = 1; - chars.forEach((a)=>{longest = Math.max(longest,a.length)}); - - if( longest == 1 ){ - return '['+chars.join('')+']'; - } - - return '(?:'+chars.join(glue)+')'; -}; - -export const escapeToPattern = (chars:string[]):string =>{ - const escaped = chars.map((diacritic) => escape_regex(diacritic)); - return arrayToPattern(escaped); -}; - -/** - * Get all possible combinations of substrings that add up to the given string - * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string - * - */ -export const allSubstrings = (input:string):string[][] => { - - if( input.length === 1) return [[input]]; - - var result:string[][] = []; - allSubstrings(input.substring(1)).forEach(function(subresult) { - var tmp = subresult.slice(0); - tmp[0] = input.charAt(0) + tmp[0]; - result.push(tmp); - - tmp = subresult.slice(0); - tmp.unshift(input.charAt(0)); - result.push(tmp); - }); - - return result; -} - -/** - * Generate a list of diacritics from the list of code points - * - */ -export const generateDiacritics = (code_points:[[number,number]]):TDiacraticList => { - - var diacritics:{[key:string]:string[]} = {}; - code_points.forEach((code_range)=>{ - - for(let i = code_range[0]; i <= code_range[1]; i++){ - - let diacritic = String.fromCharCode(i); - let latin = asciifold(diacritic); - - if( latin == diacritic.toLowerCase() ){ - continue; - } - - // skip when latin is a string longer than 3 characters long - // bc the resulting regex patterns will be long - // eg: - // latin صلى الله عليه وسلم length 18 code point 65018 - // latin جل جلاله length 8 code point 65019 - if( latin.length > 3 ){ - continue; - } - - const latin_diacritics:string[] = diacritics[latin] || [latin]; - const patt = new RegExp( escapeToPattern(latin_diacritics),'iu'); - if( diacritic.match(patt) ){ - continue; - } - latin_diacritics.push(diacritic); - diacritics[latin] = latin_diacritics; - } - }); - - // filter out if there's only one character in the list - // todo: this may not be needed - Object.keys(diacritics).forEach(latin => { - const latin_diacritics = diacritics[latin] || []; - if( latin_diacritics.length < 2 ){ - delete diacritics[latin]; - } - }); - - - // latin character pattern - // match longer substrings first - let latin_chars = Object.keys(diacritics).sort((a, b) => b.length - a.length ); - latin_pat = new RegExp('('+ escapeToPattern(latin_chars) + accent_pat + '*)','gu'); - - - // build diacritic patterns - // ae needs: - // (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...)) - var diacritic_patterns:TDiacraticList = {}; - latin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{ - - var substrings = allSubstrings(latin); - var pattern = substrings.map((sub_pat)=>{ - - sub_pat = sub_pat.map((l)=>{ - if( diacritics.hasOwnProperty(l) ){ - return escapeToPattern(diacritics[l]!); - } - return l; - }); - - return arrayToPattern(sub_pat,''); - }); - - diacritic_patterns[latin] = arrayToPattern(pattern); - }); - - - return diacritic_patterns; -} - -/** - * Expand a regular expression pattern to include diacritics - * eg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/ - * - */ -export const diacriticRegexPoints = (regex:string):string => { - - if( diacritic_patterns === undefined ){ - diacritic_patterns = generateDiacritics(code_points); - } - - const decomposed = regex.normalize('NFKD').toLowerCase(); - - return decomposed.split(latin_pat).map((part:string)=>{ - - // "ffl" or "ffl" - const no_accent = asciifold(part); - if( no_accent == '' ){ - return ''; - } - - if( diacritic_patterns.hasOwnProperty(no_accent) ){ - return diacritic_patterns[no_accent]; - } - - return part; - }).join(''); - -} diff --git a/lib/sifter.ts b/lib/sifter.ts index e1c3439..f905c2d 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -15,9 +15,9 @@ */ // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" -import { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts'; -// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" -import { diacriticRegexPoints } from './diacritics.ts'; +import { scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp } from './utils.ts'; +import { diacriticRegexPoints,escape_regex } from '@orchidjs/diacritics'; + // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" import * as T from 'types.ts'; @@ -275,7 +275,7 @@ export default class Sifter{ } return 0; }; - + }; /** diff --git a/lib/utils.ts b/lib/utils.ts index 9a09cd6..b8f8393 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -1,6 +1,6 @@ -// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" -import { asciifold } from './diacritics.ts'; +import { asciifold } from '@orchidjs/diacritics'; + // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" import * as T from './types.ts'; @@ -50,14 +50,6 @@ export const scoreValue = (value:string, token:T.Token, weight:number ):number = return score * weight; }; -/** - * - * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error - */ -export const escape_regex = (str:string):string => { - return (str + '').replace(/([\$\(\)\*\+\.\?\[\]\^\{\|\}\\])/gu, '\\$1'); -}; - /** * Cast object property to an array if it exists and has a value diff --git a/package.json b/package.json index 2f8762f..5b552a3 100644 --- a/package.json +++ b/package.json @@ -64,5 +64,7 @@ "/dist", "/lib" ], - "dependencies": {} + "dependencies": { + "@orchidjs/diacritics": "^1.0.0" + } } diff --git a/test/diacritics.js b/test/diacritics.js deleted file mode 100644 index c2d32fc..0000000 --- a/test/diacritics.js +++ /dev/null @@ -1,76 +0,0 @@ -var assert = require('assert'); -var diacritics = require('../dist/cjs/diacritics.js'); -var utils = require('../dist/cjs/utils.js'); -var Sifter = require('../dist/cjs/sifter.js'); - -describe('diacritics', () => { - - it('Should match composed and decomposed strings', () => { - - const sifter = new Sifter([]); - const composed = 'أهلا'; // '\u{623}\u{647}\u{644}\u{627}' - const decomposed = 'أهلا'; // '\u{627}\u{654}\u{647}\u{644}\u{627}' - - assert.notEqual(composed,decomposed); - - - tokens = sifter.tokenize(composed); - assert.equal(tokens[0].regex.test(composed), true); - - tokens = sifter.tokenize(decomposed); - assert.equal(tokens[0].regex.test(decomposed), true); - - tokens = sifter.tokenize(composed); - assert.equal(tokens[0].regex.test(decomposed), true); - - tokens = sifter.tokenize(decomposed); - assert.equal(tokens[0].regex.test(composed), true); - - }); - - - it('Should match all diacritic code points',()=>{ - - const sifter = new Sifter([]); - - - for(let i = 0; i <= 65535; i++){ - - let composed = String.fromCharCode(i); - let decomposed = composed.normalize('NFKD'); - - - if( decomposed.length > 3 ){ - continue; - } - - if( composed.trim().length == 0 ){ - continue; - } - - tokens = sifter.tokenize(composed); - if( tokens.length && tokens[0].regex ){ - assert.equal(tokens[0].regex.test(composed), true, 'composed should match composed for ' + composed + ' regex: '+tokens[0].regex + ' code point: '+i); - } - - tokens = sifter.tokenize(decomposed); - if( tokens.length && tokens[0].regex ){ - assert.equal(tokens[0].regex.test(decomposed), true, 'decomposed should match composed for ' + decomposed + ' and ' + composed + ' regex: '+tokens[0].regex); - } - - tokens = sifter.tokenize(composed); - if( tokens.length && tokens[0].regex ){ - assert.equal(tokens[0].regex.test(decomposed), true, 'composed should match decomposed for ' + composed + ' and ' + decomposed + ' regex: '+tokens[0].regex); - } - - tokens = sifter.tokenize(decomposed); - if( tokens.length && tokens[0].regex ){ - assert.equal(tokens[0].regex.test(composed), true, 'decomposed should match composed for ' + decomposed + ' and ' + composed + ' regex: '+tokens[0].regex+ ' code point: '+i); - } - - }; - - }); - - -}); From 2347181ab38fb511b1bc68d19c33045b7f395a55 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Thu, 4 Aug 2022 14:08:50 -0600 Subject: [PATCH 117/140] remove unused imports --- .config/rollup.config.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/.config/rollup.config.js b/.config/rollup.config.js index d1f5d27..1735fab 100644 --- a/.config/rollup.config.js +++ b/.config/rollup.config.js @@ -1,8 +1,6 @@ import babel from '@rollup/plugin-babel'; import { terser } from 'rollup-plugin-terser'; -import pkg from '../package.json'; import path from 'path'; -import fs from 'fs'; var configs = []; const banner = `/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */`; From a453e0f8b290cb7de3da06b1f23f6e483e74b5d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radek=20=C5=A0er=C3=BD?= Date: Wed, 14 Sep 2022 10:15:55 +0200 Subject: [PATCH 118/140] Fix of using implicit type any When using this plugin with strict mode, there is an error using implicit type any: ``` ERROR in [at-loader] ./node_modules/@orchidjs/sifter/lib/sifter.ts:26:9 TS7008: Member 'items' implicitly has an 'any' type. ``` This commit fixes the problem. Constructor uses type any for items, so this just defines it on property as well. --- lib/sifter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index f905c2d..2247f4d 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -23,7 +23,7 @@ import * as T from 'types.ts'; export default class Sifter{ - public items; // []|{}; + public items: any; // []|{}; public settings: T.Settings; /** From 0b1fec04c749c9524fe0a24600d79659f72781ac Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sat, 17 Sep 2022 12:48:02 -0600 Subject: [PATCH 119/140] use @orchidjs/unicode-variants --- lib/sifter.ts | 4 ++-- lib/utils.ts | 3 +-- package.json | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 2247f4d..871d1ea 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -16,7 +16,7 @@ // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" import { scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp } from './utils.ts'; -import { diacriticRegexPoints,escape_regex } from '@orchidjs/diacritics'; +import { getPattern, escape_regex } from '@orchidjs/unicode-variants'; // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" import * as T from 'types.ts'; @@ -66,7 +66,7 @@ export default class Sifter{ if( word.length > 0 ){ if( this.settings.diacritics ){ - regex = diacriticRegexPoints(word); + regex = getPattern(word); }else{ regex = escape_regex(word); } diff --git a/lib/utils.ts b/lib/utils.ts index b8f8393..d2e0c11 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -1,6 +1,5 @@ -import { asciifold } from '@orchidjs/diacritics'; - +import { asciifold } from '@orchidjs/unicode-variants'; // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" import * as T from './types.ts'; diff --git a/package.json b/package.json index 5b552a3..5633aa6 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,6 @@ "/lib" ], "dependencies": { - "@orchidjs/diacritics": "^1.0.0" + "@orchidjs/unicode-variants": "^1.0.0" } } From eee4058e00cd10327a90a78ed0c88d18b34eb9eb Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sat, 17 Sep 2022 12:48:39 -0600 Subject: [PATCH 120/140] "+" if t_delta is positive --- benchmark/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/benchmark/index.js b/benchmark/index.js index c31056c..26e8a00 100644 --- a/benchmark/index.js +++ b/benchmark/index.js @@ -83,11 +83,12 @@ var timed_report = function(title, fn) { var t_delta = t_new - t_old; var p_delta = Math.round(t_delta / t_old * 100, 1); + reports_new[title] = t_new; process.stdout.write('\033[1;39m' + humanize.numberFormat(t_new / 1000) + ' ms\033[0;39m (score: ' + (t_new / time_baseline).toFixed(6) + ')\033[0;39m '); if (t_old) { process.stdout.write('\t' + (Math.abs(p_delta) < 5 ? '' : (t_delta > 0 ? '\033[31m' : '\033[32m'))); - process.stdout.write((t_delta > 0 ? '-' : '+') + Math.abs(p_delta) + '% (' + (t_delta > 0 ? '+' : '') + humanize.numberFormat(Math.round(t_delta / 1000), 0) + 'ms)'); + process.stdout.write((t_delta > 0 ? '+' : '-') + Math.abs(p_delta) + '% (' + (t_delta > 0 ? '+' : '') + humanize.numberFormat(Math.round(t_delta / 1000), 0) + 'ms)'); process.stdout.write('\033[0;39m'); } process.stdout.write('\t' + title); From 78758a789bc3946fa149e32d7ba8a385aac8fde5 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sat, 17 Sep 2022 17:02:23 -0600 Subject: [PATCH 121/140] unicode-variants 1.0.1 --- .config/rollup.config.js | 4 ++-- lib/sifter.ts | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.config/rollup.config.js b/.config/rollup.config.js index 1735fab..fef47e3 100644 --- a/.config/rollup.config.js +++ b/.config/rollup.config.js @@ -37,7 +37,7 @@ configs.push({ output:{ dir: path.resolve(__dirname,'../dist/esm'), format: 'esm', - preserveModules: true, + preserveModules: false, sourcemap: true, banner: banner, }, @@ -50,7 +50,7 @@ configs.push({ output:{ dir: path.resolve(__dirname,'../dist/cjs'), format: 'cjs', - preserveModules: true, + preserveModules: false, sourcemap: true, banner: banner, }, diff --git a/lib/sifter.ts b/lib/sifter.ts index 871d1ea..299fe23 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -66,11 +66,11 @@ export default class Sifter{ if( word.length > 0 ){ if( this.settings.diacritics ){ - regex = getPattern(word); + regex = getPattern(word) || null; }else{ regex = escape_regex(word); } - if( respect_word_boundaries ) regex = "\\b"+regex; + if( regex && respect_word_boundaries ) regex = "\\b"+regex; } tokens.push({ diff --git a/package.json b/package.json index 5633aa6..f97b5a6 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,6 @@ "/lib" ], "dependencies": { - "@orchidjs/unicode-variants": "^1.0.0" + "@orchidjs/unicode-variants": "^1.0.1" } } From ee591ca265f7b8d2a3e2dcc37052f3dc744084c1 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sat, 17 Sep 2022 17:09:49 -0600 Subject: [PATCH 122/140] note unicode-variants use --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c8bf092..11a82c1 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Sifter is a fast and small (<6kb) client and server-side library (coded in TypeScript and available in [CJS, UMD, and ESM](https://irian.to/blogs/what-are-cjs-amd-umd-and-esm-in-javascript/)) for textually searching arrays and hashes of objects by property – or multiple properties. It's designed specifically for autocomplete. The process is three-step: *score*, *filter*, *sort*. -* **Supports díåcritîçs.**
For example, if searching for "montana" and an item in the set has a value of "montaña", it will still be matched. Sorting will also play nicely with diacritics. +* **Supports díåcritîçs.**
For example, if searching for "montana" and an item in the set has a value of "montaña", it will still be matched. Sorting will also play nicely with diacritics. (using [unicode-variants](https://github.com/orchidjs/unicode-variants)) * **Smart scoring.**
Items are scored / sorted intelligently depending on where a match is found in the string (how close to the beginning) and what percentage of the string matches. * **Multi-field sorting.**
When scores aren't enough to go by – like when getting results for an empty query – it can sort by one or more fields. For example, sort by a person's first name and last name without actually merging the properties to a single string. * **Nested properties.**
Allows to search and sort on nested properties so you can perform search on complex objects without flattening them simply by using dot-notation to reference fields (ie. `nested.property`). From ab3e3bbaabe0b6223cda49659894bf70a80bd7cb Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sun, 18 Sep 2022 18:54:35 -0600 Subject: [PATCH 123/140] types --- lib/sifter.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 299fe23..19d5320 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -125,8 +125,8 @@ export default class Sifter{ if (field_count === 1) { return function(token:T.Token, data:{}) { - const field = fields[0].field; - return scoreValue(getAttrFn(data, field), token, weights[field]); + const field = fields[0]!.field; + return scoreValue(getAttrFn(data, field), token, weights[field]||1); }; } @@ -158,15 +158,15 @@ export default class Sifter{ if (token_count === 1) { return function(data:{}) { - return scoreObject(tokens[0], data); + return scoreObject(tokens[0]!, data); }; } if (search.options.conjunction === 'and') { return function(data:{}) { - var i = 0, score, sum = 0; - for (; i < token_count; i++) { - score = scoreObject(tokens[i], data); + var score, sum = 0; + for( let token of tokens){ + score = scoreObject(token, data); if (score <= 0) return 0; sum += score; } @@ -221,9 +221,9 @@ export default class Sifter{ // parse options if (sort) { - for (i = 0, n = sort.length; i < n; i++) { - if (search.query || sort[i].field !== '$score') { - sort_flds.push(sort[i]); + for( let s of sort ){ + if (search.query || s.field !== '$score') { + sort_flds.push(s); } } } From a8b46aa943660a737b5ecdded4a8b78830d36f61 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Sun, 18 Sep 2022 18:56:41 -0600 Subject: [PATCH 124/140] remove default export; remove @ts-ignore for *.ts extensions --- .config/rollup.config.js | 13 ++++++++++--- lib/sifter.ts | 11 +++++------ lib/types.ts | 6 +++--- lib/utils.ts | 6 ++---- package.json | 1 + test/getScoreFunction.js | 2 +- test/prepareSearch.js | 2 +- test/search.js | 2 +- test/sorting.js | 2 +- test/tokenize.js | 2 +- test/utils.js | 10 +++++----- 11 files changed, 31 insertions(+), 26 deletions(-) diff --git a/.config/rollup.config.js b/.config/rollup.config.js index fef47e3..30244a4 100644 --- a/.config/rollup.config.js +++ b/.config/rollup.config.js @@ -1,5 +1,6 @@ import babel from '@rollup/plugin-babel'; import { terser } from 'rollup-plugin-terser'; +import resolve from '@rollup/plugin-node-resolve'; // so Rollup can resolve imports without file extensions and `node_modules` import path from 'path'; var configs = []; @@ -15,6 +16,10 @@ var babel_config = babel({ configFile: path.resolve(__dirname,'babel.config.json'), }); +var resolve_config = resolve({ + extensions: extensions, +}); + var terser_config = terser({ mangle: true, format: { @@ -37,11 +42,11 @@ configs.push({ output:{ dir: path.resolve(__dirname,'../dist/esm'), format: 'esm', - preserveModules: false, + preserveModules: true, sourcemap: true, banner: banner, }, - plugins:[babel_config] // resolve_config + plugins:[babel_config,resolve_config] }); // cjs @@ -54,7 +59,7 @@ configs.push({ sourcemap: true, banner: banner, }, - plugins:[babel_config] //resolve_config + plugins:[babel_config,resolve_config] }); @@ -70,6 +75,7 @@ configs.push({ }, plugins:[ babel_config, + resolve_config ] }); @@ -85,6 +91,7 @@ configs.push({ }, plugins:[ babel_config, + resolve_config, terser_config ] }); diff --git a/lib/sifter.ts b/lib/sifter.ts index 19d5320..5541479 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -14,14 +14,11 @@ * @author Brian Reavis */ - // @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" -import { scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp } from './utils.ts'; +import { scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp } from './utils'; import { getPattern, escape_regex } from '@orchidjs/unicode-variants'; +import * as T from './types'; -// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" -import * as T from 'types.ts'; - -export default class Sifter{ +class Sifter{ public items: any; // []|{}; public settings: T.Settings; @@ -357,3 +354,5 @@ export default class Sifter{ return search; }; } + +export { Sifter, scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp, getPattern, escape_regex } diff --git a/lib/types.ts b/lib/types.ts index a1da94c..10697c3 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -1,5 +1,5 @@ -// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" -import Sifter from 'sifter.ts'; + +import Sifter from './sifter'; export type Field = { field: string, @@ -11,7 +11,7 @@ export type Sort = { direction?: string, } -export type SortFn = (this:Sifter, a:ResultItem, b:ResultItem)=>number; +export type SortFn = (this:Sifter, a:ResultItem, b:ResultItem)=>number; export type Options = { fields: Field[], diff --git a/lib/utils.ts b/lib/utils.ts index d2e0c11..2d98883 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -1,8 +1,6 @@ import { asciifold } from '@orchidjs/unicode-variants'; - -// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension" -import * as T from './types.ts'; +import * as T from './types'; /** @@ -75,7 +73,7 @@ export const propToArray = (obj:{[key:string]:any}, key:string) => { * ``` * */ -export const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => { +export const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => { if ( Array.isArray(object)) { object.forEach(callback); diff --git a/package.json b/package.json index f97b5a6..74cc4af 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "@babel/preset-env": "^7.13.15", "@babel/preset-typescript": "^7.13.0", "@rollup/plugin-babel": "^5.3.0", + "@rollup/plugin-node-resolve": "^13.0.0", "coveralls": "^3.1.0", "humanize": "0.0.9", "jest": "^28.1.2", diff --git a/test/getScoreFunction.js b/test/getScoreFunction.js index dc788d7..9d0b132 100644 --- a/test/getScoreFunction.js +++ b/test/getScoreFunction.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../dist/cjs/sifter.js'); +var {Sifter} = require('@orchidjs/sifter'); describe('#getScoreFunction()', function() { diff --git a/test/prepareSearch.js b/test/prepareSearch.js index 9f5fcaa..0a5ba91 100644 --- a/test/prepareSearch.js +++ b/test/prepareSearch.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../dist/cjs/sifter.js'); +var {Sifter} = require('@orchidjs/sifter'); describe('#prepareSearch()', function() { diff --git a/test/search.js b/test/search.js index d120553..154a614 100644 --- a/test/search.js +++ b/test/search.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../dist/cjs/sifter.js'); +var {Sifter} = require('@orchidjs/sifter'); describe('#search()', function() { diff --git a/test/sorting.js b/test/sorting.js index 1cff669..367862c 100644 --- a/test/sorting.js +++ b/test/sorting.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../dist/cjs/sifter.js'); +var {Sifter} = require('@orchidjs/sifter'); describe('sorting', function() { diff --git a/test/tokenize.js b/test/tokenize.js index f85a983..5fe3b2b 100644 --- a/test/tokenize.js +++ b/test/tokenize.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var Sifter = require('../dist/cjs/sifter.js'); +var {Sifter} = require('@orchidjs/sifter'); describe('#tokenize()', function() { var sifter, tokens; diff --git a/test/utils.js b/test/utils.js index 620e312..77900b1 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var utils = require('../dist/cjs/utils.js'); +var sifter = require('@orchidjs/sifter'); describe('#prepareSearch()', function() { @@ -8,20 +8,20 @@ describe('#prepareSearch()', function() { var from = 'aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ'; var to = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; - assert.strictEqual( utils.cmp(from,to), 0 ); + assert.strictEqual( sifter.cmp(from,to), 0 ); }); it('getAttr should return void when invalid object passed', function() { - assert.equal( utils.getAttr(null,'test'), null); + assert.equal( sifter.getAttr(null,'test'), null); }); it('getAttrNesting should return void when invalid object passed', function() { - assert.equal( utils.getAttrNesting(null,'test'), null); + assert.equal( sifter.getAttrNesting(null,'test'), null); }); it('scoreValue should cast non-string values to string', function() { var token = {string:'a',regex:new RegExp('a','i')}; - var score = utils.scoreValue([], token, 1); + var score = sifter.scoreValue([], token, 1); assert.equal( score, 0); }); From e11ec5e74ddeb35610bed4ca9d4fff15fc0facc1 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Mon, 19 Sep 2022 11:58:34 -0600 Subject: [PATCH 125/140] unicode-variants 1.0.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 74cc4af..1d91765 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,6 @@ "/lib" ], "dependencies": { - "@orchidjs/unicode-variants": "^1.0.1" + "@orchidjs/unicode-variants": "^1.0.2" } } From 2216f9a99768bef76871dd601aba703bc1d108e9 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Mon, 19 Sep 2022 11:59:13 -0600 Subject: [PATCH 126/140] types --- .config/rollup.config.js | 2 +- lib/sifter.ts | 49 +++++++++++++++++++--------------------- lib/types.ts | 20 +++++++++------- lib/utils.ts | 1 + 4 files changed, 37 insertions(+), 35 deletions(-) diff --git a/.config/rollup.config.js b/.config/rollup.config.js index 30244a4..4174bd1 100644 --- a/.config/rollup.config.js +++ b/.config/rollup.config.js @@ -7,7 +7,7 @@ var configs = []; const banner = `/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */`; const extensions = [ - '.js', '.jsx', '.ts', '.tsx', + '.js', '.jsx', '.ts', '.tsx', '.mjs', ]; var babel_config = babel({ diff --git a/lib/sifter.ts b/lib/sifter.ts index 5541479..93a9da5 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -87,13 +87,17 @@ class Sifter{ * Good matches will have a higher score than poor matches. * If an item is not a match, 0 will be returned by the function. * - * @returns {function} + * @returns {T.ScoreFn} */ getScoreFunction(query:string, options:T.Options ){ var search = this.prepareSearch(query, options); return this._getScoreFunction(search); } + /** + * @returns {T.ScoreFn} + * + */ _getScoreFunction(search:T.PrepareObj ){ const tokens = search.tokens, token_count = tokens.length; @@ -187,19 +191,18 @@ class Sifter{ * * @return function(a,b) */ - getSortFunction(query:string, options:T.Options) { + getSortFunction(query:string, options:Partial) { var search = this.prepareSearch(query, options); return this._getSortFunction(search); } _getSortFunction(search:T.PrepareObj){ - var i, n, implicit_score; + var implicit_score, + sort_flds:T.Sort[] = []; const self = this, options = search.options, - sort = (!search.query && options.sort_empty) ? options.sort_empty : options.sort, - sort_flds:T.Sort[] = [], - multipliers:number[] = []; + sort = (!search.query && options.sort_empty) ? options.sort_empty : options.sort; if( typeof sort == 'function' ){ @@ -229,8 +232,8 @@ class Sifter{ // sort field, unless it's manually specified if (search.query) { implicit_score = true; - for (i = 0, n = sort_flds.length; i < n; i++) { - if (sort_flds[i].field === '$score') { + for( let fld of sort_flds ){ + if( fld.field === '$score' ){ implicit_score = false; break; } @@ -238,13 +241,10 @@ class Sifter{ if (implicit_score) { sort_flds.unshift({field: '$score', direction: 'desc'}); } + + // without a search.query, all items will have the same score } else { - for (i = 0, n = sort_flds.length; i < n; i++) { - if (sort_flds[i].field === '$score') { - sort_flds.splice(i, 1); - break; - } - } + sort_flds = sort_flds.filter((fld) => fld.field !== '$score' ); } @@ -255,14 +255,11 @@ class Sifter{ } return function(a:T.ResultItem, b:T.ResultItem) { - var i, result, field; - for (i = 0; i < sort_flds_count; i++) { - field = sort_flds[i].field; + var result, field; + for( let sort_fld of sort_flds ){ + field = sort_fld.field; - let multiplier = multipliers[i]; - if( multiplier == undefined ){ - multiplier = sort_flds[i].direction === 'desc' ? -1 : 1; - } + let multiplier = sort_fld.direction === 'desc' ? -1 : 1; result = multiplier * cmp( get_field(field, a), @@ -283,7 +280,7 @@ class Sifter{ */ prepareSearch(query:string, optsUser:Partial):T.PrepareObj { const weights:T.Weights = {}; - var options = Object.assign({},optsUser); + var options = Object.assign({},optsUser) as T.Options; propToArray(options,'sort'); propToArray(options,'sort_empty'); @@ -304,7 +301,7 @@ class Sifter{ return { - options : options, + options : options as T.Options, query : query.toLowerCase().trim(), tokens : this.tokenize(query, options.respect_word_boundaries, weights), total : 0, @@ -319,14 +316,14 @@ class Sifter{ * */ search(query:string, options:T.Options) : T.PrepareObj { - var self = this, score, search:T.PrepareObj; + var self = this, score, search: T.PrepareObj; search = this.prepareSearch(query, options); options = search.options; query = search.query; // generate result scoring function - const fn_score = options.score || self._getScoreFunction(search); + const fn_score:T.ScoreFn = options.score || self._getScoreFunction(search); // perform search and sort if (query.length) { @@ -355,4 +352,4 @@ class Sifter{ }; } -export { Sifter, scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp, getPattern, escape_regex } +export { Sifter, scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp, getPattern } diff --git a/lib/types.ts b/lib/types.ts index 10697c3..6c98281 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -1,5 +1,5 @@ -import Sifter from './sifter'; +import {Sifter} from './sifter'; export type Field = { field: string, @@ -15,14 +15,15 @@ export type SortFn = (this:Sifter, a:ResultItem, b:ResultItem)=>number; export type Options = { fields: Field[], - score: ()=>any, - filter: boolean, - limit: number, - sort: SortFn|Sort[], - sort_empty: SortFn|Sort[], - nesting: boolean, - respect_word_boundaries: boolean, conjunction: string, + sort: SortFn|Sort[], + nesting: boolean, + + score?: ScoreFn, + filter?: boolean, + sort_empty?: SortFn|Sort[], + respect_word_boundaries?: boolean, + limit?: number, } export type Token = { @@ -52,3 +53,6 @@ export type ResultItem = { score: number, id: number|string, } + + +export type ScoreFn = (item:ResultItem) => number; diff --git a/lib/utils.ts b/lib/utils.ts index 2d98883..4691d0b 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -38,6 +38,7 @@ export const scoreValue = (value:string, token:T.Token, weight:number ):number = if (!value) return 0; value = value + ''; + if( token.regex == null ) return 0; pos = value.search(token.regex); if (pos === -1) return 0; From 72f07b485b11e110a1e2398ec35c70c0af2f81b1 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Mon, 19 Sep 2022 12:02:48 -0600 Subject: [PATCH 127/140] show import in js example --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 11a82c1..9cb35d4 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ $ npm install @orchidjs/sifter # node.js ## Usage ```js +import {Sifter} from '@orchidjs/sifter'; + var sifter = new Sifter([ {title: 'Annapurna I', location: 'Nepal', continent: 'Asia'}, {title: 'Annapurna II', location: 'Nepal', continent: 'Asia'}, From 87361ba1576141e4f7295d95986c80692e60a5f9 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Mon, 19 Sep 2022 12:03:56 -0600 Subject: [PATCH 128/140] v1.0.0 Release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d91765..26f0dd7 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "0.9.3", + "version": "1.0.0", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 828bce650fa89bab6f14bd79394f8d2e5170f9af Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Mon, 19 Sep 2022 12:23:10 -0600 Subject: [PATCH 129/140] fix require() statements in tests --- test/getScoreFunction.js | 2 +- test/prepareSearch.js | 2 +- test/search.js | 2 +- test/sorting.js | 2 +- test/tokenize.js | 2 +- test/utils.js | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/getScoreFunction.js b/test/getScoreFunction.js index 9d0b132..bd48a99 100644 --- a/test/getScoreFunction.js +++ b/test/getScoreFunction.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var {Sifter} = require('@orchidjs/sifter'); +var {Sifter} = require('../dist/cjs/sifter.js'); describe('#getScoreFunction()', function() { diff --git a/test/prepareSearch.js b/test/prepareSearch.js index 0a5ba91..5d89d39 100644 --- a/test/prepareSearch.js +++ b/test/prepareSearch.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var {Sifter} = require('@orchidjs/sifter'); +var {Sifter} = require('../dist/cjs/sifter.js'); describe('#prepareSearch()', function() { diff --git a/test/search.js b/test/search.js index 154a614..bf187aa 100644 --- a/test/search.js +++ b/test/search.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var {Sifter} = require('@orchidjs/sifter'); +var {Sifter} = require('../dist/cjs/sifter.js'); describe('#search()', function() { diff --git a/test/sorting.js b/test/sorting.js index 367862c..712d6c5 100644 --- a/test/sorting.js +++ b/test/sorting.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var {Sifter} = require('@orchidjs/sifter'); +var {Sifter} = require('../dist/cjs/sifter.js'); describe('sorting', function() { diff --git a/test/tokenize.js b/test/tokenize.js index 5fe3b2b..6f8c1f8 100644 --- a/test/tokenize.js +++ b/test/tokenize.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var {Sifter} = require('@orchidjs/sifter'); +var {Sifter} = require('../dist/cjs/sifter.js'); describe('#tokenize()', function() { var sifter, tokens; diff --git a/test/utils.js b/test/utils.js index 77900b1..8d8efc9 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var sifter = require('@orchidjs/sifter'); +var sifter = require('../dist/cjs/sifter.js'); describe('#prepareSearch()', function() { From 0ddb0ffd3d3e352ffec27668054053898214a960 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Mon, 19 Sep 2022 12:27:44 -0600 Subject: [PATCH 130/140] UserOptions type --- lib/sifter.ts | 8 ++++---- lib/types.ts | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/sifter.ts b/lib/sifter.ts index 93a9da5..39ae56f 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -89,7 +89,7 @@ class Sifter{ * * @returns {T.ScoreFn} */ - getScoreFunction(query:string, options:T.Options ){ + getScoreFunction(query:string, options:T.UserOptions ){ var search = this.prepareSearch(query, options); return this._getScoreFunction(search); } @@ -191,7 +191,7 @@ class Sifter{ * * @return function(a,b) */ - getSortFunction(query:string, options:Partial) { + getSortFunction(query:string, options:T.UserOptions) { var search = this.prepareSearch(query, options); return this._getSortFunction(search); } @@ -278,7 +278,7 @@ class Sifter{ * with results. * */ - prepareSearch(query:string, optsUser:Partial):T.PrepareObj { + prepareSearch(query:string, optsUser:T.UserOptions):T.PrepareObj { const weights:T.Weights = {}; var options = Object.assign({},optsUser) as T.Options; @@ -315,7 +315,7 @@ class Sifter{ * Searches through all items and returns a sorted array of matches. * */ - search(query:string, options:T.Options) : T.PrepareObj { + search(query:string, options:T.UserOptions) : T.PrepareObj { var self = this, score, search: T.PrepareObj; search = this.prepareSearch(query, options); diff --git a/lib/types.ts b/lib/types.ts index 6c98281..8cb3484 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -13,12 +13,26 @@ export type Sort = { export type SortFn = (this:Sifter, a:ResultItem, b:ResultItem)=>number; +export type UserOptions = { + fields: string[]|Field[], + conjunction: string, + sort: string|SortFn|Sort[], + + nesting?: boolean, + score?: ScoreFn, + filter?: boolean, + sort_empty?: SortFn|Sort[], + respect_word_boundaries?: boolean, + limit?: number, +} + + export type Options = { fields: Field[], conjunction: string, sort: SortFn|Sort[], - nesting: boolean, + nesting?: boolean, score?: ScoreFn, filter?: boolean, sort_empty?: SortFn|Sort[], From 647a1ca51dea1eada1366b36070dfab221a3008c Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Mon, 19 Sep 2022 16:39:06 -0600 Subject: [PATCH 131/140] upgrade typescript --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 26f0dd7..4127fd7 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "jest": "^28.1.2", "rollup": "^2.45.2", "rollup-plugin-terser": "^7.0.2", - "typescript": "^4.7.4" + "typescript": "^4.8.3" }, "browserslist": [ ">= 0.5%", From a06d7197b67c6aece4569865fb58047b18169fec Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Mon, 19 Sep 2022 16:39:51 -0600 Subject: [PATCH 132/140] v1.0.1 Release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4127fd7..90beaf0 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "1.0.0", + "version": "1.0.1", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 123a439c37e3e92dde2d0d7f3ef17690230243b9 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 11 Oct 2022 16:08:22 -0600 Subject: [PATCH 133/140] unicode-variants 1.0.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 90beaf0..56cfd73 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,6 @@ "/lib" ], "dependencies": { - "@orchidjs/unicode-variants": "^1.0.2" + "@orchidjs/unicode-variants": "^1.0.3" } } From 672eb880605acc11a2a83d248a54d0f18427c7bc Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 11 Oct 2022 16:21:58 -0600 Subject: [PATCH 134/140] update diacritic tests --- test/tokenize.js | 2 +- test/utils.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/tokenize.js b/test/tokenize.js index 6f8c1f8..fffb182 100644 --- a/test/tokenize.js +++ b/test/tokenize.js @@ -55,7 +55,7 @@ describe('#tokenize()', function() { }); it('should match international characters', function() { assert.equal(tokens[0].regex.test('Ḧęŀlö'), true); - assert.equal(tokens[1].regex.test('ẘÕⓡlḋ'), true); + assert.equal(tokens[1].regex.test('ẘÕⓡlḓ'), true); }); }); }); diff --git a/test/utils.js b/test/utils.js index 8d8efc9..5ce0725 100644 --- a/test/utils.js +++ b/test/utils.js @@ -5,8 +5,8 @@ describe('#prepareSearch()', function() { it('should remove accents', function() { - var from = 'aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ'; - var to = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; + var from = 'aḀḁĂăÂâǍǎȺⱥẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ'; + var to = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; assert.strictEqual( sifter.cmp(from,to), 0 ); }); From 48aa9acb112f82c8f2f8ed9d5bde64bd3ef07680 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Tue, 11 Oct 2022 16:26:28 -0600 Subject: [PATCH 135/140] v1.0.2 Release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 56cfd73..4743feb 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "1.0.1", + "version": "1.0.2", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From 928da49a69ffd3d9a5ad2c6a278790dfceea99be Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 12 Oct 2022 09:54:21 -0600 Subject: [PATCH 136/140] unicode-variants 1.0.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4743feb..f80cd91 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,6 @@ "/lib" ], "dependencies": { - "@orchidjs/unicode-variants": "^1.0.3" + "@orchidjs/unicode-variants": "^1.0.4" } } From edaf386a0124fc876beaca569cb19bb61bde37f8 Mon Sep 17 00:00:00 2001 From: Josh Schmidt Date: Wed, 12 Oct 2022 09:54:58 -0600 Subject: [PATCH 137/140] v1.0.3 Release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f80cd91..ca680b8 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "1.0.2", + "version": "1.0.3", "license": "Apache-2.0", "author": "Brian Reavis ", "main": "dist/umd/sifter.js", From af330647761ac9ebf3f53c090fd3905266609220 Mon Sep 17 00:00:00 2001 From: Nathan Sarang-Walters Date: Thu, 14 Nov 2024 16:33:23 -0800 Subject: [PATCH 138/140] Revamp build (#33) * WIP build revamp * Refine types; add GitHub Actions workflow * Export types * Upgrade @orchidjs/unicode-variants --- .config/babel.config.json | 11 +- .../{rollup.config.js => rollup.config.mjs} | 34 +- .config/tsconfig.cjs.json | 8 + .config/tsconfig.esm.json | 7 + .config/tsconfig.json | 14 +- .config/tsconfig.types.json | 11 + .github/workflows/ci.yaml | 26 + .gitignore | 3 - .travis.yml | 10 - .vscode/settings.json | 3 + lib/sifter.ts | 5 +- lib/types.ts | 2 +- lib/utils.ts | 2 +- package-lock.json | 6290 +++++++++++++++++ package.json | 50 +- 15 files changed, 6396 insertions(+), 80 deletions(-) rename .config/{rollup.config.js => rollup.config.mjs} (71%) create mode 100644 .config/tsconfig.cjs.json create mode 100644 .config/tsconfig.esm.json create mode 100644 .config/tsconfig.types.json create mode 100644 .github/workflows/ci.yaml delete mode 100644 .travis.yml create mode 100644 .vscode/settings.json create mode 100644 package-lock.json diff --git a/.config/babel.config.json b/.config/babel.config.json index 5d321a3..3bc4950 100644 --- a/.config/babel.config.json +++ b/.config/babel.config.json @@ -4,14 +4,11 @@ [ "@babel/preset-env", { - loose: true, - bugfixes: true, - modules: false + "loose": true, + "bugfixes": true, + "modules": false } ], "@babel/typescript" - ], - "plugins": [ - ["@babel/plugin-proposal-class-properties", { "loose": true }] - ] + ] } diff --git a/.config/rollup.config.js b/.config/rollup.config.mjs similarity index 71% rename from .config/rollup.config.js rename to .config/rollup.config.mjs index 4174bd1..29944b8 100644 --- a/.config/rollup.config.js +++ b/.config/rollup.config.mjs @@ -1,9 +1,12 @@ import babel from '@rollup/plugin-babel'; -import { terser } from 'rollup-plugin-terser'; +import terser from '@rollup/plugin-terser'; import resolve from '@rollup/plugin-node-resolve'; // so Rollup can resolve imports without file extensions and `node_modules` import path from 'path'; +import { fileURLToPath } from 'url'; -var configs = []; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const configs = []; const banner = `/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */`; const extensions = [ @@ -36,33 +39,6 @@ var terser_config = terser({ }); -// esm -configs.push({ - input: path.resolve(__dirname,'../lib/sifter.ts'), - output:{ - dir: path.resolve(__dirname,'../dist/esm'), - format: 'esm', - preserveModules: true, - sourcemap: true, - banner: banner, - }, - plugins:[babel_config,resolve_config] -}); - -// cjs -configs.push({ - input: path.resolve(__dirname,'../lib/sifter.ts'), - output:{ - dir: path.resolve(__dirname,'../dist/cjs'), - format: 'cjs', - preserveModules: false, - sourcemap: true, - banner: banner, - }, - plugins:[babel_config,resolve_config] -}); - - // umd configs.push({ input: path.resolve(__dirname,'../lib/sifter.ts'), diff --git a/.config/tsconfig.cjs.json b/.config/tsconfig.cjs.json new file mode 100644 index 0000000..97fea37 --- /dev/null +++ b/.config/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "moduleResolution": "Node", + "outDir": "../dist/cjs", + } +} diff --git a/.config/tsconfig.esm.json b/.config/tsconfig.esm.json new file mode 100644 index 0000000..b66e859 --- /dev/null +++ b/.config/tsconfig.esm.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "NodeNext", + "outDir": "../dist/esm", + } +} diff --git a/.config/tsconfig.json b/.config/tsconfig.json index 56cc31a..dc240be 100644 --- a/.config/tsconfig.json +++ b/.config/tsconfig.json @@ -2,18 +2,18 @@ "include": ["../lib/**/*"], "compilerOptions": { "allowJs": true, - "checkJs": true, - "strict": true, - "target": "esnext", - "module": "esnext", + "checkJs": true, + "strict": true, + "target": "ESNext", + "module": "NodeNext", + "moduleResolution": "NodeNext", "noUnusedLocals": true, "noUnusedParameters": true, "allowUnreachableCode": false, "noUncheckedIndexedAccess": true, - "declaration": true, - "declarationDir": "../dist/types", "isolatedModules": true, - "moduleResolution": "node" + "sourceMap": true, + "rewriteRelativeImportExtensions": true, }, } diff --git a/.config/tsconfig.types.json b/.config/tsconfig.types.json new file mode 100644 index 0000000..a8add8f --- /dev/null +++ b/.config/tsconfig.types.json @@ -0,0 +1,11 @@ +{ + // This exists for backwards compatibility. In the wild, folks are importing + // paths like `@orchidjs/sifter.js/dist/types/...`. + // + // Consider removing this in the next major version. + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../dist/types", + "emitDeclarationOnly": true + } +} diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..e3c47f4 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,26 @@ +name: Node.js CI + +on: + push: + branches: + - main + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: ['18.x', '20.x', '22.x'] + + steps: + - uses: actions/checkout@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + - run: npm ci + - run: npm run build + - run: npm run test + - run: npm run test:types diff --git a/.gitignore b/.gitignore index 29f81e4..513e10f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,4 @@ node_modules benchmark/report*.json coverage -package-lock.json -build -x-* dist diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ed6b70d..0000000 --- a/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -sudo: false -dist: focal -language: node_js -node_js: - - "12" - - "14" - - "16" - - "18" -script: - - npm run test:coveralls diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..25fa621 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib" +} diff --git a/lib/sifter.ts b/lib/sifter.ts index 39ae56f..8cc9b7b 100644 --- a/lib/sifter.ts +++ b/lib/sifter.ts @@ -14,9 +14,9 @@ * @author Brian Reavis */ -import { scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp } from './utils'; +import { scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp } from './utils.ts'; import { getPattern, escape_regex } from '@orchidjs/unicode-variants'; -import * as T from './types'; +import * as T from './types.ts'; class Sifter{ @@ -353,3 +353,4 @@ class Sifter{ } export { Sifter, scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp, getPattern } +export * from './types.ts'; diff --git a/lib/types.ts b/lib/types.ts index 8cb3484..d3ef26a 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -1,5 +1,5 @@ -import {Sifter} from './sifter'; +import {Sifter} from './sifter.ts'; export type Field = { field: string, diff --git a/lib/utils.ts b/lib/utils.ts index 4691d0b..a26783f 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -1,6 +1,6 @@ import { asciifold } from '@orchidjs/unicode-variants'; -import * as T from './types'; +import * as T from './types.ts'; /** diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7cd0e55 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6290 @@ +{ + "name": "@orchidjs/sifter", + "version": "1.0.3", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@orchidjs/sifter", + "version": "1.0.3", + "license": "Apache-2.0", + "dependencies": { + "@orchidjs/unicode-variants": "^1.1.2" + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.17.0", + "@babel/core": "^7.26.0", + "@babel/preset-env": "^7.26.0", + "@babel/preset-typescript": "^7.26.0", + "@rollup/plugin-babel": "^6.0.4", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-terser": "^0.4.4", + "humanize": "^0.0.9", + "jest": "^29.7.0", + "rollup": "^4.26.0", + "typescript": "^5.7.1-rc" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@andrewbranch/untar.js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@andrewbranch/untar.js/-/untar.js-1.0.3.tgz", + "integrity": "sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==", + "dev": true + }, + "node_modules/@arethetypeswrong/cli": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@arethetypeswrong/cli/-/cli-0.17.0.tgz", + "integrity": "sha512-xSMW7bfzVWpYw5JFgZqBXqr6PdR0/REmn3DkxCES5N0JTcB0CVgbIynJCvKBFmXaPc3hzmmTrb7+yPDRoOSZdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@arethetypeswrong/core": "0.17.0", + "chalk": "^4.1.2", + "cli-table3": "^0.6.3", + "commander": "^10.0.1", + "marked": "^9.1.2", + "marked-terminal": "^7.1.0", + "semver": "^7.5.4" + }, + "bin": { + "attw": "dist/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@arethetypeswrong/cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@arethetypeswrong/cli/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@arethetypeswrong/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@arethetypeswrong/core/-/core-0.17.0.tgz", + "integrity": "sha512-FHyhFizXNetigTVsIhqXKGYLpazPS5YNojEPpZEUcBPt9wVvoEbNIvG+hybuBR+pjlRcbyuqhukHZm1fr+bDgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@andrewbranch/untar.js": "^1.0.3", + "cjs-module-lexer": "^1.2.3", + "fflate": "^0.8.2", + "lru-cache": "^10.4.3", + "semver": "^7.5.4", + "typescript": "5.6.1-rc", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@arethetypeswrong/core/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@arethetypeswrong/core/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@arethetypeswrong/core/node_modules/typescript": { + "version": "5.6.1-rc", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.1-rc.tgz", + "integrity": "sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", + "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", + "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@orchidjs/unicode-variants": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@orchidjs/unicode-variants/-/unicode-variants-1.1.2.tgz", + "integrity": "sha512-5DobW1CHgnBROOEpFlEXytED5OosEWESFvg/VYmH0143oXcijYTprRYJTs+55HzGM4IqxiLFSuqEzu9mPNwVsA==", + "license": "Apache-2.0" + }, + "node_modules/@rollup/plugin-babel": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz", + "integrity": "sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", + "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", + "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", + "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", + "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", + "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", + "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", + "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", + "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", + "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", + "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", + "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", + "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", + "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", + "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", + "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", + "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", + "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", + "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.8" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.59", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.59.tgz", + "integrity": "sha512-faAXB6+gEbC8FsiRdpOXgOe4snP49YwjiXynEB8Mp7sUx80W5eN+BnnBHJ/F7eIeLzs+QBfDD40bJMm97oEFcw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/humanize/-/humanize-0.0.9.tgz", + "integrity": "sha512-bvZZ7vXpr1RKoImjuQ45hJb5OvE2oJafHysiD/AL3nkqTZH2hFCjQ3YZfCd63FefDitbJze/ispUPP0gfDsT2Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/marked": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", + "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/marked-terminal": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.2.1.tgz", + "integrity": "sha512-rQ1MoMFXZICWNsKMiiHwP/Z+92PLKskTPXj+e7uwXmuMPkNn7iTqC+IvDekVm1MPeC9wYQeLxeFaOvudRR/XbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "ansi-regex": "^6.1.0", + "chalk": "^5.3.0", + "cli-highlight": "^2.1.11", + "cli-table3": "^0.6.5", + "node-emoji": "^2.1.3", + "supports-hyperlinks": "^3.1.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <15" + } + }, + "node_modules/marked-terminal/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/marked-terminal/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/marked-terminal/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz", + "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/rollup": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", + "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.26.0", + "@rollup/rollup-android-arm64": "4.26.0", + "@rollup/rollup-darwin-arm64": "4.26.0", + "@rollup/rollup-darwin-x64": "4.26.0", + "@rollup/rollup-freebsd-arm64": "4.26.0", + "@rollup/rollup-freebsd-x64": "4.26.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", + "@rollup/rollup-linux-arm-musleabihf": "4.26.0", + "@rollup/rollup-linux-arm64-gnu": "4.26.0", + "@rollup/rollup-linux-arm64-musl": "4.26.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", + "@rollup/rollup-linux-riscv64-gnu": "4.26.0", + "@rollup/rollup-linux-s390x-gnu": "4.26.0", + "@rollup/rollup-linux-x64-gnu": "4.26.0", + "@rollup/rollup-linux-x64-musl": "4.26.0", + "@rollup/rollup-win32-arm64-msvc": "4.26.0", + "@rollup/rollup-win32-ia32-msvc": "4.26.0", + "@rollup/rollup-win32-x64-msvc": "4.26.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/terser": { + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.7.1-rc", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.1-rc.tgz", + "integrity": "sha512-d6m+HT78uZtyUbXbUyIvuJ6kXCTSJEfy+2pZSUwt9d6JZ0kOMNDwhIILfV5FnaxMwVa48Yfw4sK0ISC4Qyq5tw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index ca680b8..c467a72 100644 --- a/package.json +++ b/package.json @@ -14,36 +14,46 @@ "version": "1.0.3", "license": "Apache-2.0", "author": "Brian Reavis ", - "main": "dist/umd/sifter.js", - "browser": "dist/umd/sifter.js", + "type": "module", + "main": "dist/cjs/sifter.js", "module": "dist/esm/sifter.js", - "types": "dist/types/sifter.d.ts", + "browser": "dist/umd/sifter.js", + "exports": { + ".": { + "import": "./dist/esm/sifter.js", + "require": "./dist/cjs/sifter.js" + }, + "./types/*": "./dist/types/*", + "./dist/*": "./dist/*", + "./package.json": "./package.json" + }, "repository": { "type": "git", "url": "https://github.com/orchidjs/sifter.js.git" }, "scripts": { "test": "jest --coverage", - "test:typescript": "tsc -p .config --noemit", - "test:coveralls": "npm run build && jest --coverage && cat ./coverage/lcov.info | coveralls", + "test:types": "attw --pack .", "pretest": "npm run build", "benchmark": "npm run build && node --expose-gc benchmark/index.js", - "build": "npx rollup -c .config/rollup.config.js", - "build:types": "tsc -p .config --emitDeclarationOnly" + "build": "rm -rf dist && npm run build:esm && npm run build:cjs && npm run build:umd && npm run build:types", + "build:esm": "tsc -p .config/tsconfig.esm.json", + "build:cjs": "tsc -p .config/tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > ./dist/cjs/package.json", + "build:umd": "npx rollup -c .config/rollup.config.mjs && echo '{\"type\":\"commonjs\"}' > ./dist/umd/package.json", + "build:types": "tsc -p .config/tsconfig.types.json" }, "devDependencies": { - "@babel/core": "^7.13.16", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/preset-env": "^7.13.15", - "@babel/preset-typescript": "^7.13.0", - "@rollup/plugin-babel": "^5.3.0", - "@rollup/plugin-node-resolve": "^13.0.0", - "coveralls": "^3.1.0", - "humanize": "0.0.9", - "jest": "^28.1.2", - "rollup": "^2.45.2", - "rollup-plugin-terser": "^7.0.2", - "typescript": "^4.8.3" + "@arethetypeswrong/cli": "^0.17.0", + "@babel/core": "^7.26.0", + "@babel/preset-env": "^7.26.0", + "@babel/preset-typescript": "^7.26.0", + "@rollup/plugin-babel": "^6.0.4", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-terser": "^0.4.4", + "humanize": "^0.0.9", + "jest": "^29.7.0", + "rollup": "^4.26.0", + "typescript": "^5.7.1-rc" }, "browserslist": [ ">= 0.5%", @@ -66,6 +76,6 @@ "/lib" ], "dependencies": { - "@orchidjs/unicode-variants": "^1.0.4" + "@orchidjs/unicode-variants": "^1.1.2" } } From b6b6004c65f34b98d6f532323acff1dbfe196f7e Mon Sep 17 00:00:00 2001 From: Nathan Sarang-Walters Date: Thu, 14 Nov 2024 16:34:47 -0800 Subject: [PATCH 139/140] Tweak release script --- release.sh | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/release.sh b/release.sh index cf67ab3..30494c2 100755 --- a/release.sh +++ b/release.sh @@ -64,18 +64,13 @@ if ! [[ "$VERSION" =~ ^([0-9]\.[0-9]\.[0-9]) ]]; then fi -# make sure tests pass -if ! npm test; then - echo 'Tests failed... cannot create release' - exit -fi - # update package.json and package-lock.json -if ! sed -i 's/"version": "[^"]*"/"version": "'$VERSION'"/' package.json; then - echo 'version not replaced in package-lock.json' +if ! npm version --git-tag-version=false $VERSION; then + echo 'Version not updated' exit fi + # build from source if ! npm run build; then echo 'Build failed... cannot create release' @@ -83,6 +78,13 @@ if ! npm run build; then fi +# make sure tests pass +if ! npm test; then + echo 'Tests failed... cannot create release' + exit +fi + + # make sure types are up-to-date if ! npm run build:types; then echo 'types not generated' From 18a1a48ac74d74b4428925c94f9562e0d603e38b Mon Sep 17 00:00:00 2001 From: Nathan Sarang-Walters Date: Thu, 14 Nov 2024 16:35:30 -0800 Subject: [PATCH 140/140] v1.1.0 Release --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7cd0e55..801af83 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@orchidjs/sifter", - "version": "1.0.3", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@orchidjs/sifter", - "version": "1.0.3", + "version": "1.1.0", "license": "Apache-2.0", "dependencies": { "@orchidjs/unicode-variants": "^1.1.2" diff --git a/package.json b/package.json index c467a72..7085cb0 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "autocomplete" ], "description": "A library for textually searching arrays and hashes of objects by property (or multiple properties). Designed specifically for autocomplete.", - "version": "1.0.3", + "version": "1.1.0", "license": "Apache-2.0", "author": "Brian Reavis ", "type": "module",