From a1070b8ceab6fb7dbe9a23423d51def182930666 Mon Sep 17 00:00:00 2001 From: Andrey Goncharov Date: Fri, 10 Nov 2023 04:34:09 -0800 Subject: [PATCH] Add regex support Reviewed By: LukeDefeo Differential Revision: D51198464 fbshipit-source-id: 445cc47f90c2730f3b0728e5bf667330274d103d --- .../DataTableDefaultPowerSearchOperators.tsx | 31 +++++++++++++++++++ .../data-table/DataTableWithPowerSearch.tsx | 5 +++ 2 files changed, 36 insertions(+) diff --git a/desktop/flipper-plugin/src/ui/data-table/DataTableDefaultPowerSearchOperators.tsx b/desktop/flipper-plugin/src/ui/data-table/DataTableDefaultPowerSearchOperators.tsx index 6b8d8d250..6a58391fc 100644 --- a/desktop/flipper-plugin/src/ui/data-table/DataTableDefaultPowerSearchOperators.tsx +++ b/desktop/flipper-plugin/src/ui/data-table/DataTableDefaultPowerSearchOperators.tsx @@ -21,6 +21,11 @@ export type PowerSearchOperatorProcessor = ( ) => boolean; export const dataTablePowerSearchOperators = { + string_matches_regex: () => ({ + label: 'matches regex', + key: 'string_matches_regex', + valueType: 'STRING', + }), string_contains: () => ({ label: 'contains', key: 'string_contains', @@ -46,6 +51,11 @@ export const dataTablePowerSearchOperators = { key: 'searializable_object_contains', valueType: 'STRING', }), + searializable_object_matches_regex: () => ({ + label: 'matches regex', + key: 'searializable_object_matches_regex', + valueType: 'STRING', + }), searializable_object_not_contains: () => ({ label: 'does not contain', key: 'searializable_object_not_contains', @@ -217,7 +227,23 @@ const tryConvertingUnknownToString = (value: unknown): string | null => { } }; +const regexCache: Record = {}; +function safeCreateRegExp(source: string): RegExp | undefined { + try { + if (!regexCache[source]) { + regexCache[source] = new RegExp(source); + } + return regexCache[source]; + } catch (_e) { + return undefined; + } +} + export const dataTablePowerSearchOperatorProcessorConfig = { + string_matches_regex: (_operator, searchValue: string, value: string) => + !!safeCreateRegExp(searchValue)?.test( + tryConvertingUnknownToString(value) ?? '', + ), string_contains: (_operator, searchValue: string, value: string) => !!tryConvertingUnknownToString(value) ?.toLowerCase() @@ -226,6 +252,11 @@ export const dataTablePowerSearchOperatorProcessorConfig = { !tryConvertingUnknownToString(value) ?.toLowerCase() .includes(searchValue.toLowerCase()), + searializable_object_matches_regex: ( + _operator, + searchValue: string, + value: object, + ) => !!safeCreateRegExp(searchValue)?.test(JSON.stringify(value)), searializable_object_contains: ( _operator, searchValue: string, diff --git a/desktop/flipper-plugin/src/ui/data-table/DataTableWithPowerSearch.tsx b/desktop/flipper-plugin/src/ui/data-table/DataTableWithPowerSearch.tsx index e2a38c57e..7dd62e905 100644 --- a/desktop/flipper-plugin/src/ui/data-table/DataTableWithPowerSearch.tsx +++ b/desktop/flipper-plugin/src/ui/data-table/DataTableWithPowerSearch.tsx @@ -119,6 +119,8 @@ const powerSearchConfigEntireRow: FieldConfig = { dataTablePowerSearchOperators.searializable_object_contains(), searializable_object_not_contains: dataTablePowerSearchOperators.searializable_object_not_contains(), + searializable_object_matches_regex: + dataTablePowerSearchOperators.searializable_object_matches_regex(), }, useWholeRow: true, }; @@ -388,6 +390,7 @@ export function DataTable( dataTablePowerSearchOperators.string_not_matches_exactly(), dataTablePowerSearchOperators.string_set_contains_any_of(), dataTablePowerSearchOperators.string_set_contains_none_of(), + dataTablePowerSearchOperators.string_matches_regex(), ]; } else if (Array.isArray(column.powerSearchConfig)) { columnPowerSearchOperators = column.powerSearchConfig; @@ -433,6 +436,7 @@ export function DataTable( dataTablePowerSearchOperators.string_not_matches_exactly(), dataTablePowerSearchOperators.string_set_contains_any_of(), dataTablePowerSearchOperators.string_set_contains_none_of(), + dataTablePowerSearchOperators.string_matches_regex(), ]; break; } @@ -483,6 +487,7 @@ export function DataTable( columnPowerSearchOperators = [ dataTablePowerSearchOperators.searializable_object_contains(), dataTablePowerSearchOperators.searializable_object_not_contains(), + dataTablePowerSearchOperators.searializable_object_matches_regex(), ]; break; }