From 8c37045f3734950fad052369b77e83d0571e240e Mon Sep 17 00:00:00 2001 From: Theo Sun Date: Fri, 10 Jul 2020 13:18:44 +0800 Subject: [PATCH] fix: visit undefine object will throw error --- src/visitor.ts | 38 +++++++++++++++++++------------------- test/query.spec.ts | 9 +++++++++ test/visitor.spec.ts | 5 +++++ 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/visitor.ts b/src/visitor.ts index f1155ea..6dab7c3 100644 --- a/src/visitor.ts +++ b/src/visitor.ts @@ -24,37 +24,37 @@ export type Visitor = Traverser export function traverseAst(traverser: Traverser, node: Token, parent?: Token): void { if (node instanceof Token) { - if (node.type in traverser) { - traverser[node.type](node, parent); + if (node?.type in traverser) { + traverser[node?.type](node, parent); } } - if (isArray(node.value) || isPlainObject(node.value)) { - forEach(node.value, (item) => { + if (isArray(node?.value) || isPlainObject(node?.value)) { + forEach(node?.value, (item) => { if (item instanceof Token) { traverseAst(traverser, item, node); } }); } - if (isArray(node.value?.options)) { - forEach(node.value?.options, (item) => { + if (isArray(node?.value?.options)) { + forEach(node?.value?.options, (item) => { if (item instanceof Token) { traverseAst(traverser, item, node); } }); } - if (isArray(node.value?.items)) { - forEach(node.value?.items, (item) => { + if (isArray(node?.value?.items)) { + forEach(node?.value?.items, (item) => { if (item instanceof Token) { traverseAst(traverser, item, node); } }); } - if (node.value instanceof Token) { - traverseAst(traverser, node.value, node); + if (node?.value instanceof Token) { + traverseAst(traverser, node?.value, node); } } @@ -68,28 +68,28 @@ export function traverseAst(traverser: Traverser, node: Token, parent?: Token): */ export function traverseAstDeepFirst(traverser: Traverser, node: Token, parent?: Token): void { - if (isArray(node.value) || isPlainObject(node.value)) { - forEach(node.value, (item) => { + if (isArray(node?.value) || isPlainObject(node?.value)) { + forEach(node?.value, (item) => { if (item instanceof Token) { traverseAstDeepFirst(traverser, item, node); } }); } - if (node.value instanceof Token) { - traverseAstDeepFirst(traverser, node.value, node); + if (node?.value instanceof Token) { + traverseAstDeepFirst(traverser, node?.value, node); } - if (isArray(node.value?.options)) { - forEach(node.value?.options, (item) => { + if (isArray(node?.value?.options)) { + forEach(node?.value?.options, (item) => { if (item instanceof Token) { traverseAstDeepFirst(traverser, item, node); } }); } - if (isArray(node.value?.items)) { - forEach(node.value?.items, (item) => { + if (isArray(node?.value?.items)) { + forEach(node?.value?.items, (item) => { if (item instanceof Token) { traverseAstDeepFirst(traverser, item, node); } @@ -97,7 +97,7 @@ export function traverseAstDeepFirst(traverser: Traverser, node: Token, parent?: } if (node instanceof Token) { - if (node.type in traverser) { + if (node?.type in traverser) { traverser[node.type](node, parent); } } diff --git a/test/query.spec.ts b/test/query.spec.ts index ecaca10..d49e5d9 100644 --- a/test/query.spec.ts +++ b/test/query.spec.ts @@ -3,6 +3,7 @@ import { findOne, findAll } from '../src/utils'; import { TokenType } from '../src/lexer'; import { get } from '@newdash/newdash'; import { defaultParser } from '../src'; +import { execPath } from 'process'; describe('Query Test Suite', () => { @@ -70,4 +71,12 @@ describe('Query Test Suite', () => { expect(node).not.toBeUndefined(); }); + it('should parse $filter only', () => { + const ast = defaultParser.query('$filter=id eq 1'); + expect(ast).not.toBeUndefined(); + expect(ast.value.options).not.toBeUndefined(); + expect(ast.value.options).toHaveLength(1); + + }); + }); diff --git a/test/visitor.spec.ts b/test/visitor.spec.ts index 47ac2c0..fe34d34 100644 --- a/test/visitor.spec.ts +++ b/test/visitor.spec.ts @@ -55,4 +55,9 @@ describe('Visitor Parse Suite', () => { }); + it('should support visit undefined', () => { + const { visit, visitSequence } = createSeqTraverser(true); + visit(undefined); + }); + });