import { Environment } from '@marcbachmann/cel-js'; import { getProperty, hasProperty } from '../utils.ts'; export const celEnvBase = new Environment({ unlistedVariablesAreDyn: true, enableOptionalTypes: true, homogeneousAggregateLiterals: false, }); // array const params: string[] = []; for (let i = 0; i < 10; i++) { params.push('dyn'); celEnvBase.registerFunction(`concat(${params.join(',')}):list`, _concat); } celEnvBase.registerFunction('join(list):string', list => { return _join(list); }); celEnvBase.registerFunction('join(list,string):string', (list, sep) => { return _join(list, sep); }); celEnvBase.registerFunction('sum(list):int', list => { return _sum(list); }); // string celEnvBase.registerFunction('string(null):string', value => { return String(value); }); celEnvBase.registerFunction('toFixed(double,int):string', (value, precision) => { return _toFixed(value, precision); }); celEnvBase.registerFunction('toFixed(int,int):string', (value, precision) => { return _toFixed(value, precision); }); // operator: + celEnvBase.registerOperator('string + int', (str, n) => str + String(n)); celEnvBase.registerOperator('int + string', (n, str) => String(n) + str); celEnvBase.registerOperator('string + double', (str, n) => str + String(n)); celEnvBase.registerOperator('double + string', (n, str) => String(n) + str); celEnvBase.registerOperator('string + null', (str, _n) => str); celEnvBase.registerOperator('null + string', (_n, str) => str); // operator: == celEnvBase.registerOperator('string == null', (str, n) => str === n); celEnvBase.registerOperator('int == null', (num, n) => num === n); celEnvBase.registerOperator('bool == null', (b, n) => b === n); // get celEnvBase.registerFunction('get(map,string):dyn', (obj, name) => { return getProperty(obj, name) ?? null; }); celEnvBase.registerFunction('get(map,string,dyn):dyn', (obj, name, defaultValue) => { return getProperty(obj, name) ?? defaultValue; }); celEnvBase.registerFunction('get(bool,string):dyn', (_obj, _name) => { return null; }); celEnvBase.registerFunction('get(bool,string,dyn):dyn', (_obj, _name, defaultValue) => { return defaultValue; }); celEnvBase.registerFunction('get(null,string):dyn', (_obj, _name) => { return null; }); celEnvBase.registerFunction('get(null,string,dyn):dyn', (_obj, _name, defaultValue) => { return defaultValue; }); celEnvBase.registerFunction('exists(null,string):bool', (obj, name) => { return hasProperty(obj, name); }); celEnvBase.registerFunction('exists(map,string):bool', (obj, name) => { return hasProperty(obj, name); }); // stringify/parse celEnvBase.registerFunction('stringify(dyn):string', dyn => { return JSON.stringify(dyn, null, 2); }); celEnvBase.registerFunction('parse(string):dyn', str => { return JSON.parse(str); }); function _concat(...args: any[]): any[] { return [].concat(...args); } function _join(list?: [], sep?: string): string { if (!list) return ''; return list.join(sep); } function _sum(list?: []): bigint { if (!list || list.length === 0) return 0n; return list.reduce((acc, item) => { if (item === null || item === undefined) return acc; return acc + BigInt(item as number | string | bigint); }, 0n); } function _toFixed(value: number | bigint, precision: number | bigint): string { const precisionInt = Number(precision); if (typeof value === 'bigint') { return precisionInt > 0 ? `${value}.${'0'.repeat(precisionInt)}` : String(value); } return value.toFixed(precisionInt); }