From 897a9430eee547e18bf76ad1d0fd4198cbfe1dbe Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Tue, 26 Jul 2022 08:14:35 +1200 Subject: [PATCH 1/2] perf: cache jest fn call parsing results --- src/rules/utils/parseJestFnCall.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/rules/utils/parseJestFnCall.ts b/src/rules/utils/parseJestFnCall.ts index c24949df9..b3e335077 100644 --- a/src/rules/utils/parseJestFnCall.ts +++ b/src/rules/utils/parseJestFnCall.ts @@ -181,6 +181,8 @@ const resolvePossibleAliasedGlobal = ( return null; }; +const parseJestFnCallCache = new WeakMap(); + export const parseJestFnCall = ( node: TSESTree.CallExpression, context: TSESLint.RuleContext, @@ -197,6 +199,21 @@ export const parseJestFnCall = ( export const parseJestFnCallWithReason = ( node: TSESTree.CallExpression, context: TSESLint.RuleContext, +): ParsedJestFnCall | string | null => { + if (parseJestFnCallCache.has(node)) { + return parseJestFnCallCache.get(node); + } + + const parsedJestFnCall = parseJestFnCallWithReasonInner(node, context); + + parseJestFnCallCache.set(node, parsedJestFnCall); + + return parsedJestFnCall; +}; + +const parseJestFnCallWithReasonInner = ( + node: TSESTree.CallExpression, + context: TSESLint.RuleContext, ): ParsedJestFnCall | string | null => { const chain = getNodeChain(node); From 5b22fcf8f03cf15415df1714cf8f1d14dba16ad4 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Tue, 9 Aug 2022 07:31:48 +1200 Subject: [PATCH 2/2] refactor: avoid `has` call & strongly type `WeakMap` --- src/rules/utils/parseJestFnCall.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/rules/utils/parseJestFnCall.ts b/src/rules/utils/parseJestFnCall.ts index b3e335077..ea1e628bc 100644 --- a/src/rules/utils/parseJestFnCall.ts +++ b/src/rules/utils/parseJestFnCall.ts @@ -181,7 +181,10 @@ const resolvePossibleAliasedGlobal = ( return null; }; -const parseJestFnCallCache = new WeakMap(); +const parseJestFnCallCache = new WeakMap< + TSESTree.CallExpression, + ParsedJestFnCall | string | null +>(); export const parseJestFnCall = ( node: TSESTree.CallExpression, @@ -200,11 +203,13 @@ export const parseJestFnCallWithReason = ( node: TSESTree.CallExpression, context: TSESLint.RuleContext, ): ParsedJestFnCall | string | null => { - if (parseJestFnCallCache.has(node)) { - return parseJestFnCallCache.get(node); + let parsedJestFnCall = parseJestFnCallCache.get(node); + + if (parsedJestFnCall) { + return parsedJestFnCall; } - const parsedJestFnCall = parseJestFnCallWithReasonInner(node, context); + parsedJestFnCall = parseJestFnCallWithReasonInner(node, context); parseJestFnCallCache.set(node, parsedJestFnCall);