Skip to content

Commit cec2380

Browse files
committed
fix: [#618] Tampering with original value casing + configurable property matching
1 parent 180b0c6 commit cec2380

File tree

1 file changed

+39
-9
lines changed

1 file changed

+39
-9
lines changed

src/resource/filter-util.ts

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
export const byNameCaseInsensitive = (name?: string) => {
3-
return <TObject extends {name?: string}>(object: TObject) => {
3+
return <TObject extends { name?: string }>(object: TObject) => {
44
if (object?.name && name) {
55
return object.name.toLocaleLowerCase().localeCompare(name.toLocaleLowerCase()) === 0;
66
}
@@ -9,7 +9,7 @@ export const byNameCaseInsensitive = (name?: string) => {
99
}
1010

1111
export const byClassCaseInsensitive = (className?: string) => {
12-
return <TObject extends {class?: string}>(object: TObject) => {
12+
return <TObject extends { class?: string }>(object: TObject) => {
1313
if (object?.class && className) {
1414
return object.class.toLocaleLowerCase().localeCompare(className.toLocaleLowerCase()) === 0;
1515
}
@@ -20,17 +20,13 @@ export const byClassCaseInsensitive = (className?: string) => {
2020
const copyPropsLowerCase = (properties: Map<string, string | number | boolean>) => {
2121
const lowercase = new Map<string, string | number | boolean>();
2222
for (let [key, value] of properties) {
23-
let normalizedValue = value;
24-
if (typeof value === 'string') {
25-
normalizedValue = value.toLocaleLowerCase();
26-
}
27-
lowercase.set(key.toLocaleLowerCase(), normalizedValue);
23+
lowercase.set(key.toLocaleLowerCase(), value);
2824
}
2925
return lowercase;
3026
}
3127

3228
export const byPropertyCaseInsensitive = (propertyName: string, value?: any) => {
33-
return <TObject extends {properties: Map<string, string | number | boolean>}>(object: TObject) => {
29+
return <TObject extends { properties: Map<string, string | number | boolean> }>(object: TObject) => {
3430
const lowercase = copyPropsLowerCase(object.properties);
3531

3632
if (value !== undefined) {
@@ -39,9 +35,43 @@ export const byPropertyCaseInsensitive = (propertyName: string, value?: any) =>
3935
normalizedValue = value.toLocaleLowerCase();
4036
}
4137

38+
const maybeValue = lowercase.get(propertyName.toLocaleLowerCase());
39+
if (typeof maybeValue === 'string') {
40+
return maybeValue.toLocaleLowerCase() === normalizedValue;
41+
}
42+
43+
return lowercase.get(propertyName.toLocaleLowerCase()) === normalizedValue;
44+
} else {
45+
return lowercase.has(propertyName.toLocaleLowerCase());
46+
}
47+
}
48+
}
49+
50+
export const byProperty = (propertyName: string, value?: any, valueMatchInsensitve = true) => {
51+
return <TObject extends { properties: Map<string, string | number | boolean> }>(object: TObject) => {
52+
const lowercase = copyPropsLowerCase(object.properties);
53+
54+
if (value !== undefined) {
55+
let normalizedValue = value;
56+
if (typeof value === 'string') {
57+
normalizedValue = valueMatchInsensitve ? value.toLocaleLowerCase() : value;
58+
}
59+
60+
const maybeValue = lowercase.get(propertyName.toLocaleLowerCase());
61+
if (typeof maybeValue === 'string') {
62+
return (valueMatchInsensitve ? maybeValue.toLocaleLowerCase() : maybeValue) === normalizedValue;
63+
}
64+
4265
return lowercase.get(propertyName.toLocaleLowerCase()) === normalizedValue;
4366
} else {
4467
return lowercase.has(propertyName.toLocaleLowerCase());
4568
}
4669
}
47-
}
70+
}
71+
72+
export const byPropertyMatcher = (propertyName: string, matchValue: (val: any) => boolean) => {
73+
return <TObject extends { properties: Map<string, string | number | boolean> }>(object: TObject) => {
74+
const lowercase = copyPropsLowerCase(object.properties);
75+
return matchValue(lowercase.get(propertyName.toLocaleLowerCase()));
76+
}
77+
}

0 commit comments

Comments
 (0)