import { Evaluator, Expression, Scope } from '../dist/index.js'; const e = new Evaluator(); describe('Scope should work correctly', () => { it('can create from undefined', () => { const s = new Scope(undefined, false); expect(e.evaluate(Expression('12'), s)).toBe(12); }); it('can create from function', () => { const s = new Scope((k) => (k === 'a' ? 12 : undefined), false); expect(e.evaluate(Expression('a'), s)).toBe(12); expect(e.evaluate(Expression('`b` in global'), s)).toBe(false); }); it('can create from object', () => { const s = new Scope({ a: 12, b: Expression('a + 1') }, false); expect(e.evaluate(Expression('a'), s)).toBe(12); expect(e.evaluate(Expression('b'), s)).toBe(13); }); }); describe('Scope should not leak dangerous objects', () => { it('should not access prototype fields', () => { const s = new Scope({}, false); expect(e.evaluate(Expression('`__proto__` in global'), s)).toBe(false); expect(e.evaluate(Expression('`toString` in global'), s)).toBe(false); }); it('should access same name props', () => { const s = new Scope({ ['__proto__']: 12, toString: 'x' }, false); expect(e.evaluate(Expression('__proto__'), s)).toBe(12); expect(e.evaluate(Expression('toString'), s)).toBe('x'); }); });