Skip to content

Commit c505ab6

Browse files
committed
fix(ui): handle RegExp input for filters
1 parent bb5e3cc commit c505ab6

File tree

3 files changed

+40
-10
lines changed

3 files changed

+40
-10
lines changed

src/ui/cli/FilterSuites.tsx

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react'
1+
import React, { useState } from 'react'
22
import { Box, Text } from 'ink'
33
import { useTester } from '../TesterContext'
44
import { useSubscribers } from './useSubscribers'
@@ -23,21 +23,34 @@ export function FilterSuitesValue() {
2323
export function FilterSuitesInput() {
2424
const tester = useTester()
2525
useSubscribers([
26-
r => tester.addListener('option', e => {
26+
() => tester.addListener('option', e => {
2727
if (e.key === 'filterSuites') {
28-
r()
28+
setFilter(e.value)
2929
}
3030
}),
3131
], [tester])
3232

3333
const { navigate } = useRouter()
3434

35+
const [filter, setFilter] = useState(tester.filterSuites.get())
3536
const input = useStringInput(getRegexpSource(tester.filterSuites.get()), {
36-
onChange: (v: string) => tester.filterSuites.set(v ? new RegExp(v, 'i') : undefined),
37+
onInput: v => {
38+
try {
39+
setFilter(setRegexpSource(v))
40+
} catch {
41+
//
42+
}
43+
},
44+
onChange: v => {
45+
try {
46+
tester.filterSuites.set(setRegexpSource(v))
47+
} catch {
48+
return false
49+
}
50+
},
3751
onEscape: () => navigate('/'),
3852
})
3953

40-
const filter = input.value ? new RegExp(input.value, 'i') : undefined
4154
return <Box
4255
justifyContent="space-between"
4356
flexWrap="wrap"
@@ -79,5 +92,9 @@ export function FilterSuitesInput() {
7992
}
8093

8194
function getRegexpSource(r: RegExp | undefined) {
82-
return r?.source.replaceAll(/\\(.)/g, '$1') ?? ''
95+
return r?.source.replaceAll('\\/', '/') ?? ''
96+
}
97+
98+
function setRegexpSource(s: string) {
99+
return s ? new RegExp(s.replaceAll('/', '\\/')) : undefined
83100
}

src/ui/cli/FilterTests.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,13 @@ export function FilterTestsInput() {
3333
const { navigate } = useRouter()
3434

3535
const input = useStringInput(getRegexpSource(tester.filterTests.get()), {
36-
onChange: (v: string) => tester.filterTests.set(v ? new RegExp(v, 'i') : undefined),
36+
onChange: v => {
37+
try {
38+
tester.filterTests.set(setRegexpSource(v))
39+
} catch {
40+
return false
41+
}
42+
},
3743
onEscape: () => navigate('/'),
3844
})
3945

@@ -71,3 +77,7 @@ export function FilterTestsInput() {
7177
function getRegexpSource(r: RegExp | undefined) {
7278
return r?.source.replaceAll(/\\(.)/g, '$1') ?? ''
7379
}
80+
81+
function setRegexpSource(s: string) {
82+
return s ? new RegExp(s.replaceAll('/', '\\/')) : undefined
83+
}

src/ui/cli/Input.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export function useStringInput(
1111
onEscape,
1212
isFocused = true,
1313
}: {
14-
onChange: (s: string) => void
14+
onChange: (s: string) => void|boolean
1515
onInput?: (s: string) => void
1616
onReset?: (s: string) => void
1717
onEscape?: () => void
@@ -41,9 +41,12 @@ export function useStringInput(
4141
}
4242
} else if (key.return) {
4343
if (value !== initialValue) {
44-
onChange(value)
44+
if (onChange(value) !== false) {
45+
onEscape?.()
46+
}
47+
} else {
48+
onEscape?.()
4549
}
46-
onEscape?.()
4750
} else if (key.shift && (key.backspace || key.delete)) {
4851
set({ value: '', pos: 0 })
4952
onInput?.('')

0 commit comments

Comments
 (0)