You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.3 KiB
104 lines
3.3 KiB
"use strict"; |
|
|
|
Object.defineProperty(exports, "__esModule", { |
|
value: true |
|
}); |
|
exports.fuzzyMatches = fuzzyMatches; |
|
exports.getDefaultNormalizer = getDefaultNormalizer; |
|
exports.makeNormalizer = makeNormalizer; |
|
exports.matches = matches; |
|
|
|
function assertNotNullOrUndefined(matcher) { |
|
if (matcher === null || matcher === undefined) { |
|
throw new Error( // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- implicitly converting `T` to `string` |
|
`It looks like ${matcher} was passed instead of a matcher. Did you do something like getByText(${matcher})?`); |
|
} |
|
} |
|
|
|
function fuzzyMatches(textToMatch, node, matcher, normalizer) { |
|
if (typeof textToMatch !== 'string') { |
|
return false; |
|
} |
|
|
|
assertNotNullOrUndefined(matcher); |
|
const normalizedText = normalizer(textToMatch); |
|
|
|
if (typeof matcher === 'string' || typeof matcher === 'number') { |
|
return normalizedText.toLowerCase().includes(matcher.toString().toLowerCase()); |
|
} else if (typeof matcher === 'function') { |
|
return matcher(normalizedText, node); |
|
} else { |
|
return matchRegExp(matcher, normalizedText); |
|
} |
|
} |
|
|
|
function matches(textToMatch, node, matcher, normalizer) { |
|
if (typeof textToMatch !== 'string') { |
|
return false; |
|
} |
|
|
|
assertNotNullOrUndefined(matcher); |
|
const normalizedText = normalizer(textToMatch); |
|
|
|
if (matcher instanceof Function) { |
|
return matcher(normalizedText, node); |
|
} else if (matcher instanceof RegExp) { |
|
return matchRegExp(matcher, normalizedText); |
|
} else { |
|
return normalizedText === String(matcher); |
|
} |
|
} |
|
|
|
function getDefaultNormalizer({ |
|
trim = true, |
|
collapseWhitespace = true |
|
} = {}) { |
|
return text => { |
|
let normalizedText = text; |
|
normalizedText = trim ? normalizedText.trim() : normalizedText; |
|
normalizedText = collapseWhitespace ? normalizedText.replace(/\s+/g, ' ') : normalizedText; |
|
return normalizedText; |
|
}; |
|
} |
|
/** |
|
* Constructs a normalizer to pass to functions in matches.js |
|
* @param {boolean|undefined} trim The user-specified value for `trim`, without |
|
* any defaulting having been applied |
|
* @param {boolean|undefined} collapseWhitespace The user-specified value for |
|
* `collapseWhitespace`, without any defaulting having been applied |
|
* @param {Function|undefined} normalizer The user-specified normalizer |
|
* @returns {Function} A normalizer |
|
*/ |
|
|
|
|
|
function makeNormalizer({ |
|
trim, |
|
collapseWhitespace, |
|
normalizer |
|
}) { |
|
if (!normalizer) { |
|
// No custom normalizer specified. Just use default. |
|
return getDefaultNormalizer({ |
|
trim, |
|
collapseWhitespace |
|
}); |
|
} |
|
|
|
if (typeof trim !== 'undefined' || typeof collapseWhitespace !== 'undefined') { |
|
// They've also specified a value for trim or collapseWhitespace |
|
throw new Error('trim and collapseWhitespace are not supported with a normalizer. ' + 'If you want to use the default trim and collapseWhitespace logic in your normalizer, ' + 'use "getDefaultNormalizer({trim, collapseWhitespace})" and compose that into your normalizer'); |
|
} |
|
|
|
return normalizer; |
|
} |
|
|
|
function matchRegExp(matcher, text) { |
|
const match = matcher.test(text); |
|
|
|
if (matcher.global && matcher.lastIndex !== 0) { |
|
console.warn(`To match all elements we had to reset the lastIndex of the RegExp because the global flag is enabled. We encourage to remove the global flag from the RegExp.`); |
|
matcher.lastIndex = 0; |
|
} |
|
|
|
return match; |
|
} |