mathjs 9.4.5 → 10.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. package/HISTORY.md +35 -0
  2. package/bin/cli.js +0 -0
  3. package/docs/expressions/syntax.md +46 -43
  4. package/docs/reference/functions/format.md +5 -2
  5. package/docs/reference/functions/parser.md +4 -4
  6. package/docs/reference/functions/setCartesian.md +3 -1
  7. package/lib/browser/math.js +5 -5
  8. package/lib/browser/math.js.map +1 -1
  9. package/lib/cjs/constants.js +1 -1
  10. package/lib/cjs/core/function/config.js +1 -1
  11. package/lib/cjs/core/function/import.js +2 -1
  12. package/lib/cjs/entry/dependenciesAny/dependenciesParserClass.generated.js +2 -2
  13. package/lib/cjs/entry/dependenciesAny.generated.js +999 -999
  14. package/lib/cjs/entry/dependenciesNumber/dependenciesParserClass.generated.js +2 -2
  15. package/lib/cjs/entry/dependenciesNumber.generated.js +581 -581
  16. package/lib/cjs/entry/impureFunctionsAny.generated.js +314 -313
  17. package/lib/cjs/entry/impureFunctionsNumber.generated.js +223 -222
  18. package/lib/cjs/entry/mainAny.js +8 -8
  19. package/lib/cjs/entry/mainNumber.js +8 -8
  20. package/lib/cjs/entry/pureFunctionsAny.generated.js +1100 -1100
  21. package/lib/cjs/entry/pureFunctionsNumber.generated.js +375 -375
  22. package/lib/cjs/entry/typeChecks.js +12 -12
  23. package/lib/cjs/expression/Parser.js +6 -5
  24. package/lib/cjs/expression/embeddedDocs/function/set/setCartesian.js +1 -1
  25. package/lib/cjs/expression/function/parser.js +4 -4
  26. package/lib/cjs/expression/node/OperatorNode.js +9 -6
  27. package/lib/cjs/expression/operators.js +1 -1
  28. package/lib/cjs/expression/parse.js +42 -6
  29. package/lib/cjs/factoriesAny.js +660 -660
  30. package/lib/cjs/factoriesNumber.js +268 -237
  31. package/lib/cjs/function/set/setCartesian.js +3 -1
  32. package/lib/cjs/function/string/format.js +5 -2
  33. package/lib/cjs/header.js +2 -2
  34. package/lib/cjs/plain/bignumber/arithmetic.js +2 -2
  35. package/lib/cjs/plain/number/arithmetic.js +10 -10
  36. package/lib/cjs/plain/number/constants.js +1 -1
  37. package/lib/cjs/plain/number/logical.js +1 -1
  38. package/lib/cjs/plain/number/probability.js +2 -1
  39. package/lib/cjs/plain/number/trigonometry.js +1 -1
  40. package/lib/cjs/plain/number/utils.js +1 -1
  41. package/lib/cjs/type/unit/physicalConstants.js +1 -1
  42. package/lib/cjs/utils/array.js +14 -14
  43. package/lib/cjs/utils/bignumber/bitwise.js +1 -1
  44. package/lib/cjs/utils/customs.js +5 -5
  45. package/lib/cjs/utils/factory.js +3 -3
  46. package/lib/cjs/utils/function.js +1 -1
  47. package/lib/cjs/utils/is.js +23 -23
  48. package/lib/cjs/utils/latex.js +2 -1
  49. package/lib/cjs/utils/map.js +3 -3
  50. package/lib/cjs/utils/noop.js +1 -1
  51. package/lib/cjs/utils/number.js +10 -6
  52. package/lib/cjs/utils/object.js +8 -8
  53. package/lib/cjs/utils/snapshot.js +1 -1
  54. package/lib/cjs/utils/string.js +2 -2
  55. package/lib/cjs/version.js +1 -1
  56. package/lib/esm/core/function/import.js +2 -1
  57. package/lib/esm/entry/dependenciesAny/dependenciesParserClass.generated.js +2 -2
  58. package/lib/esm/entry/dependenciesAny.generated.js +270 -270
  59. package/lib/esm/entry/dependenciesNumber/dependenciesParserClass.generated.js +2 -2
  60. package/lib/esm/entry/dependenciesNumber.generated.js +163 -163
  61. package/lib/esm/entry/impureFunctionsAny.generated.js +301 -301
  62. package/lib/esm/entry/impureFunctionsNumber.generated.js +211 -211
  63. package/lib/esm/entry/pureFunctionsAny.generated.js +816 -816
  64. package/lib/esm/entry/pureFunctionsNumber.generated.js +234 -234
  65. package/lib/esm/expression/Parser.js +6 -5
  66. package/lib/esm/expression/embeddedDocs/function/set/setCartesian.js +1 -1
  67. package/lib/esm/expression/function/parser.js +4 -4
  68. package/lib/esm/expression/node/OperatorNode.js +9 -6
  69. package/lib/esm/expression/parse.js +42 -6
  70. package/lib/esm/function/set/setCartesian.js +3 -1
  71. package/lib/esm/function/string/format.js +5 -2
  72. package/lib/esm/version.js +1 -1
  73. package/package.json +16 -16
  74. package/types/index.d.ts +281 -77
@@ -1,10 +1,10 @@
1
1
  import { factory } from '../utils/factory.js';
2
2
  import { createEmptyMap, toObject } from '../utils/map.js';
3
3
  var name = 'Parser';
4
- var dependencies = ['parse'];
4
+ var dependencies = ['evaluate'];
5
5
  export var createParserClass = /* #__PURE__ */factory(name, dependencies, _ref => {
6
6
  var {
7
- parse
7
+ evaluate
8
8
  } = _ref;
9
9
 
10
10
  /**
@@ -37,7 +37,7 @@ export var createParserClass = /* #__PURE__ */factory(name, dependencies, _ref =
37
37
  * // define variables and functions
38
38
  * parser.evaluate('x = 7 / 2') // 3.5
39
39
  * parser.evaluate('x + 3') // 6.5
40
- * parser.evaluate('function f(x, y) = x^y') // f(x, y)
40
+ * parser.evaluate('f(x, y) = x^y') // f(x, y)
41
41
  * parser.evaluate('f(2, 3)') // 8
42
42
  *
43
43
  * // get and set variables and functions
@@ -74,14 +74,15 @@ export var createParserClass = /* #__PURE__ */factory(name, dependencies, _ref =
74
74
  Parser.prototype.isParser = true;
75
75
  /**
76
76
  * Parse and evaluate the given expression
77
- * @param {string} expr A string containing an expression, for example "2+3"
77
+ * @param {string | string[]} expr A string containing an expression,
78
+ * for example "2+3", or a list with expressions
78
79
  * @return {*} result The result, or undefined when the expression was empty
79
80
  * @throws {Error}
80
81
  */
81
82
 
82
83
  Parser.prototype.evaluate = function (expr) {
83
84
  // TODO: validate arguments
84
- return parse(expr).compile().evaluate(this.scope);
85
+ return evaluate(expr, this.scope);
85
86
  };
86
87
  /**
87
88
  * Get a variable (a function or variable) by name from the parsers scope.
@@ -2,7 +2,7 @@ export var setCartesianDocs = {
2
2
  name: 'setCartesian',
3
3
  category: 'Set',
4
4
  syntax: ['setCartesian(set1, set2)'],
5
- description: 'Create the cartesian product of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.',
5
+ description: 'Create the cartesian product of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays and the values will be sorted in ascending order before the operation.',
6
6
  examples: ['setCartesian([1, 2], [3, 4])'],
7
7
  seealso: ['setUnion', 'setIntersect', 'setDifference', 'setPowerset']
8
8
  };
@@ -25,10 +25,10 @@ export var createParser = /* #__PURE__ */factory(name, dependencies, _ref => {
25
25
  * const d = parser.evaluate('cos(45 deg)') // 0.7071067811865476
26
26
  *
27
27
  * // define variables and functions
28
- * parser.evaluate('x = 7 / 2') // 3.5
29
- * parser.evaluate('x + 3') // 6.5
30
- * parser.evaluate('function f(x, y) = x^y') // f(x, y)
31
- * parser.evaluate('f(2, 3)') // 8
28
+ * parser.evaluate('x = 7 / 2') // 3.5
29
+ * parser.evaluate('x + 3') // 6.5
30
+ * parser.evaluate('f(x, y) = x^y') // f(x, y)
31
+ * parser.evaluate('f(2, 3)') // 8
32
32
  *
33
33
  * // get and set variables and functions
34
34
  * const x = parser.get('x') // 7
@@ -21,8 +21,9 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
21
21
  * @param {string} fn Function name, for example 'add'
22
22
  * @param {Node[]} args Operator arguments
23
23
  * @param {boolean} [implicit] Is this an implicit multiplication?
24
+ * @param {boolean} [isPercentage] Is this an percentage Operation?
24
25
  */
25
- function OperatorNode(op, fn, args, implicit) {
26
+ function OperatorNode(op, fn, args, implicit, isPercentage) {
26
27
  if (!(this instanceof OperatorNode)) {
27
28
  throw new SyntaxError('Constructor must be called with the new operator');
28
29
  } // validate input
@@ -41,6 +42,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
41
42
  }
42
43
 
43
44
  this.implicit = implicit === true;
45
+ this.isPercentage = isPercentage === true;
44
46
  this.op = op;
45
47
  this.fn = fn;
46
48
  this.args = args || [];
@@ -123,7 +125,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
123
125
  args[i] = this._ifNode(callback(this.args[i], 'args[' + i + ']', this));
124
126
  }
125
127
 
126
- return new OperatorNode(this.op, this.fn, args, this.implicit);
128
+ return new OperatorNode(this.op, this.fn, args, this.implicit, this.isPercentage);
127
129
  };
128
130
  /**
129
131
  * Create a clone of this node, a shallow copy
@@ -132,7 +134,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
132
134
 
133
135
 
134
136
  OperatorNode.prototype.clone = function () {
135
- return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit);
137
+ return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit, this.isPercentage);
136
138
  };
137
139
  /**
138
140
  * Check whether this is an unary OperatorNode:
@@ -466,20 +468,21 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
466
468
  op: this.op,
467
469
  fn: this.fn,
468
470
  args: this.args,
469
- implicit: this.implicit
471
+ implicit: this.implicit,
472
+ isPercentage: this.isPercentage
470
473
  };
471
474
  };
472
475
  /**
473
476
  * Instantiate an OperatorNode from its JSON representation
474
477
  * @param {Object} json An object structured like
475
- * `{"mathjs": "OperatorNode", "op": "+", "fn": "add", "args": [...], "implicit": false}`,
478
+ * `{"mathjs": "OperatorNode", "op": "+", "fn": "add", "args": [...], "implicit": false, "isPercentage":false}`,
476
479
  * where mathjs is optional
477
480
  * @returns {OperatorNode}
478
481
  */
479
482
 
480
483
 
481
484
  OperatorNode.fromJSON = function (json) {
482
- return new OperatorNode(json.op, json.fn, json.args, json.implicit);
485
+ return new OperatorNode(json.op, json.fn, json.args, json.implicit, json.isPercentage);
483
486
  };
484
487
  /**
485
488
  * Get HTML representation.
@@ -1006,7 +1006,14 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
1006
1006
  name = state.token;
1007
1007
  fn = operators[name];
1008
1008
  getTokenSkipNewline(state);
1009
- params = [node, parseMultiplyDivide(state)];
1009
+ var rightNode = parseMultiplyDivide(state);
1010
+
1011
+ if (rightNode.isPercentage) {
1012
+ params = [node, new OperatorNode('*', 'multiply', [node, rightNode])];
1013
+ } else {
1014
+ params = [node, rightNode];
1015
+ }
1016
+
1010
1017
  node = new OperatorNode(name, fn, params);
1011
1018
  }
1012
1019
 
@@ -1027,9 +1034,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
1027
1034
  '*': 'multiply',
1028
1035
  '.*': 'dotMultiply',
1029
1036
  '/': 'divide',
1030
- './': 'dotDivide',
1031
- '%': 'mod',
1032
- mod: 'mod'
1037
+ './': 'dotDivide'
1033
1038
  };
1034
1039
 
1035
1040
  while (true) {
@@ -1087,7 +1092,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
1087
1092
 
1088
1093
 
1089
1094
  function parseRule2(state) {
1090
- var node = parseUnary(state);
1095
+ var node = parsePercentage(state);
1091
1096
  var last = node;
1092
1097
  var tokenStates = [];
1093
1098
 
@@ -1109,7 +1114,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
1109
1114
  _extends(state, tokenStates.pop());
1110
1115
 
1111
1116
  tokenStates.pop();
1112
- last = parseUnary(state);
1117
+ last = parsePercentage(state);
1113
1118
  node = new OperatorNode('/', 'divide', [node, last]);
1114
1119
  } else {
1115
1120
  // Not a match, so rewind
@@ -1132,6 +1137,37 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
1132
1137
 
1133
1138
  return node;
1134
1139
  }
1140
+ /**
1141
+ * percentage or mod
1142
+ * @return {Node} node
1143
+ * @private
1144
+ */
1145
+
1146
+
1147
+ function parsePercentage(state) {
1148
+ var node, name, fn, params;
1149
+ node = parseUnary(state);
1150
+ var operators = {
1151
+ '%': 'mod',
1152
+ mod: 'mod'
1153
+ };
1154
+
1155
+ while (hasOwnProperty(operators, state.token)) {
1156
+ name = state.token;
1157
+ fn = operators[name];
1158
+ getTokenSkipNewline(state);
1159
+
1160
+ if (name === '%' && state.tokenType === TOKENTYPE.DELIMITER && state.token !== '(') {
1161
+ // If the expression contains only %, then treat that as /100
1162
+ node = new OperatorNode('/', 'divide', [node, new ConstantNode(100)], false, true);
1163
+ } else {
1164
+ params = [node, parseUnary(state)];
1165
+ node = new OperatorNode(name, fn, params);
1166
+ }
1167
+ }
1168
+
1169
+ return node;
1170
+ }
1135
1171
  /**
1136
1172
  * Unary plus and minus, and logical and bitwise not
1137
1173
  * @return {Node} node
@@ -14,7 +14,8 @@ export var createSetCartesian = /* #__PURE__ */factory(name, dependencies, _ref
14
14
 
15
15
  /**
16
16
  * Create the cartesian product of two (multi)sets.
17
- * Multi-dimension arrays will be converted to single-dimension arrays before the operation.
17
+ * Multi-dimension arrays will be converted to single-dimension arrays
18
+ * and the values will be sorted in ascending order before the operation.
18
19
  *
19
20
  * Syntax:
20
21
  *
@@ -23,6 +24,7 @@ export var createSetCartesian = /* #__PURE__ */factory(name, dependencies, _ref
23
24
  * Examples:
24
25
  *
25
26
  * math.setCartesian([1, 2], [3, 4]) // returns [[1, 3], [1, 4], [2, 3], [2, 4]]
27
+ * math.setCartesian([4, 3], [2, 1]) // returns [[3, 1], [3, 2], [4, 1], [4, 2]]
26
28
  *
27
29
  * See also:
28
30
  *
@@ -52,8 +52,11 @@ export var createFormat = /* #__PURE__ */factory(name, dependencies, _ref => {
52
52
  * For example format(-1, {notation: 'hex', wordSize: 8}) === '0xffi8'.
53
53
  * Default value is undefined.
54
54
  * - `precision: number`
55
- * A number between 0 and 16 to round the digits of the number. In case
56
- * of notations 'exponential', 'engineering', and 'auto', `precision`
55
+ * Limit the number of digits of the formatted value.
56
+ * For regular numbers, must be a number between 0 and 16.
57
+ * For bignumbers, the maximum depends on the configured precision,
58
+ * see function `config()`.
59
+ * In case of notations 'exponential', 'engineering', and 'auto', `precision`
57
60
  * defines the total number of significant digits returned.
58
61
  * In case of notation 'fixed', `precision` defines the number of
59
62
  * significant digits after the decimal point.
@@ -1,2 +1,2 @@
1
- export var version = '9.4.5'; // Note: This file is automatically generated when building math.js.
1
+ export var version = '10.0.0'; // Note: This file is automatically generated when building math.js.
2
2
  // Changes made in this file will be overwritten.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mathjs",
3
- "version": "9.4.5",
3
+ "version": "10.0.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,7 +25,7 @@
25
25
  "unit"
26
26
  ],
27
27
  "dependencies": {
28
- "@babel/runtime": "^7.15.4",
28
+ "@babel/runtime": "^7.16.0",
29
29
  "complex.js": "^2.0.15",
30
30
  "decimal.js": "^10.3.1",
31
31
  "escape-latex": "^1.2.0",
@@ -36,28 +36,28 @@
36
36
  "typed-function": "^2.0.0"
37
37
  },
38
38
  "devDependencies": {
39
- "@babel/core": "7.15.5",
40
- "@babel/plugin-transform-object-assign": "7.14.5",
41
- "@babel/plugin-transform-runtime": "7.15.0",
42
- "@babel/preset-env": "7.15.6",
43
- "@babel/register": "7.15.3",
44
- "babel-loader": "8.2.2",
39
+ "@babel/core": "7.16.0",
40
+ "@babel/plugin-transform-object-assign": "7.16.0",
41
+ "@babel/plugin-transform-runtime": "7.16.0",
42
+ "@babel/preset-env": "7.16.0",
43
+ "@babel/register": "7.16.0",
44
+ "babel-loader": "8.2.3",
45
45
  "benchmark": "2.1.4",
46
46
  "codecov": "3.8.3",
47
- "core-js": "3.17.3",
47
+ "core-js": "3.19.1",
48
48
  "del": "6.0.0",
49
- "dtslint": "4.1.6",
49
+ "dtslint": "4.2.0",
50
50
  "expr-eval": "2.0.2",
51
51
  "fancy-log": "1.3.3",
52
- "glob": "7.1.7",
52
+ "glob": "7.2.0",
53
53
  "gulp": "4.0.2",
54
54
  "gulp-babel": "8.0.0",
55
55
  "handlebars": "4.7.7",
56
56
  "istanbul": "0.4.5",
57
- "jsep": "1.0.3",
58
- "karma": "6.3.4",
57
+ "jsep": "1.2.0",
58
+ "karma": "6.3.7",
59
59
  "karma-browserstack-launcher": "1.6.0",
60
- "karma-firefox-launcher": "2.1.1",
60
+ "karma-firefox-launcher": "2.1.2",
61
61
  "karma-mocha": "2.0.1",
62
62
  "karma-mocha-reporter": "2.2.5",
63
63
  "karma-webpack": "4.0.2",
@@ -72,9 +72,9 @@
72
72
  "numericjs": "1.2.6",
73
73
  "nyc": "15.1.0",
74
74
  "pad-right": "0.2.2",
75
- "standard": "16.0.3",
75
+ "standard": "16.0.4",
76
76
  "sylvester": "0.0.21",
77
- "typescript": "4.4.3",
77
+ "typescript": "4.4.4",
78
78
  "webpack": "4.46.0",
79
79
  "zeros": "1.0.0"
80
80
  },