@pawel-up/jexl
Version:
Javascript Expression Language: Powerful context-based expression parser and evaluator
492 lines (449 loc) • 15.8 kB
text/typescript
/**
* Math function schemas using JSON Schema
*/
import { createParameter, createFunctionSchema, createLibrarySchema } from './utils.js'
// Create math function schemas using the helper utilities
export const mathFunctionSchemas = {
ABS: createFunctionSchema(
'ABS',
'Returns the absolute value of a number',
'math',
[createParameter('x', { type: 'number', description: 'The number to get the absolute value of' })],
{ type: 'number', description: 'The absolute value' },
{
examples: ['ABS(-5) // 5', 'ABS(3.14) // 3.14', 'ABS(0) // 0'],
}
),
CEIL: createFunctionSchema(
'CEIL',
'Returns the smallest integer greater than or equal to a number',
'math',
[createParameter('x', { type: 'number', description: 'The number to ceil' })],
{ type: 'number', description: 'The ceiling value' },
{
examples: ['ceil(4.2) // 5', 'ceil(-4.7) // -4', 'ceil(0) // 0'],
}
),
FLOOR: createFunctionSchema(
'FLOOR',
'Returns the largest integer less than or equal to a number',
'math',
[createParameter('x', { type: 'number', description: 'The number to floor' })],
{ type: 'number', description: 'The floor value' },
{
examples: ['FLOOR(4.7) // 4', 'FLOOR(-4.2) // -5', 'FLOOR(0) // 0'],
}
),
ROUND: createFunctionSchema(
'ROUND',
'Returns the value of a number rounded to the nearest integer',
'math',
[createParameter('x', { type: 'number', description: 'The number to round' })],
{ type: 'number', description: 'The rounded value' },
{
examples: ['ROUND(4.7) // 5', 'ROUND(4.2) // 4', 'ROUND(-4.5) // -4'],
}
),
RANDOM: createFunctionSchema(
'RANDOM',
'Returns a random number between 0 (inclusive) and 1 (exclusive)',
'math',
[],
{ type: 'number', description: 'A random number between 0 and 1' },
{
examples: ['RANDOM() // 0.123456789', 'RANDOM() // 0.987654321'],
}
),
MAX: createFunctionSchema(
'MAX',
'Returns the largest of the given numbers',
'math',
[createParameter('values', { type: 'number', description: 'The numbers to compare' }, true, { variadic: true })],
{ type: 'number', description: 'The maximum value' },
{
examples: ['MAX(1, 2, 3) // 3', 'MAX(-1, -2, -3) // -1', 'MAX(5) // 5'],
}
),
MIN: createFunctionSchema(
'MIN',
'Returns the smallest of the given numbers',
'math',
[createParameter('values', { type: 'number', description: 'The numbers to compare' }, true, { variadic: true })],
{ type: 'number', description: 'The minimum value' },
{
examples: ['MIN(1, 2, 3) // 1', 'MIN(-1, -2, -3) // -3', 'MIN(5) // 5'],
}
),
SIN: createFunctionSchema(
'SIN',
'Returns the sine of a number (in radians)',
'math',
[createParameter('x', { type: 'number', description: 'The angle in radians' })],
{ type: 'number', description: 'The sine value' },
{
examples: ['SIN(0) // 0', 'SIN(Math.PI / 2) // 1', 'SIN(Math.PI) // 0'],
}
),
COS: createFunctionSchema(
'COS',
'Returns the cosine of a number (in radians)',
'math',
[createParameter('x', { type: 'number', description: 'The angle in radians' })],
{ type: 'number', description: 'The cosine value' },
{
examples: ['COS(0) // 1', 'COS(Math.PI / 2) // 0', 'COS(Math.PI) // -1'],
}
),
TAN: createFunctionSchema(
'TAN',
'Returns the tangent of a number (in radians)',
'math',
[createParameter('x', { type: 'number', description: 'The angle in radians' })],
{ type: 'number', description: 'The tangent value' },
{
examples: ['TAN(0) // 0', 'TAN(Math.PI / 4) // 1'],
}
),
ASIN: createFunctionSchema(
'ASIN',
'Returns the arcsine of a number',
'math',
[createParameter('x', { type: 'number', description: 'The number (-1 to 1)' })],
{ type: 'number', description: 'The arcsine in radians' },
{
examples: ['ASIN(0) // 0', 'ASIN(1) // Math.PI / 2', 'ASIN(-1) // -Math.PI / 2'],
}
),
ACOS: createFunctionSchema(
'ACOS',
'Returns the arccosine of a number',
'math',
[createParameter('x', { type: 'number', description: 'The number (-1 to 1)' })],
{ type: 'number', description: 'The arccosine in radians' },
{
examples: ['ACOS(1) // 0', 'ACOS(0) // Math.PI / 2', 'ACOS(-1) // Math.PI'],
}
),
ATAN: createFunctionSchema(
'ATAN',
'Returns the arctangent of a number',
'math',
[createParameter('x', { type: 'number', description: 'The number' })],
{ type: 'number', description: 'The arctangent in radians' },
{
examples: ['ATAN(0) // 0', 'ATAN(1) // Math.PI / 4', 'ATAN(-1) // -Math.PI / 4'],
}
),
ATAN2: createFunctionSchema(
'ATAN2',
'Returns the arctangent of the quotient of its arguments',
'math',
[
createParameter('y', { type: 'number', description: 'The y coordinate' }),
createParameter('x', { type: 'number', description: 'The x coordinate' }),
],
{ type: 'number', description: 'The arctangent in radians' },
{
examples: ['ATAN2(1, 1) // Math.PI / 4', 'ATAN2(1, 0) // Math.PI / 2'],
}
),
SQRT: createFunctionSchema(
'SQRT',
'Returns the square root of a number',
'math',
[createParameter('x', { type: 'number', description: 'The number to get the square root of' })],
{ type: 'number', description: 'The square root' },
{
examples: ['SQRT(9) // 3', 'SQRT(16) // 4', 'SQRT(2) // 1.4142135623730951'],
}
),
CBRT: createFunctionSchema(
'CBRT',
'Returns the cube root of a number',
'math',
[createParameter('x', { type: 'number', description: 'The number to get the cube root of' })],
{ type: 'number', description: 'The cube root' },
{
examples: ['CBRT(8) // 2', 'CBRT(27) // 3', 'CBRT(-8) // -2'],
}
),
EXP: createFunctionSchema(
'EXP',
'Returns e raised to the power of x',
'math',
[createParameter('x', { type: 'number', description: 'The exponent' })],
{ type: 'number', description: 'e raised to the power of x' },
{
examples: ['EXP(0) // 1', 'EXP(1) // 2.718281828459045', 'EXP(2) // 7.38905609893065'],
}
),
LOG: createFunctionSchema(
'LOG',
'Returns the natural logarithm of a number',
'math',
[createParameter('x', { type: 'number', description: 'The number' })],
{ type: 'number', description: 'The natural logarithm' },
{
examples: ['LOG(1) // 0', 'LOG(Math.E) // 1', 'LOG(10) // 2.302585092994046'],
}
),
LOG10: createFunctionSchema(
'LOG10',
'Returns the base-10 logarithm of a number',
'math',
[createParameter('x', { type: 'number', description: 'The number' })],
{ type: 'number', description: 'The base-10 logarithm' },
{
examples: ['LOG10(10) // 1', 'LOG10(100) // 2', 'LOG10(1000) // 3'],
}
),
LOG2: createFunctionSchema(
'LOG2',
'Returns the base-2 logarithm of a number',
'math',
[createParameter('x', { type: 'number', description: 'The number' })],
{ type: 'number', description: 'The base-2 logarithm' },
{
examples: ['LOG2(2) // 1', 'LOG2(8) // 3', 'LOG2(1024) // 10'],
}
),
POW: createFunctionSchema(
'POW',
'Returns the base raised to the power of the exponent',
'math',
[
createParameter('base', { type: 'number', description: 'The base number' }),
createParameter('exponent', { type: 'number', description: 'The exponent' }),
],
{ type: 'number', description: 'The result of base raised to the power of exponent' },
{
examples: ['POW(2, 3) // 8', 'POW(4, 0.5) // 2', 'POW(10, 2) // 100'],
}
),
SIGN: createFunctionSchema(
'SIGN',
'Returns the sign of a number',
'math',
[createParameter('x', { type: 'number', description: 'The number' })],
{ type: 'number', description: '1 if positive, -1 if negative, 0 if zero' },
{
examples: ['SIGN(5) // 1', 'SIGN(-5) // -1', 'SIGN(0) // 0'],
}
),
TRUNC: createFunctionSchema(
'TRUNC',
'Returns the integer part of a number by removing fractional digits',
'math',
[createParameter('x', { type: 'number', description: 'The number to truncate' })],
{ type: 'number', description: 'The integer part of the number' },
{
examples: ['TRUNC(4.9) // 4', 'TRUNC(-4.9) // -4', 'TRUNC(0.123) // 0'],
}
),
SUM: createFunctionSchema(
'SUM',
'Returns the sum of all arguments',
'math',
[createParameter('values', { type: 'number', description: 'The numbers to sum' }, true, { variadic: true })],
{ type: 'number', description: 'The sum of all values' },
{
examples: ['SUM(1, 2, 3) // 6', 'SUM(10, 20) // 30', 'SUM(1.5, 2.5, 3) // 7'],
}
),
AVG: createFunctionSchema(
'AVG',
'Returns the average of all arguments',
'math',
[createParameter('values', { type: 'number', description: 'The numbers to average' }, true, { variadic: true })],
{ type: 'number', description: 'The average of all values' },
{
examples: ['AVG(1, 2, 3) // 2', 'AVG(10, 20) // 15', 'AVG(1, 2, 3, 4, 5) // 3'],
}
),
MEDIAN: createFunctionSchema(
'MEDIAN',
'Returns the median of all arguments',
'math',
[
createParameter('values', { type: 'number', description: 'The numbers to find the median of' }, true, {
variadic: true,
}),
],
{ type: 'number', description: 'The median value' },
{
examples: ['MEDIAN(1, 2, 3) // 2', 'MEDIAN(1, 2, 3, 4) // 2.5', 'MEDIAN(5, 1, 3) // 3'],
}
),
MODE: createFunctionSchema(
'MODE',
'Returns the mode (most frequent value) of all arguments',
'math',
[
createParameter('values', { type: 'number', description: 'The numbers to find the mode of' }, true, {
variadic: true,
}),
],
{ type: 'number', description: 'The mode value' },
{
examples: ['MODE(1, 2, 2, 3) // 2', 'MODE(1, 1, 2, 3) // 1', 'MODE(1, 2, 3) // 1 (first occurrence)'],
}
),
VARIANCE: createFunctionSchema(
'VARIANCE',
'Returns the variance of all arguments',
'math',
[
createParameter('values', { type: 'number', description: 'The numbers to calculate variance of' }, true, {
variadic: true,
}),
],
{ type: 'number', description: 'The variance of the numbers' },
{
examples: ['VARIANCE(1, 2, 3) // 0.6666666666666666', 'VARIANCE(1, 1, 1) // 0', 'VARIANCE(1, 2, 3, 4) // 1.25'],
}
),
STDDEV: createFunctionSchema(
'STDDEV',
'Returns the standard deviation of all arguments',
'math',
[
createParameter(
'values',
{ type: 'number', description: 'The numbers to calculate standard deviation of' },
true,
{
variadic: true,
}
),
],
{ type: 'number', description: 'The standard deviation of the numbers' },
{
examples: [
'STDDEV(1, 2, 3) // 0.816496580927726',
'STDDEV(1, 1, 1) // 0',
'STDDEV(1, 2, 3, 4) // 1.118033988749895',
],
}
),
CLAMP: createFunctionSchema(
'CLAMP',
'Clamps a number between a minimum and maximum value',
'math',
[
createParameter('value', { type: 'number', description: 'The value to clamp' }),
createParameter('min', { type: 'number', description: 'The minimum value' }),
createParameter('max', { type: 'number', description: 'The maximum value' }),
],
{ type: 'number', description: 'The clamped value' },
{
examples: ['CLAMP(5, 0, 10) // 5', 'CLAMP(-5, 0, 10) // 0', 'CLAMP(15, 0, 10) // 10'],
}
),
LERP: createFunctionSchema(
'LERP',
'Linear interpolation between two values',
'math',
[
createParameter('start', { type: 'number', description: 'The start value' }),
createParameter('end', { type: 'number', description: 'The end value' }),
createParameter('t', { type: 'number', description: 'The interpolation factor (0-1)' }),
],
{ type: 'number', description: 'The interpolated value' },
{
examples: ['LERP(0, 10, 0.5) // 5', 'LERP(10, 20, 0.25) // 12.5', 'LERP(-10, 10, 0.8) // 6'],
}
),
TO_DEGREES: createFunctionSchema(
'TO_DEGREES',
'Converts radians to degrees',
'math',
[createParameter('radians', { type: 'number', description: 'The angle in radians' })],
{ type: 'number', description: 'The angle in degrees' },
{
examples: ['TO_DEGREES(Math.PI) // 180', 'TO_DEGREES(Math.PI / 2) // 90', 'TO_DEGREES(0) // 0'],
}
),
TO_RADIANS: createFunctionSchema(
'TO_RADIANS',
'Converts degrees to radians',
'math',
[createParameter('degrees', { type: 'number', description: 'The angle in degrees' })],
{ type: 'number', description: 'The angle in radians' },
{
examples: ['TO_RADIANS(180) // Math.PI', 'TO_RADIANS(90) // Math.PI / 2', 'TO_RADIANS(0) // 0'],
}
),
GCD: createFunctionSchema(
'GCD',
'Calculates the greatest common divisor of two numbers',
'math',
[
createParameter('a', { type: 'number', description: 'First number' }),
createParameter('b', { type: 'number', description: 'Second number' }),
],
{ type: 'number', description: 'The greatest common divisor' },
{
examples: ['GCD(48, 18) // 6', 'GCD(56, 98) // 14', 'GCD(101, 10) // 1'],
}
),
LCM: createFunctionSchema(
'LCM',
'Calculates the least common multiple of two numbers',
'math',
[
createParameter('a', { type: 'number', description: 'First number' }),
createParameter('b', { type: 'number', description: 'Second number' }),
],
{ type: 'number', description: 'The least common multiple' },
{
examples: ['LCM(4, 6) // 12', 'LCM(15, 20) // 60', 'LCM(7, 5) // 35'],
}
),
FACTORIAL: createFunctionSchema(
'FACTORIAL',
'Calculates the factorial of a number',
'math',
[createParameter('n', { type: 'number', description: 'The number to calculate factorial of' })],
{ type: 'number', description: 'The factorial of the number' },
{
examples: ['FACTORIAL(5) // 120', 'FACTORIAL(0) // 1', 'FACTORIAL(1) // 1', 'FACTORIAL(10) // 3628800'],
}
),
IS_PRIME: createFunctionSchema(
'IS_PRIME',
'Checks if a number is prime',
'math',
[createParameter('n', { type: 'number', description: 'The number to check' })],
{ type: 'boolean', description: 'True if the number is prime, false otherwise' },
{
examples: ['IS_PRIME(5) // true', 'IS_PRIME(4) // false', 'IS_PRIME(1) // false'],
}
),
ROUND_TO: createFunctionSchema(
'ROUND_TO',
'Rounds a number to a specified number of decimal places',
'math',
[
createParameter('value', { type: 'number', description: 'The number to round' }),
createParameter('decimals', { type: 'number', description: 'The number of decimal places' }),
],
{ type: 'number', description: 'The rounded number' },
{
examples: ['ROUND_TO(3.14159, 2) // 3.14', 'ROUND_TO(2.71828, 3) // 2.718', 'ROUND_TO(1.23456, 0) // 1'],
}
),
}
// Create the library schema
export const mathLibrarySchema = createLibrarySchema(mathFunctionSchemas, {
category: 'math',
title: 'Jexl Math Functions',
description: 'Mathematical functions and utilities for Jexl expressions',
version: '1.0.0',
})
// Export utility functions for easy access
export const getMathFunction = (name: string) => mathLibrarySchema.functions[name]
export const getMathFunctionNames = () => Object.keys(mathLibrarySchema.functions)
export const getMathFunctionCount = () => Object.keys(mathLibrarySchema.functions).length
// Export for integration with editors/tools
export { mathLibrarySchema as schema }
export default mathLibrarySchema