@koine/utils 2.0.0-beta.72 → 2.0.0-beta.73
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.js +10 -0
- package/Emitter.js +19 -0
- package/accentSets.js +29 -0
- package/addOrReplaceAtIdx.js +14 -0
- package/areEqual.js +45 -0
- package/arrayFilterFalsy.js +1 -0
- package/arrayFindLastIndex.js +8 -0
- package/arrayOfAll.js +1 -0
- package/arraySum.js +1 -0
- package/arrayToLookup.js +4 -0
- package/arrayUniqueByProperties.js +1 -0
- package/buildUrlQueryString.js +20 -0
- package/capitalize.js +2 -0
- package/changeCaseCamel.js +18 -0
- package/changeCaseCapital.js +11 -0
- package/changeCaseConstant.js +7 -0
- package/changeCaseDot.js +2 -0
- package/changeCaseHelpers.d.ts +0 -5
- package/changeCaseHelpers.js +71 -0
- package/changeCaseKebab.js +2 -0
- package/changeCaseNone.js +7 -0
- package/changeCasePascal.js +10 -0
- package/changeCasePascalSnake.js +2 -0
- package/changeCasePath.js +2 -0
- package/changeCaseSentence.js +16 -0
- package/changeCaseSnake.js +2 -0
- package/changeCaseTrain.js +2 -0
- package/chunkByChunks.js +31 -0
- package/chunkBySize.js +7 -0
- package/clamp.js +1 -0
- package/clsx.js +39 -0
- package/convertRange.js +1 -0
- package/cookie.js +1 -0
- package/createPalette.js +11 -0
- package/debounce.js +17 -0
- package/debouncePromise.js +51 -0
- package/debounceRaf.js +12 -0
- package/decode.js +1 -0
- package/encode.js +1 -0
- package/ensureInt.js +1 -0
- package/env.js +1 -0
- package/errorToString.js +2 -0
- package/escapeRegExp.js +1 -0
- package/findDuplicatedIndexes.js +10 -0
- package/forin.js +5 -0
- package/gbToBytes.js +1 -0
- package/getEmptyArray.js +4 -0
- package/getKeys.js +1 -0
- package/getMediaQueryWidthResolvers.js +41 -0
- package/getMediaQueryWidthTailwindScreens.js +26 -0
- package/getNonce.js +2 -0
- package/getParamAmong.js +5 -0
- package/getParamAsInt.js +8 -0
- package/getParamAsString.js +2 -0
- package/getType.js +1 -0
- package/getUrlHashParams.js +8 -0
- package/getUrlHashPathname.js +1 -0
- package/getUrlPathnameParts.js +5 -0
- package/getUrlQueryParams.js +21 -0
- package/imgEmptyPixel.js +1 -0
- package/index.js +156 -0
- package/invariant.js +16 -0
- package/isAbsoluteUrl.js +2 -0
- package/isAnyObject.js +2 -0
- package/isArray.js +2 -0
- package/isBlob.js +2 -0
- package/isBoolean.js +2 -0
- package/isBrowser.js +1 -0
- package/isBrowserNow.js +2 -0
- package/isDate.js +2 -0
- package/isEmptyArray.js +2 -0
- package/isEmptyObject.js +2 -0
- package/isEmptyString.js +1 -0
- package/isError.js +2 -0
- package/isExternalUrl.js +10 -0
- package/isFile.js +2 -0
- package/isFloat.js +2 -0
- package/isFormData.js +2 -0
- package/isFullArray.js +2 -0
- package/isFullObject.js +2 -0
- package/isFullString.js +2 -0
- package/isFunction.js +1 -0
- package/isInt.js +2 -0
- package/isMap.js +2 -0
- package/isNaNValue.js +2 -0
- package/isNegativeNumber.js +2 -0
- package/isNull.js +2 -0
- package/isNullOrUndefined.js +4 -0
- package/isNumber.js +2 -0
- package/isNumericLiteral.js +1 -0
- package/isObject.js +2 -0
- package/isObjectLike.js +2 -0
- package/isObjectStringKeyed.js +2 -0
- package/isOneOf.js +7 -0
- package/isPlainObject.js +5 -0
- package/isPositiveNumber.js +2 -0
- package/isPrimitive.js +12 -0
- package/isPromise.js +2 -0
- package/isRegExp.js +2 -0
- package/isServer.js +2 -0
- package/isServerNow.js +2 -0
- package/isSet.js +2 -0
- package/isString.js +2 -0
- package/isSymbol.js +2 -0
- package/isType.js +12 -0
- package/isUndefined.js +2 -0
- package/isWeakMap.js +2 -0
- package/isWeakSet.js +2 -0
- package/kbToBytes.js +1 -0
- package/location.js +1 -0
- package/lowercase.js +1 -0
- package/mapListBy.js +4 -0
- package/matchSorter.js +238 -0
- package/mbToBytes.js +1 -0
- package/mergeObjects.js +28 -0
- package/mergeUrlQueryParams.js +13 -0
- package/moveSortableArrayItemByKey.js +8 -0
- package/noop.js +1 -0
- package/normaliseUrl.js +2 -0
- package/normaliseUrlPathname.js +2 -0
- package/objectFlat.js +16 -0
- package/objectFlip.js +4 -0
- package/objectMergeWithDefaults.js +20 -0
- package/objectOmit.js +7 -0
- package/objectPick.js +8 -0
- package/objectSort.js +1 -0
- package/objectSortByKeysMatching.js +2 -0
- package/objectToArray.js +1 -0
- package/package.json +1 -1
- package/parseCookie.js +32 -0
- package/parseURL.js +13 -0
- package/quaranteneProps.js +15 -0
- package/randomInt.js +1 -0
- package/randomKey.js +4 -0
- package/readCookie.js +33 -0
- package/removeAccents.js +9 -0
- package/removeCookie.js +9 -0
- package/removeDuplicates.js +1 -0
- package/removeDuplicatesByKey.js +12 -0
- package/removeDuplicatesComparing.js +6 -0
- package/removeIndexesFromArray.js +9 -0
- package/removeTrailingSlash.js +1 -0
- package/removeUrlQueryParams.js +13 -0
- package/render.js +112 -0
- package/round.js +3 -0
- package/roundTo.js +10 -0
- package/serializeCookie.js +68 -0
- package/setCookie.js +44 -0
- package/shuffle.js +16 -0
- package/slugify.js +10 -0
- package/split.js +1 -0
- package/splitReverse.js +1 -0
- package/swapMap.js +7 -0
- package/throttle.js +14 -0
- package/titleCase.js +3 -0
- package/toNumber.js +2 -0
- package/toRgba.js +7 -0
- package/transformToUrlPathname.js +4 -0
- package/truncate.js +5 -0
- package/tryUntil.js +14 -0
- package/types.js +1 -0
- package/uid.js +5 -0
- package/updateLinkParams.js +6 -0
- package/updateUrlQueryParams.js +10 -0
- package/uppercase.js +1 -0
- package/uuid.js +4 -0
- package/uuidNumeric.js +1 -0
- package/wait.js +1 -0
- package/without.js +1 -0
package/matchSorter.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
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 };
|
package/mbToBytes.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let mbToBytes = (bytes) => bytes * 1000 * 1000;
|
package/mergeObjects.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
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
|
+
};
|
package/noop.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let noop = () => void 0;
|
package/normaliseUrl.js
ADDED
package/objectFlat.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
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
|
+
};
|
package/objectFlip.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
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;
|
package/objectOmit.js
ADDED
package/objectPick.js
ADDED
package/objectSort.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let objectSort = (data, compareFn) => Object.fromEntries(Object.entries(data).sort(compareFn));
|
package/objectToArray.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let objectToArray = (obj, iterator) => Object.keys(obj).map(iterator);
|
package/package.json
CHANGED
package/parseCookie.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
};
|
package/parseURL.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
};
|
package/randomInt.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let randomInt = (min, max) => Math.floor(Math.random() * (max - min + 1) + min);
|
package/randomKey.js
ADDED
package/readCookie.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
}
|
package/removeAccents.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
};
|
package/removeCookie.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export let removeDuplicatesByKey = (array = [], key) => {
|
|
2
|
+
const keysMap = {};
|
|
3
|
+
const output = [];
|
|
4
|
+
for (let i = 0; i < array.length; i++) {
|
|
5
|
+
const item = array[i];
|
|
6
|
+
if (!keysMap[item[key]]) {
|
|
7
|
+
output.push(item);
|
|
8
|
+
keysMap[item[key]] = true;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return output;
|
|
12
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { findDuplicatedIndexes } from "./findDuplicatedIndexes";
|
|
2
|
+
import { removeIndexesFromArray } from "./removeIndexesFromArray";
|
|
3
|
+
export let removeDuplicatesComparing = (from, to) => {
|
|
4
|
+
const indexes = findDuplicatedIndexes(from);
|
|
5
|
+
return removeIndexesFromArray(to, indexes);
|
|
6
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export let removeTralingSlash = (urlLike) => (urlLike || "").replace(/\/*$/, "");
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { buildUrlQueryString } from "./buildUrlQueryString";
|
|
2
|
+
import { getUrlQueryParams } from "./getUrlQueryParams";
|
|
3
|
+
export let removeUrlQueryParams = (url, paramsToRemove = []) => {
|
|
4
|
+
const parts = url.split("?");
|
|
5
|
+
const allParams = getUrlQueryParams(url);
|
|
6
|
+
const params = {};
|
|
7
|
+
for (const key in allParams) {
|
|
8
|
+
if (!paramsToRemove.includes(key)) {
|
|
9
|
+
params[key] = allParams[key];
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return parts[0] + buildUrlQueryString(params);
|
|
13
|
+
};
|