@koine/utils 2.0.0-beta.72 → 2.0.0-beta.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Defer.d.ts +1 -0
- package/Defer.js +11 -0
- package/Emitter.d.ts +1 -0
- package/Emitter.js +20 -0
- package/accentSets.d.ts +1 -0
- package/accentSets.js +30 -0
- package/addOrReplaceAtIdx.d.ts +1 -0
- package/addOrReplaceAtIdx.js +15 -0
- package/areEqual.d.ts +1 -1
- package/areEqual.js +46 -0
- package/arrayFilterFalsy.d.ts +1 -0
- package/arrayFilterFalsy.js +2 -0
- package/arrayFindLastIndex.d.ts +1 -0
- package/arrayFindLastIndex.js +9 -0
- package/arrayOfAll.d.ts +1 -0
- package/arrayOfAll.js +2 -0
- package/arraySum.d.ts +1 -0
- package/arraySum.js +2 -0
- package/arrayToLookup.d.ts +1 -0
- package/arrayToLookup.js +5 -0
- package/arrayUniqueByProperties.d.ts +1 -0
- package/arrayUniqueByProperties.js +2 -0
- package/buildUrlQueryString.d.ts +1 -0
- package/buildUrlQueryString.js +21 -0
- package/capitalize.d.ts +1 -0
- package/capitalize.js +3 -0
- package/changeCaseCamel.d.ts +1 -0
- package/changeCaseCamel.js +19 -0
- package/changeCaseCapital.d.ts +1 -0
- package/changeCaseCapital.js +12 -0
- package/changeCaseConstant.d.ts +1 -0
- package/changeCaseConstant.js +8 -0
- package/changeCaseDot.d.ts +1 -0
- package/changeCaseDot.js +3 -0
- package/changeCaseHelpers.d.ts +0 -5
- package/changeCaseHelpers.js +71 -0
- package/changeCaseKebab.d.ts +1 -0
- package/changeCaseKebab.js +3 -0
- package/changeCaseNone.d.ts +1 -0
- package/changeCaseNone.js +8 -0
- package/changeCasePascal.d.ts +1 -0
- package/changeCasePascal.js +11 -0
- package/changeCasePascalSnake.d.ts +1 -0
- package/changeCasePascalSnake.js +3 -0
- package/changeCasePath.d.ts +1 -0
- package/changeCasePath.js +3 -0
- package/changeCaseSentence.d.ts +1 -0
- package/changeCaseSentence.js +17 -0
- package/changeCaseSnake.d.ts +1 -0
- package/changeCaseSnake.js +3 -0
- package/changeCaseTrain.d.ts +1 -0
- package/changeCaseTrain.js +3 -0
- package/chunkByChunks.d.ts +1 -0
- package/chunkByChunks.js +32 -0
- package/chunkBySize.d.ts +1 -0
- package/chunkBySize.js +8 -0
- package/clamp.d.ts +1 -0
- package/clamp.js +2 -0
- package/clsx.d.ts +1 -1
- package/clsx.js +40 -0
- package/convertRange.d.ts +1 -0
- package/convertRange.js +2 -0
- package/cookie.d.ts +0 -3
- package/cookie.js +1 -0
- package/createPalette.d.ts +1 -1
- package/createPalette.js +12 -0
- package/debounce.d.ts +1 -0
- package/debounce.js +18 -0
- package/debouncePromise.d.ts +1 -0
- package/debouncePromise.js +52 -0
- package/debounceRaf.d.ts +1 -0
- package/debounceRaf.js +13 -0
- package/decode.d.ts +1 -0
- package/decode.js +2 -0
- package/encode.d.ts +1 -0
- package/encode.js +2 -0
- package/ensureInt.d.ts +1 -0
- package/ensureInt.js +2 -0
- package/env.js +1 -0
- package/errorToString.d.ts +1 -0
- package/errorToString.js +3 -0
- package/escapeRegExp.d.ts +1 -0
- package/escapeRegExp.js +2 -0
- package/findDuplicatedIndexes.d.ts +1 -0
- package/findDuplicatedIndexes.js +11 -0
- package/forin.d.ts +1 -0
- package/forin.js +6 -0
- package/gbToBytes.d.ts +1 -0
- package/gbToBytes.js +2 -0
- package/getEmptyArray.d.ts +1 -0
- package/getEmptyArray.js +5 -0
- package/getKeys.d.ts +1 -0
- package/getKeys.js +2 -0
- package/getMediaQueryWidthResolvers.d.ts +1 -0
- package/getMediaQueryWidthResolvers.js +42 -0
- package/getMediaQueryWidthTailwindScreens.d.ts +1 -0
- package/getMediaQueryWidthTailwindScreens.js +27 -0
- package/getNonce.d.ts +1 -0
- package/getNonce.js +3 -0
- package/getParamAmong.d.ts +1 -0
- package/getParamAmong.js +6 -0
- package/getParamAsInt.d.ts +1 -0
- package/getParamAsInt.js +9 -0
- package/getParamAsString.d.ts +1 -0
- package/getParamAsString.js +3 -0
- package/getType.d.ts +1 -0
- package/getType.js +2 -0
- package/getUrlHashParams.d.ts +1 -0
- package/getUrlHashParams.js +9 -0
- package/getUrlHashPathname.d.ts +1 -0
- package/getUrlHashPathname.js +2 -0
- package/getUrlPathnameParts.d.ts +1 -0
- package/getUrlPathnameParts.js +6 -0
- package/getUrlQueryParams.d.ts +1 -0
- package/getUrlQueryParams.js +22 -0
- package/imgEmptyPixel.d.ts +1 -0
- package/imgEmptyPixel.js +2 -0
- package/index.cjs.js +69 -69
- package/index.d.ts +1 -1
- package/index.esm.js +69 -69
- package/index.js +156 -0
- package/invariant.d.ts +1 -0
- package/invariant.js +17 -0
- package/isAbsoluteUrl.d.ts +1 -0
- package/isAbsoluteUrl.js +3 -0
- package/isAnyObject.d.ts +1 -0
- package/isAnyObject.js +3 -0
- package/isArray.d.ts +1 -0
- package/isArray.js +3 -0
- package/isBlob.d.ts +1 -0
- package/isBlob.js +3 -0
- package/isBoolean.d.ts +1 -0
- package/isBoolean.js +3 -0
- package/isBrowser.d.ts +1 -0
- package/isBrowser.js +2 -0
- package/isBrowserNow.d.ts +1 -0
- package/isBrowserNow.js +3 -0
- package/isDate.d.ts +1 -0
- package/isDate.js +3 -0
- package/isEmptyArray.d.ts +1 -0
- package/isEmptyArray.js +3 -0
- package/isEmptyObject.d.ts +1 -0
- package/isEmptyObject.js +3 -0
- package/isEmptyString.d.ts +1 -0
- package/isEmptyString.js +2 -0
- package/isError.d.ts +1 -0
- package/isError.js +3 -0
- package/isExternalUrl.d.ts +1 -0
- package/isExternalUrl.js +11 -0
- package/isFile.d.ts +1 -0
- package/isFile.js +3 -0
- package/isFloat.d.ts +1 -0
- package/isFloat.js +3 -0
- package/isFormData.d.ts +1 -0
- package/isFormData.js +3 -0
- package/isFullArray.d.ts +1 -0
- package/isFullArray.js +3 -0
- package/isFullObject.d.ts +1 -0
- package/isFullObject.js +3 -0
- package/isFullString.d.ts +1 -0
- package/isFullString.js +3 -0
- package/isFunction.d.ts +1 -0
- package/isFunction.js +2 -0
- package/isInt.d.ts +1 -0
- package/isInt.js +3 -0
- package/isMap.d.ts +1 -0
- package/isMap.js +3 -0
- package/isNaNValue.d.ts +1 -0
- package/isNaNValue.js +3 -0
- package/isNegativeNumber.d.ts +1 -0
- package/isNegativeNumber.js +3 -0
- package/isNull.d.ts +1 -0
- package/isNull.js +3 -0
- package/isNullOrUndefined.d.ts +1 -0
- package/isNullOrUndefined.js +5 -0
- package/isNumber.d.ts +1 -0
- package/isNumber.js +3 -0
- package/isNumericLiteral.d.ts +1 -0
- package/isNumericLiteral.js +2 -0
- package/isObject.d.ts +1 -0
- package/isObject.js +3 -0
- package/isObjectLike.d.ts +1 -0
- package/isObjectLike.js +3 -0
- package/isObjectStringKeyed.d.ts +1 -0
- package/isObjectStringKeyed.js +3 -0
- package/isOneOf.d.ts +1 -0
- package/isOneOf.js +8 -0
- package/isPlainObject.d.ts +1 -0
- package/isPlainObject.js +6 -0
- package/isPositiveNumber.d.ts +1 -0
- package/isPositiveNumber.js +3 -0
- package/isPrimitive.d.ts +1 -0
- package/isPrimitive.js +13 -0
- package/isPromise.d.ts +1 -0
- package/isPromise.js +3 -0
- package/isRegExp.d.ts +1 -0
- package/isRegExp.js +3 -0
- package/isServer.d.ts +1 -0
- package/isServer.js +3 -0
- package/isServerNow.d.ts +1 -0
- package/isServerNow.js +3 -0
- package/isSet.d.ts +1 -0
- package/isSet.js +3 -0
- package/isString.d.ts +1 -0
- package/isString.js +3 -0
- package/isSymbol.d.ts +1 -0
- package/isSymbol.js +3 -0
- package/isType.d.ts +1 -0
- package/isType.js +13 -0
- package/isUndefined.d.ts +1 -0
- package/isUndefined.js +3 -0
- package/isWeakMap.d.ts +1 -0
- package/isWeakMap.js +3 -0
- package/isWeakSet.d.ts +1 -0
- package/isWeakSet.js +3 -0
- package/kbToBytes.d.ts +1 -0
- package/kbToBytes.js +2 -0
- package/location.js +1 -0
- package/lowercase.d.ts +1 -0
- package/lowercase.js +2 -0
- package/mapListBy.d.ts +1 -0
- package/mapListBy.js +5 -0
- package/matchSorter.d.ts +1 -0
- package/matchSorter.js +239 -0
- package/mbToBytes.d.ts +1 -0
- package/mbToBytes.js +2 -0
- package/mergeObjects.d.ts +1 -0
- package/mergeObjects.js +29 -0
- package/mergeUrlQueryParams.d.ts +1 -0
- package/mergeUrlQueryParams.js +14 -0
- package/moveSortableArrayItemByKey.d.ts +1 -0
- package/moveSortableArrayItemByKey.js +9 -0
- package/noop.d.ts +1 -0
- package/noop.js +2 -0
- package/normaliseUrl.d.ts +1 -0
- package/normaliseUrl.js +3 -0
- package/normaliseUrlPathname.d.ts +1 -0
- package/normaliseUrlPathname.js +3 -0
- package/objectFlat.d.ts +1 -0
- package/objectFlat.js +17 -0
- package/objectFlip.d.ts +1 -0
- package/objectFlip.js +5 -0
- package/objectMergeWithDefaults.d.ts +1 -0
- package/objectMergeWithDefaults.js +21 -0
- package/objectOmit.d.ts +1 -0
- package/objectOmit.js +8 -0
- package/objectPick.d.ts +1 -0
- package/objectPick.js +9 -0
- package/objectSort.d.ts +1 -0
- package/objectSort.js +2 -0
- package/objectSortByKeysMatching.d.ts +1 -0
- package/objectSortByKeysMatching.js +3 -0
- package/objectToArray.d.ts +1 -0
- package/objectToArray.js +2 -0
- package/package.json +1 -1
- package/parseCookie.d.ts +1 -0
- package/parseCookie.js +33 -0
- package/parseURL.d.ts +1 -0
- package/parseURL.js +14 -0
- package/quaranteneProps.d.ts +1 -1
- package/quaranteneProps.js +16 -0
- package/randomInt.d.ts +1 -0
- package/randomInt.js +2 -0
- package/randomKey.d.ts +1 -0
- package/randomKey.js +5 -0
- package/readCookie.d.ts +1 -0
- package/readCookie.js +34 -0
- package/removeAccents.d.ts +1 -0
- package/removeAccents.js +10 -0
- package/removeCookie.d.ts +1 -0
- package/removeCookie.js +10 -0
- package/removeDuplicates.d.ts +2 -0
- package/removeDuplicates.js +2 -0
- package/removeDuplicatesByKey.d.ts +1 -0
- package/removeDuplicatesByKey.js +13 -0
- package/removeDuplicatesComparing.d.ts +1 -0
- package/removeDuplicatesComparing.js +7 -0
- package/removeIndexesFromArray.d.ts +1 -0
- package/removeIndexesFromArray.js +10 -0
- package/removeTrailingSlash.d.ts +2 -1
- package/removeTrailingSlash.js +2 -0
- package/removeUrlQueryParams.d.ts +1 -0
- package/removeUrlQueryParams.js +14 -0
- package/render.d.ts +1 -1
- package/render.js +113 -0
- package/round.d.ts +1 -0
- package/round.js +4 -0
- package/roundTo.d.ts +1 -0
- package/roundTo.js +11 -0
- package/serializeCookie.d.ts +1 -0
- package/serializeCookie.js +69 -0
- package/setCookie.d.ts +1 -0
- package/setCookie.js +45 -0
- package/shuffle.d.ts +1 -0
- package/shuffle.js +17 -0
- package/slugify.d.ts +1 -0
- package/slugify.js +11 -0
- package/split.d.ts +1 -0
- package/split.js +2 -0
- package/splitReverse.d.ts +1 -0
- package/splitReverse.js +2 -0
- package/swapMap.d.ts +1 -0
- package/swapMap.js +8 -0
- package/throttle.d.ts +1 -0
- package/throttle.js +15 -0
- package/titleCase.d.ts +1 -0
- package/titleCase.js +4 -0
- package/toNumber.d.ts +1 -0
- package/toNumber.js +3 -0
- package/toRgba.d.ts +1 -0
- package/toRgba.js +8 -0
- package/transformToUrlPathname.d.ts +1 -0
- package/transformToUrlPathname.js +5 -0
- package/truncate.d.ts +1 -0
- package/truncate.js +6 -0
- package/tryUntil.d.ts +1 -0
- package/tryUntil.js +15 -0
- package/types.js +1 -0
- package/uid.d.ts +1 -0
- package/uid.js +6 -0
- package/updateLinkParams.d.ts +1 -0
- package/updateLinkParams.js +7 -0
- package/updateUrlQueryParams.d.ts +1 -0
- package/updateUrlQueryParams.js +11 -0
- package/uppercase.d.ts +1 -0
- package/uppercase.js +2 -0
- package/uuid.d.ts +1 -0
- package/uuid.js +5 -0
- package/uuidNumeric.d.ts +1 -0
- package/uuidNumeric.js +2 -0
- package/wait.d.ts +1 -0
- package/wait.js +2 -0
- package/without.js +1 -0
package/matchSorter.js
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { isString } from "./isString";
|
|
2
|
+
import { removeAccents } from "./removeAccents";
|
|
3
|
+
const RANKING_CASE_SENSITIVE_EQUAL = 7;
|
|
4
|
+
const RANKING_EQUAL = 6;
|
|
5
|
+
const RANKING_STARTS_WITH = 5;
|
|
6
|
+
const RANKING_WORD_STARTS_WITH = 4;
|
|
7
|
+
const RANKING_CONTAINS = 3;
|
|
8
|
+
const RANKING_ACRONYM = 2;
|
|
9
|
+
const RANKING_MATCHES = 1;
|
|
10
|
+
const RANKING_NO_MATCH = 0;
|
|
11
|
+
let defaultBaseSortFn = (a, b) => String(a.rankedValue).localeCompare(String(b.rankedValue));
|
|
12
|
+
let matchSorter = (items, value, options = {}) => {
|
|
13
|
+
const { keys, threshold = RANKING_MATCHES, baseSort = defaultBaseSortFn, sorter = (matchedItems) => matchedItems.sort((a, b) => sortRankedValues(a, b, baseSort)), } = options;
|
|
14
|
+
const matchedItems = items.reduce(reduceItemsToRanked, []);
|
|
15
|
+
return sorter(matchedItems).map(({ item }) => item);
|
|
16
|
+
function reduceItemsToRanked(matches, item, index) {
|
|
17
|
+
const rankingInfo = getHighestRanking(item, keys, value, options);
|
|
18
|
+
const { rank, keyThreshold = threshold } = rankingInfo;
|
|
19
|
+
if (rank >= keyThreshold) {
|
|
20
|
+
matches.push({ ...rankingInfo, item, index });
|
|
21
|
+
}
|
|
22
|
+
return matches;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
let getHighestRanking = (item, keys, value, options) => {
|
|
26
|
+
if (!keys) {
|
|
27
|
+
const stringItem = item;
|
|
28
|
+
return {
|
|
29
|
+
rankedValue: stringItem,
|
|
30
|
+
rank: getMatchRanking(stringItem, value, options),
|
|
31
|
+
keyIndex: -1,
|
|
32
|
+
keyThreshold: options.threshold,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const valuesToRank = getAllValuesToRank(item, keys);
|
|
36
|
+
return valuesToRank.reduce(({ rank, rankedValue, keyIndex, keyThreshold }, { itemValue, attributes }, i) => {
|
|
37
|
+
let newRank = getMatchRanking(itemValue, value, options);
|
|
38
|
+
let newRankedValue = rankedValue;
|
|
39
|
+
const { minRanking, maxRanking, threshold } = attributes;
|
|
40
|
+
if (newRank < minRanking && newRank >= RANKING_MATCHES) {
|
|
41
|
+
newRank = minRanking;
|
|
42
|
+
}
|
|
43
|
+
else if (newRank > maxRanking) {
|
|
44
|
+
newRank = maxRanking;
|
|
45
|
+
}
|
|
46
|
+
if (newRank > rank) {
|
|
47
|
+
rank = newRank;
|
|
48
|
+
keyIndex = i;
|
|
49
|
+
keyThreshold = threshold;
|
|
50
|
+
newRankedValue = itemValue;
|
|
51
|
+
}
|
|
52
|
+
return { rankedValue: newRankedValue, rank, keyIndex, keyThreshold };
|
|
53
|
+
}, {
|
|
54
|
+
rankedValue: item,
|
|
55
|
+
rank: RANKING_NO_MATCH,
|
|
56
|
+
keyIndex: -1,
|
|
57
|
+
keyThreshold: options.threshold,
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
let getMatchRanking = (testString, stringToRank, options) => {
|
|
61
|
+
testString = prepareValueForComparison(testString, options);
|
|
62
|
+
stringToRank = prepareValueForComparison(stringToRank, options);
|
|
63
|
+
if (stringToRank.length > testString.length) {
|
|
64
|
+
return RANKING_NO_MATCH;
|
|
65
|
+
}
|
|
66
|
+
if (testString === stringToRank) {
|
|
67
|
+
return RANKING_CASE_SENSITIVE_EQUAL;
|
|
68
|
+
}
|
|
69
|
+
testString = testString.toLowerCase();
|
|
70
|
+
stringToRank = stringToRank.toLowerCase();
|
|
71
|
+
if (testString === stringToRank) {
|
|
72
|
+
return RANKING_EQUAL;
|
|
73
|
+
}
|
|
74
|
+
if (testString.startsWith(stringToRank)) {
|
|
75
|
+
return RANKING_STARTS_WITH;
|
|
76
|
+
}
|
|
77
|
+
if (testString.includes(` ${stringToRank}`)) {
|
|
78
|
+
return RANKING_WORD_STARTS_WITH;
|
|
79
|
+
}
|
|
80
|
+
if (testString.includes(stringToRank)) {
|
|
81
|
+
return RANKING_CONTAINS;
|
|
82
|
+
}
|
|
83
|
+
else if (stringToRank.length === 1) {
|
|
84
|
+
return RANKING_NO_MATCH;
|
|
85
|
+
}
|
|
86
|
+
if (getAcronym(testString).includes(stringToRank)) {
|
|
87
|
+
return RANKING_ACRONYM;
|
|
88
|
+
}
|
|
89
|
+
return getClosenessRanking(testString, stringToRank);
|
|
90
|
+
};
|
|
91
|
+
let getAcronym = (string) => {
|
|
92
|
+
let acronym = "";
|
|
93
|
+
const wordsInString = string.split(" ");
|
|
94
|
+
wordsInString.forEach((wordInString) => {
|
|
95
|
+
const splitByHyphenWords = wordInString.split("-");
|
|
96
|
+
splitByHyphenWords.forEach((splitByHyphenWord) => {
|
|
97
|
+
acronym += splitByHyphenWord.substring(0, 1);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
return acronym;
|
|
101
|
+
};
|
|
102
|
+
let getClosenessRanking = (testString, stringToRank) => {
|
|
103
|
+
let matchingInOrderCharCount = 0;
|
|
104
|
+
let charNumber = 0;
|
|
105
|
+
function findMatchingCharacter(matchChar, string, index) {
|
|
106
|
+
for (let j = index, J = string.length; j < J; j++) {
|
|
107
|
+
const stringChar = string[j];
|
|
108
|
+
if (stringChar === matchChar) {
|
|
109
|
+
matchingInOrderCharCount += 1;
|
|
110
|
+
return j + 1;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return -1;
|
|
114
|
+
}
|
|
115
|
+
function getRanking(spread) {
|
|
116
|
+
const spreadPercentage = 1 / spread;
|
|
117
|
+
const inOrderPercentage = matchingInOrderCharCount / stringToRank.length;
|
|
118
|
+
const ranking = RANKING_MATCHES + inOrderPercentage * spreadPercentage;
|
|
119
|
+
return ranking;
|
|
120
|
+
}
|
|
121
|
+
const firstIndex = findMatchingCharacter(stringToRank[0], testString, 0);
|
|
122
|
+
if (firstIndex < 0) {
|
|
123
|
+
return RANKING_NO_MATCH;
|
|
124
|
+
}
|
|
125
|
+
charNumber = firstIndex;
|
|
126
|
+
for (let i = 1, I = stringToRank.length; i < I; i++) {
|
|
127
|
+
const matchChar = stringToRank[i];
|
|
128
|
+
charNumber = findMatchingCharacter(matchChar, testString, charNumber);
|
|
129
|
+
const found = charNumber > -1;
|
|
130
|
+
if (!found) {
|
|
131
|
+
return RANKING_NO_MATCH;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const spread = charNumber - firstIndex;
|
|
135
|
+
return getRanking(spread);
|
|
136
|
+
};
|
|
137
|
+
let sortRankedValues = (a, b, baseSort) => {
|
|
138
|
+
const aFirst = -1;
|
|
139
|
+
const bFirst = 1;
|
|
140
|
+
const { rank: aRank, keyIndex: aKeyIndex } = a;
|
|
141
|
+
const { rank: bRank, keyIndex: bKeyIndex } = b;
|
|
142
|
+
const same = aRank === bRank;
|
|
143
|
+
if (same) {
|
|
144
|
+
if (aKeyIndex === bKeyIndex) {
|
|
145
|
+
return baseSort(a, b);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
return aKeyIndex < bKeyIndex ? aFirst : bFirst;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
return aRank > bRank ? aFirst : bFirst;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
let prepareValueForComparison = (value, { keepDiacritics }) => {
|
|
156
|
+
value = `${value}`;
|
|
157
|
+
if (!keepDiacritics) {
|
|
158
|
+
value = removeAccents(value);
|
|
159
|
+
}
|
|
160
|
+
return value;
|
|
161
|
+
};
|
|
162
|
+
let getItemValues = (item, key) => {
|
|
163
|
+
if (typeof key === "object") {
|
|
164
|
+
key = key.key;
|
|
165
|
+
}
|
|
166
|
+
let value;
|
|
167
|
+
if (typeof key === "function") {
|
|
168
|
+
value = key(item);
|
|
169
|
+
}
|
|
170
|
+
else if (item == null) {
|
|
171
|
+
value = null;
|
|
172
|
+
}
|
|
173
|
+
else if (Object.hasOwnProperty.call(item, key)) {
|
|
174
|
+
value = item[key];
|
|
175
|
+
}
|
|
176
|
+
else if (key.includes(".")) {
|
|
177
|
+
return getNestedValues(key, item);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
value = null;
|
|
181
|
+
}
|
|
182
|
+
if (value == null) {
|
|
183
|
+
return [];
|
|
184
|
+
}
|
|
185
|
+
if (Array.isArray(value)) {
|
|
186
|
+
return value;
|
|
187
|
+
}
|
|
188
|
+
return [String(value)];
|
|
189
|
+
};
|
|
190
|
+
let getNestedValues = (path, item) => {
|
|
191
|
+
const keys = path.split(".");
|
|
192
|
+
let values = [item];
|
|
193
|
+
for (let i = 0, I = keys.length; i < I; i++) {
|
|
194
|
+
const nestedKey = keys[i];
|
|
195
|
+
let nestedValues = [];
|
|
196
|
+
for (let j = 0, J = values.length; j < J; j++) {
|
|
197
|
+
const nestedItem = values[j];
|
|
198
|
+
if (nestedItem == null)
|
|
199
|
+
continue;
|
|
200
|
+
if (Object.hasOwnProperty.call(nestedItem, nestedKey)) {
|
|
201
|
+
const nestedValue = nestedItem[nestedKey];
|
|
202
|
+
if (nestedValue != null) {
|
|
203
|
+
nestedValues.push(nestedValue);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else if (nestedKey === "*") {
|
|
207
|
+
nestedValues = nestedValues.concat(nestedItem);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
values = nestedValues;
|
|
211
|
+
}
|
|
212
|
+
if (Array.isArray(values[0])) {
|
|
213
|
+
const result = [];
|
|
214
|
+
return result.concat(...values);
|
|
215
|
+
}
|
|
216
|
+
return values;
|
|
217
|
+
};
|
|
218
|
+
let getAllValuesToRank = (item, keys) => {
|
|
219
|
+
const allValues = [];
|
|
220
|
+
for (let j = 0, J = keys.length; j < J; j++) {
|
|
221
|
+
const key = keys[j];
|
|
222
|
+
const attributes = getKeyAttributes(key);
|
|
223
|
+
const itemValues = getItemValues(item, key);
|
|
224
|
+
for (let i = 0, I = itemValues.length; i < I; i++) {
|
|
225
|
+
allValues.push({
|
|
226
|
+
itemValue: itemValues[i],
|
|
227
|
+
attributes,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return allValues;
|
|
232
|
+
};
|
|
233
|
+
const defaultKeyAttributes = {
|
|
234
|
+
maxRanking: Infinity,
|
|
235
|
+
minRanking: -Infinity,
|
|
236
|
+
};
|
|
237
|
+
let getKeyAttributes = (key) => isString(key) ? defaultKeyAttributes : { ...defaultKeyAttributes, ...key };
|
|
238
|
+
export { matchSorter, defaultBaseSortFn };
|
|
239
|
+
export default matchSorter;
|
package/mbToBytes.d.ts
CHANGED
package/mbToBytes.js
ADDED
package/mergeObjects.d.ts
CHANGED
package/mergeObjects.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { isObject } from "./isObject";
|
|
2
|
+
import { isUndefined } from "./isUndefined";
|
|
3
|
+
export let mergeObjects = (target, ...sources) => {
|
|
4
|
+
if (!sources.length) {
|
|
5
|
+
return target;
|
|
6
|
+
}
|
|
7
|
+
const source = sources.shift();
|
|
8
|
+
if (source === undefined) {
|
|
9
|
+
return target;
|
|
10
|
+
}
|
|
11
|
+
if (isObject(target) && isObject(source)) {
|
|
12
|
+
Object.keys(source).forEach((_key) => {
|
|
13
|
+
const key = _key;
|
|
14
|
+
if (isObject(source[key])) {
|
|
15
|
+
if (!target[key]) {
|
|
16
|
+
target[key] = {};
|
|
17
|
+
}
|
|
18
|
+
mergeObjects(target[key], source[key]);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
if (!isUndefined(source[key])) {
|
|
22
|
+
target[key] = source[key];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return mergeObjects(target, ...sources);
|
|
28
|
+
};
|
|
29
|
+
export default mergeObjects;
|
package/mergeUrlQueryParams.d.ts
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { isNull } from "./isNull";
|
|
2
|
+
export let mergeUrlQueryParams = (oldParams = {}, newParams = {}) => {
|
|
3
|
+
for (const key in newParams) {
|
|
4
|
+
const value = newParams[key];
|
|
5
|
+
if (oldParams[key] && isNull(value)) {
|
|
6
|
+
delete oldParams[key];
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
oldParams[key] = value;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return oldParams;
|
|
13
|
+
};
|
|
14
|
+
export default mergeUrlQueryParams;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export let moveSortableArrayItemByKey = (items, key, fromItem, toItem) => {
|
|
2
|
+
const itemsKeys = items.map((item) => item[key]);
|
|
3
|
+
const idxFrom = itemsKeys.indexOf(fromItem[key]);
|
|
4
|
+
const idxTo = itemsKeys.indexOf(toItem[key]);
|
|
5
|
+
const [item] = items.splice(idxFrom, 1);
|
|
6
|
+
items.splice(idxTo, 0, item);
|
|
7
|
+
return [...items];
|
|
8
|
+
};
|
|
9
|
+
export default moveSortableArrayItemByKey;
|
package/noop.d.ts
CHANGED
package/noop.js
ADDED
package/normaliseUrl.d.ts
CHANGED
package/normaliseUrl.js
ADDED
package/objectFlat.d.ts
CHANGED
package/objectFlat.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export let objectFlat = (obj, delimiter = ".", parent = "") => {
|
|
2
|
+
return Object.keys(obj).reduce((acc, _key) => {
|
|
3
|
+
const key = _key;
|
|
4
|
+
const propName = (parent ? `${parent}${delimiter}${key}` : key);
|
|
5
|
+
if (typeof obj[key] === "object") {
|
|
6
|
+
acc = {
|
|
7
|
+
...acc,
|
|
8
|
+
...objectFlat(obj[key], delimiter, propName),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
acc[propName] = obj[key];
|
|
13
|
+
}
|
|
14
|
+
return acc;
|
|
15
|
+
}, {});
|
|
16
|
+
};
|
|
17
|
+
export default objectFlat;
|
package/objectFlip.d.ts
CHANGED
package/objectFlip.js
ADDED
|
@@ -3,3 +3,4 @@ export type ObjectMergeWithDefaults<Defaults, Overrides> = Overrides extends und
|
|
|
3
3
|
[K in keyof Overrides]-?: Overrides[K] extends undefined ? K extends keyof Defaults ? Defaults[K] : never : K extends keyof Defaults ? ObjectMergeWithDefaults<Defaults[K], Overrides[K]> : Overrides[K];
|
|
4
4
|
} : Overrides;
|
|
5
5
|
export declare let objectMergeWithDefaults: <D extends PlainObject, O extends PlainObject>(defaults: D, overrides?: O | undefined) => ObjectMergeWithDefaults<D, O>;
|
|
6
|
+
export default objectMergeWithDefaults;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { isObject } from "./isObject";
|
|
2
|
+
export let objectMergeWithDefaults = (defaults, overrides) => overrides
|
|
3
|
+
? Object.keys(overrides).reduce((result, _key) => {
|
|
4
|
+
const keyDefaults = _key;
|
|
5
|
+
const keyOverrides = _key;
|
|
6
|
+
if (isObject(overrides[keyOverrides])) {
|
|
7
|
+
if (!defaults[keyDefaults]) {
|
|
8
|
+
defaults[keyDefaults] = {};
|
|
9
|
+
}
|
|
10
|
+
result[keyDefaults] = objectMergeWithDefaults(defaults[keyDefaults], overrides[keyOverrides]);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
result[keyDefaults] =
|
|
14
|
+
overrides[keyOverrides] === undefined
|
|
15
|
+
? defaults[keyDefaults]
|
|
16
|
+
: overrides[keyOverrides];
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}, { ...defaults })
|
|
20
|
+
: defaults;
|
|
21
|
+
export default objectMergeWithDefaults;
|
package/objectOmit.d.ts
CHANGED
package/objectOmit.js
ADDED
package/objectPick.d.ts
CHANGED
package/objectPick.js
ADDED
package/objectSort.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export declare let objectSort: <T extends object>(data: T, compareFn?: ((a: [Extract<keyof T, string>, T[Extract<keyof T, string>]], b: [Extract<keyof T, string>, T[Extract<keyof T, string>]]) => number) | undefined) => {
|
|
2
2
|
[k: string]: any;
|
|
3
3
|
};
|
|
4
|
+
export default objectSort;
|
package/objectSort.js
ADDED
package/objectToArray.d.ts
CHANGED
package/objectToArray.js
ADDED
package/package.json
CHANGED
package/parseCookie.d.ts
CHANGED
package/parseCookie.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
let tryDecode = (str, decode) => {
|
|
2
|
+
try {
|
|
3
|
+
return decode(str);
|
|
4
|
+
}
|
|
5
|
+
catch (e) {
|
|
6
|
+
return str;
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
export let parseCookie = (str, attributes = {}) => {
|
|
10
|
+
if (typeof str !== "string") {
|
|
11
|
+
throw new TypeError("argument str must be a string");
|
|
12
|
+
}
|
|
13
|
+
const obj = {};
|
|
14
|
+
const pairs = str.split(";");
|
|
15
|
+
const { decode = decodeURIComponent } = attributes;
|
|
16
|
+
for (let i = 0; i < pairs.length; i++) {
|
|
17
|
+
const pair = pairs[i];
|
|
18
|
+
const index = pair.indexOf("=");
|
|
19
|
+
if (index < 0) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const key = pair.substring(0, index).trim();
|
|
23
|
+
if (undefined == obj[key]) {
|
|
24
|
+
let val = pair.substring(index + 1, pair.length).trim();
|
|
25
|
+
if (val[0] === '"') {
|
|
26
|
+
val = val.slice(1, -1);
|
|
27
|
+
}
|
|
28
|
+
obj[key] = tryDecode(val, decode);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return obj;
|
|
32
|
+
};
|
|
33
|
+
export default parseCookie;
|
package/parseURL.d.ts
CHANGED
package/parseURL.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export let parseURL = (url) => {
|
|
2
|
+
const match = url.match(/^(https?:)\/\/(([^:/?#]*)(?::([0-9]+))?)([/]{0,1}[^?#]*)(\?[^#]*|)(#.*|)$/);
|
|
3
|
+
return (match && {
|
|
4
|
+
href: url,
|
|
5
|
+
protocol: match[1],
|
|
6
|
+
host: match[2],
|
|
7
|
+
hostname: match[3],
|
|
8
|
+
port: match[4],
|
|
9
|
+
pathname: match[5],
|
|
10
|
+
search: match[6],
|
|
11
|
+
hash: match[7],
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
export default parseURL;
|
package/quaranteneProps.d.ts
CHANGED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export let quaranteneProps = (props, propsKeysToQuarantene) => {
|
|
2
|
+
const healthyProps = {
|
|
3
|
+
_: {},
|
|
4
|
+
};
|
|
5
|
+
for (const key in props) {
|
|
6
|
+
const prop = props[key];
|
|
7
|
+
if (propsKeysToQuarantene.includes(key)) {
|
|
8
|
+
healthyProps._[key] = prop;
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
healthyProps[key] = prop;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return healthyProps;
|
|
15
|
+
};
|
|
16
|
+
export default quaranteneProps;
|
package/randomInt.d.ts
CHANGED
package/randomInt.js
ADDED
package/randomKey.d.ts
CHANGED
package/randomKey.js
ADDED
package/readCookie.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export declare function readCookie<T extends Record<string, unknown> = Record<string, string>>(name?: null): T;
|
|
2
2
|
export declare function readCookie<T extends Record<string, unknown> = Record<string, string>, N extends keyof T = keyof T>(name: N): T[N];
|
|
3
|
+
export default readCookie;
|
package/readCookie.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
let converterRead = (value) => {
|
|
2
|
+
if (value[0] === '"') {
|
|
3
|
+
value = value.slice(1, -1);
|
|
4
|
+
}
|
|
5
|
+
return value.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent);
|
|
6
|
+
};
|
|
7
|
+
export function readCookie(name) {
|
|
8
|
+
if (typeof document === "undefined") {
|
|
9
|
+
if (process.env["NODE_ENV"] === "development") {
|
|
10
|
+
console.warn("[@koine/utils:readCookie] document is undefined");
|
|
11
|
+
}
|
|
12
|
+
return name ? "" : {};
|
|
13
|
+
}
|
|
14
|
+
const cookies = document.cookie ? document.cookie.split("; ") : [];
|
|
15
|
+
const all = {};
|
|
16
|
+
for (let i = 0; i < cookies.length; i++) {
|
|
17
|
+
const parts = cookies[i].split("=");
|
|
18
|
+
const value = parts.slice(1).join("=");
|
|
19
|
+
try {
|
|
20
|
+
const found = decodeURIComponent(parts[0]);
|
|
21
|
+
all[found] = converterRead(value);
|
|
22
|
+
if (name === found) {
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
if (process.env["NODE_ENV"] === "development") {
|
|
28
|
+
console.warn("[@koine/utils:readCookie] failed to decode", value);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return name ? all[name] : all;
|
|
33
|
+
}
|
|
34
|
+
export default readCookie;
|
package/removeAccents.d.ts
CHANGED
package/removeAccents.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { accentsSets } from "./accentSets";
|
|
2
|
+
export let removeAccents = (text = "", sets = accentsSets) => {
|
|
3
|
+
let len = sets.length;
|
|
4
|
+
while (len--) {
|
|
5
|
+
const [to, from] = sets[len];
|
|
6
|
+
text = text.replace(new RegExp(`[${from}]`, "gi"), to);
|
|
7
|
+
}
|
|
8
|
+
return text;
|
|
9
|
+
};
|
|
10
|
+
export default removeAccents;
|
package/removeCookie.d.ts
CHANGED
package/removeCookie.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { defaultAttributesClient } from "./cookie";
|
|
2
|
+
import { setCookie } from "./setCookie";
|
|
3
|
+
export let removeCookie = (name, attributes = {}) => {
|
|
4
|
+
setCookie(name, "", {
|
|
5
|
+
...defaultAttributesClient,
|
|
6
|
+
...attributes,
|
|
7
|
+
expires: -1,
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
export default removeCookie;
|