mirror of
https://github.com/IT4Change/ohmyform-ui.git
synced 2025-12-13 09:45:50 +00:00
49 lines
1013 B
TypeScript
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
|
|
}
|
|
}
|
|
}
|