Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
export default function parseExpressionString(propValue, configuration) {
// NOTE: Can be null which represents invalid function. Return null so that prop can be omitted
if (propValue in cachedExpressionMap) {
return cachedExpressionMap[propValue];
}
let func;
// Compile with expression-eval
const ast = expressionEval.parse(propValue);
if (!ast.right && !ast.left && ast.type === 'Identifier') {
func = row => {
return get(row, propValue);
};
} else {
// NOTE: To avoid security risks, the arguments passed to the
// compiled expression must only give access to pure data (no globals etc)
// We disable function call syntax
traverse(ast, node => {
if (node.type === 'CallExpression') {
throw new Error('Function calls not allowed in JSON expressions');
}
});
// TODO Something like `expressionEval.eval(ast, {row});` would be useful for unpacking arrays
func = row => {
return expressionEval.eval(ast, row);
private getExpression(exp: string): Matcher {
const matcherKey = exp;
let expression = this.matcherMap.get(matcherKey);
if (!expression) {
expression = compile(exp);
this.matcherMap.set(matcherKey, expression);
}
return expression;
}
const expString = this.model.model.get('m')?.get('m')?.value;
if (!expString) {
throw new Error('Unable to find matchers in model');
}
const effect = this.model.model.get('e')?.get('e')?.value;
if (!effect) {
throw new Error('Unable to find policy_effect in model');
}
const matcherKey = `${asyncCompile ? 'ASYNC[' : 'SYNC['}${expString}]`;
let expression = this.matcherMap.get(matcherKey);
if (!expression) {
expression = asyncCompile ? compileAsync(expString) : compile(expString);
this.matcherMap.set(matcherKey, expression);
}
let policyEffects: Effect[];
let matcherResults: number[];
const p = this.model.model.get('p')?.get('p');
const policyLen = p?.policy?.length;
const rTokens = this.model.model.get('r')?.get('r')?.tokens;
const rTokensLen = rTokens?.length;
if (policyLen && policyLen !== 0) {
policyEffects = new Array(policyLen);
matcherResults = new Array(policyLen);
func = row => {
return expressionEval.eval(ast, row);
};
}