/
text.js
60 lines (55 loc) 路 1.6 KB
/
text.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import {wrapAllByQueryWithSuggestion} from '../query-helpers'
import {DEFAULT_IGNORE_TAGS} from '../config'
import {
fuzzyMatches,
matches,
makeNormalizer,
getNodeText,
buildQueries,
} from './all-utils'
function queryAllByText(
container,
text,
{
selector = '*',
exact = true,
collapseWhitespace,
trim,
ignore = DEFAULT_IGNORE_TAGS,
normalizer,
} = {},
) {
const matcher = exact ? matches : fuzzyMatches
const matchNormalizer = makeNormalizer({collapseWhitespace, trim, normalizer})
let baseArray = []
if (typeof container.matches === 'function' && container.matches(selector)) {
baseArray = [container]
}
return [...baseArray, ...Array.from(container.querySelectorAll(selector))]
.filter(node => !ignore || !node.matches(ignore))
.filter(node => matcher(getNodeText(node), node, text, matchNormalizer))
}
const getMultipleError = (c, text) =>
`Found multiple elements with the text: ${text}`
const getMissingError = (c, text) =>
`Unable to find an element with the text: ${text}. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.`
const queryAllByTextWithSuggestions = wrapAllByQueryWithSuggestion(
queryAllByText,
queryAllByText.name,
'queryAll',
)
const [
queryByText,
getAllByText,
getByText,
findAllByText,
findByText,
] = buildQueries(queryAllByText, getMultipleError, getMissingError)
export {
queryByText,
queryAllByTextWithSuggestions as queryAllByText,
getByText,
getAllByText,
findAllByText,
findByText,
}