@@ -6,9 +6,22 @@ import {
66 InternalFilteringOption ,
77 InternalFilteringProperty ,
88 InternalToken ,
9+ InternalTokenGroup ,
910 Token ,
1011} from './interfaces' ;
1112
13+ export function isInternalToken ( tokenOrGroup : InternalToken | InternalTokenGroup ) : tokenOrGroup is InternalToken {
14+ const key : keyof InternalToken = 'operator' ;
15+ return key in tokenOrGroup ;
16+ }
17+
18+ export function isInternalTokenGroup (
19+ tokenOrGroup : InternalToken | InternalTokenGroup
20+ ) : tokenOrGroup is InternalTokenGroup {
21+ const key : keyof InternalTokenGroup = 'operation' ;
22+ return key in tokenOrGroup ;
23+ }
24+
1225// Finds the longest property the filtering text starts from.
1326export function matchFilteringProperty (
1427 filteringProperties : readonly InternalFilteringProperty [ ] ,
@@ -137,17 +150,22 @@ interface AbstractTokenGroup<T extends AbstractToken> {
137150 tokens : readonly ( T | AbstractTokenGroup < T > ) [ ] ;
138151}
139152
153+ function isAbstractToken < T extends AbstractToken > ( tokenOrGroup : T | AbstractTokenGroup < T > ) : tokenOrGroup is T {
154+ const key : keyof AbstractToken = 'operator' ;
155+ return key in tokenOrGroup ;
156+ }
157+
140158/**
141159 * Transforms query token groups to tokens (only taking 1 level of nesting).
142160 */
143161export function tokenGroupToTokens < T extends AbstractToken > ( tokenGroups : readonly ( T | AbstractTokenGroup < T > ) [ ] ) : T [ ] {
144162 const tokens : T [ ] = [ ] ;
145163 for ( const tokenOrGroup of tokenGroups ) {
146- if ( 'operator' in tokenOrGroup ) {
164+ if ( isAbstractToken ( tokenOrGroup ) ) {
147165 tokens . push ( tokenOrGroup ) ;
148166 } else {
149167 for ( const nestedTokenOrGroup of tokenOrGroup . tokens ) {
150- if ( 'operator' in nestedTokenOrGroup ) {
168+ if ( isAbstractToken ( nestedTokenOrGroup ) ) {
151169 tokens . push ( nestedTokenOrGroup ) ;
152170 } else {
153171 // Ignore deeply nested tokens
0 commit comments