mathjs 11.0.0 → 11.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CONTRIBUTING.md +1 -4
  2. package/HISTORY.md +27 -0
  3. package/lib/browser/math.js +1 -1
  4. package/lib/browser/math.js.LICENSE.txt +2 -2
  5. package/lib/browser/math.js.map +1 -1
  6. package/lib/cjs/core/create.js +1 -0
  7. package/lib/cjs/core/function/typed.js +3 -0
  8. package/lib/cjs/entry/typeChecks.js +6 -0
  9. package/lib/cjs/expression/embeddedDocs/construction/index.js +1 -1
  10. package/lib/cjs/function/algebra/derivative.js +3 -3
  11. package/lib/cjs/function/algebra/simplify.js +3 -1
  12. package/lib/cjs/function/algebra/symbolicEqual.js +5 -6
  13. package/lib/cjs/function/arithmetic/fix.js +1 -1
  14. package/lib/cjs/function/arithmetic/floor.js +1 -1
  15. package/lib/cjs/function/arithmetic/invmod.js +1 -1
  16. package/lib/cjs/function/arithmetic/nthRoot.js +3 -3
  17. package/lib/cjs/function/arithmetic/nthRoots.js +2 -2
  18. package/lib/cjs/function/bitwise/bitNot.js +1 -1
  19. package/lib/cjs/function/bitwise/leftShift.js +1 -1
  20. package/lib/cjs/function/bitwise/rightArithShift.js +1 -1
  21. package/lib/cjs/function/bitwise/rightLogShift.js +1 -1
  22. package/lib/cjs/function/geometry/distance.js +2 -2
  23. package/lib/cjs/function/matrix/diff.js +1 -1
  24. package/lib/cjs/function/matrix/rotate.js +5 -5
  25. package/lib/cjs/function/string/format.js +2 -2
  26. package/lib/cjs/function/string/hex.js +1 -2
  27. package/lib/cjs/function/trigonometry/acot.js +2 -3
  28. package/lib/cjs/function/trigonometry/acsc.js +2 -3
  29. package/lib/cjs/function/trigonometry/asec.js +2 -2
  30. package/lib/cjs/function/trigonometry/asin.js +1 -1
  31. package/lib/cjs/function/trigonometry/atan.js +1 -2
  32. package/lib/cjs/function/trigonometry/atan2.js +1 -1
  33. package/lib/cjs/function/utils/clone.js +1 -1
  34. package/lib/cjs/function/utils/hasNumericValue.js +1 -1
  35. package/lib/cjs/function/utils/isInteger.js +1 -1
  36. package/lib/cjs/function/utils/isNaN.js +1 -1
  37. package/lib/cjs/function/utils/isNegative.js +1 -1
  38. package/lib/cjs/function/utils/isNumeric.js +1 -1
  39. package/lib/cjs/function/utils/isPositive.js +1 -1
  40. package/lib/cjs/function/utils/isZero.js +11 -11
  41. package/lib/cjs/header.js +2 -2
  42. package/lib/cjs/type/unit/Unit.js +30 -25
  43. package/lib/cjs/type/unit/function/unit.js +5 -2
  44. package/lib/cjs/utils/is.js +5 -0
  45. package/lib/cjs/version.js +1 -1
  46. package/lib/esm/core/create.js +2 -1
  47. package/lib/esm/core/function/typed.js +4 -1
  48. package/lib/esm/entry/typeChecks.js +1 -1
  49. package/lib/esm/expression/embeddedDocs/construction/index.js +1 -1
  50. package/lib/esm/function/algebra/derivative.js +3 -3
  51. package/lib/esm/function/algebra/simplify.js +3 -1
  52. package/lib/esm/function/algebra/symbolicEqual.js +5 -6
  53. package/lib/esm/function/arithmetic/fix.js +1 -1
  54. package/lib/esm/function/arithmetic/floor.js +1 -1
  55. package/lib/esm/function/arithmetic/invmod.js +1 -1
  56. package/lib/esm/function/arithmetic/nthRoot.js +3 -3
  57. package/lib/esm/function/arithmetic/nthRoots.js +2 -2
  58. package/lib/esm/function/bitwise/bitNot.js +1 -1
  59. package/lib/esm/function/bitwise/leftShift.js +1 -1
  60. package/lib/esm/function/bitwise/rightArithShift.js +1 -1
  61. package/lib/esm/function/bitwise/rightLogShift.js +1 -1
  62. package/lib/esm/function/geometry/distance.js +2 -2
  63. package/lib/esm/function/matrix/diff.js +1 -1
  64. package/lib/esm/function/matrix/rotate.js +5 -5
  65. package/lib/esm/function/string/format.js +2 -2
  66. package/lib/esm/function/string/hex.js +1 -2
  67. package/lib/esm/function/trigonometry/acot.js +2 -3
  68. package/lib/esm/function/trigonometry/acsc.js +2 -3
  69. package/lib/esm/function/trigonometry/asec.js +2 -2
  70. package/lib/esm/function/trigonometry/asin.js +1 -1
  71. package/lib/esm/function/trigonometry/atan.js +1 -2
  72. package/lib/esm/function/trigonometry/atan2.js +1 -1
  73. package/lib/esm/function/utils/clone.js +1 -1
  74. package/lib/esm/function/utils/hasNumericValue.js +1 -1
  75. package/lib/esm/function/utils/isInteger.js +1 -1
  76. package/lib/esm/function/utils/isNaN.js +1 -1
  77. package/lib/esm/function/utils/isNegative.js +1 -1
  78. package/lib/esm/function/utils/isNumeric.js +1 -1
  79. package/lib/esm/function/utils/isPositive.js +1 -1
  80. package/lib/esm/function/utils/isZero.js +11 -11
  81. package/lib/esm/type/unit/Unit.js +25 -24
  82. package/lib/esm/type/unit/function/unit.js +5 -2
  83. package/lib/esm/utils/is.js +3 -0
  84. package/lib/esm/version.js +1 -1
  85. package/package.json +17 -18
  86. package/types/index.d.ts +33 -19
  87. package/types/index.ts +123 -95
  88. package/types/tsconfig.json +4 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mathjs",
3
- "version": "11.0.0",
3
+ "version": "11.2.0",
4
4
  "description": "Math.js is an extensive math library for JavaScript and Node.js. It features a flexible expression parser with support for symbolic computation, comes with a large set of built-in functions and constants, and offers an integrated solution to work with different data types like numbers, big numbers, complex numbers, fractions, units, and matrices.",
5
5
  "author": "Jos de Jong <wjosdejong@gmail.com> (https://github.com/josdejong)",
6
6
  "homepage": "https://mathjs.org",
@@ -25,42 +25,42 @@
25
25
  "unit"
26
26
  ],
27
27
  "dependencies": {
28
- "@babel/runtime": "^7.18.9",
28
+ "@babel/runtime": "^7.19.0",
29
29
  "complex.js": "^2.1.1",
30
- "decimal.js": "^10.3.1",
30
+ "decimal.js": "^10.4.0",
31
31
  "escape-latex": "^1.2.0",
32
32
  "fraction.js": "^4.2.0",
33
33
  "javascript-natural-sort": "^0.7.1",
34
34
  "seedrandom": "^3.0.5",
35
35
  "tiny-emitter": "^2.1.0",
36
- "typed-function": "^3.0.0"
36
+ "typed-function": "^4.1.0"
37
37
  },
38
38
  "devDependencies": {
39
- "@babel/core": "7.18.9",
39
+ "@babel/core": "7.19.0",
40
40
  "@babel/plugin-transform-object-assign": "7.18.6",
41
- "@babel/plugin-transform-runtime": "7.18.9",
42
- "@babel/preset-env": "7.18.9",
41
+ "@babel/plugin-transform-runtime": "7.18.10",
42
+ "@babel/preset-env": "7.19.0",
43
43
  "@babel/register": "7.18.9",
44
44
  "@types/assert": "1.5.6",
45
45
  "@types/mocha": "9.1.1",
46
- "@typescript-eslint/eslint-plugin": "5.30.7",
47
- "@typescript-eslint/parser": "5.30.7",
46
+ "@typescript-eslint/eslint-plugin": "5.36.2",
47
+ "@typescript-eslint/parser": "5.36.2",
48
48
  "assert": "2.0.0",
49
49
  "babel-loader": "8.2.5",
50
50
  "benchmark": "2.1.4",
51
51
  "codecov": "3.8.3",
52
- "core-js": "3.23.5",
52
+ "core-js": "3.25.1",
53
53
  "del": "6.1.1",
54
54
  "dtslint": "4.2.1",
55
- "eslint": "8.20.0",
55
+ "eslint": "8.23.1",
56
56
  "eslint-config-prettier": "8.5.0",
57
57
  "eslint-config-standard": "17.0.0",
58
58
  "eslint-plugin-import": "2.26.0",
59
59
  "eslint-plugin-mocha": "10.1.0",
60
- "eslint-plugin-n": "15.2.4",
60
+ "eslint-plugin-n": "15.2.5",
61
61
  "eslint-plugin-prettier": "4.2.1",
62
- "eslint-plugin-promise": "6.0.0",
63
- "expect-type": "0.13.0",
62
+ "eslint-plugin-promise": "6.0.1",
63
+ "expect-type": "0.14.2",
64
64
  "expr-eval": "2.0.2",
65
65
  "fancy-log": "2.0.0",
66
66
  "glob": "8.0.3",
@@ -90,8 +90,8 @@
90
90
  "process": "0.11.10",
91
91
  "sylvester": "0.0.21",
92
92
  "ts-node": "10.9.1",
93
- "typescript": "4.7.4",
94
- "webpack": "5.73.0",
93
+ "typescript": "4.8.3",
94
+ "webpack": "5.74.0",
95
95
  "zeros": "1.0.0"
96
96
  },
97
97
  "type": "module",
@@ -161,10 +161,9 @@
161
161
  "test:all": "npm run test:src && npm run test:generated && npm run test:node && npm run test:types",
162
162
  "test:browser": "karma start test/browser-test-config/local-karma.js",
163
163
  "test:browserstack": "karma start test/browser-test-config/browserstack-karma.js",
164
- "test:types": "cd types && node --loader ts-node/esm ./index.ts",
164
+ "test:types": "cd types && tsc -p ./tsconfig.json && node --loader ts-node/esm ./index.ts",
165
165
  "coverage": "nyc --reporter=lcov --reporter=text-summary mocha test/unit-tests && echo \"\nDetailed coverage report is available at ./coverage/lcov-report/index.html\"",
166
166
  "prepublishOnly": "npm run test:all && npm run lint",
167
- "prepare": "npm run build",
168
167
  "update-authors": "node ./tools/update-authors.js"
169
168
  },
170
169
  "bin": {
package/types/index.d.ts CHANGED
@@ -283,6 +283,7 @@ declare namespace math {
283
283
  type OperatorNodeMap = {
284
284
  xor: 'xor'
285
285
  and: 'and'
286
+ or: 'or'
286
287
  bitOr: '|'
287
288
  bitXor: '^|'
288
289
  bitAnd: '&'
@@ -291,6 +292,7 @@ declare namespace math {
291
292
  smaller: '<'
292
293
  larger: '>'
293
294
  smallerEq: '<='
295
+ largerEq: '>='
294
296
  leftShift: '<<'
295
297
  rightArithShift: '>>'
296
298
  rightLogShift: '>>>'
@@ -478,6 +480,12 @@ declare namespace math {
478
480
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
479
481
  reviver(): (key: any, value: any) => any
480
482
 
483
+ /**
484
+ * Returns replacer function that can be used as replacer in JSON.stringify function.
485
+ */
486
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
487
+ replacer(): (key: any, value: any) => any
488
+
481
489
  /*************************************************************************
482
490
  * Core functions
483
491
  ************************************************************************/
@@ -890,8 +898,11 @@ declare namespace math {
890
898
  */
891
899
  simplify: Simplify
892
900
 
893
- simplifyConstant(expr: MathNode | string, options?: SimplifyOptions)
894
- simplifyCore(expr: MathNode | string, options?: SimplifyOptions)
901
+ simplifyConstant(
902
+ expr: MathNode | string,
903
+ options?: SimplifyOptions
904
+ ): MathNode
905
+ simplifyCore(expr: MathNode | string, options?: SimplifyOptions): MathNode
895
906
 
896
907
  /**
897
908
  * Replaces variable nodes with their scoped values
@@ -2192,11 +2203,9 @@ declare namespace math {
2192
2203
  * undefined. Returns an array with the configured number of elements
2193
2204
  * when number is > 1.
2194
2205
  */
2195
- pickRandom(
2196
- array: number[],
2197
- number?: number,
2198
- weights?: number[]
2199
- ): number | number[]
2206
+ pickRandom<T>(array: T[]): T
2207
+ pickRandom<T>(array: T[], number: number): T[]
2208
+ pickRandom<T>(array: T[], number: number, weights: number[]): T[]
2200
2209
 
2201
2210
  /**
2202
2211
  * Return a random number larger or equal to min and smaller than max
@@ -2567,9 +2576,9 @@ declare namespace math {
2567
2576
  median(...args: MathType[]): any
2568
2577
 
2569
2578
  /**
2570
- * Compute the maximum value of a matrix or a list of values. In case of
2571
- * a multi dimensional array, the maximum of the flattened array will be
2572
- * calculated. When dim is provided, the maximum over the selected
2579
+ * Compute the minimum value of a matrix or a list of values. In case of
2580
+ * a multi dimensional array, the minimun of the flattened array will be
2581
+ * calculated. When dim is provided, the minimun over the selected
2573
2582
  * dimension will be calculated. Parameter dim is zero-based.
2574
2583
  * @param args A single matrix or or multiple scalar values
2575
2584
  * @returns The minimum value
@@ -3149,6 +3158,8 @@ declare namespace math {
3149
3158
 
3150
3159
  isRangeNode(x: unknown): x is RangeNode
3151
3160
 
3161
+ isRelationalNode(x: unknown): x is RelationalNode
3162
+
3152
3163
  isSymbolNode(x: unknown): x is SymbolNode
3153
3164
 
3154
3165
  isChain(x: unknown): x is MathJsChain<unknown>
@@ -4407,11 +4418,12 @@ declare namespace math {
4407
4418
  * pass a custom set of rules to the function as second argument. A rule
4408
4419
  * can be specified as an object, string, or function.
4409
4420
  * @param scope Scope to variables
4421
+ * @param options Options to configure the behavior of simplify
4410
4422
  */
4411
4423
  simplify(
4412
4424
  this: MathJsChain<MathNode | string>,
4413
4425
  rules?: SimplifyRule[],
4414
- scope?: Map | object,
4426
+ scope?: Map<string, MathType> | object,
4415
4427
  options?: SimplifyOptions
4416
4428
  ): MathJsChain<MathNode>
4417
4429
 
@@ -5511,11 +5523,13 @@ declare namespace math {
5511
5523
  * @param number An int or float
5512
5524
  * @param weights An array of ints or floats
5513
5525
  */
5514
- pickRandom(
5515
- array: MathJsChain<number[]>,
5516
- number?: number,
5517
- weights?: number[]
5518
- ): MathJsChain<number | number[]>
5526
+ pickRandom<T>(this: MathJsChain<T[]>): MathJsChain<T>
5527
+ pickRandom<T>(this: MathJsChain<T[]>, number: number): MathJsChain<T[]>
5528
+ pickRandom<T>(
5529
+ this: MathJsChain<T[]>,
5530
+ number: number,
5531
+ weights: number[]
5532
+ ): MathJsChain<T[]>
5519
5533
 
5520
5534
  /**
5521
5535
  * Return a random number larger or equal to min and smaller than max
@@ -5863,9 +5877,9 @@ declare namespace math {
5863
5877
  median(this: MathJsChain<MathCollection>, dim?: number): MathJsChain<any>
5864
5878
 
5865
5879
  /**
5866
- * Compute the maximum value of a matrix or a list of values. In case of
5867
- * a multi dimensional array, the maximum of the flattened array will be
5868
- * calculated. When dim is provided, the maximum over the selected
5880
+ * Compute the minimum value of a matrix or a list of values. In case of
5881
+ * a multi dimensional array, the minimum of the flattened array will be
5882
+ * calculated. When dim is provided, the minimum over the selected
5869
5883
  * dimension will be calculated. Parameter dim is zero-based.
5870
5884
  * @param dim The minimum over the selected dimension
5871
5885
  */
package/types/index.ts CHANGED
@@ -1,35 +1,48 @@
1
1
  import {
2
- create,
3
- factory,
4
- all,
5
- MathJsFunctionName,
6
- fractionDependencies,
2
+ AccessorNode,
7
3
  addDependencies,
8
- divideDependencies,
9
- formatDependencies,
10
- MathNode,
11
- MathJsChain,
4
+ all,
5
+ ArrayNode,
6
+ AssignmentNode,
12
7
  BigNumber,
13
- MathCollection,
8
+ BlockNode,
14
9
  Complex,
15
- Unit,
10
+ ConditionalNode,
11
+ ConstantNode,
12
+ create,
13
+ divideDependencies,
14
+ EvalFunction,
15
+ factory,
16
+ formatDependencies,
16
17
  Fraction,
17
- MathArray,
18
+ fractionDependencies,
19
+ FunctionAssignmentNode,
20
+ FunctionNode,
21
+ Help,
18
22
  Index,
19
- Matrix,
20
- EvalFunction,
23
+ IndexNode,
21
24
  LUDecomposition,
22
- QRDecomposition,
23
- SLUDecomposition,
24
- MathType,
25
+ MathArray,
26
+ MathCollection,
27
+ MathJsChain,
28
+ MathJsFunctionName,
29
+ MathNode,
30
+ MathNodeCommon,
25
31
  MathNumericType,
26
- ConstantNode,
32
+ MathType,
33
+ Matrix,
34
+ ObjectNode,
27
35
  OperatorNode,
28
36
  OperatorNodeFn,
29
37
  OperatorNodeOp,
30
- SymbolNode,
31
38
  ParenthesisNode,
39
+ PolarCoordinates,
40
+ QRDecomposition,
41
+ RangeNode,
32
42
  SimplifyRule,
43
+ SLUDecomposition,
44
+ SymbolNode,
45
+ Unit,
33
46
  } from 'mathjs'
34
47
  import * as assert from 'assert'
35
48
  import { expectTypeOf } from 'expect-type'
@@ -125,8 +138,8 @@ Basic usage examples
125
138
  ) // Matrix + Array
126
139
 
127
140
  // narrowed type inference
128
- const _b: math.Matrix = math.add(math.matrix([2]), math.matrix([3]))
129
- const _c: math.Matrix = math.subtract(math.matrix([4]), math.matrix([5]))
141
+ const _b: Matrix = math.add(math.matrix([2]), math.matrix([3]))
142
+ const _c: Matrix = math.subtract(math.matrix([4]), math.matrix([5]))
130
143
  }
131
144
 
132
145
  /*
@@ -944,18 +957,18 @@ Complex numbers examples
944
957
 
945
958
  // create a complex number from polar coordinates
946
959
  {
947
- const p: math.PolarCoordinates = {
960
+ const p: PolarCoordinates = {
948
961
  r: math.sqrt(2) as number, // must be real but a sqrt could be Complex
949
962
  phi: math.pi / 4,
950
963
  }
951
- const c: math.Complex = math.complex(p)
964
+ const c: Complex = math.complex(p)
952
965
  assert.strictEqual(c.im, 1)
953
966
  assert.ok(Math.abs(c.re - 1) < 1e-12)
954
967
  }
955
968
 
956
969
  // get polar coordinates of a complex number
957
970
  {
958
- const _p: math.PolarCoordinates = math.complex(3, 4).toPolar()
971
+ const _p: PolarCoordinates = math.complex(3, 4).toPolar()
959
972
  }
960
973
  }
961
974
 
@@ -1014,7 +1027,7 @@ Expressions examples
1014
1027
 
1015
1028
  {
1016
1029
  const node2 = math.parse('x^a')
1017
- const _code2: math.EvalFunction = node2.compile()
1030
+ const _code2: EvalFunction = node2.compile()
1018
1031
  node2.toString()
1019
1032
  }
1020
1033
 
@@ -1117,8 +1130,8 @@ Matrices examples
1117
1130
 
1118
1131
  // create matrices and arrays. a matrix is just a wrapper around an Array,
1119
1132
  // providing some handy utilities.
1120
- const a: math.Matrix = math.matrix([1, 4, 9, 16, 25])
1121
- const b: math.Matrix = math.matrix(math.ones([2, 3]))
1133
+ const a: Matrix = math.matrix([1, 4, 9, 16, 25])
1134
+ const b: Matrix = math.matrix(math.ones([2, 3]))
1122
1135
  b.size()
1123
1136
 
1124
1137
  // @ts-expect-error ... ones() in a chain cannot take more dimensions
@@ -1130,7 +1143,7 @@ Matrices examples
1130
1143
  const _array = a.valueOf()
1131
1144
 
1132
1145
  // Matrices can be cloned
1133
- const _clone: math.Matrix = a.clone()
1146
+ const _clone: Matrix = a.clone()
1134
1147
 
1135
1148
  // perform operations with matrices
1136
1149
  math.map(a, math.sqrt)
@@ -1142,22 +1155,22 @@ Matrices examples
1142
1155
  [1, 2],
1143
1156
  [3, 4],
1144
1157
  ]
1145
- const b: math.Matrix = math.matrix([
1158
+ const b: Matrix = math.matrix([
1146
1159
  [5, 6],
1147
1160
  [1, 1],
1148
1161
  ])
1149
1162
 
1150
1163
  b.subset(math.index(1, [0, 1]), [[7, 8]])
1151
1164
  const _c = math.multiply(a, b)
1152
- const f: math.Matrix = math.matrix([1, 0])
1153
- const _d: math.Matrix = f.subset(math.index(1))
1165
+ const f: Matrix = math.matrix([1, 0])
1166
+ const _d: Matrix = f.subset(math.index(1))
1154
1167
  }
1155
1168
 
1156
1169
  // get a sub matrix
1157
1170
  {
1158
- const a: math.Matrix = math.diag(math.range(1, 4))
1171
+ const a: Matrix = math.diag(math.range(1, 4))
1159
1172
  a.subset(math.index([1, 2], [1, 2]))
1160
- const b: math.Matrix = math.range(1, 6)
1173
+ const b: Matrix = math.range(1, 6)
1161
1174
  b.subset(math.index(math.range(1, 4)))
1162
1175
  }
1163
1176
 
@@ -1203,7 +1216,7 @@ Matrices examples
1203
1216
  [6, 4, 3]
1204
1217
  )
1205
1218
  assert.deepStrictEqual(
1206
- math.filter(['23', 'foo', '100', '55', 'bar'], /[0-9]+/),
1219
+ math.filter(['23', 'foo', '100', '55', 'bar'], /\d+/),
1207
1220
  ['23', '100', '55']
1208
1221
  )
1209
1222
  }
@@ -1308,7 +1321,7 @@ Math types examples: Type results after multiplying 'MathTypes' with matrices
1308
1321
 
1309
1322
  // 1D JS Array
1310
1323
  const r3 = math.multiply(abc, bcd)
1311
- r3[1] // By default least promised valid syntax
1324
+ const _r31 = r3[1] // By default least promised valid syntax
1312
1325
 
1313
1326
  // 2D JS Array
1314
1327
  const r12 = math.multiply(bcd, bcd)
@@ -1316,9 +1329,9 @@ Math types examples: Type results after multiplying 'MathTypes' with matrices
1316
1329
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1317
1330
  const multiDimensional = (x: any): x is any[][] => x.length && x[0].length
1318
1331
  if (multiDimensional(r12)) {
1319
- r12[1][1]
1332
+ const _r1211 = r12[1][1]
1320
1333
  }
1321
- r12[1] // Valid syntax
1334
+ const _r121 = r12[1] // Valid syntax
1322
1335
 
1323
1336
  // Matrix: matrix * vector
1324
1337
  const r7 = math.multiply(Mabc, bcd)
@@ -1450,29 +1463,27 @@ Expression tree examples
1450
1463
  const math = create(all, {})
1451
1464
 
1452
1465
  // Filter an expression tree
1453
- const node: math.MathNode = math.parse('x^2 + x/4 + 3*y')
1454
- const filtered: math.MathNode[] = node.filter(
1455
- (node: math.MathNode) => node.type === 'SymbolNode' && node.name === 'x'
1466
+ const node: MathNode = math.parse('x^2 + x/4 + 3*y')
1467
+ const filtered: MathNode[] = node.filter(
1468
+ (node: MathNode) => node.type === 'SymbolNode' && node.name === 'x'
1456
1469
  )
1457
1470
 
1458
- const _arr: string[] = filtered.map((node: math.MathNode) => node.toString())
1471
+ const _arr: string[] = filtered.map((node: MathNode) => node.toString())
1459
1472
 
1460
1473
  // Traverse an expression tree
1461
- const node1: math.MathNode = math.parse('3 * x + 2')
1462
- node1.traverse(
1463
- (node: math.MathNode, _path: string, _parent: math.MathNode) => {
1464
- switch (node.type) {
1465
- case 'OperatorNode':
1466
- return node.type === 'OperatorNode'
1467
- case 'ConstantNode':
1468
- return node.type === 'ConstantNode'
1469
- case 'SymbolNode':
1470
- return node.type === 'SymbolNode'
1471
- default:
1472
- return
1473
- }
1474
+ const node1: MathNode = math.parse('3 * x + 2')
1475
+ node1.traverse((node: MathNode, _path: string, _parent: MathNode) => {
1476
+ switch (node.type) {
1477
+ case 'OperatorNode':
1478
+ return node.type === 'OperatorNode'
1479
+ case 'ConstantNode':
1480
+ return node.type === 'ConstantNode'
1481
+ case 'SymbolNode':
1482
+ return node.type === 'SymbolNode'
1483
+ default:
1484
+ return
1474
1485
  }
1475
- )
1486
+ })
1476
1487
  }
1477
1488
 
1478
1489
  /*
@@ -1535,9 +1546,9 @@ Function ceil examples
1535
1546
  )
1536
1547
 
1537
1548
  // numeric input, array or matrix of decimals
1538
- const numCeiled: math.MathArray = math.ceil(math.tau, [2, 3])
1549
+ const numCeiled: MathArray = math.ceil(math.tau, [2, 3])
1539
1550
  assert.deepStrictEqual(numCeiled, [6.29, 6.284])
1540
- const bigCeiled: math.Matrix = math.ceil(
1551
+ const bigCeiled: Matrix = math.ceil(
1541
1552
  math.bignumber(6.28318),
1542
1553
  math.matrix([2, 3])
1543
1554
  )
@@ -1611,9 +1622,9 @@ Function fix examples
1611
1622
  )
1612
1623
 
1613
1624
  // numeric input, array or matrix of decimals
1614
- const numFixed: math.MathArray = math.fix(math.tau, [2, 3])
1625
+ const numFixed: MathArray = math.fix(math.tau, [2, 3])
1615
1626
  assert.deepStrictEqual(numFixed, [6.28, 6.283])
1616
- const bigFixed: math.Matrix = math.fix(
1627
+ const bigFixed: Matrix = math.fix(
1617
1628
  math.bignumber(6.28318),
1618
1629
  math.matrix([2, 3])
1619
1630
  )
@@ -1687,9 +1698,9 @@ Function floor examples
1687
1698
  )
1688
1699
 
1689
1700
  // numeric input, array or matrix of decimals
1690
- const numFloored: math.MathArray = math.floor(math.tau, [2, 3])
1701
+ const numFloored: MathArray = math.floor(math.tau, [2, 3])
1691
1702
  assert.deepStrictEqual(numFloored, [6.28, 6.283])
1692
- const bigFloored: math.Matrix = math.floor(
1703
+ const bigFloored: Matrix = math.floor(
1693
1704
  math.bignumber(6.28318),
1694
1705
  math.matrix([2, 3])
1695
1706
  )
@@ -1763,9 +1774,9 @@ Function round examples
1763
1774
  )
1764
1775
 
1765
1776
  // numeric input, array or matrix of decimals
1766
- const numRounded: math.MathArray = math.round(math.tau, [2, 3])
1777
+ const numRounded: MathArray = math.round(math.tau, [2, 3])
1767
1778
  assert.deepStrictEqual(numRounded, [6.28, 6.283])
1768
- const bigRounded: math.Matrix = math.round(
1779
+ const bigRounded: Matrix = math.round(
1769
1780
  math.bignumber(6.28318),
1770
1781
  math.matrix([2, 3])
1771
1782
  )
@@ -2065,6 +2076,7 @@ Factory Test
2065
2076
  math.isOperatorNode,
2066
2077
  math.isParenthesisNode,
2067
2078
  math.isRangeNode,
2079
+ math.isRelationalNode,
2068
2080
  math.isSymbolNode,
2069
2081
  math.isChain,
2070
2082
  ]
@@ -2077,22 +2089,22 @@ Factory Test
2077
2089
 
2078
2090
  // Check guards do type refinement
2079
2091
 
2080
- let x: unknown
2092
+ const x: unknown = undefined
2081
2093
 
2082
2094
  if (math.isNumber(x)) {
2083
2095
  expectTypeOf(x).toMatchTypeOf<number>()
2084
2096
  }
2085
2097
  if (math.isBigNumber(x)) {
2086
- expectTypeOf(x).toMatchTypeOf<math.BigNumber>()
2098
+ expectTypeOf(x).toMatchTypeOf<BigNumber>()
2087
2099
  }
2088
2100
  if (math.isComplex(x)) {
2089
- expectTypeOf(x).toMatchTypeOf<math.Complex>()
2101
+ expectTypeOf(x).toMatchTypeOf<Complex>()
2090
2102
  }
2091
2103
  if (math.isFraction(x)) {
2092
- expectTypeOf(x).toMatchTypeOf<math.Fraction>()
2104
+ expectTypeOf(x).toMatchTypeOf<Fraction>()
2093
2105
  }
2094
2106
  if (math.isUnit(x)) {
2095
- expectTypeOf(x).toMatchTypeOf<math.Unit>()
2107
+ expectTypeOf(x).toMatchTypeOf<Unit>()
2096
2108
  }
2097
2109
  if (math.isString(x)) {
2098
2110
  expectTypeOf(x).toMatchTypeOf<string>()
@@ -2101,22 +2113,22 @@ Factory Test
2101
2113
  expectTypeOf(x).toMatchTypeOf<unknown[]>()
2102
2114
  }
2103
2115
  if (math.isMatrix(x)) {
2104
- expectTypeOf(x).toMatchTypeOf<math.Matrix>()
2116
+ expectTypeOf(x).toMatchTypeOf<Matrix>()
2105
2117
  }
2106
2118
  if (math.isDenseMatrix(x)) {
2107
- expectTypeOf(x).toMatchTypeOf<math.Matrix>()
2119
+ expectTypeOf(x).toMatchTypeOf<Matrix>()
2108
2120
  }
2109
2121
  if (math.isSparseMatrix(x)) {
2110
- expectTypeOf(x).toMatchTypeOf<math.Matrix>()
2122
+ expectTypeOf(x).toMatchTypeOf<Matrix>()
2111
2123
  }
2112
2124
  if (math.isIndex(x)) {
2113
- expectTypeOf(x).toMatchTypeOf<math.Index>()
2125
+ expectTypeOf(x).toMatchTypeOf<Index>()
2114
2126
  }
2115
2127
  if (math.isBoolean(x)) {
2116
2128
  expectTypeOf(x).toMatchTypeOf<boolean>()
2117
2129
  }
2118
2130
  if (math.isHelp(x)) {
2119
- expectTypeOf(x).toMatchTypeOf<math.Help>()
2131
+ expectTypeOf(x).toMatchTypeOf<Help>()
2120
2132
  }
2121
2133
  if (math.isDate(x)) {
2122
2134
  expectTypeOf(x).toMatchTypeOf<Date>()
@@ -2132,40 +2144,40 @@ Factory Test
2132
2144
  }
2133
2145
 
2134
2146
  if (math.isAccessorNode(x)) {
2135
- expectTypeOf(x).toMatchTypeOf<math.AccessorNode>()
2147
+ expectTypeOf(x).toMatchTypeOf<AccessorNode>()
2136
2148
  }
2137
2149
  if (math.isArrayNode(x)) {
2138
- expectTypeOf(x).toMatchTypeOf<math.ArrayNode>()
2150
+ expectTypeOf(x).toMatchTypeOf<ArrayNode>()
2139
2151
  }
2140
2152
  if (math.isAssignmentNode(x)) {
2141
- expectTypeOf(x).toMatchTypeOf<math.AssignmentNode>()
2153
+ expectTypeOf(x).toMatchTypeOf<AssignmentNode>()
2142
2154
  }
2143
2155
  if (math.isBlockNode(x)) {
2144
- expectTypeOf(x).toMatchTypeOf<math.BlockNode>()
2156
+ expectTypeOf(x).toMatchTypeOf<BlockNode>()
2145
2157
  }
2146
2158
  if (math.isConditionalNode(x)) {
2147
- expectTypeOf(x).toMatchTypeOf<math.ConditionalNode>()
2159
+ expectTypeOf(x).toMatchTypeOf<ConditionalNode>()
2148
2160
  }
2149
2161
  if (math.isConstantNode(x)) {
2150
- expectTypeOf(x).toMatchTypeOf<math.ConstantNode>()
2162
+ expectTypeOf(x).toMatchTypeOf<ConstantNode>()
2151
2163
  }
2152
2164
  if (math.isFunctionAssignmentNode(x)) {
2153
- expectTypeOf(x).toMatchTypeOf<math.FunctionAssignmentNode>()
2165
+ expectTypeOf(x).toMatchTypeOf<FunctionAssignmentNode>()
2154
2166
  }
2155
2167
  if (math.isFunctionNode(x)) {
2156
- expectTypeOf(x).toMatchTypeOf<math.FunctionNode>()
2168
+ expectTypeOf(x).toMatchTypeOf<FunctionNode>()
2157
2169
  }
2158
2170
  if (math.isIndexNode(x)) {
2159
- expectTypeOf(x).toMatchTypeOf<math.IndexNode>()
2171
+ expectTypeOf(x).toMatchTypeOf<IndexNode>()
2160
2172
  }
2161
2173
  if (math.isNode(x)) {
2162
- expectTypeOf(x).toMatchTypeOf<math.MathNodeCommon>()
2174
+ expectTypeOf(x).toMatchTypeOf<MathNodeCommon>()
2163
2175
  }
2164
2176
  if (math.isNode(x)) {
2165
- expectTypeOf(x).toMatchTypeOf<math.MathNodeCommon>()
2177
+ expectTypeOf(x).toMatchTypeOf<MathNodeCommon>()
2166
2178
  }
2167
2179
  if (math.isObjectNode(x)) {
2168
- expectTypeOf(x).toMatchTypeOf<math.ObjectNode>()
2180
+ expectTypeOf(x).toMatchTypeOf<ObjectNode>()
2169
2181
  }
2170
2182
  if (math.isOperatorNode(x)) {
2171
2183
  expectTypeOf(x).toMatchTypeOf<
@@ -2173,17 +2185,20 @@ Factory Test
2173
2185
  >()
2174
2186
  }
2175
2187
  if (math.isParenthesisNode(x)) {
2176
- expectTypeOf(x).toMatchTypeOf<math.ParenthesisNode>()
2188
+ expectTypeOf(x).toMatchTypeOf<ParenthesisNode>()
2177
2189
  }
2178
2190
  if (math.isRangeNode(x)) {
2179
- expectTypeOf(x).toMatchTypeOf<math.RangeNode>()
2191
+ expectTypeOf(x).toMatchTypeOf<RangeNode>()
2192
+ }
2193
+ if (math.isRelationalNode(x)) {
2194
+ expectTypeOf(x).toMatchTypeOf<math.RelationalNode>()
2180
2195
  }
2181
2196
  if (math.isSymbolNode(x)) {
2182
- expectTypeOf(x).toMatchTypeOf<math.SymbolNode>()
2197
+ expectTypeOf(x).toMatchTypeOf<SymbolNode>()
2183
2198
  }
2184
2199
  if (math.isChain(x)) {
2185
2200
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
2186
- expectTypeOf(x).toMatchTypeOf<math.MathJsChain<any>>()
2201
+ expectTypeOf(x).toMatchTypeOf<MathJsChain<any>>()
2187
2202
  }
2188
2203
  }
2189
2204
 
@@ -2194,9 +2209,7 @@ Probability function examples
2194
2209
  const math = create(all, {})
2195
2210
 
2196
2211
  expectTypeOf(math.lgamma(1.5)).toMatchTypeOf<number>()
2197
- expectTypeOf(
2198
- math.lgamma(math.complex(1.5, -1.5))
2199
- ).toMatchTypeOf<math.Complex>()
2212
+ expectTypeOf(math.lgamma(math.complex(1.5, -1.5))).toMatchTypeOf<Complex>()
2200
2213
  }
2201
2214
 
2202
2215
  /*
@@ -2231,7 +2244,22 @@ Resolve examples
2231
2244
  expectTypeOf(
2232
2245
  math.resolve([math.parse('x + y'), 'x*x'], { x: 0 })
2233
2246
  ).toMatchTypeOf<MathNode[]>()
2234
- expectTypeOf(
2235
- math.resolve(math.matrix(['x', 'y']))
2236
- ).toMatchTypeOf<math.Matrix>()
2247
+ expectTypeOf(math.resolve(math.matrix(['x', 'y']))).toMatchTypeOf<Matrix>()
2248
+ }
2249
+
2250
+ /*
2251
+ Random examples
2252
+ */
2253
+ {
2254
+ const math = create(all, {})
2255
+ expectTypeOf(math.pickRandom([1, 2, 3])).toMatchTypeOf<number>()
2256
+ expectTypeOf(math.pickRandom(['a', { b: 10 }, 42])).toMatchTypeOf<
2257
+ string | number | { b: number }
2258
+ >()
2259
+ expectTypeOf(math.pickRandom([1, 2, 3])).toMatchTypeOf<number>()
2260
+ expectTypeOf(math.pickRandom([1, 2, 3], 2)).toMatchTypeOf<number[]>()
2261
+
2262
+ expectTypeOf(math.chain([1, 2, 3]).pickRandom(2)).toMatchTypeOf<
2263
+ MathJsChain<number[]>
2264
+ >()
2237
2265
  }
@@ -15,5 +15,8 @@
15
15
  "strictNullChecks": false,
16
16
  "strictFunctionTypes": true,
17
17
  "forceConsistentCasingInFileNames": true
18
- }
18
+ },
19
+ "files": [
20
+ "./index.ts"
21
+ ],
19
22
  }