ohmyform-ui/components/use.math.ts

49 lines
1013 B
TypeScript

import debug from 'debug'
import { formula, init } from 'expressionparser'
const logger = debug('useMath')
export const useMath = (): ((
expression: string,
values?: { [id: string]: string | number }
) => boolean) => {
return (expression, values) => {
const parser = init(formula, (term: string) => {
if (values[term]) {
return values[term]
}
throw new Error(`Invalid term: ${term}`);
})
try {
let processed = expression
Object.keys(values).forEach((key) => {
const r = new RegExp(key.replace('$', '\\$'), 'ig')
const test = r.test(processed)
if (test) {
processed = processed.replace(r, String(values[key]))
}
})
parser.expressionToValue(expression)
return Boolean(parser.expressionToValue(expression))
} catch (e) {
logger(
'failed to calculate %O: %s',
{
expression,
values,
},
e.message
)
throw e
}
}
}