Skip to content

Commit a7b35c1

Browse files
authored
Merge pull request #3544 from sniok/search-expressions
frontend: Use simple-eval for advanced search
2 parents d84f76a + 5b33fd4 commit a7b35c1

File tree

5 files changed

+40
-6
lines changed

5 files changed

+40
-6
lines changed

frontend/package-lock.json

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
"react-window": "^1.8.11",
9191
"recharts": "^2.1.4",
9292
"semver": "^7.3.5",
93+
"simple-eval": "^2.0.0",
9394
"spacetime": "^7.4.0",
9495
"stream-browserify": "^3.0.0",
9596
"stream-http": "^3.2.0",

frontend/src/components/advancedSearch/utils/searchWithQuery.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
* limitations under the License.
1515
*/
1616

17+
import jsep from 'jsep';
18+
import evaluate from 'simple-eval';
1719
import { getTopLevelKeys } from './getTopLevelKeys';
1820

1921
/**
@@ -32,24 +34,26 @@ export async function searchWithQuery<T extends { jsonData: any }>(
3234
const searchTimeStart = performance.now();
3335
const results: any[] = [];
3436

35-
const topLevelKeys = getTopLevelKeys(items.map(it => it.jsonData));
36-
37-
let queryFn: any;
37+
let filterExpression: any;
3838
const functionBody = query;
3939
try {
40-
queryFn = eval(`({ ${topLevelKeys.join(', ')} }) => { return ${functionBody}; }`);
40+
filterExpression = jsep(functionBody);
4141
} catch (e) {}
4242

43-
if (!queryFn) return { results: [], searchTimeMs: 0 };
43+
if (!filterExpression) return { results: [], searchTimeMs: 0 };
4444

4545
const batchSize = 5000;
4646

47+
// Create object that contains all keys of all objects
48+
const dummyObject: any = {};
49+
getTopLevelKeys(items.map(it => it.jsonData)).forEach(key => (dummyObject[key] = undefined));
50+
4751
for (let i = 0; i < items.length; i++) {
4852
const resource = items[i];
4953
const data = resource.jsonData;
5054

5155
try {
52-
const res = queryFn(data);
56+
const res = evaluate(filterExpression, { ...dummyObject, ...data });
5357
if (res === true) {
5458
results.push(resource);
5559
}

plugins/headlamp-plugin/package-lock.json

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

plugins/headlamp-plugin/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122
"resize-observer-polyfill": "^1.5.1",
123123
"semver": "^7.3.5",
124124
"shx": "^0.3.4",
125+
"simple-eval": "^2.0.0",
125126
"spacetime": "^7.4.0",
126127
"storybook": "^8.5.6",
127128
"stream-browserify": "^3.0.0",

0 commit comments

Comments
 (0)