diff --git a/lib/scripting/vbs-helper.spec.ts b/lib/scripting/vbs-helper.spec.ts index e3e3e308..890b9173 100644 --- a/lib/scripting/vbs-helper.spec.ts +++ b/lib/scripting/vbs-helper.spec.ts @@ -199,6 +199,8 @@ describe('The scripting VBS Helper', () => { expect(vbsHelper.equals(undefined, new VbsUndefined())).to.equal(true); expect(vbsHelper.equals(new VbsUndefined(), undefined)).to.equal(true); expect(vbsHelper.equals(new VbsUndefined(), new VbsUndefined())).to.equal(true); + expect(vbsHelper.equals(new VbsUndefined(), '')).to.equal(true); + expect(vbsHelper.equals('', new VbsUndefined())).to.equal(true); }); it('should compare not equal using "equals"', () => { diff --git a/lib/scripting/vbs-helper.ts b/lib/scripting/vbs-helper.ts index 48284f1e..9ca50158 100644 --- a/lib/scripting/vbs-helper.ts +++ b/lib/scripting/vbs-helper.ts @@ -131,18 +131,31 @@ export class VBSHelper { return true; } + const undef1 = typeof value1 === 'object' && value1.__isUndefined; + const undef2 = typeof value2 === 'object' && value2.__isUndefined; + // VbsUndefined == undefined - if (typeof value1 === 'object' && value1.__isUndefined && typeof value2 === 'undefined') { + if (undef1 && typeof value2 === 'undefined') { return true; } // undefined == VbsUndefined - if (typeof value2 === 'object' && value2.__isUndefined && typeof value1 === 'undefined') { + if (typeof value1 === 'undefined' && undef2) { return true; } // VbsUndefined == VbsUndefined - if (typeof value1 === 'object' && value1.__isUndefined && typeof value2 === 'object' && value2.__isUndefined) { + if (undef1 && undef2) { + return true; + } + + // '' == VbsUndefined + if (undef1 && value2 === '') { + return true; + } + + // VbsUndefined == '' + if (value1 === '' && undef2) { return true; } diff --git a/lib/scripting/vbs-undefined.spec.ts b/lib/scripting/vbs-undefined.spec.ts index 6332af83..aaf28c34 100644 --- a/lib/scripting/vbs-undefined.spec.ts +++ b/lib/scripting/vbs-undefined.spec.ts @@ -31,4 +31,10 @@ describe('The VBScript undefined handler', () => { expect(() => undef == 1).not.to.throw(); }); + it('should return "undefined" as string', () => { + const undef = new VbsUndefined() as unknown; + // tslint:disable-next-line:triple-equals + expect('' + undef).to.equal('undefined'); + }); + }); diff --git a/lib/scripting/vbs-undefined.ts b/lib/scripting/vbs-undefined.ts index 888d0e6d..53158682 100644 --- a/lib/scripting/vbs-undefined.ts +++ b/lib/scripting/vbs-undefined.ts @@ -33,6 +33,9 @@ export class VbsUndefined implements ProxyHandler { } public get(target: any, p: string | number | symbol, receiver: any): any { + if (p === 'toString') { + return () => undefined; + } if (typeof p === 'symbol' || ['valueOf', 'toString', 'inspect', '__errGet', '__errSet'].includes(p as string)) { return Reflect.get(target, p); }