Skip to content

Commit

Permalink
fix: guard against type errors in prefer-t-regex
Browse files Browse the repository at this point in the history
  • Loading branch information
spence-s committed Jan 17, 2023
1 parent 40a81b6 commit 35dcd13
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 3 deletions.
27 changes: 25 additions & 2 deletions rules/prefer-t-regex.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ const create = context => {
```
*/
const findRootReference = node => {
if (!node) {
return;
}

if (node.type === 'Identifier') {
const reference = findReference(node.name);

Expand Down Expand Up @@ -80,18 +84,27 @@ const create = context => {
2. `RegExp` class can't be looked up so the function just checks for the name `RegExp`.
*/
const isRegExp = lookup => {
if (lookup.regex) {
if (lookup?.regex) {
return true;
}

// Look up references in case it's a variable or RegExp declaration.
const reference = findRootReference(lookup);

if (!reference) {
return false;
}

return reference.regex ?? reference.name === 'RegExp';
};

const booleanHandler = node => {
const firstArg = node.arguments[0];

if (!firstArg) {
return;
}

const isFunctionCall = firstArg.type === 'CallExpression';
if (!isFunctionCall || !firstArg.callee.property) {
return;
Expand Down Expand Up @@ -144,6 +157,11 @@ const create = context => {
}

const matchee = secondArgumentIsRegex ? firstArg : secondArg;

if (!matchee) {
return;
}

const regex = secondArgumentIsRegex ? secondArg : firstArg;

const booleanFixer = assertion => fixer => {
Expand Down Expand Up @@ -179,7 +197,12 @@ const create = context => {
CallExpression: visitIf([
ava.isInTestFile,
ava.isInTestNode,
])(node => {
],
)(node => {
if (!node?.callee?.property) {
return;
}

const isAssertion = node.callee.type === 'MemberExpression'
&& util.getNameOfRootNodeObject(node.callee) === 't';

Expand Down
10 changes: 9 additions & 1 deletion test/prefer-t-regex.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,16 @@ ruleTester.run('prefer-t-regex', rule, {
header + 'test(t => t.regex(foo, RegExp(/\\d+/)));',
// Shouldn't be triggered since it's not a test file
'test(t => t.true(/\\d+/.test("foo")));',
// Not valid, but it shouldn't cause errors
'test(t => t.true());',
// These shouldn't cause errors as this rule affects them.
// This rule would crash on the following.
header + 'test(t => t.true());',
header + 'test(t => t.is(true))',
header + 'test(t => t.is())',
header + 'test(t => t.false())',
header + 'test(t => t.falsy())',
header + 'test(t => t.truthy())',
header + 'test(t => t.deepEqual(true))',
],
invalid: [
{
Expand Down

0 comments on commit 35dcd13

Please sign in to comment.