Skip to content

CAI-js/eval

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

@caijs/eval

Build Status Coverage Status NPM version NPM downloads

@caijs/eval is like eval, but executed with a context. It is intended for use in build scripts and code transformations, doing some evaluation at build time—it is NOT suitable for handling arbitrary untrusted user input. Malicious user input can execute arbitrary code.

Installation

In your project folder run:

$ npm install @caijs/eval

Examples of use

You can evaluate expressions

const { evaluate } = require('@caijs/eval');

const src = '[1, 2, 3].map(function(x) { return x * 2 })';
const result = evaluate(src);
console.log(result); // [2, 4, 6]

You can add a context

const { evaluate } = require('@caijs/eval');

const src = '[1, 2, 3].map(function(x) { return x * n })';
const context = { n: 3 };
const result = evaluate(src, context);
console.log(result); // [3, 6, 9]

You can also declare functions in the context:

const { evaluate } = require('@caijs/eval');

const src = '[1,2,3+4*10+n,foo(3+5),obj[""+"x"].y]';
const context = {
  n: 6,
  foo(x) {
    return x * 100;
  },
  obj: { x: { y: 555 } },
};
const result = evaluate(src, context);
console.log(result); // [ 1, 2, 49, 800, 555 ]

You can use a "this" if you define it in the context:

const { evaluate } = require('./src/evaluator');

const src = 'this.a + this.b + n';
const context = {
  this: {
    a: 1,
    b: 2
  },
  n: 6,
};
const result = evaluate(src, context);
console.log(result);

You can modify context variables:

const { evaluate } = require('@caijs/eval');

const src = 'this.a += this.b; this.a';
const context = {
  this: {
    a: 1,
    b: 2,
  },
  n: 6,
};
const result = evaluate(src, context);
console.log(result); // 3
console.log(context); // { this: { a: 3, b: 2 }, n: 6 }

If you don't want the code to modify your context, pass a "false" as the last parameter:

const { evaluate } = require('@caijs/eval');

const src = 'this.a += this.b; this.a';
const context = {
  this: {
    a: 1,
    b: 2,
  },
  n: 6,
};
const result = evaluate(src, context, false);
console.log(result); // 1
console.log(context); // { this: { a: 1, b: 2 }, n: 6 }

You can even create your own context variables:

const { evaluate } = require('@caijs/eval');

const src = 'z = this.a + this.b; z';
const context = {
  this: {
    a: 1,
    b: 2,
  },
  n: 6,
};
const result = evaluate(src, context);
console.log(result); // 3
console.log(context); // { this: { a: 1, b: 2 }, n: 6, z: 3 }

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published