<script src="https://unpkg.com/@web-native-js/jsen/dist/main.js"></script>​<script>// The above tag loads JSEN into a global "WebNative" object.const Jsen = window.WebNative.Jsen;</script>
$ npm i -g npm$ npm i --save @web-native-js/jsen
JSEN works both in browser and server environments.
// Node-style importimport Jsen from '@web-native-js/jsen';​// Standard JavaScript import. (Actual path depends on where you installed JSEN to.)import Jsen from './node_modules/@web-native-js/jsen/src/index.js';
// parse() a Math expressionvar expr = '7 + 8';var exprObj = Jsen.parse(expr);​// get result with eval()console.log(exprObj.eval());​// convert to string anytimeconsole.log(exprObj.toString());
// parse() a valuevar expr = '10';var exprObj = Jsen.parse(expr);​// get result with eval()console.log(exprObj.eval());​// ------------​// parse() an array expressionvar expr = '["New York City", "Lagos", "Berlin"]';var exprObj = Jsen.parse(expr);​// get result with eval()console.log(exprObj.eval());​// ------------​// parse() an object expressionvar expr = '{city1: "New York City", city2: "Lagos", city3: "Berlin"}';var exprObj = Jsen.parse(expr);​// get result with eval()console.log(exprObj.eval());​// ------------​// convert to string anytimeconsole.log(exprObj.toString());
// "if" ... "else" constructsvar expr = 'if (2 > 1) {// Expression1} else if (3 > 2) {// Expression2} else {// Expression3}';​// Ternary Conditional Expressions;var expr = '2 > 1 ? expression1 : (3 > 2 ? expression2 : expression3)';
// parse() a logical expression with references to properties of a context objectvar expr = 'age < 18 ? fname + " " + lname + " does not meet the age requirement!" : fname + " " + lname + " is old enough!"';var exprObj = Jsen.parse(expr);​// eval() with a context objectvar context = {fname: "John", lname: "Doe", age: 24};console.log(exprObj.eval(context));​// eval() same exprObj with another context objectvar context2 = {fname: "John2", lname: "Doe2", age: 10};console.log(exprObj.eval(context2));​// convert to string anytimeconsole.log(exprObj.toString());
The eval()
allows us to set traps that intercept set
, get
, delete
, and in
operations. A trap works just like ES6 Proxy traps.
// The "get" handler in the trap below will be called as the "age", "fname", "lname" references are being evaluatedconsole.log(exprObj.eval(context2, null, {get:(target, propertyName) => {return target[propertyName];}}));
// parse() a logical expression with embedded callsvar expr = '"Today is: " + date().toString()';var exprObj = Jsen.parse(expr);​// eval() with the given contextvar context = {date:() => (new Date)};console.log(exprObj.eval(context));​// convert to string anytimeconsole.log(exprObj.toString());
// parse() a function declaration that will materialize into a real functionvar expr = '(arg1, arg2) => {return arg1 + arg2 + argFromContext}';var exprObj = Jsen.parse(expr);​// eval() to materialize the declared functionvar context = {argFromContext: 10};var sumFunction = exprObj.eval(context);​// Call materialized function nowconsole.log(sumFunction(30, 20));​// convert to string anytimeconsole.log(exprObj.toString());
// parse() an assignment expression.// Multiple expressions supported.var expr = 'prop2 = "val2"; prop3 = "val3"';var exprObj = Jsen.parse(expr);​// eval() with a context objectvar context = {prop1: "val1"};console.log(exprObj.eval(context));​// Confirm the new properties have been setconsole.log(context);​// convert to string anytimeconsole.log(exprObj.toString());
// parse() a delete expression.var expr = 'delete prop1; delete prop1';var exprObj = Jsen.parse(expr);​// eval() with a context object to mutatevar context = {prop1: "val1", prop2: "val2", prop3: "val3"};console.log(exprObj.eval(context));​// Confirm the new property has been deletedconsole.log(context);​// convert to string anytimeconsole.log(exprObj.toString());
// Line commentsvar expr = `​/*** Block comments*/​// Single line commentsdelete prop1; delete /*comment anywhere*/prop3;`;​var exprObj = Jsen.parse(expr);​// eval() with a context object to mutatevar context = {prop1: "val1", prop2: "val2", prop3: "val3"};console.log(exprObj.eval(context));​// Confirm the new properties have been deletedconsole.log(context);​// Convert to string without the commentsconsole.log(exprObj.toString());