import { Path } from './index' interface INode { type?: string after?: Node depth?: number } export type Node = | IdentifierNode | WildcardOperatorNode | GroupExpressionNode | RangeExpressionNode | DestructorExpressionNode | ObjectPatternNode | ArrayPatternNode | DotOperatorNode | ExpandOperatorNode | INode export type IdentifierNode = { type: 'Identifier' value: string arrayIndex?: boolean } & INode export type IgnoreExpressionNode = { type: 'IgnoreExpression' value: string } & INode export type DotOperatorNode = { type: 'DotOperator' } & INode export type WildcardOperatorNode = { type: 'WildcardOperator' filter?: GroupExpressionNode | RangeExpressionNode } & INode export type ExpandOperatorNode = { type: 'ExpandOperator' } & INode export type GroupExpressionNode = { type: 'GroupExpression' value: Node[] isExclude?: boolean } & INode export type RangeExpressionNode = { type: 'RangeExpression' start?: IdentifierNode end?: IdentifierNode } & INode export type DestructorExpressionNode = { type: 'DestructorExpression' value?: ObjectPatternNode | ArrayPatternNode source?: string } & INode export type ObjectPatternNode = { type: 'ObjectPattern' properties: ObjectPatternPropertyNode[] } & INode export type ObjectPatternPropertyNode = { type: 'ObjectPatternProperty' key: IdentifierNode value?: ObjectPatternNode[] | ArrayPatternNode[] | IdentifierNode } & INode export type ArrayPatternNode = { type: 'ArrayPattern' elements: ObjectPatternNode[] | ArrayPatternNode[] | IdentifierNode[] } & INode export type DestrcutorRule = { key?: string | number path?: Array } export type MatcherFunction = ((path: Segments) => boolean) & { path: Path } export type Pattern = | string | number | Path | Segments | MatcherFunction | RegExp export type DestrcutorRules = DestrcutorRule[] export type Segments = Array export const isType = (type: string) => (obj: any): obj is T => { return obj && obj.type === type } export const isIdentifier = isType('Identifier') export const isIgnoreExpression = isType( 'IgnoreExpression' ) export const isDotOperator = isType('DotOperator') export const isWildcardOperator = isType( 'WildcardOperator' ) export const isExpandOperator = isType('ExpandOperator') export const isGroupExpression = isType('GroupExpression') export const isRangeExpression = isType('RangeExpression') export const isDestructorExpression = isType( 'DestructorExpression' ) export const isObjectPattern = isType('ObjectPattern') export const isObjectPatternProperty = isType( 'ObjectPatternProperty' ) export const isArrayPattern = isType('ArrayPattern') export type KeyType = string | number | symbol export type IAccessors = { get?: (source: any, key: KeyType) => any set?: (source: any, key: KeyType, value: any) => any has?: (source: any, key: KeyType) => boolean delete?: (source: any, key: KeyType) => any } export type IRegistry = { accessors?: IAccessors }