From 3650589236615ccf3cd6f7e0d686681545404fe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20De=20Boey?= Date: Wed, 6 Oct 2021 01:06:46 +0200 Subject: [PATCH] feat(experimental-utils): extract `ast-utils`' `predicates`' helpers --- .../src/ast-utils/helpers.ts | 37 +++++++++++++++++ .../src/ast-utils/predicates.ts | 40 +++---------------- 2 files changed, 42 insertions(+), 35 deletions(-) create mode 100644 packages/experimental-utils/src/ast-utils/helpers.ts diff --git a/packages/experimental-utils/src/ast-utils/helpers.ts b/packages/experimental-utils/src/ast-utils/helpers.ts new file mode 100644 index 00000000000..5d917df603a --- /dev/null +++ b/packages/experimental-utils/src/ast-utils/helpers.ts @@ -0,0 +1,37 @@ +import { AST_NODE_TYPES, TSESTree } from '../ts-estree'; + +export const isNodeOfType = + (nodeType: NodeType) => + ( + node: TSESTree.Node | null | undefined, + ): node is TSESTree.Node & { type: NodeType } => + node?.type === nodeType; + +export const isNodeOfTypes = + (nodeTypes: NodeTypes) => + ( + node: TSESTree.Node | null | undefined, + ): node is TSESTree.Node & { type: NodeTypes[number] } => + !!node && nodeTypes.includes(node.type); + +type ObjectEntry = [keyof BaseType, BaseType[keyof BaseType]]; +type ObjectEntries = Array>; +export const isNodeOfTypeWithConditions = < + NodeType extends AST_NODE_TYPES, + Conditions extends Partial, +>( + nodeType: NodeType, + conditions: Conditions, +): (( + node: TSESTree.Node | null | undefined, +) => node is TSESTree.Node & { type: NodeType } & Conditions) => { + const entries = Object.entries(conditions) as ObjectEntries< + TSESTree.Node & { type: NodeType } + >; + + return ( + node: TSESTree.Node | null | undefined, + ): node is TSESTree.Node & { type: NodeType } & Conditions => + node?.type === nodeType && + entries.every(([key, value]) => node[key] === value); +}; diff --git a/packages/experimental-utils/src/ast-utils/predicates.ts b/packages/experimental-utils/src/ast-utils/predicates.ts index 5044dfcca6e..7eea8325a3f 100644 --- a/packages/experimental-utils/src/ast-utils/predicates.ts +++ b/packages/experimental-utils/src/ast-utils/predicates.ts @@ -1,40 +1,10 @@ import { AST_NODE_TYPES, AST_TOKEN_TYPES, TSESTree } from '../ts-estree'; -const isNodeOfType = - (nodeType: NodeType) => - ( - node: TSESTree.Node | null | undefined, - ): node is TSESTree.Node & { type: NodeType } => - node?.type === nodeType; - -const isNodeOfTypes = - (nodeTypes: NodeTypes) => - ( - node: TSESTree.Node | null | undefined, - ): node is TSESTree.Node & { type: NodeTypes[number] } => - !!node && nodeTypes.includes(node.type); - -type ObjectEntry = [keyof BaseType, BaseType[keyof BaseType]]; -type ObjectEntries = Array>; -const isNodeOfTypeWithConditions = < - NodeType extends AST_NODE_TYPES, - Conditions extends Partial, ->( - nodeType: NodeType, - conditions: Conditions, -): (( - node: TSESTree.Node | null | undefined, -) => node is TSESTree.Node & { type: NodeType } & Conditions) => { - const entries = Object.entries(conditions) as ObjectEntries< - TSESTree.Node & { type: NodeType } - >; - - return ( - node: TSESTree.Node | null | undefined, - ): node is TSESTree.Node & { type: NodeType } & Conditions => - node?.type === nodeType && - entries.every(([key, value]) => node[key] === value); -}; +import { + isNodeOfType, + isNodeOfTypes, + isNodeOfTypeWithConditions, +} from './helpers'; function isOptionalChainPunctuator( token: TSESTree.Token,