mathjs 15.0.0 → 15.1.1

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 (175) hide show
  1. package/HISTORY.md +34 -6
  2. package/NOTICE +1 -1
  3. package/README.md +7 -7
  4. package/bin/cli.js +1 -1
  5. package/lib/browser/math.js +1 -1
  6. package/lib/browser/math.js.LICENSE.txt +3 -3
  7. package/lib/browser/math.js.map +1 -1
  8. package/lib/cjs/core/function/import.js +7 -0
  9. package/lib/cjs/core/function/typed.js +1 -1
  10. package/lib/cjs/entry/dependenciesAny/dependenciesBernoulli.generated.js +25 -0
  11. package/lib/cjs/entry/dependenciesAny/dependenciesConstantNode.generated.js +2 -0
  12. package/lib/cjs/entry/dependenciesAny/dependenciesEqual.generated.js +0 -2
  13. package/lib/cjs/entry/dependenciesAny/dependenciesIsBounded.generated.js +17 -0
  14. package/lib/cjs/entry/dependenciesAny/dependenciesIsFinite.generated.js +21 -0
  15. package/lib/cjs/entry/dependenciesAny/dependenciesIsInteger.generated.js +2 -0
  16. package/lib/cjs/entry/dependenciesAny/dependenciesSimplifyConstant.generated.js +2 -0
  17. package/lib/cjs/entry/dependenciesAny/dependenciesUnitClass.generated.js +0 -2
  18. package/lib/cjs/entry/dependenciesAny/dependenciesZeta.generated.js +2 -0
  19. package/lib/cjs/entry/dependenciesAny.generated.js +21 -0
  20. package/lib/cjs/entry/dependenciesNumber/dependenciesBernoulli.generated.js +21 -0
  21. package/lib/cjs/entry/dependenciesNumber/dependenciesConstantNode.generated.js +2 -0
  22. package/lib/cjs/entry/dependenciesNumber/dependenciesIsBounded.generated.js +17 -0
  23. package/lib/cjs/entry/dependenciesNumber/dependenciesIsFinite.generated.js +21 -0
  24. package/lib/cjs/entry/dependenciesNumber/dependenciesSimplifyConstant.generated.js +2 -0
  25. package/lib/cjs/entry/dependenciesNumber/dependenciesZeta.generated.js +2 -0
  26. package/lib/cjs/entry/dependenciesNumber.generated.js +21 -0
  27. package/lib/cjs/entry/impureFunctionsAny.generated.js +217 -212
  28. package/lib/cjs/entry/impureFunctionsNumber.generated.js +82 -77
  29. package/lib/cjs/entry/pureFunctionsAny.generated.js +668 -652
  30. package/lib/cjs/entry/pureFunctionsNumber.generated.js +155 -140
  31. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +6 -0
  32. package/lib/cjs/expression/embeddedDocs/function/combinatorics/stirlingS2.js +2 -2
  33. package/lib/cjs/expression/embeddedDocs/function/probability/bernoulli.js +14 -0
  34. package/lib/cjs/expression/embeddedDocs/function/utils/isBounded.js +14 -0
  35. package/lib/cjs/expression/embeddedDocs/function/utils/isFinite.js +14 -0
  36. package/lib/cjs/expression/embeddedDocs/function/utils/isNaN.js +1 -1
  37. package/lib/cjs/expression/embeddedDocs/function/utils/isNumeric.js +1 -1
  38. package/lib/cjs/expression/node/AccessorNode.js +36 -7
  39. package/lib/cjs/expression/node/ConstantNode.js +4 -4
  40. package/lib/cjs/expression/node/FunctionNode.js +20 -5
  41. package/lib/cjs/expression/parse.js +62 -14
  42. package/lib/cjs/factoriesAny.js +21 -0
  43. package/lib/cjs/factoriesNumber.js +23 -2
  44. package/lib/cjs/function/algebra/polynomialRoot.js +4 -0
  45. package/lib/cjs/function/algebra/simplifyConstant.js +3 -2
  46. package/lib/cjs/function/arithmetic/add.js +8 -1
  47. package/lib/cjs/function/arithmetic/cbrt.js +7 -6
  48. package/lib/cjs/function/arithmetic/ceil.js +10 -2
  49. package/lib/cjs/function/arithmetic/exp.js +7 -5
  50. package/lib/cjs/function/arithmetic/expm1.js +6 -5
  51. package/lib/cjs/function/arithmetic/fix.js +10 -2
  52. package/lib/cjs/function/arithmetic/floor.js +10 -2
  53. package/lib/cjs/function/arithmetic/log.js +13 -0
  54. package/lib/cjs/function/arithmetic/mod.js +8 -2
  55. package/lib/cjs/function/arithmetic/nthRoot.js +9 -3
  56. package/lib/cjs/function/arithmetic/nthRoots.js +12 -11
  57. package/lib/cjs/function/matrix/map.js +6 -0
  58. package/lib/cjs/function/probability/bernoulli.js +108 -0
  59. package/lib/cjs/function/relational/compare.js +6 -0
  60. package/lib/cjs/function/relational/compareNatural.js +8 -2
  61. package/lib/cjs/function/relational/deepEqual.js +8 -3
  62. package/lib/cjs/function/relational/equal.js +17 -5
  63. package/lib/cjs/function/relational/unequal.js +14 -2
  64. package/lib/cjs/function/set/setDistinct.js +2 -1
  65. package/lib/cjs/function/special/zeta.js +3 -2
  66. package/lib/cjs/function/string/format.js +9 -0
  67. package/lib/cjs/function/utils/isBounded.js +54 -0
  68. package/lib/cjs/function/utils/isFinite.js +57 -0
  69. package/lib/cjs/function/utils/isInteger.js +7 -15
  70. package/lib/cjs/function/utils/isNaN.js +1 -1
  71. package/lib/cjs/function/utils/isNumeric.js +1 -1
  72. package/lib/cjs/function/utils/numeric.js +6 -0
  73. package/lib/cjs/header.js +3 -3
  74. package/lib/cjs/json/replacer.js +1 -1
  75. package/lib/cjs/plain/number/probability.js +2 -2
  76. package/lib/cjs/plain/number/trigonometry.js +1 -1
  77. package/lib/cjs/type/bigint.js +5 -0
  78. package/lib/cjs/type/boolean.js +6 -0
  79. package/lib/cjs/type/complex/function/complex.js +6 -0
  80. package/lib/cjs/type/fraction/function/fraction.js +9 -1
  81. package/lib/cjs/type/matrix/SparseMatrix.js +24 -4
  82. package/lib/cjs/type/matrix/function/index.js +8 -0
  83. package/lib/cjs/type/matrix/function/matrix.js +6 -0
  84. package/lib/cjs/type/matrix/function/sparse.js +4 -0
  85. package/lib/cjs/type/string.js +4 -0
  86. package/lib/cjs/type/unit/Unit.js +12 -8
  87. package/lib/cjs/type/unit/function/unit.js +8 -0
  88. package/lib/cjs/utils/number.js +7 -7
  89. package/lib/cjs/utils/optimizeCallback.js +13 -1
  90. package/lib/cjs/version.js +1 -1
  91. package/lib/esm/core/function/import.js +7 -0
  92. package/lib/esm/core/function/typed.js +1 -1
  93. package/lib/esm/entry/dependenciesAny/dependenciesBernoulli.generated.js +18 -0
  94. package/lib/esm/entry/dependenciesAny/dependenciesConstantNode.generated.js +2 -0
  95. package/lib/esm/entry/dependenciesAny/dependenciesEqual.generated.js +0 -2
  96. package/lib/esm/entry/dependenciesAny/dependenciesIsBounded.generated.js +10 -0
  97. package/lib/esm/entry/dependenciesAny/dependenciesIsFinite.generated.js +14 -0
  98. package/lib/esm/entry/dependenciesAny/dependenciesIsInteger.generated.js +2 -0
  99. package/lib/esm/entry/dependenciesAny/dependenciesSimplifyConstant.generated.js +2 -0
  100. package/lib/esm/entry/dependenciesAny/dependenciesUnitClass.generated.js +0 -2
  101. package/lib/esm/entry/dependenciesAny/dependenciesZeta.generated.js +2 -0
  102. package/lib/esm/entry/dependenciesAny.generated.js +3 -0
  103. package/lib/esm/entry/dependenciesNumber/dependenciesBernoulli.generated.js +14 -0
  104. package/lib/esm/entry/dependenciesNumber/dependenciesConstantNode.generated.js +2 -0
  105. package/lib/esm/entry/dependenciesNumber/dependenciesIsBounded.generated.js +10 -0
  106. package/lib/esm/entry/dependenciesNumber/dependenciesIsFinite.generated.js +14 -0
  107. package/lib/esm/entry/dependenciesNumber/dependenciesSimplifyConstant.generated.js +2 -0
  108. package/lib/esm/entry/dependenciesNumber/dependenciesZeta.generated.js +2 -0
  109. package/lib/esm/entry/dependenciesNumber.generated.js +3 -0
  110. package/lib/esm/entry/impureFunctionsAny.generated.js +219 -214
  111. package/lib/esm/entry/impureFunctionsNumber.generated.js +84 -79
  112. package/lib/esm/entry/pureFunctionsAny.generated.js +665 -649
  113. package/lib/esm/entry/pureFunctionsNumber.generated.js +154 -139
  114. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +6 -0
  115. package/lib/esm/expression/embeddedDocs/function/combinatorics/stirlingS2.js +2 -2
  116. package/lib/esm/expression/embeddedDocs/function/probability/bernoulli.js +8 -0
  117. package/lib/esm/expression/embeddedDocs/function/utils/isBounded.js +8 -0
  118. package/lib/esm/expression/embeddedDocs/function/utils/isFinite.js +8 -0
  119. package/lib/esm/expression/embeddedDocs/function/utils/isNaN.js +1 -1
  120. package/lib/esm/expression/embeddedDocs/function/utils/isNumeric.js +1 -1
  121. package/lib/esm/expression/node/AccessorNode.js +36 -7
  122. package/lib/esm/expression/node/ConstantNode.js +4 -4
  123. package/lib/esm/expression/node/FunctionNode.js +20 -5
  124. package/lib/esm/expression/parse.js +62 -14
  125. package/lib/esm/factoriesAny.js +3 -0
  126. package/lib/esm/factoriesNumber.js +3 -0
  127. package/lib/esm/function/algebra/polynomialRoot.js +4 -0
  128. package/lib/esm/function/algebra/simplifyConstant.js +3 -2
  129. package/lib/esm/function/arithmetic/add.js +8 -1
  130. package/lib/esm/function/arithmetic/cbrt.js +7 -6
  131. package/lib/esm/function/arithmetic/ceil.js +10 -2
  132. package/lib/esm/function/arithmetic/exp.js +7 -5
  133. package/lib/esm/function/arithmetic/expm1.js +6 -5
  134. package/lib/esm/function/arithmetic/fix.js +10 -2
  135. package/lib/esm/function/arithmetic/floor.js +10 -2
  136. package/lib/esm/function/arithmetic/log.js +13 -0
  137. package/lib/esm/function/arithmetic/mod.js +8 -2
  138. package/lib/esm/function/arithmetic/nthRoot.js +9 -3
  139. package/lib/esm/function/arithmetic/nthRoots.js +12 -11
  140. package/lib/esm/function/matrix/map.js +6 -0
  141. package/lib/esm/function/probability/bernoulli.js +102 -0
  142. package/lib/esm/function/relational/compare.js +6 -0
  143. package/lib/esm/function/relational/compareNatural.js +8 -2
  144. package/lib/esm/function/relational/deepEqual.js +8 -3
  145. package/lib/esm/function/relational/equal.js +17 -5
  146. package/lib/esm/function/relational/unequal.js +14 -2
  147. package/lib/esm/function/set/setDistinct.js +2 -1
  148. package/lib/esm/function/special/zeta.js +3 -2
  149. package/lib/esm/function/string/format.js +9 -0
  150. package/lib/esm/function/utils/isBounded.js +48 -0
  151. package/lib/esm/function/utils/isFinite.js +51 -0
  152. package/lib/esm/function/utils/isInteger.js +7 -15
  153. package/lib/esm/function/utils/isNaN.js +1 -1
  154. package/lib/esm/function/utils/isNumeric.js +1 -1
  155. package/lib/esm/function/utils/numeric.js +6 -0
  156. package/lib/esm/header.js +1 -1
  157. package/lib/esm/json/replacer.js +1 -1
  158. package/lib/esm/plain/number/probability.js +2 -2
  159. package/lib/esm/plain/number/trigonometry.js +1 -1
  160. package/lib/esm/type/bigint.js +5 -0
  161. package/lib/esm/type/boolean.js +6 -0
  162. package/lib/esm/type/complex/function/complex.js +6 -0
  163. package/lib/esm/type/fraction/function/fraction.js +9 -1
  164. package/lib/esm/type/matrix/SparseMatrix.js +24 -4
  165. package/lib/esm/type/matrix/function/index.js +8 -0
  166. package/lib/esm/type/matrix/function/matrix.js +6 -0
  167. package/lib/esm/type/matrix/function/sparse.js +4 -0
  168. package/lib/esm/type/string.js +4 -0
  169. package/lib/esm/type/unit/Unit.js +12 -8
  170. package/lib/esm/type/unit/function/unit.js +8 -0
  171. package/lib/esm/utils/number.js +7 -7
  172. package/lib/esm/utils/optimizeCallback.js +13 -1
  173. package/lib/esm/version.js +1 -1
  174. package/package.json +15 -15
  175. package/types/index.d.ts +580 -237
@@ -38,8 +38,13 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
38
38
  * @param {Node} object The object from which to retrieve
39
39
  * a property or subset.
40
40
  * @param {IndexNode} index IndexNode containing ranges
41
+ * @param {boolean} [optionalChaining=false]
42
+ * Optional property, if the accessor was written as optional-chaining
43
+ * using `a?.b`, or `a?.["b"] with bracket notation.
44
+ * Forces evaluate to undefined if the given object is undefined or null.
41
45
  */
42
46
  constructor(object, index) {
47
+ let optionalChaining = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
43
48
  super();
44
49
  if (!(0, _is.isNode)(object)) {
45
50
  throw new TypeError('Node expected for parameter "object"');
@@ -49,6 +54,7 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
49
54
  }
50
55
  this.object = object;
51
56
  this.index = index;
57
+ this.optionalChaining = optionalChaining;
52
58
  }
53
59
 
54
60
  // readonly property name
@@ -82,15 +88,36 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
82
88
  _compile(math, argNames) {
83
89
  const evalObject = this.object._compile(math, argNames);
84
90
  const evalIndex = this.index._compile(math, argNames);
91
+ const optionalChaining = this.optionalChaining;
92
+ const prevOptionalChaining = (0, _is.isAccessorNode)(this.object) && this.object.optionalChaining;
85
93
  if (this.index.isObjectProperty()) {
86
94
  const prop = this.index.getObjectProperty();
87
95
  return function evalAccessorNode(scope, args, context) {
96
+ const ctx = context || {};
97
+ const object = evalObject(scope, args, ctx);
98
+ if (optionalChaining && object == null) {
99
+ ctx.optionalShortCircuit = true;
100
+ return undefined;
101
+ }
102
+ if (prevOptionalChaining && ctx !== null && ctx !== void 0 && ctx.optionalShortCircuit) {
103
+ return undefined;
104
+ }
105
+
88
106
  // get a property from an object evaluated using the scope.
89
- return (0, _customs.getSafeProperty)(evalObject(scope, args, context), prop);
107
+ return (0, _customs.getSafeProperty)(object, prop);
90
108
  };
91
109
  } else {
92
110
  return function evalAccessorNode(scope, args, context) {
93
- const object = evalObject(scope, args, context);
111
+ const ctx = context || {};
112
+ const object = evalObject(scope, args, ctx);
113
+ if (optionalChaining && object == null) {
114
+ ctx.optionalShortCircuit = true;
115
+ return undefined;
116
+ }
117
+ if (prevOptionalChaining && ctx !== null && ctx !== void 0 && ctx.optionalShortCircuit) {
118
+ return undefined;
119
+ }
120
+
94
121
  // we pass just object here instead of context:
95
122
  const index = evalIndex(scope, args, object);
96
123
  return access(object, index);
@@ -114,7 +141,7 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
114
141
  * @returns {AccessorNode} Returns a transformed copy of the node
115
142
  */
116
143
  map(callback) {
117
- return new AccessorNode(this._ifNode(callback(this.object, 'object', this)), this._ifNode(callback(this.index, 'index', this)));
144
+ return new AccessorNode(this._ifNode(callback(this.object, 'object', this)), this._ifNode(callback(this.index, 'index', this)), this.optionalChaining);
118
145
  }
119
146
 
120
147
  /**
@@ -122,7 +149,7 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
122
149
  * @return {AccessorNode}
123
150
  */
124
151
  clone() {
125
- return new AccessorNode(this.object, this.index);
152
+ return new AccessorNode(this.object, this.index, this.optionalChaining);
126
153
  }
127
154
 
128
155
  /**
@@ -135,7 +162,8 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
135
162
  if (needParenthesis(this.object)) {
136
163
  object = '(' + object + ')';
137
164
  }
138
- return object + this.index.toString(options);
165
+ const optionalChaining = this.optionalChaining ? this.index.dotNotation ? '?' : '?.' : '';
166
+ return object + optionalChaining + this.index.toString(options);
139
167
  }
140
168
 
141
169
  /**
@@ -172,7 +200,8 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
172
200
  return {
173
201
  mathjs: name,
174
202
  object: this.object,
175
- index: this.index
203
+ index: this.index,
204
+ optionalChaining: this.optionalChaining
176
205
  };
177
206
  }
178
207
 
@@ -185,7 +214,7 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
185
214
  * @returns {AccessorNode}
186
215
  */
187
216
  static fromJSON(json) {
188
- return new AccessorNode(json.object, json.index);
217
+ return new AccessorNode(json.object, json.index, json.optionalChaining);
189
218
  }
190
219
  }
191
220
  (0, _defineProperty2.default)(AccessorNode, "name", name);
@@ -11,10 +11,11 @@ var _is = require("../../utils/is.js");
11
11
  var _latex = require("../../utils/latex.js");
12
12
  var _factory = require("../../utils/factory.js");
13
13
  const name = 'ConstantNode';
14
- const dependencies = ['Node'];
14
+ const dependencies = ['Node', 'isBounded'];
15
15
  const createConstantNode = exports.createConstantNode = /* #__PURE__ */(0, _factory.factory)(name, dependencies, _ref => {
16
16
  let {
17
- Node
17
+ Node,
18
+ isBounded
18
19
  } = _ref;
19
20
  class ConstantNode extends Node {
20
21
  /**
@@ -157,8 +158,7 @@ const createConstantNode = exports.createConstantNode = /* #__PURE__ */(0, _fact
157
158
  case 'number':
158
159
  case 'BigNumber':
159
160
  {
160
- const finite = type === 'BigNumber' ? this.value.isFinite() : isFinite(this.value);
161
- if (!finite) {
161
+ if (!isBounded(this.value)) {
162
162
  return this.value.valueOf() < 0 ? '-\\infty' : '\\infty';
163
163
  }
164
164
  const index = value.toLowerCase().indexOf('e');
@@ -107,7 +107,7 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
107
107
  * the arguments, typically a SymbolNode or AccessorNode
108
108
  * @param {./Node[]} args
109
109
  */
110
- constructor(fn, args) {
110
+ constructor(fn, args, optional) {
111
111
  super();
112
112
  if (typeof fn === 'string') {
113
113
  fn = new SymbolNode(fn);
@@ -118,8 +118,13 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
118
118
  if (!Array.isArray(args) || !args.every(_is.isNode)) {
119
119
  throw new TypeError('Array containing Nodes expected for parameter "args"');
120
120
  }
121
+ const optionalType = typeof optional;
122
+ if (!(optionalType === 'undefined' || optionalType === 'boolean')) {
123
+ throw new TypeError('optional flag, if specified, must be boolean');
124
+ }
121
125
  this.fn = fn;
122
126
  this.args = args || [];
127
+ this.optional = !!optional;
123
128
  }
124
129
 
125
130
  // readonly property name
@@ -149,6 +154,7 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
149
154
  _compile(math, argNames) {
150
155
  // compile arguments
151
156
  const evalArgs = this.args.map(arg => arg._compile(math, argNames));
157
+ const fromOptionalChaining = this.optional || (0, _is.isAccessorNode)(this.fn) && this.fn.optionalChaining;
152
158
  if ((0, _is.isSymbolNode)(this.fn)) {
153
159
  const name = this.fn.name;
154
160
  if (!argNames[name]) {
@@ -162,10 +168,8 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
162
168
  value = scope.get(name);
163
169
  } else if (name in math) {
164
170
  value = (0, _customs.getSafeProperty)(math, name);
165
- } else {
166
- return FunctionNode.onUndefinedFunction(name);
167
- }
168
- if (typeof value === 'function') {
171
+ } else if (fromOptionalChaining) value = undefined;else return FunctionNode.onUndefinedFunction(name);
172
+ if (typeof value === 'function' || fromOptionalChaining && value === undefined) {
169
173
  return value;
170
174
  }
171
175
  throw new TypeError(`'${name}' is not a function; its value is:\n ${strin(value)}`);
@@ -192,17 +196,20 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
192
196
  case 0:
193
197
  return function evalFunctionNode(scope, args, context) {
194
198
  const fn = resolveFn(scope);
199
+ if (fromOptionalChaining && fn === undefined) return undefined;
195
200
  return fn();
196
201
  };
197
202
  case 1:
198
203
  return function evalFunctionNode(scope, args, context) {
199
204
  const fn = resolveFn(scope);
205
+ if (fromOptionalChaining && fn === undefined) return undefined;
200
206
  const evalArg0 = evalArgs[0];
201
207
  return fn(evalArg0(scope, args, context));
202
208
  };
203
209
  case 2:
204
210
  return function evalFunctionNode(scope, args, context) {
205
211
  const fn = resolveFn(scope);
212
+ if (fromOptionalChaining && fn === undefined) return undefined;
206
213
  const evalArg0 = evalArgs[0];
207
214
  const evalArg1 = evalArgs[1];
208
215
  return fn(evalArg0(scope, args, context), evalArg1(scope, args, context));
@@ -210,6 +217,7 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
210
217
  default:
211
218
  return function evalFunctionNode(scope, args, context) {
212
219
  const fn = resolveFn(scope);
220
+ if (fromOptionalChaining && fn === undefined) return undefined;
213
221
  const values = evalArgs.map(evalArg => evalArg(scope, args, context));
214
222
  return fn(...values);
215
223
  };
@@ -220,6 +228,7 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
220
228
  const rawArgs = this.args;
221
229
  return function evalFunctionNode(scope, args, context) {
222
230
  const fn = (0, _customs.getSafeProperty)(args, name);
231
+ if (fromOptionalChaining && fn === undefined) return undefined;
223
232
  if (typeof fn !== 'function') {
224
233
  throw new TypeError(`Argument '${name}' was not a function; received: ${strin(fn)}`);
225
234
  }
@@ -241,6 +250,11 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
241
250
  const rawArgs = this.args;
242
251
  return function evalFunctionNode(scope, args, context) {
243
252
  const object = evalObject(scope, args, context);
253
+
254
+ // Optional chaining: if the base object is nullish, short-circuit to undefined
255
+ if (fromOptionalChaining && (object == null || object[prop] === undefined)) {
256
+ return undefined;
257
+ }
244
258
  const fn = (0, _customs.getSafeMethod)(object, prop);
245
259
  if (fn !== null && fn !== void 0 && fn.rawArgs) {
246
260
  // "Raw" evaluation
@@ -260,6 +274,7 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
260
274
  const rawArgs = this.args;
261
275
  return function evalFunctionNode(scope, args, context) {
262
276
  const fn = evalFn(scope, args, context);
277
+ if (fromOptionalChaining && fn === undefined) return undefined;
263
278
  if (typeof fn !== 'function') {
264
279
  throw new TypeError(`Expression '${fnExpr}' did not evaluate to a function; value is:` + `\n ${strin(fn)}`);
265
280
  }
@@ -68,6 +68,23 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
68
68
  *
69
69
  * evaluate, compile
70
70
  *
71
+ * History:
72
+ *
73
+ * v0.9 Created
74
+ * v0.13 Switched to one-based indices
75
+ * v0.14 Added `[1,2;3,4]` notation for matrices
76
+ * v0.18 Dropped the `function` keyword
77
+ * v0.20 Added ternary conditional
78
+ * v0.27 Allow multi-line expressions; allow functions that receive
79
+ * unevaluated parameters (`rawArgs`)
80
+ * v3 Add object notation; allow assignments internal to other
81
+ * expressions
82
+ * v7.3 Supported binary, octal, and hexadecimal notation
83
+ * v9.5 Support for calculations with percentages
84
+ * v12.4 Allow trailing commas in matrices
85
+ * v14.8 Add nullish coalescing operator
86
+ * v15.1 Add optional chaining operator
87
+ *
71
88
  * @param {string | string[] | Matrix} expr Expression to be parsed
72
89
  * @param {{nodes: Object<string, Node>}} [options] Available options:
73
90
  * - `nodes` a set of custom nodes
@@ -136,6 +153,7 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
136
153
  '=': true,
137
154
  ':': true,
138
155
  '?': true,
156
+ '?.': true,
139
157
  '??': true,
140
158
  '==': true,
141
159
  '!=': true,
@@ -302,7 +320,9 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
302
320
  }
303
321
 
304
322
  // check for delimiters consisting of 2 characters
305
- if (c2.length === 2 && DELIMITERS[c2]) {
323
+ // Special case: the check for '?.' is to prevent a case like 'a?.3:.7' from being interpreted as optional chaining
324
+ // TODO: refactor the tokenization into some better way to deal with cases like 'a?.3:.7', see https://github.com/josdejong/mathjs/pull/3584
325
+ if (c2.length === 2 && DELIMITERS[c2] && (c2 !== '?.' || !parse.isDigit(state.expression.charAt(state.index + 2)))) {
306
326
  state.tokenType = TOKENTYPE.DELIMITER;
307
327
  state.token = c2;
308
328
  next(state);
@@ -647,6 +667,9 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
647
667
  return new AssignmentNode(new SymbolNode(name), value);
648
668
  } else if ((0, _is.isAccessorNode)(node)) {
649
669
  // parse a matrix subset assignment like 'A[1,2] = 4'
670
+ if (node.optionalChaining) {
671
+ throw createSyntaxError(state, 'Cannot assign to optional chain');
672
+ }
650
673
  getTokenSkipNewline(state);
651
674
  value = parseAssignment(state);
652
675
  return new AssignmentNode(node.object, node.index, value);
@@ -891,8 +914,15 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
891
914
  let node;
892
915
  const params = [];
893
916
  if (state.token === ':') {
894
- // implicit start=1 (one-based)
895
- node = new ConstantNode(1);
917
+ if (state.conditionalLevel === state.nestingLevel) {
918
+ // we are in the midst of parsing a conditional operator, so not
919
+ // a range, but rather an empty true-expr, which is considered a
920
+ // syntax error
921
+ throw createSyntaxError(state, 'The true-expression of a conditional operator may not be empty');
922
+ } else {
923
+ // implicit start of range = 1 (one-based)
924
+ node = new ConstantNode(1);
925
+ }
896
926
  } else {
897
927
  // explicit start
898
928
  node = parseAddSubtract(state);
@@ -1261,9 +1291,9 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
1261
1291
 
1262
1292
  /**
1263
1293
  * parse accessors:
1264
- * - function invocation in round brackets (...), for example sqrt(2)
1265
- * - index enclosed in square brackets [...], for example A[2,3]
1266
- * - dot notation for properties, like foo.bar
1294
+ * - function invocation in round brackets (...), for example sqrt(2) or sqrt?.(2) with optional chaining
1295
+ * - index enclosed in square brackets [...], for example A[2,3] or A?.[2,3] with optional chaining
1296
+ * - dot notation for properties, like foo.bar or foo?.bar with optional chaining
1267
1297
  * @param {Object} state
1268
1298
  * @param {Node} node Node on which to apply the parameters. If there
1269
1299
  * are no parameters in the expression, the node
@@ -1275,12 +1305,27 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
1275
1305
  */
1276
1306
  function parseAccessors(state, node, types) {
1277
1307
  let params;
1278
- while ((state.token === '(' || state.token === '[' || state.token === '.') && (!types || types.includes(state.token))) {
1308
+
1309
+ // Iterate and handle chained accessors, including repeated optional chaining
1310
+ while (true) {
1279
1311
  // eslint-disable-line no-unmodified-loop-condition
1312
+ // Track whether an optional chaining operator precedes the next accessor
1313
+ let optional = false;
1314
+
1315
+ // Consume an optional chaining operator if present
1316
+ if (state.token === '?.') {
1317
+ optional = true;
1318
+ // consume the '?.' token
1319
+ getToken(state);
1320
+ }
1321
+ const hasNextAccessor = (state.token === '(' || state.token === '[' || state.token === '.') && (!types || types.includes(state.token));
1322
+ if (!(optional || hasNextAccessor)) {
1323
+ break;
1324
+ }
1280
1325
  params = [];
1281
1326
  if (state.token === '(') {
1282
- if ((0, _is.isSymbolNode)(node) || (0, _is.isAccessorNode)(node)) {
1283
- // function invocation like fn(2, 3) or obj.fn(2, 3)
1327
+ if (optional || (0, _is.isSymbolNode)(node) || (0, _is.isAccessorNode)(node)) {
1328
+ // function invocation: fn(2, 3) or obj.fn(2, 3) or (anything)?.(2, 3)
1284
1329
  openParams(state);
1285
1330
  getToken(state);
1286
1331
  if (state.token !== ')') {
@@ -1298,7 +1343,7 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
1298
1343
  }
1299
1344
  closeParams(state);
1300
1345
  getToken(state);
1301
- node = new FunctionNode(node, params);
1346
+ node = new FunctionNode(node, params, optional);
1302
1347
  } else {
1303
1348
  // implicit multiplication like (2+3)(4+5) or sqrt(2)(1+2)
1304
1349
  // don't parse it here but let it be handled by parseImplicitMultiplication
@@ -1324,18 +1369,21 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
1324
1369
  }
1325
1370
  closeParams(state);
1326
1371
  getToken(state);
1327
- node = new AccessorNode(node, new IndexNode(params));
1372
+ node = new AccessorNode(node, new IndexNode(params), optional);
1328
1373
  } else {
1329
1374
  // dot notation like variable.prop
1330
- getToken(state);
1375
+ // consume the `.` (if it was ?., already consumed):
1376
+ if (!optional) getToken(state);
1331
1377
  const isPropertyName = state.tokenType === TOKENTYPE.SYMBOL || state.tokenType === TOKENTYPE.DELIMITER && state.token in NAMED_DELIMITERS;
1332
1378
  if (!isPropertyName) {
1333
- throw createSyntaxError(state, 'Property name expected after dot');
1379
+ let message = 'Property name expected after ';
1380
+ message += optional ? 'optional chain' : 'dot';
1381
+ throw createSyntaxError(state, message);
1334
1382
  }
1335
1383
  params.push(new ConstantNode(state.token));
1336
1384
  getToken(state);
1337
1385
  const dotNotation = true;
1338
- node = new AccessorNode(node, new IndexNode(params, dotNotation));
1386
+ node = new AccessorNode(node, new IndexNode(params, dotNotation), optional);
1339
1387
  }
1340
1388
  }
1341
1389
  return node;
@@ -153,6 +153,12 @@ Object.defineProperty(exports, "createBellNumbers", {
153
153
  return _bellNumbers.createBellNumbers;
154
154
  }
155
155
  });
156
+ Object.defineProperty(exports, "createBernoulli", {
157
+ enumerable: true,
158
+ get: function () {
159
+ return _bernoulli.createBernoulli;
160
+ }
161
+ });
156
162
  Object.defineProperty(exports, "createBigNumberClass", {
157
163
  enumerable: true,
158
164
  get: function () {
@@ -939,6 +945,18 @@ Object.defineProperty(exports, "createInvmod", {
939
945
  return _invmod.createInvmod;
940
946
  }
941
947
  });
948
+ Object.defineProperty(exports, "createIsBounded", {
949
+ enumerable: true,
950
+ get: function () {
951
+ return _isBounded.createIsBounded;
952
+ }
953
+ });
954
+ Object.defineProperty(exports, "createIsFinite", {
955
+ enumerable: true,
956
+ get: function () {
957
+ return _isFinite.createIsFinite;
958
+ }
959
+ });
942
960
  Object.defineProperty(exports, "createIsInteger", {
943
961
  enumerable: true,
944
962
  get: function () {
@@ -2215,6 +2233,8 @@ var _hasNumericValue = require("./function/utils/hasNumericValue.js");
2215
2233
  var _isPositive = require("./function/utils/isPositive.js");
2216
2234
  var _isZero = require("./function/utils/isZero.js");
2217
2235
  var _isNaN = require("./function/utils/isNaN.js");
2236
+ var _isBounded = require("./function/utils/isBounded.js");
2237
+ var _isFinite = require("./function/utils/isFinite.js");
2218
2238
  var _typeOf = require("./function/utils/typeOf.js");
2219
2239
  var _equalScalar = require("./function/relational/equalScalar.js");
2220
2240
  var _SparseMatrix = require("./type/matrix/SparseMatrix.js");
@@ -2443,6 +2463,7 @@ var _variance = require("./function/statistics/variance.js");
2443
2463
  var _quantileSeq = require("./function/statistics/quantileSeq.js");
2444
2464
  var _std = require("./function/statistics/std.js");
2445
2465
  var _corr = require("./function/statistics/corr.js");
2466
+ var _bernoulli = require("./function/probability/bernoulli.js");
2446
2467
  var _combinations = require("./function/probability/combinations.js");
2447
2468
  var _combinationsWithRep = require("./function/probability/combinationsWithRep.js");
2448
2469
  var _gamma = require("./function/probability/gamma.js");
@@ -31,6 +31,12 @@ Object.defineProperty(exports, "createBellNumbers", {
31
31
  return _bellNumbers.createBellNumbers;
32
32
  }
33
33
  });
34
+ Object.defineProperty(exports, "createBernoulli", {
35
+ enumerable: true,
36
+ get: function () {
37
+ return _bernoulli.createBernoulli;
38
+ }
39
+ });
34
40
  Object.defineProperty(exports, "createBigint", {
35
41
  enumerable: true,
36
42
  get: function () {
@@ -303,6 +309,18 @@ Object.defineProperty(exports, "createInfinity", {
303
309
  return _constants.createInfinity;
304
310
  }
305
311
  });
312
+ Object.defineProperty(exports, "createIsBounded", {
313
+ enumerable: true,
314
+ get: function () {
315
+ return _isBounded.createIsBounded;
316
+ }
317
+ });
318
+ Object.defineProperty(exports, "createIsFinite", {
319
+ enumerable: true,
320
+ get: function () {
321
+ return _isFinite.createIsFinite;
322
+ }
323
+ });
306
324
  exports.createIsNegative = exports.createIsNaN = exports.createIsInteger = void 0;
307
325
  Object.defineProperty(exports, "createIsNumeric", {
308
326
  enumerable: true,
@@ -354,8 +372,7 @@ Object.defineProperty(exports, "createLargerEq", {
354
372
  return _largerEq.createLargerEqNumber;
355
373
  }
356
374
  });
357
- exports.createLeftShift = exports.createLcm = void 0;
358
- exports.createLog2 = exports.createLog1p = exports.createLog10 = exports.createLog = exports.createLgamma = void 0;
375
+ exports.createLog2 = exports.createLog1p = exports.createLog10 = exports.createLog = exports.createLgamma = exports.createLeftShift = exports.createLcm = void 0;
359
376
  Object.defineProperty(exports, "createMad", {
360
377
  enumerable: true,
361
378
  get: function () {
@@ -853,6 +870,7 @@ var _map = require("./function/matrix/map.js");
853
870
  var _range = require("./function/matrix/range.js");
854
871
  var _size = require("./function/matrix/size.js");
855
872
  var _partitionSelect = require("./function/matrix/partitionSelect.js");
873
+ var _bernoulli = require("./function/probability/bernoulli.js");
856
874
  var _combinationsWithRep = require("./function/probability/combinationsWithRep.js");
857
875
  var _factorial = require("./function/probability/factorial.js");
858
876
  var _multinomial = require("./function/probability/multinomial.js");
@@ -904,6 +922,8 @@ var _varianceTransform = require("./expression/transform/variance.transform.js")
904
922
  var _clone = require("./function/utils/clone.js");
905
923
  var _isNumeric = require("./function/utils/isNumeric.js");
906
924
  var _hasNumericValue = require("./function/utils/hasNumericValue.js");
925
+ var _isBounded = require("./function/utils/isBounded.js");
926
+ var _isFinite = require("./function/utils/isFinite.js");
907
927
  var _typeOf = require("./function/utils/typeOf.js");
908
928
  var _isPrime = require("./function/utils/isPrime.js");
909
929
  var _numeric = require("./function/utils/numeric.js");
@@ -986,6 +1006,7 @@ const createSubset = exports.createSubset = /* #__PURE__ */(0, _factory.factory)
986
1006
  // TODO: create range implementation for range?
987
1007
 
988
1008
  // probability
1009
+
989
1010
  const createCombinations = exports.createCombinations = createNumberFactory('combinations', _index.combinationsNumber);
990
1011
  const createGamma = exports.createGamma = createNumberFactory('gamma', _index.gammaNumber);
991
1012
  const createLgamma = exports.createLgamma = createNumberFactory('lgamma', _index.lgammaNumber);
@@ -52,6 +52,10 @@ const createPolynomialRoot = exports.createPolynomialRoot = /* #__PURE__ */(0, _
52
52
  * See also:
53
53
  * cbrt, sqrt
54
54
  *
55
+ * History:
56
+ *
57
+ * v11.4 Created
58
+ *
55
59
  * @param {... number | Complex} coeffs
56
60
  * The coefficients of the polynomial, starting with with the constant coefficent, followed
57
61
  * by the linear coefficient and subsequent coefficients of increasing powers.
@@ -10,13 +10,14 @@ var _number = require("../../utils/number.js");
10
10
  var _util = require("./simplify/util.js");
11
11
  var _noop = require("../../utils/noop.js");
12
12
  const name = 'simplifyConstant';
13
- const dependencies = ['typed', 'config', 'mathWithTransform', 'matrix', '?fraction', '?bignumber', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'SymbolNode'];
13
+ const dependencies = ['typed', 'config', 'mathWithTransform', 'matrix', 'isBounded', '?fraction', '?bignumber', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'SymbolNode'];
14
14
  const createSimplifyConstant = exports.createSimplifyConstant = /* #__PURE__ */(0, _factory.factory)(name, dependencies, _ref => {
15
15
  let {
16
16
  typed,
17
17
  config,
18
18
  mathWithTransform,
19
19
  matrix,
20
+ isBounded,
20
21
  fraction,
21
22
  bignumber,
22
23
  AccessorNode,
@@ -134,7 +135,7 @@ const createSimplifyConstant = exports.createSimplifyConstant = /* #__PURE__ */(
134
135
  // and when both numerator and denominator are small enough
135
136
  function _exactFraction(n, options) {
136
137
  const exactFractions = options && options.exactFractions !== false;
137
- if (exactFractions && isFinite(n) && fraction) {
138
+ if (exactFractions && isBounded(n) && fraction) {
138
139
  const f = fraction(n);
139
140
  const fractionsLimit = options && typeof options.fractionsLimit === 'number' ? options.fractionsLimit : Infinity; // no limit by default
140
141
 
@@ -59,7 +59,7 @@ const createAdd = exports.createAdd = /* #__PURE__ */(0, _factory.factory)(name,
59
59
  *
60
60
  * const c = math.unit('5 cm')
61
61
  * const d = math.unit('2.1 mm')
62
- * math.add(c, d) // returns Unit 52.1 mm
62
+ * math.add(c, d) // returns Unit 5.21 cm
63
63
  *
64
64
  * math.add("2.3", "4") // returns number 6.3
65
65
  *
@@ -67,6 +67,13 @@ const createAdd = exports.createAdd = /* #__PURE__ */(0, _factory.factory)(name,
67
67
  *
68
68
  * subtract, sum
69
69
  *
70
+ * History:
71
+ *
72
+ * v13 Handle bigint arguments
73
+ * v11.6 Support matrix broadcasting
74
+ * v3.8 Allow more than two arguments
75
+ * v0.0.2 Created
76
+ *
70
77
  * @param {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} x First value to add
71
78
  * @param {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} y Second value to add
72
79
  * @return {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} Sum of `x` and `y`
@@ -41,17 +41,18 @@ const createCbrt = exports.createCbrt = /* #__PURE__ */(0, _factory.factory)(nam
41
41
  * math.map([27, 64, 125], x => math.cbrt(x)) // returns [3, 4, 5]
42
42
  *
43
43
  * const x = math.complex('8i')
44
- * math.cbrt(x) // returns Complex 1.7320508075689 + i
45
- * math.cbrt(x, true) // returns Matrix [
46
- * // 1.7320508075689 + i
47
- * // -1.7320508075689 + i
48
- * // -2i
49
- * // ]
44
+ * math.cbrt(x) // returns 1.7320508075689 + i ...
45
+ * math.cbrt(x, true)
46
+ * // Complex Matrix ["1.7320508075689+i", "-1.7320508075689+i", "-2i"]
50
47
  *
51
48
  * See also:
52
49
  *
53
50
  * square, sqrt, cube
54
51
  *
52
+ * History:
53
+ *
54
+ * v2.3 Created
55
+ *
55
56
  * @param {number | BigNumber | Complex | Unit} x
56
57
  * Value for which to calculate the cubic root.
57
58
  * @param {boolean} [allRoots] Optional, false by default. Only applicable
@@ -106,13 +106,13 @@ const createCeil = exports.createCeil = /* #__PURE__ */(0, _factory.factory)(nam
106
106
  * math.ceil(-4.782, 2) // returns number -4.78
107
107
  *
108
108
  * const c = math.complex(3.24, -2.71)
109
- * math.ceil(c) // returns Complex 4 - 2i
109
+ * math.ceil(c) // returns Complex 4 - 2i ...
110
110
  * math.ceil(c, 1) // returns Complex 3.3 - 2.7i
111
111
  *
112
112
  * const unit = math.unit('3.241 cm')
113
113
  * const cm = math.unit('cm')
114
114
  * const mm = math.unit('mm')
115
- * math.ceil(unit, 1, cm) // returns Unit 3.3 cm
115
+ * math.ceil(unit, 1, cm) // returns Unit 3.3 cm ...
116
116
  * math.ceil(unit, 1, mm) // returns Unit 32.5 mm
117
117
  *
118
118
  * math.ceil([3.2, 3.8, -4.7]) // returns Array [4, 4, -4]
@@ -122,6 +122,14 @@ const createCeil = exports.createCeil = /* #__PURE__ */(0, _factory.factory)(nam
122
122
  *
123
123
  * floor, fix, round
124
124
  *
125
+ * History:
126
+ *
127
+ * v14 Handle Units
128
+ * v7.4 Allow second "precision" argument
129
+ * v5.7 Support tolerance for round-off errors
130
+ * v2 Handle Fractions
131
+ * v0.1 Created
132
+ *
125
133
  * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Value to be rounded
126
134
  * @param {number | BigNumber | Array} [n=0] Number of decimals
127
135
  * @param {Unit} [valuelessUnit] A valueless unit
@@ -29,16 +29,18 @@ const createExp = exports.createExp = /* #__PURE__ */(0, _factory.factory)(name,
29
29
  * math.log(math.exp(2)) // returns number 2
30
30
  *
31
31
  * math.map([1, 2, 3], math.exp)
32
- * // returns Array [
33
- * // 2.718281828459045,
34
- * // 7.3890560989306495,
35
- * // 20.085536923187668
36
- * // ]
32
+ * // returns [2.718281828459045, 7.3890560989306495, 20.085536923187668]
37
33
  *
38
34
  * See also:
39
35
  *
40
36
  * expm1, expm, log, pow
41
37
  *
38
+ * History:
39
+ *
40
+ * v11 Don't apply elementwise, avoid confusion with matrix exponential
41
+ * v0.20 Handle BigNumbers
42
+ * v0.0.2 Created
43
+ *
42
44
  * @param {number | BigNumber | Complex} x A number to exponentiate
43
45
  * @return {number | BigNumber | Complex} Exponential of `x`
44
46
  */
@@ -33,16 +33,17 @@ const createExpm1 = exports.createExpm1 = /* #__PURE__ */(0, _factory.factory)(n
33
33
  * math.log(math.expm1(2) + 1) // returns number 2
34
34
  *
35
35
  * math.map([1, 2, 3], math.expm1)
36
- * // returns Array [
37
- * // 1.718281828459045,
38
- * // 6.3890560989306495,
39
- * // 19.085536923187668
40
- * // ]
36
+ * // returns [1.718281828459045, 6.3890560989306495, 19.085536923187668]
41
37
  *
42
38
  * See also:
43
39
  *
44
40
  * exp, expm, log, pow
45
41
  *
42
+ * History:
43
+ *
44
+ * v11 Don't apply elementwise, avoids confusion with matrix exponential
45
+ * v4.2 Created
46
+ *
46
47
  * @param {number | BigNumber | Complex} x The number to exponentiate
47
48
  * @return {number | BigNumber | Complex} Exponential of `x`, minus one
48
49
  */