Comparing version 3.0.2 to 3.0.4
@@ -79,675 +79,12 @@ var prepare = function (query, source, opts) { | ||
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; | ||
/** | ||
* lodash (Custom Build) <https://lodash.com/> | ||
* Build: `lodash modularize exports="npm" -o ./` | ||
* Copyright jQuery Foundation and other contributors <https://jquery.org/> | ||
* Released under MIT license <https://lodash.com/license> | ||
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> | ||
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors | ||
*/ | ||
/** Used as references for various `Number` constants. */ | ||
var INFINITY = 1 / 0; | ||
/** `Object#toString` result references. */ | ||
var symbolTag = '[object Symbol]'; | ||
/** Used to match Latin Unicode letters (excluding mathematical operators). */ | ||
var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; | ||
/** Used to compose unicode character classes. */ | ||
var rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23', | ||
rsComboSymbolsRange = '\\u20d0-\\u20f0'; | ||
/** Used to compose unicode capture groups. */ | ||
var rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']'; | ||
/** | ||
* Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and | ||
* [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). | ||
*/ | ||
var reComboMark = RegExp(rsCombo, 'g'); | ||
/** Used to map Latin Unicode letters to basic Latin letters. */ | ||
var deburredLetters = { | ||
// Latin-1 Supplement block. | ||
'\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', | ||
'\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', | ||
'\xc7': 'C', '\xe7': 'c', | ||
'\xd0': 'D', '\xf0': 'd', | ||
'\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', | ||
'\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', | ||
'\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', | ||
'\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', | ||
'\xd1': 'N', '\xf1': 'n', | ||
'\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', | ||
'\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', | ||
'\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', | ||
'\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', | ||
'\xdd': 'Y', '\xfd': 'y', '\xff': 'y', | ||
'\xc6': 'Ae', '\xe6': 'ae', | ||
'\xde': 'Th', '\xfe': 'th', | ||
'\xdf': 'ss', | ||
// Latin Extended-A block. | ||
'\u0100': 'A', '\u0102': 'A', '\u0104': 'A', | ||
'\u0101': 'a', '\u0103': 'a', '\u0105': 'a', | ||
'\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', | ||
'\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', | ||
'\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', | ||
'\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', | ||
'\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', | ||
'\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', | ||
'\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', | ||
'\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', | ||
'\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', | ||
'\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', | ||
'\u0134': 'J', '\u0135': 'j', | ||
'\u0136': 'K', '\u0137': 'k', '\u0138': 'k', | ||
'\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', | ||
'\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', | ||
'\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', | ||
'\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', | ||
'\u014c': 'O', '\u014e': 'O', '\u0150': 'O', | ||
'\u014d': 'o', '\u014f': 'o', '\u0151': 'o', | ||
'\u0154': 'R', '\u0156': 'R', '\u0158': 'R', | ||
'\u0155': 'r', '\u0157': 'r', '\u0159': 'r', | ||
'\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', | ||
'\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', | ||
'\u0162': 'T', '\u0164': 'T', '\u0166': 'T', | ||
'\u0163': 't', '\u0165': 't', '\u0167': 't', | ||
'\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', | ||
'\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', | ||
'\u0174': 'W', '\u0175': 'w', | ||
'\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', | ||
'\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', | ||
'\u017a': 'z', '\u017c': 'z', '\u017e': 'z', | ||
'\u0132': 'IJ', '\u0133': 'ij', | ||
'\u0152': 'Oe', '\u0153': 'oe', | ||
'\u0149': "'n", '\u017f': 'ss' | ||
}; | ||
/** Detect free variable `global` from Node.js. */ | ||
var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; | ||
/** Detect free variable `self`. */ | ||
var freeSelf = typeof self == 'object' && self && self.Object === Object && self; | ||
/** Used as a reference to the global object. */ | ||
var root = freeGlobal || freeSelf || Function('return this')(); | ||
/** | ||
* The base implementation of `_.propertyOf` without support for deep paths. | ||
* | ||
* @private | ||
* @param {Object} object The object to query. | ||
* @returns {Function} Returns the new accessor function. | ||
*/ | ||
function basePropertyOf(object) { | ||
return function(key) { | ||
return object == null ? undefined : object[key]; | ||
}; | ||
} | ||
/** | ||
* Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A | ||
* letters to basic Latin letters. | ||
* | ||
* @private | ||
* @param {string} letter The matched letter to deburr. | ||
* @returns {string} Returns the deburred letter. | ||
*/ | ||
var deburrLetter = basePropertyOf(deburredLetters); | ||
/** Used for built-in method references. */ | ||
var objectProto = Object.prototype; | ||
/** | ||
* Used to resolve the | ||
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) | ||
* of values. | ||
*/ | ||
var objectToString = objectProto.toString; | ||
/** Built-in value references. */ | ||
var Symbol = root.Symbol; | ||
/** Used to convert symbols to primitives and strings. */ | ||
var symbolProto = Symbol ? Symbol.prototype : undefined, | ||
symbolToString = symbolProto ? symbolProto.toString : undefined; | ||
/** | ||
* The base implementation of `_.toString` which doesn't convert nullish | ||
* values to empty strings. | ||
* | ||
* @private | ||
* @param {*} value The value to process. | ||
* @returns {string} Returns the string. | ||
*/ | ||
function baseToString(value) { | ||
// Exit early for strings to avoid a performance hit in some environments. | ||
if (typeof value == 'string') { | ||
return value; | ||
} | ||
if (isSymbol(value)) { | ||
return symbolToString ? symbolToString.call(value) : ''; | ||
} | ||
var result = (value + ''); | ||
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; | ||
} | ||
/** | ||
* Checks if `value` is object-like. A value is object-like if it's not `null` | ||
* and has a `typeof` result of "object". | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @since 4.0.0 | ||
* @category Lang | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is object-like, else `false`. | ||
* @example | ||
* | ||
* _.isObjectLike({}); | ||
* // => true | ||
* | ||
* _.isObjectLike([1, 2, 3]); | ||
* // => true | ||
* | ||
* _.isObjectLike(_.noop); | ||
* // => false | ||
* | ||
* _.isObjectLike(null); | ||
* // => false | ||
*/ | ||
function isObjectLike(value) { | ||
return !!value && typeof value == 'object'; | ||
} | ||
/** | ||
* Checks if `value` is classified as a `Symbol` primitive or object. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @since 4.0.0 | ||
* @category Lang | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`. | ||
* @example | ||
* | ||
* _.isSymbol(Symbol.iterator); | ||
* // => true | ||
* | ||
* _.isSymbol('abc'); | ||
* // => false | ||
*/ | ||
function isSymbol(value) { | ||
return typeof value == 'symbol' || | ||
(isObjectLike(value) && objectToString.call(value) == symbolTag); | ||
} | ||
/** | ||
* Converts `value` to a string. An empty string is returned for `null` | ||
* and `undefined` values. The sign of `-0` is preserved. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @since 4.0.0 | ||
* @category Lang | ||
* @param {*} value The value to process. | ||
* @returns {string} Returns the string. | ||
* @example | ||
* | ||
* _.toString(null); | ||
* // => '' | ||
* | ||
* _.toString(-0); | ||
* // => '-0' | ||
* | ||
* _.toString([1, 2, 3]); | ||
* // => '1,2,3' | ||
*/ | ||
function toString(value) { | ||
return value == null ? '' : baseToString(value); | ||
} | ||
/** | ||
* Deburrs `string` by converting | ||
* [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) | ||
* and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) | ||
* letters to basic Latin letters and removing | ||
* [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @since 3.0.0 | ||
* @category String | ||
* @param {string} [string=''] The string to deburr. | ||
* @returns {string} Returns the deburred string. | ||
* @example | ||
* | ||
* _.deburr('déjà vu'); | ||
* // => 'deja vu' | ||
*/ | ||
function deburr(string) { | ||
string = toString(string); | ||
return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); | ||
} | ||
var lodash_deburr = deburr; | ||
var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; | ||
var escapeStringRegexp = function (str) { | ||
if (typeof str !== 'string') { | ||
throw new TypeError('Expected a string'); | ||
} | ||
return str.replace(matchOperatorsRe, '\\$&'); | ||
}; | ||
var replacements = [ | ||
// German umlauts | ||
['ß', 'ss'], | ||
['ä', 'ae'], | ||
['Ä', 'Ae'], | ||
['ö', 'oe'], | ||
['Ö', 'Oe'], | ||
['ü', 'ue'], | ||
['Ü', 'Ue'], | ||
// Vietnamese | ||
['à', 'a'], | ||
['À', 'A'], | ||
['á', 'a'], | ||
['Á', 'A'], | ||
['â', 'a'], | ||
['Â', 'A'], | ||
['ã', 'a'], | ||
['Ã', 'A'], | ||
['è', 'e'], | ||
['È', 'E'], | ||
['é', 'e'], | ||
['É', 'E'], | ||
['ê', 'e'], | ||
['Ê', 'E'], | ||
['ì', 'i'], | ||
['Ì', 'I'], | ||
['í', 'i'], | ||
['Í', 'I'], | ||
['ò', 'o'], | ||
['Ò', 'O'], | ||
['ó', 'o'], | ||
['Ó', 'O'], | ||
['ô', 'o'], | ||
['Ô', 'O'], | ||
['õ', 'o'], | ||
['Õ', 'O'], | ||
['ù', 'u'], | ||
['Ù', 'U'], | ||
['ú', 'u'], | ||
['Ú', 'U'], | ||
['ý', 'y'], | ||
['Ý', 'Y'], | ||
['ă', 'a'], | ||
['Ă', 'A'], | ||
['Đ', 'D'], | ||
['đ', 'd'], | ||
['ĩ', 'i'], | ||
['Ĩ', 'I'], | ||
['ũ', 'u'], | ||
['Ũ', 'U'], | ||
['ơ', 'o'], | ||
['Ơ', 'O'], | ||
['ư', 'u'], | ||
['Ư', 'U'], | ||
['ạ', 'a'], | ||
['Ạ', 'A'], | ||
['ả', 'a'], | ||
['Ả', 'A'], | ||
['ấ', 'a'], | ||
['Ấ', 'A'], | ||
['ầ', 'a'], | ||
['Ầ', 'A'], | ||
['ẩ', 'a'], | ||
['Ẩ', 'A'], | ||
['ẫ', 'a'], | ||
['Ẫ', 'A'], | ||
['ậ', 'a'], | ||
['Ậ', 'A'], | ||
['ắ', 'a'], | ||
['Ắ', 'A'], | ||
['ằ', 'a'], | ||
['Ằ', 'A'], | ||
['ẳ', 'a'], | ||
['Ẳ', 'A'], | ||
['ẵ', 'a'], | ||
['Ẵ', 'A'], | ||
['ặ', 'a'], | ||
['Ặ', 'A'], | ||
['ẹ', 'e'], | ||
['Ẹ', 'E'], | ||
['ẻ', 'e'], | ||
['Ẻ', 'E'], | ||
['ẽ', 'e'], | ||
['Ẽ', 'E'], | ||
['ế', 'e'], | ||
['Ế', 'E'], | ||
['ề', 'e'], | ||
['Ề', 'E'], | ||
['ể', 'e'], | ||
['Ể', 'E'], | ||
['ễ', 'e'], | ||
['Ễ', 'E'], | ||
['ệ', 'e'], | ||
['Ệ', 'E'], | ||
['ỉ', 'i'], | ||
['Ỉ', 'I'], | ||
['ị', 'i'], | ||
['Ị', 'I'], | ||
['ọ', 'o'], | ||
['Ọ', 'O'], | ||
['ỏ', 'o'], | ||
['Ỏ', 'O'], | ||
['ố', 'o'], | ||
['Ố', 'O'], | ||
['ồ', 'o'], | ||
['Ồ', 'O'], | ||
['ổ', 'o'], | ||
['Ổ', 'O'], | ||
['ỗ', 'o'], | ||
['Ỗ', 'O'], | ||
['ộ', 'o'], | ||
['Ộ', 'O'], | ||
['ớ', 'o'], | ||
['Ớ', 'O'], | ||
['ờ', 'o'], | ||
['Ờ', 'O'], | ||
['ở', 'o'], | ||
['Ở', 'O'], | ||
['ỡ', 'o'], | ||
['Ỡ', 'O'], | ||
['ợ', 'o'], | ||
['Ợ', 'O'], | ||
['ụ', 'u'], | ||
['Ụ', 'U'], | ||
['ủ', 'u'], | ||
['Ủ', 'U'], | ||
['ứ', 'u'], | ||
['Ứ', 'U'], | ||
['ừ', 'u'], | ||
['Ừ', 'U'], | ||
['ử', 'u'], | ||
['Ử', 'U'], | ||
['ữ', 'u'], | ||
['Ữ', 'U'], | ||
['ự', 'u'], | ||
['Ự', 'U'], | ||
['ỳ', 'y'], | ||
['Ỳ', 'Y'], | ||
['ỵ', 'y'], | ||
['Ỵ', 'Y'], | ||
['ỷ', 'y'], | ||
['Ỷ', 'Y'], | ||
['ỹ', 'y'], | ||
['Ỹ', 'Y'], | ||
// Arabic | ||
['ء', 'e'], | ||
['آ', 'a'], | ||
['أ', 'a'], | ||
['ؤ', 'w'], | ||
['إ', 'i'], | ||
['ئ', 'y'], | ||
['ا', 'a'], | ||
['ب', 'b'], | ||
['ة', 't'], | ||
['ت', 't'], | ||
['ث', 'th'], | ||
['ج', 'j'], | ||
['ح', 'h'], | ||
['خ', 'kh'], | ||
['د', 'd'], | ||
['ذ', 'dh'], | ||
['ر', 'r'], | ||
['ز', 'z'], | ||
['س', 's'], | ||
['ش', 'sh'], | ||
['ص', 's'], | ||
['ض', 'd'], | ||
['ط', 't'], | ||
['ظ', 'z'], | ||
['ع', 'e'], | ||
['غ', 'gh'], | ||
['ـ', '_'], | ||
['ف', 'f'], | ||
['ق', 'q'], | ||
['ك', 'k'], | ||
['ل', 'l'], | ||
['م', 'm'], | ||
['ن', 'n'], | ||
['ه', 'h'], | ||
['و', 'w'], | ||
['ى', 'a'], | ||
['ي', 'y'], | ||
['َ', 'a'], | ||
['ُ', 'u'], | ||
['ِ', 'i'], | ||
['٠', '0'], | ||
['١', '1'], | ||
['٢', '2'], | ||
['٣', '3'], | ||
['٤', '4'], | ||
['٥', '5'], | ||
['٦', '6'], | ||
['٧', '7'], | ||
['٨', '8'], | ||
['٩', '9'], | ||
// Persian / Farsi | ||
['چ', 'ch'], | ||
['ک', 'k'], | ||
['گ', 'g'], | ||
['پ', 'p'], | ||
['ژ', 'zh'], | ||
['ی', 'y'], | ||
['۰', '0'], | ||
['۱', '1'], | ||
['۲', '2'], | ||
['۳', '3'], | ||
['۴', '4'], | ||
['۵', '5'], | ||
['۶', '6'], | ||
['۷', '7'], | ||
['۸', '8'], | ||
['۹', '9'], | ||
// Pashto | ||
['ټ', 'p'], | ||
['ځ', 'z'], | ||
['څ', 'c'], | ||
['ډ', 'd'], | ||
['ﺫ', 'd'], | ||
['ﺭ', 'r'], | ||
['ړ', 'r'], | ||
['ﺯ', 'z'], | ||
['ږ', 'g'], | ||
['ښ', 'x'], | ||
['ګ', 'g'], | ||
['ڼ', 'n'], | ||
['ۀ', 'e'], | ||
['ې', 'e'], | ||
['ۍ', 'ai'], | ||
// Urdu | ||
['ٹ', 't'], | ||
['ڈ', 'd'], | ||
['ڑ', 'r'], | ||
['ں', 'n'], | ||
['ہ', 'h'], | ||
['ھ', 'h'], | ||
['ے', 'e'], | ||
// Russian | ||
['А', 'A'], | ||
['а', 'a'], | ||
['Б', 'B'], | ||
['б', 'b'], | ||
['В', 'V'], | ||
['в', 'v'], | ||
['Г', 'G'], | ||
['г', 'g'], | ||
['Д', 'D'], | ||
['д', 'd'], | ||
['Е', 'E'], | ||
['е', 'e'], | ||
['Ж', 'Zh'], | ||
['ж', 'zh'], | ||
['З', 'Z'], | ||
['з', 'z'], | ||
['И', 'I'], | ||
['и', 'i'], | ||
['Й', 'J'], | ||
['й', 'j'], | ||
['К', 'K'], | ||
['к', 'k'], | ||
['Л', 'L'], | ||
['л', 'l'], | ||
['М', 'M'], | ||
['м', 'm'], | ||
['Н', 'N'], | ||
['н', 'n'], | ||
['О', 'O'], | ||
['о', 'o'], | ||
['П', 'P'], | ||
['п', 'p'], | ||
['Р', 'R'], | ||
['р', 'r'], | ||
['С', 'S'], | ||
['с', 's'], | ||
['Т', 'T'], | ||
['т', 't'], | ||
['У', 'U'], | ||
['у', 'u'], | ||
['Ф', 'F'], | ||
['ф', 'f'], | ||
['Х', 'H'], | ||
['х', 'h'], | ||
['Ц', 'Cz'], | ||
['ц', 'cz'], | ||
['Ч', 'Ch'], | ||
['ч', 'ch'], | ||
['Ш', 'Sh'], | ||
['ш', 'sh'], | ||
['Щ', 'Shh'], | ||
['щ', 'shh'], | ||
['Ъ', ''], | ||
['ъ', ''], | ||
['Ы', 'Y'], | ||
['ы', 'y'], | ||
['Ь', ''], | ||
['ь', ''], | ||
['Э', 'E'], | ||
['э', 'e'], | ||
['Ю', 'Yu'], | ||
['ю', 'yu'], | ||
['Я', 'Ya'], | ||
['я', 'ya'], | ||
['Ё', 'Yo'], | ||
['ё', 'yo'], | ||
// Romanian | ||
['ș', 's'], | ||
['Ș', 's'], | ||
['ț', 't'], | ||
['Ț', 't'], | ||
// Turkish | ||
['ş', 's'], | ||
['Ş', 's'], | ||
['ç', 'c'], | ||
['Ç', 'c'], | ||
['ğ', 'g'], | ||
['Ğ', 'g'], | ||
['ı', 'i'], | ||
['İ', 'i'] | ||
]; | ||
var overridableReplacements = [ | ||
['&', ' and '], | ||
['🦄', ' unicorn '], | ||
['♥', ' love '] | ||
]; | ||
const decamelize = string => { | ||
return string | ||
.replace(/([a-z\d])([A-Z])/g, '$1 $2') | ||
.replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1 $2'); | ||
}; | ||
const doCustomReplacements = (string, replacements) => { | ||
for (const [key, value] of replacements) { | ||
string = string.replace(new RegExp(escapeStringRegexp(key), 'g'), value); | ||
} | ||
return string; | ||
}; | ||
const removeMootSeparators = (string, separator) => { | ||
return string | ||
.replace(new RegExp(`${separator}{2,}`, 'g'), separator) | ||
.replace(new RegExp(`^${separator}|${separator}$`, 'g'), ''); | ||
}; | ||
const slugify = (string, options) => { | ||
if (typeof string !== 'string') { | ||
throw new TypeError(`Expected a string, got \`${typeof string}\``); | ||
} | ||
options = { | ||
separator: '-', | ||
lowercase: true, | ||
decamelize: true, | ||
customReplacements: [], | ||
...options | ||
}; | ||
const separator = escapeStringRegexp(options.separator); | ||
const customReplacements = new Map([ | ||
...overridableReplacements, | ||
...options.customReplacements, | ||
...replacements | ||
]); | ||
string = doCustomReplacements(string, customReplacements); | ||
string = lodash_deburr(string); | ||
string = string.normalize('NFKD'); | ||
if (options.decamelize) { | ||
string = decamelize(string); | ||
} | ||
let patternSlug = /[^a-zA-Z\d]+/g; | ||
if (options.lowercase) { | ||
string = string.toLowerCase(); | ||
patternSlug = /[^a-z\d]+/g; | ||
} | ||
string = string.replace(patternSlug, separator); | ||
string = string.replace(/\\/g, ''); | ||
string = removeMootSeparators(string, separator); | ||
return string; | ||
}; | ||
var slugify_1 = slugify; | ||
// TODO: Remove this for the next major release | ||
var default_1 = slugify; | ||
slugify_1.default = default_1; | ||
// XRegExp('\\p{Latin}') | ||
var latinCharacter = /[\u0041-\u005A\u0061-\u007A\u00AA\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A-\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA7FF\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A]/; | ||
var isLeading = function (prevChar, char) { | ||
var precededBySeparator = ['-', '_', ' ', '.', '/', '\\'].indexOf(prevChar) > -1; | ||
var isCharLeading = char.toUpperCase() === char && /\w/.test(slugify_1(char)); | ||
var precededBySeparator = prevChar === '-' || | ||
prevChar === '_' || | ||
prevChar === ' ' || | ||
prevChar === '.' || | ||
prevChar === '/' || | ||
prevChar === '\\'; | ||
var isCharLeading = char.toUpperCase() === char && latinCharacter.test(char); | ||
return precededBySeparator || isCharLeading; | ||
@@ -953,6 +290,12 @@ }; | ||
var get = function (object, path) { | ||
if (!path) { | ||
return object; | ||
} | ||
return path.indexOf('.') > -1 ? dotProp_1(object, path) : object[path]; | ||
}; | ||
var filter = function (query, options) { | ||
if (options === void 0) { options = {}; } | ||
return function (source) { | ||
return test(query, dotProp_1(source, options.sourcePath || ''), options); | ||
return test(query, get(source, options.sourcePath || ''), options); | ||
}; | ||
@@ -970,4 +313,4 @@ }; | ||
return function (leftSource, rightSource) { | ||
var leftScore = match(query, dotProp_1(leftSource, sourcePath), matchOptions).score; | ||
var rightScore = match(query, dotProp_1(rightSource, sourcePath), matchOptions).score; | ||
var leftScore = match(query, get(leftSource, sourcePath), matchOptions).score; | ||
var rightScore = match(query, get(rightSource, sourcePath), matchOptions).score; | ||
if (rightScore === leftScore) | ||
@@ -980,10 +323,10 @@ return 0; | ||
return function (leftSource, rightSource) { | ||
var leftId = dotProp_1(leftSource, options.idPath); | ||
var rightId = dotProp_1(rightSource, options.idPath); | ||
var leftId = get(leftSource, options.idPath); | ||
var rightId = get(rightSource, options.idPath); | ||
var leftScore = memo.hasOwnProperty(leftId) | ||
? memo[leftId] | ||
: match(query, dotProp_1(leftSource, sourcePath), matchOptions).score; | ||
: match(query, get(leftSource, sourcePath), matchOptions).score; | ||
var rightScore = memo.hasOwnProperty(rightId) | ||
? memo[rightId] | ||
: match(query, dotProp_1(rightSource, sourcePath), matchOptions).score; | ||
: match(query, get(rightSource, sourcePath), matchOptions).score; | ||
if (!memo.hasOwnProperty(leftId)) { | ||
@@ -990,0 +333,0 @@ memo[leftId] = leftScore; |
@@ -85,675 +85,12 @@ (function (global, factory) { | ||
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; | ||
/** | ||
* lodash (Custom Build) <https://lodash.com/> | ||
* Build: `lodash modularize exports="npm" -o ./` | ||
* Copyright jQuery Foundation and other contributors <https://jquery.org/> | ||
* Released under MIT license <https://lodash.com/license> | ||
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> | ||
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors | ||
*/ | ||
/** Used as references for various `Number` constants. */ | ||
var INFINITY = 1 / 0; | ||
/** `Object#toString` result references. */ | ||
var symbolTag = '[object Symbol]'; | ||
/** Used to match Latin Unicode letters (excluding mathematical operators). */ | ||
var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; | ||
/** Used to compose unicode character classes. */ | ||
var rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23', | ||
rsComboSymbolsRange = '\\u20d0-\\u20f0'; | ||
/** Used to compose unicode capture groups. */ | ||
var rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']'; | ||
/** | ||
* Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and | ||
* [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). | ||
*/ | ||
var reComboMark = RegExp(rsCombo, 'g'); | ||
/** Used to map Latin Unicode letters to basic Latin letters. */ | ||
var deburredLetters = { | ||
// Latin-1 Supplement block. | ||
'\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', | ||
'\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', | ||
'\xc7': 'C', '\xe7': 'c', | ||
'\xd0': 'D', '\xf0': 'd', | ||
'\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', | ||
'\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', | ||
'\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', | ||
'\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', | ||
'\xd1': 'N', '\xf1': 'n', | ||
'\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', | ||
'\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', | ||
'\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', | ||
'\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', | ||
'\xdd': 'Y', '\xfd': 'y', '\xff': 'y', | ||
'\xc6': 'Ae', '\xe6': 'ae', | ||
'\xde': 'Th', '\xfe': 'th', | ||
'\xdf': 'ss', | ||
// Latin Extended-A block. | ||
'\u0100': 'A', '\u0102': 'A', '\u0104': 'A', | ||
'\u0101': 'a', '\u0103': 'a', '\u0105': 'a', | ||
'\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', | ||
'\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', | ||
'\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', | ||
'\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', | ||
'\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', | ||
'\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', | ||
'\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', | ||
'\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', | ||
'\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', | ||
'\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', | ||
'\u0134': 'J', '\u0135': 'j', | ||
'\u0136': 'K', '\u0137': 'k', '\u0138': 'k', | ||
'\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', | ||
'\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', | ||
'\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', | ||
'\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', | ||
'\u014c': 'O', '\u014e': 'O', '\u0150': 'O', | ||
'\u014d': 'o', '\u014f': 'o', '\u0151': 'o', | ||
'\u0154': 'R', '\u0156': 'R', '\u0158': 'R', | ||
'\u0155': 'r', '\u0157': 'r', '\u0159': 'r', | ||
'\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', | ||
'\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', | ||
'\u0162': 'T', '\u0164': 'T', '\u0166': 'T', | ||
'\u0163': 't', '\u0165': 't', '\u0167': 't', | ||
'\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', | ||
'\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', | ||
'\u0174': 'W', '\u0175': 'w', | ||
'\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', | ||
'\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', | ||
'\u017a': 'z', '\u017c': 'z', '\u017e': 'z', | ||
'\u0132': 'IJ', '\u0133': 'ij', | ||
'\u0152': 'Oe', '\u0153': 'oe', | ||
'\u0149': "'n", '\u017f': 'ss' | ||
}; | ||
/** Detect free variable `global` from Node.js. */ | ||
var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; | ||
/** Detect free variable `self`. */ | ||
var freeSelf = typeof self == 'object' && self && self.Object === Object && self; | ||
/** Used as a reference to the global object. */ | ||
var root = freeGlobal || freeSelf || Function('return this')(); | ||
/** | ||
* The base implementation of `_.propertyOf` without support for deep paths. | ||
* | ||
* @private | ||
* @param {Object} object The object to query. | ||
* @returns {Function} Returns the new accessor function. | ||
*/ | ||
function basePropertyOf(object) { | ||
return function(key) { | ||
return object == null ? undefined : object[key]; | ||
}; | ||
} | ||
/** | ||
* Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A | ||
* letters to basic Latin letters. | ||
* | ||
* @private | ||
* @param {string} letter The matched letter to deburr. | ||
* @returns {string} Returns the deburred letter. | ||
*/ | ||
var deburrLetter = basePropertyOf(deburredLetters); | ||
/** Used for built-in method references. */ | ||
var objectProto = Object.prototype; | ||
/** | ||
* Used to resolve the | ||
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) | ||
* of values. | ||
*/ | ||
var objectToString = objectProto.toString; | ||
/** Built-in value references. */ | ||
var Symbol = root.Symbol; | ||
/** Used to convert symbols to primitives and strings. */ | ||
var symbolProto = Symbol ? Symbol.prototype : undefined, | ||
symbolToString = symbolProto ? symbolProto.toString : undefined; | ||
/** | ||
* The base implementation of `_.toString` which doesn't convert nullish | ||
* values to empty strings. | ||
* | ||
* @private | ||
* @param {*} value The value to process. | ||
* @returns {string} Returns the string. | ||
*/ | ||
function baseToString(value) { | ||
// Exit early for strings to avoid a performance hit in some environments. | ||
if (typeof value == 'string') { | ||
return value; | ||
} | ||
if (isSymbol(value)) { | ||
return symbolToString ? symbolToString.call(value) : ''; | ||
} | ||
var result = (value + ''); | ||
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; | ||
} | ||
/** | ||
* Checks if `value` is object-like. A value is object-like if it's not `null` | ||
* and has a `typeof` result of "object". | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @since 4.0.0 | ||
* @category Lang | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is object-like, else `false`. | ||
* @example | ||
* | ||
* _.isObjectLike({}); | ||
* // => true | ||
* | ||
* _.isObjectLike([1, 2, 3]); | ||
* // => true | ||
* | ||
* _.isObjectLike(_.noop); | ||
* // => false | ||
* | ||
* _.isObjectLike(null); | ||
* // => false | ||
*/ | ||
function isObjectLike(value) { | ||
return !!value && typeof value == 'object'; | ||
} | ||
/** | ||
* Checks if `value` is classified as a `Symbol` primitive or object. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @since 4.0.0 | ||
* @category Lang | ||
* @param {*} value The value to check. | ||
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`. | ||
* @example | ||
* | ||
* _.isSymbol(Symbol.iterator); | ||
* // => true | ||
* | ||
* _.isSymbol('abc'); | ||
* // => false | ||
*/ | ||
function isSymbol(value) { | ||
return typeof value == 'symbol' || | ||
(isObjectLike(value) && objectToString.call(value) == symbolTag); | ||
} | ||
/** | ||
* Converts `value` to a string. An empty string is returned for `null` | ||
* and `undefined` values. The sign of `-0` is preserved. | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @since 4.0.0 | ||
* @category Lang | ||
* @param {*} value The value to process. | ||
* @returns {string} Returns the string. | ||
* @example | ||
* | ||
* _.toString(null); | ||
* // => '' | ||
* | ||
* _.toString(-0); | ||
* // => '-0' | ||
* | ||
* _.toString([1, 2, 3]); | ||
* // => '1,2,3' | ||
*/ | ||
function toString(value) { | ||
return value == null ? '' : baseToString(value); | ||
} | ||
/** | ||
* Deburrs `string` by converting | ||
* [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) | ||
* and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) | ||
* letters to basic Latin letters and removing | ||
* [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). | ||
* | ||
* @static | ||
* @memberOf _ | ||
* @since 3.0.0 | ||
* @category String | ||
* @param {string} [string=''] The string to deburr. | ||
* @returns {string} Returns the deburred string. | ||
* @example | ||
* | ||
* _.deburr('déjà vu'); | ||
* // => 'deja vu' | ||
*/ | ||
function deburr(string) { | ||
string = toString(string); | ||
return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); | ||
} | ||
var lodash_deburr = deburr; | ||
var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; | ||
var escapeStringRegexp = function (str) { | ||
if (typeof str !== 'string') { | ||
throw new TypeError('Expected a string'); | ||
} | ||
return str.replace(matchOperatorsRe, '\\$&'); | ||
}; | ||
var replacements = [ | ||
// German umlauts | ||
['ß', 'ss'], | ||
['ä', 'ae'], | ||
['Ä', 'Ae'], | ||
['ö', 'oe'], | ||
['Ö', 'Oe'], | ||
['ü', 'ue'], | ||
['Ü', 'Ue'], | ||
// Vietnamese | ||
['à', 'a'], | ||
['À', 'A'], | ||
['á', 'a'], | ||
['Á', 'A'], | ||
['â', 'a'], | ||
['Â', 'A'], | ||
['ã', 'a'], | ||
['Ã', 'A'], | ||
['è', 'e'], | ||
['È', 'E'], | ||
['é', 'e'], | ||
['É', 'E'], | ||
['ê', 'e'], | ||
['Ê', 'E'], | ||
['ì', 'i'], | ||
['Ì', 'I'], | ||
['í', 'i'], | ||
['Í', 'I'], | ||
['ò', 'o'], | ||
['Ò', 'O'], | ||
['ó', 'o'], | ||
['Ó', 'O'], | ||
['ô', 'o'], | ||
['Ô', 'O'], | ||
['õ', 'o'], | ||
['Õ', 'O'], | ||
['ù', 'u'], | ||
['Ù', 'U'], | ||
['ú', 'u'], | ||
['Ú', 'U'], | ||
['ý', 'y'], | ||
['Ý', 'Y'], | ||
['ă', 'a'], | ||
['Ă', 'A'], | ||
['Đ', 'D'], | ||
['đ', 'd'], | ||
['ĩ', 'i'], | ||
['Ĩ', 'I'], | ||
['ũ', 'u'], | ||
['Ũ', 'U'], | ||
['ơ', 'o'], | ||
['Ơ', 'O'], | ||
['ư', 'u'], | ||
['Ư', 'U'], | ||
['ạ', 'a'], | ||
['Ạ', 'A'], | ||
['ả', 'a'], | ||
['Ả', 'A'], | ||
['ấ', 'a'], | ||
['Ấ', 'A'], | ||
['ầ', 'a'], | ||
['Ầ', 'A'], | ||
['ẩ', 'a'], | ||
['Ẩ', 'A'], | ||
['ẫ', 'a'], | ||
['Ẫ', 'A'], | ||
['ậ', 'a'], | ||
['Ậ', 'A'], | ||
['ắ', 'a'], | ||
['Ắ', 'A'], | ||
['ằ', 'a'], | ||
['Ằ', 'A'], | ||
['ẳ', 'a'], | ||
['Ẳ', 'A'], | ||
['ẵ', 'a'], | ||
['Ẵ', 'A'], | ||
['ặ', 'a'], | ||
['Ặ', 'A'], | ||
['ẹ', 'e'], | ||
['Ẹ', 'E'], | ||
['ẻ', 'e'], | ||
['Ẻ', 'E'], | ||
['ẽ', 'e'], | ||
['Ẽ', 'E'], | ||
['ế', 'e'], | ||
['Ế', 'E'], | ||
['ề', 'e'], | ||
['Ề', 'E'], | ||
['ể', 'e'], | ||
['Ể', 'E'], | ||
['ễ', 'e'], | ||
['Ễ', 'E'], | ||
['ệ', 'e'], | ||
['Ệ', 'E'], | ||
['ỉ', 'i'], | ||
['Ỉ', 'I'], | ||
['ị', 'i'], | ||
['Ị', 'I'], | ||
['ọ', 'o'], | ||
['Ọ', 'O'], | ||
['ỏ', 'o'], | ||
['Ỏ', 'O'], | ||
['ố', 'o'], | ||
['Ố', 'O'], | ||
['ồ', 'o'], | ||
['Ồ', 'O'], | ||
['ổ', 'o'], | ||
['Ổ', 'O'], | ||
['ỗ', 'o'], | ||
['Ỗ', 'O'], | ||
['ộ', 'o'], | ||
['Ộ', 'O'], | ||
['ớ', 'o'], | ||
['Ớ', 'O'], | ||
['ờ', 'o'], | ||
['Ờ', 'O'], | ||
['ở', 'o'], | ||
['Ở', 'O'], | ||
['ỡ', 'o'], | ||
['Ỡ', 'O'], | ||
['ợ', 'o'], | ||
['Ợ', 'O'], | ||
['ụ', 'u'], | ||
['Ụ', 'U'], | ||
['ủ', 'u'], | ||
['Ủ', 'U'], | ||
['ứ', 'u'], | ||
['Ứ', 'U'], | ||
['ừ', 'u'], | ||
['Ừ', 'U'], | ||
['ử', 'u'], | ||
['Ử', 'U'], | ||
['ữ', 'u'], | ||
['Ữ', 'U'], | ||
['ự', 'u'], | ||
['Ự', 'U'], | ||
['ỳ', 'y'], | ||
['Ỳ', 'Y'], | ||
['ỵ', 'y'], | ||
['Ỵ', 'Y'], | ||
['ỷ', 'y'], | ||
['Ỷ', 'Y'], | ||
['ỹ', 'y'], | ||
['Ỹ', 'Y'], | ||
// Arabic | ||
['ء', 'e'], | ||
['آ', 'a'], | ||
['أ', 'a'], | ||
['ؤ', 'w'], | ||
['إ', 'i'], | ||
['ئ', 'y'], | ||
['ا', 'a'], | ||
['ب', 'b'], | ||
['ة', 't'], | ||
['ت', 't'], | ||
['ث', 'th'], | ||
['ج', 'j'], | ||
['ح', 'h'], | ||
['خ', 'kh'], | ||
['د', 'd'], | ||
['ذ', 'dh'], | ||
['ر', 'r'], | ||
['ز', 'z'], | ||
['س', 's'], | ||
['ش', 'sh'], | ||
['ص', 's'], | ||
['ض', 'd'], | ||
['ط', 't'], | ||
['ظ', 'z'], | ||
['ع', 'e'], | ||
['غ', 'gh'], | ||
['ـ', '_'], | ||
['ف', 'f'], | ||
['ق', 'q'], | ||
['ك', 'k'], | ||
['ل', 'l'], | ||
['م', 'm'], | ||
['ن', 'n'], | ||
['ه', 'h'], | ||
['و', 'w'], | ||
['ى', 'a'], | ||
['ي', 'y'], | ||
['َ', 'a'], | ||
['ُ', 'u'], | ||
['ِ', 'i'], | ||
['٠', '0'], | ||
['١', '1'], | ||
['٢', '2'], | ||
['٣', '3'], | ||
['٤', '4'], | ||
['٥', '5'], | ||
['٦', '6'], | ||
['٧', '7'], | ||
['٨', '8'], | ||
['٩', '9'], | ||
// Persian / Farsi | ||
['چ', 'ch'], | ||
['ک', 'k'], | ||
['گ', 'g'], | ||
['پ', 'p'], | ||
['ژ', 'zh'], | ||
['ی', 'y'], | ||
['۰', '0'], | ||
['۱', '1'], | ||
['۲', '2'], | ||
['۳', '3'], | ||
['۴', '4'], | ||
['۵', '5'], | ||
['۶', '6'], | ||
['۷', '7'], | ||
['۸', '8'], | ||
['۹', '9'], | ||
// Pashto | ||
['ټ', 'p'], | ||
['ځ', 'z'], | ||
['څ', 'c'], | ||
['ډ', 'd'], | ||
['ﺫ', 'd'], | ||
['ﺭ', 'r'], | ||
['ړ', 'r'], | ||
['ﺯ', 'z'], | ||
['ږ', 'g'], | ||
['ښ', 'x'], | ||
['ګ', 'g'], | ||
['ڼ', 'n'], | ||
['ۀ', 'e'], | ||
['ې', 'e'], | ||
['ۍ', 'ai'], | ||
// Urdu | ||
['ٹ', 't'], | ||
['ڈ', 'd'], | ||
['ڑ', 'r'], | ||
['ں', 'n'], | ||
['ہ', 'h'], | ||
['ھ', 'h'], | ||
['ے', 'e'], | ||
// Russian | ||
['А', 'A'], | ||
['а', 'a'], | ||
['Б', 'B'], | ||
['б', 'b'], | ||
['В', 'V'], | ||
['в', 'v'], | ||
['Г', 'G'], | ||
['г', 'g'], | ||
['Д', 'D'], | ||
['д', 'd'], | ||
['Е', 'E'], | ||
['е', 'e'], | ||
['Ж', 'Zh'], | ||
['ж', 'zh'], | ||
['З', 'Z'], | ||
['з', 'z'], | ||
['И', 'I'], | ||
['и', 'i'], | ||
['Й', 'J'], | ||
['й', 'j'], | ||
['К', 'K'], | ||
['к', 'k'], | ||
['Л', 'L'], | ||
['л', 'l'], | ||
['М', 'M'], | ||
['м', 'm'], | ||
['Н', 'N'], | ||
['н', 'n'], | ||
['О', 'O'], | ||
['о', 'o'], | ||
['П', 'P'], | ||
['п', 'p'], | ||
['Р', 'R'], | ||
['р', 'r'], | ||
['С', 'S'], | ||
['с', 's'], | ||
['Т', 'T'], | ||
['т', 't'], | ||
['У', 'U'], | ||
['у', 'u'], | ||
['Ф', 'F'], | ||
['ф', 'f'], | ||
['Х', 'H'], | ||
['х', 'h'], | ||
['Ц', 'Cz'], | ||
['ц', 'cz'], | ||
['Ч', 'Ch'], | ||
['ч', 'ch'], | ||
['Ш', 'Sh'], | ||
['ш', 'sh'], | ||
['Щ', 'Shh'], | ||
['щ', 'shh'], | ||
['Ъ', ''], | ||
['ъ', ''], | ||
['Ы', 'Y'], | ||
['ы', 'y'], | ||
['Ь', ''], | ||
['ь', ''], | ||
['Э', 'E'], | ||
['э', 'e'], | ||
['Ю', 'Yu'], | ||
['ю', 'yu'], | ||
['Я', 'Ya'], | ||
['я', 'ya'], | ||
['Ё', 'Yo'], | ||
['ё', 'yo'], | ||
// Romanian | ||
['ș', 's'], | ||
['Ș', 's'], | ||
['ț', 't'], | ||
['Ț', 't'], | ||
// Turkish | ||
['ş', 's'], | ||
['Ş', 's'], | ||
['ç', 'c'], | ||
['Ç', 'c'], | ||
['ğ', 'g'], | ||
['Ğ', 'g'], | ||
['ı', 'i'], | ||
['İ', 'i'] | ||
]; | ||
var overridableReplacements = [ | ||
['&', ' and '], | ||
['🦄', ' unicorn '], | ||
['♥', ' love '] | ||
]; | ||
const decamelize = string => { | ||
return string | ||
.replace(/([a-z\d])([A-Z])/g, '$1 $2') | ||
.replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1 $2'); | ||
}; | ||
const doCustomReplacements = (string, replacements) => { | ||
for (const [key, value] of replacements) { | ||
string = string.replace(new RegExp(escapeStringRegexp(key), 'g'), value); | ||
} | ||
return string; | ||
}; | ||
const removeMootSeparators = (string, separator) => { | ||
return string | ||
.replace(new RegExp(`${separator}{2,}`, 'g'), separator) | ||
.replace(new RegExp(`^${separator}|${separator}$`, 'g'), ''); | ||
}; | ||
const slugify = (string, options) => { | ||
if (typeof string !== 'string') { | ||
throw new TypeError(`Expected a string, got \`${typeof string}\``); | ||
} | ||
options = { | ||
separator: '-', | ||
lowercase: true, | ||
decamelize: true, | ||
customReplacements: [], | ||
...options | ||
}; | ||
const separator = escapeStringRegexp(options.separator); | ||
const customReplacements = new Map([ | ||
...overridableReplacements, | ||
...options.customReplacements, | ||
...replacements | ||
]); | ||
string = doCustomReplacements(string, customReplacements); | ||
string = lodash_deburr(string); | ||
string = string.normalize('NFKD'); | ||
if (options.decamelize) { | ||
string = decamelize(string); | ||
} | ||
let patternSlug = /[^a-zA-Z\d]+/g; | ||
if (options.lowercase) { | ||
string = string.toLowerCase(); | ||
patternSlug = /[^a-z\d]+/g; | ||
} | ||
string = string.replace(patternSlug, separator); | ||
string = string.replace(/\\/g, ''); | ||
string = removeMootSeparators(string, separator); | ||
return string; | ||
}; | ||
var slugify_1 = slugify; | ||
// TODO: Remove this for the next major release | ||
var default_1 = slugify; | ||
slugify_1.default = default_1; | ||
// XRegExp('\\p{Latin}') | ||
var latinCharacter = /[\u0041-\u005A\u0061-\u007A\u00AA\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A-\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA7FF\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A]/; | ||
var isLeading = function (prevChar, char) { | ||
var precededBySeparator = ['-', '_', ' ', '.', '/', '\\'].indexOf(prevChar) > -1; | ||
var isCharLeading = char.toUpperCase() === char && /\w/.test(slugify_1(char)); | ||
var precededBySeparator = prevChar === '-' || | ||
prevChar === '_' || | ||
prevChar === ' ' || | ||
prevChar === '.' || | ||
prevChar === '/' || | ||
prevChar === '\\'; | ||
var isCharLeading = char.toUpperCase() === char && latinCharacter.test(char); | ||
return precededBySeparator || isCharLeading; | ||
@@ -959,6 +296,12 @@ }; | ||
var get = function (object, path) { | ||
if (!path) { | ||
return object; | ||
} | ||
return path.indexOf('.') > -1 ? dotProp_1(object, path) : object[path]; | ||
}; | ||
var filter = function (query, options) { | ||
if (options === void 0) { options = {}; } | ||
return function (source) { | ||
return test(query, dotProp_1(source, options.sourcePath || ''), options); | ||
return test(query, get(source, options.sourcePath || ''), options); | ||
}; | ||
@@ -976,4 +319,4 @@ }; | ||
return function (leftSource, rightSource) { | ||
var leftScore = match(query, dotProp_1(leftSource, sourcePath), matchOptions).score; | ||
var rightScore = match(query, dotProp_1(rightSource, sourcePath), matchOptions).score; | ||
var leftScore = match(query, get(leftSource, sourcePath), matchOptions).score; | ||
var rightScore = match(query, get(rightSource, sourcePath), matchOptions).score; | ||
if (rightScore === leftScore) | ||
@@ -986,10 +329,10 @@ return 0; | ||
return function (leftSource, rightSource) { | ||
var leftId = dotProp_1(leftSource, options.idPath); | ||
var rightId = dotProp_1(rightSource, options.idPath); | ||
var leftId = get(leftSource, options.idPath); | ||
var rightId = get(rightSource, options.idPath); | ||
var leftScore = memo.hasOwnProperty(leftId) | ||
? memo[leftId] | ||
: match(query, dotProp_1(leftSource, sourcePath), matchOptions).score; | ||
: match(query, get(leftSource, sourcePath), matchOptions).score; | ||
var rightScore = memo.hasOwnProperty(rightId) | ||
? memo[rightId] | ||
: match(query, dotProp_1(rightSource, sourcePath), matchOptions).score; | ||
: match(query, get(rightSource, sourcePath), matchOptions).score; | ||
if (!memo.hasOwnProperty(leftId)) { | ||
@@ -996,0 +339,0 @@ memo[leftId] = leftScore; |
@@ -6,6 +6,12 @@ "use strict"; | ||
var match_1 = require("./match"); | ||
var get = function (object, path) { | ||
if (!path) { | ||
return object; | ||
} | ||
return path.indexOf('.') > -1 ? dot_prop_1.get(object, path) : object[path]; | ||
}; | ||
exports.filter = function (query, options) { | ||
if (options === void 0) { options = {}; } | ||
return function (source) { | ||
return test_1.test(query, dot_prop_1.get(source, options.sourcePath || ''), options); | ||
return test_1.test(query, get(source, options.sourcePath || ''), options); | ||
}; | ||
@@ -23,4 +29,4 @@ }; | ||
return function (leftSource, rightSource) { | ||
var leftScore = match_1.match(query, dot_prop_1.get(leftSource, sourcePath), matchOptions).score; | ||
var rightScore = match_1.match(query, dot_prop_1.get(rightSource, sourcePath), matchOptions).score; | ||
var leftScore = match_1.match(query, get(leftSource, sourcePath), matchOptions).score; | ||
var rightScore = match_1.match(query, get(rightSource, sourcePath), matchOptions).score; | ||
if (rightScore === leftScore) | ||
@@ -33,10 +39,10 @@ return 0; | ||
return function (leftSource, rightSource) { | ||
var leftId = dot_prop_1.get(leftSource, options.idPath); | ||
var rightId = dot_prop_1.get(rightSource, options.idPath); | ||
var leftId = get(leftSource, options.idPath); | ||
var rightId = get(rightSource, options.idPath); | ||
var leftScore = memo.hasOwnProperty(leftId) | ||
? memo[leftId] | ||
: match_1.match(query, dot_prop_1.get(leftSource, sourcePath), matchOptions).score; | ||
: match_1.match(query, get(leftSource, sourcePath), matchOptions).score; | ||
var rightScore = memo.hasOwnProperty(rightId) | ||
? memo[rightId] | ||
: match_1.match(query, dot_prop_1.get(rightSource, sourcePath), matchOptions).score; | ||
: match_1.match(query, get(rightSource, sourcePath), matchOptions).score; | ||
if (!memo.hasOwnProperty(leftId)) { | ||
@@ -43,0 +49,0 @@ memo[leftId] = leftScore; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var slugify_1 = require("@sindresorhus/slugify"); | ||
// XRegExp('\\p{Latin}') | ||
var latinCharacter = /[\u0041-\u005A\u0061-\u007A\u00AA\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A-\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA7FF\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A]/; | ||
exports.isLeading = function (prevChar, char) { | ||
var precededBySeparator = ['-', '_', ' ', '.', '/', '\\'].indexOf(prevChar) > -1; | ||
var isCharLeading = char.toUpperCase() === char && /\w/.test(slugify_1.default(char)); | ||
isCharLeading; | ||
var precededBySeparator = prevChar === '-' || | ||
prevChar === '_' || | ||
prevChar === ' ' || | ||
prevChar === '.' || | ||
prevChar === '/' || | ||
prevChar === '\\'; | ||
var isCharLeading = char.toUpperCase() === char && latinCharacter.test(char); | ||
return precededBySeparator || isCharLeading; | ||
}; | ||
//# sourceMappingURL=isLeading.js.map |
@@ -12,2 +12,2 @@ import { TestOptions } from './test'; | ||
export declare const filter: (query: string, options?: FilterOptions) => (source: any) => boolean; | ||
export declare const sort: (query: string, options?: SortOptions) => (leftSource: any, rightSource: any) => 0 | 1 | -1; | ||
export declare const sort: (query: string, options?: SortOptions) => (leftSource: any, rightSource: any) => 1 | -1 | 0; |
{ | ||
"name": "fuzzyjs", | ||
"version": "3.0.2", | ||
"version": "3.0.4", | ||
"description": "Fuzzy matching in Javascript", | ||
@@ -33,6 +33,7 @@ "keywords": [ | ||
"test:watch": "jest --coverage --watch", | ||
"test:prod": "npm run lint && npm run test -- --no-cache", | ||
"test:prod": "yarn lint && yarn test -- --no-cache", | ||
"report-coverage": "cat ./coverage/lcov.info | coveralls", | ||
"semantic-release": "semantic-release", | ||
"semantic-release-prepare": "ts-node tools/semantic-release-prepare", | ||
"benchmark": "node benchmark", | ||
"benchmark:brk": "node --inspect --debug-brk benchmark/withoutTimers", | ||
"precommit": "lint-staged", | ||
@@ -92,4 +93,6 @@ "travis-deploy-once": "travis-deploy-once" | ||
"@commitlint/config-conventional": "^8.0.0", | ||
"@types/benchmark": "^1.0.31", | ||
"@types/jest": "^24.0.14", | ||
"@types/node": "^12.0.8", | ||
"benchmark": "^2.1.4", | ||
"colors": "^1.3.2", | ||
@@ -112,3 +115,3 @@ "coveralls": "^3.0.2", | ||
"ts-jest": "^24.0.2", | ||
"ts-node": "^8.2.0", | ||
"ts-node": "^8.3.0", | ||
"typedoc": "^0.14.2", | ||
@@ -118,5 +121,4 @@ "typescript": "^3.5.2" | ||
"dependencies": { | ||
"@sindresorhus/slugify": "^0.9.1", | ||
"dot-prop": "^5.1.0" | ||
} | ||
} |
@@ -37,8 +37,5 @@ # fuzzyjs | ||
match('ssjs', 'Set Syntax: JavaScript') | ||
{ match: true } | ||
match('ssjs', 'Set Syntax: JavaScript', { withScore: true }) | ||
{ match: true, score: 22 } | ||
match('ssjav', 'Set Syntax: JavaScript', { withRanges: true }) | ||
match('ssjav', 'Set Syntax: JavaScript', { withScore: false, withRanges: true }) | ||
{ | ||
@@ -60,3 +57,3 @@ match: true, | ||
withRanges?: boolean // (default: false) | ||
withScore?: boolean // (default: false) | ||
withScore?: boolean // (default: true) | ||
} | ||
@@ -105,2 +102,69 @@ | ||
**`filter`** | ||
Can be used as a [Array.prototype.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) callback | ||
```ts | ||
import { filter as fuzzy } from 'fuzzyjs' | ||
const sources = ['Set Syntax: JavaScript', 'Set Syntax: CSS', 'Set Syntax: HTML'] | ||
sources.filter(fuzzy('ssjs')) | ||
[ 'Set Syntax: JavaScript' ] | ||
const sources = [ | ||
{ name: { foo: 'Set Syntax: JavaScript' } }, | ||
{ name: { foo: 'Set Syntax: CSS' } }, | ||
{ name: { foo: 'Set Syntax: HTML' } } | ||
] | ||
sources.filter(fuzzy('ssjs', { sourcePath: 'name.foo' })) | ||
[ { name: { foo: 'Set Syntax: JavaScript' } } ] | ||
``` | ||
```ts | ||
const filter: (query: string, options?: FilterOptions) => (source: any) => boolean | ||
type FilterOptions = TestOptions & { | ||
sourcePath?: string // used as an accessor path if array is made of objects | ||
} | ||
``` | ||
**`sort`** | ||
Can be used as a [Array.prototype.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) callback | ||
If you have a large array of objects, you might want to pass `idPath` as it creates a [memoization](https://en.wikipedia.org/wiki/Memoization) table which reduces drastically how many times the fuzzy matching algorithm will be called. | ||
```ts | ||
import { sort as fuzzy } from 'fuzzyjs' | ||
const sources = ['Set Syntax: CSS', 'Set Syntax: HTML', 'Set Syntax: JavaScript'] | ||
sources.sort(fuzzy('ssjs')) | ||
[ 'Set Syntax: JavaScript', 'Set Syntax: CSS', 'Set Syntax: HTML' ] | ||
const sources = [ | ||
{ name: { foo: 'Set Syntax: CSS' } }, | ||
{ name: { foo: 'Set Syntax: HTML' } }, | ||
{ name: { foo: 'Set Syntax: JavaScript' } } | ||
] | ||
sources.sort(fuzzy('ssjs', { sourcePath: 'name.foo' })) | ||
[ | ||
{ name: { foo: 'Set Syntax: JavaScript' } }, | ||
{ name: { foo: 'Set Syntax: CSS' } }, | ||
{ name: { foo: 'Set Syntax: HTML' } } | ||
] | ||
``` | ||
```ts | ||
const sort: (query: string, options?: SortOptions) => (leftSource: any, rightSource: any) => 0 | 1 | -1 | ||
type SortOptions = TestOptions & { | ||
strategy?: ScoreStrategy | ||
sourcePath?: string // used as an accessor path if array is made of objects | ||
idPath?: string // used as an accessor path if you want fuzzy to be memoized | ||
} | ||
``` | ||
## Scoring function | ||
@@ -107,0 +171,0 @@ |
@@ -1,2 +0,2 @@ | ||
import { get } from 'dot-prop' | ||
import { get as dotGet } from 'dot-prop' | ||
import { test, TestOptions } from './test' | ||
@@ -15,2 +15,10 @@ import { match, ScoreStrategy, MatchOptions } from './match' | ||
const get = (object: any, path: string) => { | ||
if (!path) { | ||
return object | ||
} | ||
return path.indexOf('.') > -1 ? dotGet(object, path) : object[path] | ||
} | ||
export const filter = (query: string, options: FilterOptions = {}) => (source: any) => | ||
@@ -17,0 +25,0 @@ test(query, get(source, options.sourcePath || ''), options) |
@@ -1,10 +0,16 @@ | ||
import slugify from '@sindresorhus/slugify' | ||
// XRegExp('\\p{Latin}') | ||
const latinCharacter = /[\u0041-\u005A\u0061-\u007A\u00AA\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A-\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA7FF\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A]/ | ||
export const isLeading = (prevChar: string, char: string) => { | ||
const precededBySeparator = ['-', '_', ' ', '.', '/', '\\'].indexOf(prevChar) > -1 | ||
const isCharLeading = char.toUpperCase() === char && /\w/.test(slugify(char)) | ||
const precededBySeparator = | ||
prevChar === '-' || | ||
prevChar === '_' || | ||
prevChar === ' ' || | ||
prevChar === '.' || | ||
prevChar === '/' || | ||
prevChar === '\\' | ||
isCharLeading | ||
const isCharLeading = char.toUpperCase() === char && latinCharacter.test(char) | ||
return precededBySeparator || isCharLeading | ||
} |
@@ -15,2 +15,3 @@ { | ||
"outDir": "dist/lib", | ||
"esModuleInterop": true, | ||
"typeRoots": [ | ||
@@ -17,0 +18,0 @@ "node_modules/@types" |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 2 instances in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
1
25698
1
190
1
699140
26
59
- Removed@sindresorhus/slugify@^0.9.1
- Removed@sindresorhus/slugify@0.9.1(transitive)
- Removedescape-string-regexp@1.0.5(transitive)
- Removedlodash.deburr@4.1.0(transitive)