mathjs/tools/whitelistgenerator.js
2024-05-22 08:46:14 +02:00

307 lines
5.5 KiB
JavaScript

// generates a whitelist of safe methods and functions
import { hasOwnProperty } from './utils.js'
import { create, all } from '../lib/esm/index.js'
// math.js functions (can be used when chaining
const math = create(all)
const chain = {
done: true,
valueOf: true,
toString: true
}
for (const name in math) {
if (hasOwnProperty(math, name) && typeof math[name] === 'function') {
chain[name] = true
}
}
const groups = [
chain,
// Unit
{
valueOf: true,
clone: true,
hasBase: true,
equalBase: true,
equals: true,
multiply: true,
divide: true,
pow: true,
abs: true,
to: true,
toNumber: true,
toNumeric: true,
format: true,
formatUnits: true,
toString: true
},
// Complex
{
sign: true,
add: true,
sub: true,
mul: true,
div: true,
pow: true,
sqrt: true,
exp: true,
log: true,
abs: true,
arg: true,
inverse: true,
conjugate: true,
neg: true,
floor: true,
ceil: true,
round: true,
equals: true,
isNaN: true,
clone: true,
toVector: true,
toString: true,
sin: true,
cos: true,
tan: true,
cot: true,
sec: true,
csc: true,
asin: true,
acos: true,
atan: true,
acot: true,
asec: true,
acsc: true,
sinh: true,
cosh: true,
tanh: true,
coth: true,
sech: true,
csch: true,
asinh: true,
acosh: true,
atanh: true,
acoth: true,
asech: true,
acsch: true
},
// BigNumber
{
// 'abs': true,
// 'acos': true,
// 'acosh': true,
// 'add': true,
// 'asin': true,
// 'asinh': true,
// 'atan': true,
// 'atanh': true,
atan2: true,
// 'cbrt': true,
// 'ceil': true,
clone: true,
// 'cos': true,
// 'cosh': true,
// 'div': true,
// 'exp': true,
// 'floor': true,
hypot: true,
// 'ln': true,
// 'log': true,
log2: true,
log10: true,
max: true,
min: true,
// 'mod': true,
// 'mul': true,
noConflict: true,
// 'pow': true,
random: true,
// 'round': true,
set: true,
sign: true,
// 'sin': true,
// 'sinh': true,
// 'sqrt': true,
// 'sub': true,
// 'tan': true,
// 'tanh': true,
// 'trunc': true,
absoluteValue: true,
abs: true,
ceil: true,
comparedTo: true,
cmp: true,
cosine: true,
cos: true,
cubeRoot: true,
cbrt: true,
decimalPlaces: true,
dp: true,
dividedBy: true,
div: true,
dividedToIntegerBy: true,
divToInt: true,
equals: true,
eq: true,
floor: true,
greaterThan: true,
gt: true,
greaterThanOrEqualTo: true,
gte: true,
hyperbolicCosine: true,
cosh: true,
hyperbolicSine: true,
sinh: true,
hyperbolicTangent: true,
tanh: true,
inverseCosine: true,
acos: true,
inverseHyperbolicCosine: true,
acosh: true,
inverseHyperbolicSine: true,
asinh: true,
inverseHyperbolicTangent: true,
atanh: true,
inverseSine: true,
asin: true,
inverseTangent: true,
atan: true,
isFinite: true,
isInteger: true,
isInt: true,
isNaN: true,
isNegative: true,
isNeg: true,
isPositive: true,
isPos: true,
isZero: true,
lessThan: true,
lt: true,
lessThanOrEqualTo: true,
lte: true,
logarithm: true,
log: true,
minus: true,
sub: true,
modulo: true,
mod: true,
naturalExponential: true,
exp: true,
naturalLogarithm: true,
ln: true,
negated: true,
neg: true,
plus: true,
add: true,
precision: true,
sd: true,
round: true,
sine: true,
sin: true,
squareRoot: true,
sqrt: true,
tangent: true,
tan: true,
times: true,
mul: true,
toBinary: true,
toDecimalPlaces: true,
toDP: true,
toExponential: true,
toFixed: true,
toFraction: true,
toHexadecimal: true,
toHex: true,
toJSON: true,
toNearest: true,
toNumber: true,
toOctal: true,
toPower: true,
pow: true,
toPrecision: true,
toSignificantDigits: true,
toSD: true,
toString: true,
truncated: true,
trunc: true,
valueOf: true
},
// Fraction
{
abs: true,
neg: true,
add: true,
sub: true,
mul: true,
div: true,
pow: true,
mod: true,
gcd: true,
lcm: true,
ceil: true,
floor: true,
round: true,
inverse: true,
equals: true,
compare: true,
valueOf: true,
toString: true,
toLatex: true,
toFraction: true,
toContinued: true,
clone: true
},
// Array, DenseMatrix, SparseMatrix
{
clone: true,
subset: true,
resize: true,
size: true,
map: true,
forEach: true,
toArray: true,
toJSON: true,
diagonal: true,
swapRows: true,
toString: true,
valueOf: true,
format: true
},
// Node
{
clone: true,
cloneDeep: true,
compile: true,
evaluate: true,
equals: true,
filter: true,
forEach: true,
map: true,
toString: true,
toTex: true,
transform: true,
traverse: true
}
]
// merge all groups into a single whitelist
const whitelist = groups.reduce(function (whitelist, group) {
return Object.assign(whitelist, group)
}, {})
const keys = Object.keys(whitelist).sort()
const orderedWhitelist = keys.reduce(function (whitelist, key) {
whitelist[key] = true
return whitelist
}, {})
console.log(orderedWhitelist)
console.log('number of methods/functions:', keys.length)
console.log('copy this object with safe methods into the file customs.js.')