mathjs 14.6.0 → 14.8.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 (46) hide show
  1. package/HISTORY.md +17 -0
  2. package/lib/browser/math.js +1 -1
  3. package/lib/browser/math.js.LICENSE.txt +2 -2
  4. package/lib/browser/math.js.map +1 -1
  5. package/lib/cjs/core/function/config.js +0 -1
  6. package/lib/cjs/entry/dependenciesAny/dependenciesNullish.generated.js +25 -0
  7. package/lib/cjs/entry/dependenciesAny/dependenciesNullishTransform.generated.js +25 -0
  8. package/lib/cjs/entry/dependenciesAny.generated.js +14 -0
  9. package/lib/cjs/entry/impureFunctionsAny.generated.js +8 -0
  10. package/lib/cjs/entry/pureFunctionsAny.generated.js +10 -3
  11. package/lib/cjs/expression/Parser.js +35 -1
  12. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +2 -0
  13. package/lib/cjs/expression/embeddedDocs/function/logical/nullish.js +14 -0
  14. package/lib/cjs/expression/node/FunctionAssignmentNode.js +3 -1
  15. package/lib/cjs/expression/operators.js +7 -0
  16. package/lib/cjs/expression/parse.js +18 -2
  17. package/lib/cjs/expression/transform/nullish.transform.js +43 -0
  18. package/lib/cjs/factoriesAny.js +14 -0
  19. package/lib/cjs/function/logical/nullish.js +87 -0
  20. package/lib/cjs/function/matrix/range.js +7 -5
  21. package/lib/cjs/header.js +2 -2
  22. package/lib/cjs/type/matrix/DenseMatrix.js +21 -17
  23. package/lib/cjs/type/string.js +4 -4
  24. package/lib/cjs/version.js +1 -1
  25. package/lib/esm/core/function/config.js +0 -1
  26. package/lib/esm/entry/dependenciesAny/dependenciesNullish.generated.js +18 -0
  27. package/lib/esm/entry/dependenciesAny/dependenciesNullishTransform.generated.js +18 -0
  28. package/lib/esm/entry/dependenciesAny.generated.js +2 -0
  29. package/lib/esm/entry/impureFunctionsAny.generated.js +10 -2
  30. package/lib/esm/entry/pureFunctionsAny.generated.js +8 -1
  31. package/lib/esm/expression/Parser.js +35 -1
  32. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +2 -0
  33. package/lib/esm/expression/embeddedDocs/function/logical/nullish.js +8 -0
  34. package/lib/esm/expression/node/FunctionAssignmentNode.js +3 -1
  35. package/lib/esm/expression/operators.js +7 -0
  36. package/lib/esm/expression/parse.js +18 -2
  37. package/lib/esm/expression/transform/nullish.transform.js +37 -0
  38. package/lib/esm/factoriesAny.js +2 -0
  39. package/lib/esm/function/logical/nullish.js +81 -0
  40. package/lib/esm/function/matrix/range.js +7 -5
  41. package/lib/esm/type/matrix/DenseMatrix.js +21 -17
  42. package/lib/esm/type/string.js +4 -4
  43. package/lib/esm/version.js +1 -1
  44. package/package.json +15 -16
  45. package/types/index.d.ts +19 -1
  46. package/types/tslint.json +0 -6
@@ -23,7 +23,6 @@ function configFactory(config, emit) {
23
23
  *
24
24
  * Examples:
25
25
  *
26
- *
27
26
  * import { create, all } from 'mathjs'
28
27
  *
29
28
  * // create a mathjs instance
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.nullishDependencies = void 0;
7
+ var _dependenciesDeepEqualGenerated = require("./dependenciesDeepEqual.generated.js");
8
+ var _dependenciesFlattenGenerated = require("./dependenciesFlatten.generated.js");
9
+ var _dependenciesMatrixGenerated = require("./dependenciesMatrix.generated.js");
10
+ var _dependenciesSizeGenerated = require("./dependenciesSize.generated.js");
11
+ var _dependenciesTypedGenerated = require("./dependenciesTyped.generated.js");
12
+ var _factoriesAny = require("../../factoriesAny.js");
13
+ /**
14
+ * THIS FILE IS AUTO-GENERATED
15
+ * DON'T MAKE CHANGES HERE
16
+ */
17
+
18
+ const nullishDependencies = exports.nullishDependencies = {
19
+ deepEqualDependencies: _dependenciesDeepEqualGenerated.deepEqualDependencies,
20
+ flattenDependencies: _dependenciesFlattenGenerated.flattenDependencies,
21
+ matrixDependencies: _dependenciesMatrixGenerated.matrixDependencies,
22
+ sizeDependencies: _dependenciesSizeGenerated.sizeDependencies,
23
+ typedDependencies: _dependenciesTypedGenerated.typedDependencies,
24
+ createNullish: _factoriesAny.createNullish
25
+ };
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.nullishTransformDependencies = void 0;
7
+ var _dependenciesDeepEqualGenerated = require("./dependenciesDeepEqual.generated.js");
8
+ var _dependenciesFlattenGenerated = require("./dependenciesFlatten.generated.js");
9
+ var _dependenciesMatrixGenerated = require("./dependenciesMatrix.generated.js");
10
+ var _dependenciesSizeGenerated = require("./dependenciesSize.generated.js");
11
+ var _dependenciesTypedGenerated = require("./dependenciesTyped.generated.js");
12
+ var _factoriesAny = require("../../factoriesAny.js");
13
+ /**
14
+ * THIS FILE IS AUTO-GENERATED
15
+ * DON'T MAKE CHANGES HERE
16
+ */
17
+
18
+ const nullishTransformDependencies = exports.nullishTransformDependencies = {
19
+ deepEqualDependencies: _dependenciesDeepEqualGenerated.deepEqualDependencies,
20
+ flattenDependencies: _dependenciesFlattenGenerated.flattenDependencies,
21
+ matrixDependencies: _dependenciesMatrixGenerated.matrixDependencies,
22
+ sizeDependencies: _dependenciesSizeGenerated.sizeDependencies,
23
+ typedDependencies: _dependenciesTypedGenerated.typedDependencies,
24
+ createNullishTransform: _factoriesAny.createNullishTransform
25
+ };
@@ -1443,6 +1443,18 @@ Object.defineProperty(exports, "nullDependencies", {
1443
1443
  return _dependenciesNullGenerated.nullDependencies;
1444
1444
  }
1445
1445
  });
1446
+ Object.defineProperty(exports, "nullishDependencies", {
1447
+ enumerable: true,
1448
+ get: function () {
1449
+ return _dependenciesNullishGenerated.nullishDependencies;
1450
+ }
1451
+ });
1452
+ Object.defineProperty(exports, "nullishTransformDependencies", {
1453
+ enumerable: true,
1454
+ get: function () {
1455
+ return _dependenciesNullishTransformGenerated.nullishTransformDependencies;
1456
+ }
1457
+ });
1446
1458
  Object.defineProperty(exports, "numberDependencies", {
1447
1459
  enumerable: true,
1448
1460
  get: function () {
@@ -2416,6 +2428,8 @@ var _dependenciesNthRootGenerated = require("./dependenciesAny/dependenciesNthRo
2416
2428
  var _dependenciesNthRootsGenerated = require("./dependenciesAny/dependenciesNthRoots.generated.js");
2417
2429
  var _dependenciesNuclearMagnetonGenerated = require("./dependenciesAny/dependenciesNuclearMagneton.generated.js");
2418
2430
  var _dependenciesNullGenerated = require("./dependenciesAny/dependenciesNull.generated.js");
2431
+ var _dependenciesNullishGenerated = require("./dependenciesAny/dependenciesNullish.generated.js");
2432
+ var _dependenciesNullishTransformGenerated = require("./dependenciesAny/dependenciesNullishTransform.generated.js");
2419
2433
  var _dependenciesNumberGenerated = require("./dependenciesAny/dependenciesNumber.generated.js");
2420
2434
  var _dependenciesNumericGenerated = require("./dependenciesAny/dependenciesNumeric.generated.js");
2421
2435
  var _dependenciesObjectNodeGenerated = require("./dependenciesAny/dependenciesObjectNode.generated.js");
@@ -416,6 +416,7 @@ const help = exports.help = (0, _factoriesAny.createHelp)({
416
416
  min: _pureFunctionsAnyGenerated.min,
417
417
  mod: _pureFunctionsAnyGenerated.mod,
418
418
  nthRoots: _pureFunctionsAnyGenerated.nthRoots,
419
+ nullish: _pureFunctionsAnyGenerated.nullish,
419
420
  or: _pureFunctionsAnyGenerated.or,
420
421
  partitionSelect: _pureFunctionsAnyGenerated.partitionSelect,
421
422
  qr: _pureFunctionsAnyGenerated.qr,
@@ -631,6 +632,13 @@ const help = exports.help = (0, _factoriesAny.createHelp)({
631
632
  smaller: _pureFunctionsAnyGenerated.smaller,
632
633
  typed: _pureFunctionsAnyGenerated.typed
633
634
  }),
635
+ nullish: (0, _factoriesAny.createNullishTransform)({
636
+ deepEqual: _pureFunctionsAnyGenerated.deepEqual,
637
+ flatten: _pureFunctionsAnyGenerated.flatten,
638
+ matrix: _pureFunctionsAnyGenerated.matrix,
639
+ size: _pureFunctionsAnyGenerated.size,
640
+ typed: _pureFunctionsAnyGenerated.typed
641
+ }),
634
642
  subset: (0, _factoriesAny.createSubsetTransform)({
635
643
  add: _pureFunctionsAnyGenerated.add,
636
644
  matrix: _pureFunctionsAnyGenerated.matrix,
@@ -4,9 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.dotPow = exports.dotMultiply = exports.dotDivide = exports.dot = exports.divideScalar = exports.divide = exports.distance = exports.diff = exports.diag = exports.deuteronMass = exports.det = exports.deepEqual = exports.cumsum = exports.cube = exports.ctranspose = exports.csch = exports.csc = exports.cross = exports.createUnit = exports.count = exports.coulombConstant = exports.coulomb = exports.coth = exports.cot = exports.cosh = exports.cos = exports.corr = exports.conj = exports.conductanceQuantum = exports.concat = exports.composition = exports.complex = exports.compareText = exports.compareNatural = exports.compare = exports.combinationsWithRep = exports.combinations = exports.column = exports.clone = exports.classicalElectronRadius = exports.ceil = exports.cbrt = exports.catalan = exports.boolean = exports.boltzmann = exports.bohrRadius = exports.bohrMagneton = exports.bitXor = exports.bitOr = exports.bitNot = exports.bitAnd = exports.bin = exports.bignumber = exports.bigint = exports.bellNumbers = exports.avogadro = exports.atomicMass = exports.atanh = exports.atan2 = exports.atan = exports.asinh = exports.asin = exports.asech = exports.asec = exports.arg = exports.apply = exports.and = exports.addScalar = exports.add = exports.acsch = exports.acsc = exports.acoth = exports.acot = exports.acosh = exports.acos = exports.abs = exports._true = exports._null = exports._false = exports._NaN = exports._Infinity = exports.Unit = exports.SparseMatrix = exports.Spa = exports.SQRT2 = exports.SQRT1_2 = exports.ResultSet = exports.Range = exports.Matrix = exports.LOG2E = exports.LOG10E = exports.LN2 = exports.LN10 = exports.Index = exports.ImmutableDenseMatrix = exports.Fraction = exports.FibonacciHeap = exports.DenseMatrix = exports.Complex = exports.BigNumber = void 0;
7
- exports.number = exports.nuclearMagneton = exports.nthRoots = exports.nthRoot = exports.not = exports.norm = exports.neutronMass = exports.multiplyScalar = exports.multiply = exports.multinomial = exports.molarVolume = exports.molarPlanckConstant = exports.molarMassC12 = exports.molarMass = exports.mode = exports.mod = exports.min = exports.median = exports.mean = exports.max = exports.matrixFromRows = exports.matrixFromFunction = exports.matrixFromColumns = exports.matrix = exports.mapSlices = exports.map = exports.magneticFluxQuantum = exports.magneticConstant = exports.mad = exports.lyap = exports.lusolve = exports.lup = exports.lsolveAll = exports.lsolve = exports.loschmidt = exports.log2 = exports.log1p = exports.log10 = exports.log = exports.lgamma = exports.leftShift = exports.lcm = exports.largerEq = exports.larger = exports.kron = exports.klitzing = exports.kldivergence = exports.isZero = exports.isPrime = exports.isPositive = exports.isNumeric = exports.isNegative = exports.isNaN = exports.isInteger = exports.invmod = exports.inverseConductanceQuantum = exports.inv = exports.intersect = exports.index = exports.im = exports.ifft = exports.identity = exports.i = exports.hypot = exports.hex = exports.hasNumericValue = exports.hartreeEnergy = exports.gravity = exports.gravitationConstant = exports.getMatrixDataType = exports.gcd = exports.gasConstant = exports.gamma = exports.freqz = exports.fraction = exports.format = exports.forEach = exports.floor = exports.flatten = exports.fix = exports.firstRadiation = exports.fineStructure = exports.filter = exports.fft = exports.fermiCoupling = exports.faraday = exports.factorial = exports.expm1 = exports.expm = exports.exp = exports.erf = exports.equalText = exports.equalScalar = exports.equal = exports.elementaryCharge = exports.electronMass = exports.electricConstant = exports.eigs = exports.efimovFactor = exports.e = void 0;
8
- exports.wienDisplacement = exports.weakMixingAngle = exports.version = exports.variance = exports.vacuumImpedance = exports.usolveAll = exports.usolve = exports.unit = exports.unequal = exports.unaryPlus = exports.unaryMinus = exports.typed = exports.typeOf = exports.transpose = exports.trace = exports.toBest = exports.to = exports.thomsonCrossSection = exports.tau = exports.tanh = exports.tan = exports.sylvester = exports.sum = exports.subtractScalar = exports.subtract = exports.subset = exports.string = exports.stirlingS2 = exports.stefanBoltzmann = exports.std = exports.squeeze = exports.square = exports.sqrtm = exports.sqrt = exports.splitUnit = exports.speedOfLight = exports.sparse = exports.sort = exports.solveODE = exports.smallerEq = exports.smaller = exports.slu = exports.size = exports.sinh = exports.sin = exports.sign = exports.setUnion = exports.setSymDifference = exports.setSize = exports.setPowerset = exports.setMultiplicity = exports.setIsSubset = exports.setIntersect = exports.setDistinct = exports.setDifference = exports.setCartesian = exports.secondRadiation = exports.sech = exports.sec = exports.schur = exports.sackurTetrode = exports.rydberg = exports.row = exports.round = exports.rotationMatrix = exports.rotate = exports.rightLogShift = exports.rightArithShift = exports.resize = exports.reshape = exports.replacer = exports.reducedPlanckConstant = exports.re = exports.range = exports.randomInt = exports.random = exports.quantumOfCirculation = exports.quantileSeq = exports.qr = exports.protonMass = exports.prod = exports.print = exports.pow = exports.polynomialRoot = exports.planckTime = exports.planckTemperature = exports.planckMass = exports.planckLength = exports.planckConstant = exports.planckCharge = exports.pinv = exports.pickRandom = exports.pi = exports.phi = exports.permutations = exports.partitionSelect = exports.or = exports.ones = exports.oct = exports.numeric = void 0;
9
- exports.zpk2tf = exports.zeta = exports.zeros = exports.xor = exports.xgcd = void 0;
7
+ exports.nullish = exports.nuclearMagneton = exports.nthRoots = exports.nthRoot = exports.not = exports.norm = exports.neutronMass = exports.multiplyScalar = exports.multiply = exports.multinomial = exports.molarVolume = exports.molarPlanckConstant = exports.molarMassC12 = exports.molarMass = exports.mode = exports.mod = exports.min = exports.median = exports.mean = exports.max = exports.matrixFromRows = exports.matrixFromFunction = exports.matrixFromColumns = exports.matrix = exports.mapSlices = exports.map = exports.magneticFluxQuantum = exports.magneticConstant = exports.mad = exports.lyap = exports.lusolve = exports.lup = exports.lsolveAll = exports.lsolve = exports.loschmidt = exports.log2 = exports.log1p = exports.log10 = exports.log = exports.lgamma = exports.leftShift = exports.lcm = exports.largerEq = exports.larger = exports.kron = exports.klitzing = exports.kldivergence = exports.isZero = exports.isPrime = exports.isPositive = exports.isNumeric = exports.isNegative = exports.isNaN = exports.isInteger = exports.invmod = exports.inverseConductanceQuantum = exports.inv = exports.intersect = exports.index = exports.im = exports.ifft = exports.identity = exports.i = exports.hypot = exports.hex = exports.hasNumericValue = exports.hartreeEnergy = exports.gravity = exports.gravitationConstant = exports.getMatrixDataType = exports.gcd = exports.gasConstant = exports.gamma = exports.freqz = exports.fraction = exports.format = exports.forEach = exports.floor = exports.flatten = exports.fix = exports.firstRadiation = exports.fineStructure = exports.filter = exports.fft = exports.fermiCoupling = exports.faraday = exports.factorial = exports.expm1 = exports.expm = exports.exp = exports.erf = exports.equalText = exports.equalScalar = exports.equal = exports.elementaryCharge = exports.electronMass = exports.electricConstant = exports.eigs = exports.efimovFactor = exports.e = void 0;
8
+ exports.weakMixingAngle = exports.version = exports.variance = exports.vacuumImpedance = exports.usolveAll = exports.usolve = exports.unit = exports.unequal = exports.unaryPlus = exports.unaryMinus = exports.typed = exports.typeOf = exports.transpose = exports.trace = exports.toBest = exports.to = exports.thomsonCrossSection = exports.tau = exports.tanh = exports.tan = exports.sylvester = exports.sum = exports.subtractScalar = exports.subtract = exports.subset = exports.string = exports.stirlingS2 = exports.stefanBoltzmann = exports.std = exports.squeeze = exports.square = exports.sqrtm = exports.sqrt = exports.splitUnit = exports.speedOfLight = exports.sparse = exports.sort = exports.solveODE = exports.smallerEq = exports.smaller = exports.slu = exports.size = exports.sinh = exports.sin = exports.sign = exports.setUnion = exports.setSymDifference = exports.setSize = exports.setPowerset = exports.setMultiplicity = exports.setIsSubset = exports.setIntersect = exports.setDistinct = exports.setDifference = exports.setCartesian = exports.secondRadiation = exports.sech = exports.sec = exports.schur = exports.sackurTetrode = exports.rydberg = exports.row = exports.round = exports.rotationMatrix = exports.rotate = exports.rightLogShift = exports.rightArithShift = exports.resize = exports.reshape = exports.replacer = exports.reducedPlanckConstant = exports.re = exports.range = exports.randomInt = exports.random = exports.quantumOfCirculation = exports.quantileSeq = exports.qr = exports.protonMass = exports.prod = exports.print = exports.pow = exports.polynomialRoot = exports.planckTime = exports.planckTemperature = exports.planckMass = exports.planckLength = exports.planckConstant = exports.planckCharge = exports.pinv = exports.pickRandom = exports.pi = exports.phi = exports.permutations = exports.partitionSelect = exports.or = exports.ones = exports.oct = exports.numeric = exports.number = void 0;
9
+ exports.zpk2tf = exports.zeta = exports.zeros = exports.xor = exports.xgcd = exports.wienDisplacement = void 0;
10
10
  var _configReadonly = require("./configReadonly.js");
11
11
  var _factoriesAny = require("../factoriesAny.js");
12
12
  /**
@@ -779,6 +779,13 @@ const nthRoots = exports.nthRoots = /* #__PURE__ */(0, _factoriesAny.createNthRo
779
779
  divideScalar,
780
780
  typed
781
781
  });
782
+ const nullish = exports.nullish = /* #__PURE__ */(0, _factoriesAny.createNullish)({
783
+ deepEqual,
784
+ flatten,
785
+ matrix,
786
+ size,
787
+ typed
788
+ });
782
789
  const or = exports.or = /* #__PURE__ */(0, _factoriesAny.createOr)({
783
790
  DenseMatrix,
784
791
  concat,
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.createParserClass = void 0;
7
7
  var _factory = require("../utils/factory.js");
8
+ var _is = require("../utils/is.js");
8
9
  var _map = require("../utils/map.js");
9
10
  const name = 'Parser';
10
11
  const dependencies = ['evaluate', 'parse'];
@@ -160,7 +161,40 @@ const createParserClass = exports.createParserClass = /* #__PURE__ */(0, _factor
160
161
  Parser.prototype.clear = function () {
161
162
  this.scope.clear();
162
163
  };
164
+ Parser.prototype.toJSON = function () {
165
+ const json = {
166
+ mathjs: 'Parser',
167
+ variables: {},
168
+ functions: {}
169
+ };
170
+ for (const [name, value] of this.scope) {
171
+ if ((0, _is.isFunction)(value)) {
172
+ if (!isExpressionFunction(value)) {
173
+ throw new Error(`Cannot serialize external function ${name}`);
174
+ }
175
+ json.functions[name] = `${value.syntax} = ${value.expr}`;
176
+ } else {
177
+ json.variables[name] = value;
178
+ }
179
+ }
180
+ return json;
181
+ };
182
+ Parser.fromJSON = function (json) {
183
+ const parser = new Parser();
184
+ Object.entries(json.variables).forEach(_ref2 => {
185
+ let [name, value] = _ref2;
186
+ return parser.set(name, value);
187
+ });
188
+ Object.entries(json.functions).forEach(_ref3 => {
189
+ let [_name, fn] = _ref3;
190
+ return parser.evaluate(fn);
191
+ });
192
+ return parser;
193
+ };
163
194
  return Parser;
164
195
  }, {
165
196
  isClass: true
166
- });
197
+ });
198
+ function isExpressionFunction(value) {
199
+ return typeof value === 'function' && typeof value.syntax === 'string' && typeof value.expr === 'string';
200
+ }
@@ -118,6 +118,7 @@ var _distance = require("./function/geometry/distance.js");
118
118
  var _intersect = require("./function/geometry/intersect.js");
119
119
  var _and = require("./function/logical/and.js");
120
120
  var _not = require("./function/logical/not.js");
121
+ var _nullish = require("./function/logical/nullish.js");
121
122
  var _or = require("./function/logical/or.js");
122
123
  var _xor = require("./function/logical/xor.js");
123
124
  var _mapSlices = require("./function/matrix/mapSlices.js");
@@ -587,6 +588,7 @@ const embeddedDocs = exports.embeddedDocs = {
587
588
  // functions - logical
588
589
  and: _and.andDocs,
589
590
  not: _not.notDocs,
591
+ nullish: _nullish.nullishDocs,
590
592
  or: _or.orDocs,
591
593
  xor: _xor.xorDocs,
592
594
  // functions - matrix
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.nullishDocs = void 0;
7
+ const nullishDocs = exports.nullishDocs = {
8
+ name: 'nullish',
9
+ category: 'Logical',
10
+ syntax: ['x ?? y', 'nullish(x, y)'],
11
+ description: 'Nullish coalescing operator. Returns the right-hand operand when the left-hand operand is null or undefined, and otherwise returns the left-hand operand.',
12
+ examples: ['null ?? 42', 'undefined ?? 42', '0 ?? 42', 'false ?? 42', 'null ?? undefined ?? 42'],
13
+ seealso: ['and', 'or', 'not']
14
+ };
@@ -105,7 +105,8 @@ const createFunctionAssignmentNode = exports.createFunctionAssignmentNode = /* #
105
105
  });
106
106
 
107
107
  // compile the function expression with the child args
108
- const evalExpr = this.expr._compile(math, childArgNames);
108
+ const expr = this.expr;
109
+ const evalExpr = expr._compile(math, childArgNames);
109
110
  const name = this.name;
110
111
  const params = this.params;
111
112
  const signature = (0, _array.join)(this.types, ',');
@@ -121,6 +122,7 @@ const createFunctionAssignmentNode = exports.createFunctionAssignmentNode = /* #
121
122
  };
122
123
  const fn = typed(name, signatures);
123
124
  fn.syntax = syntax;
125
+ fn.expr = expr.toString();
124
126
  scope.set(name, fn);
125
127
  return fn;
126
128
  };
@@ -232,6 +232,13 @@ const properties = exports.properties = [{
232
232
  associativity: 'right',
233
233
  associativeWith: []
234
234
  }
235
+ }, {
236
+ // nullish coalescing
237
+ 'OperatorNode:nullish': {
238
+ op: '??',
239
+ associativity: 'left',
240
+ associativeWith: []
241
+ }
235
242
  }, {
236
243
  // factorial
237
244
  'OperatorNode:factorial': {
@@ -54,7 +54,7 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
54
54
  * node1.compile().evaluate() // 5
55
55
  *
56
56
  * let scope = {a:3, b:4}
57
- * const node2 = math.parse('a * b') // 12
57
+ * const node2 = math.parse('a * b')
58
58
  * node2.evaluate(scope) // 12
59
59
  * const code2 = node2.compile()
60
60
  * code2.evaluate(scope) // 12
@@ -136,6 +136,7 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
136
136
  '=': true,
137
137
  ':': true,
138
138
  '?': true,
139
+ '??': true,
139
140
  '==': true,
140
141
  '!=': true,
141
142
  '<': true,
@@ -1115,7 +1116,7 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
1115
1116
  */
1116
1117
  function parsePow(state) {
1117
1118
  let node, name, fn, params;
1118
- node = parseLeftHandOperators(state);
1119
+ node = parseNullishCoalescing(state);
1119
1120
  if (state.token === '^' || state.token === '.^') {
1120
1121
  name = state.token;
1121
1122
  fn = name === '^' ? 'pow' : 'dotPow';
@@ -1126,6 +1127,21 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
1126
1127
  return node;
1127
1128
  }
1128
1129
 
1130
+ /**
1131
+ * nullish coalescing operator
1132
+ * @return {Node} node
1133
+ * @private
1134
+ */
1135
+ function parseNullishCoalescing(state) {
1136
+ let node = parseLeftHandOperators(state);
1137
+ while (state.token === '??') {
1138
+ // eslint-disable-line no-unmodified-loop-condition
1139
+ getTokenSkipNewline(state);
1140
+ node = new OperatorNode('??', 'nullish', [node, parseLeftHandOperators(state)]);
1141
+ }
1142
+ return node;
1143
+ }
1144
+
1129
1145
  /**
1130
1146
  * Left hand operators: factorial x!, ctranspose x'
1131
1147
  * @return {Node} node
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createNullishTransform = void 0;
7
+ var _nullish = require("../../function/logical/nullish.js");
8
+ var _factory = require("../../utils/factory.js");
9
+ var _is = require("../../utils/is.js");
10
+ const name = 'nullish';
11
+ const dependencies = ['typed', 'matrix', 'size', 'flatten', 'deepEqual'];
12
+ const createNullishTransform = exports.createNullishTransform = /* #__PURE__ */(0, _factory.factory)(name, dependencies, _ref => {
13
+ let {
14
+ typed,
15
+ matrix,
16
+ size,
17
+ flatten,
18
+ deepEqual
19
+ } = _ref;
20
+ const nullish = (0, _nullish.createNullish)({
21
+ typed,
22
+ matrix,
23
+ size,
24
+ flatten,
25
+ deepEqual
26
+ });
27
+ function nullishTransform(args, math, scope) {
28
+ const left = args[0].compile().evaluate(scope);
29
+
30
+ // If left is not a collection and not nullish, short-circuit and return it
31
+ if (!(0, _is.isCollection)(left) && left != null && left !== undefined) {
32
+ return left;
33
+ }
34
+
35
+ // Otherwise evaluate right and apply full nullish semantics (incl. element-wise)
36
+ const right = args[1].compile().evaluate(scope);
37
+ return nullish(left, right);
38
+ }
39
+ nullishTransform.rawArgs = true;
40
+ return nullishTransform;
41
+ }, {
42
+ isTransformFunction: true
43
+ });
@@ -1341,6 +1341,18 @@ Object.defineProperty(exports, "createNull", {
1341
1341
  return _constants.createNull;
1342
1342
  }
1343
1343
  });
1344
+ Object.defineProperty(exports, "createNullish", {
1345
+ enumerable: true,
1346
+ get: function () {
1347
+ return _nullish.createNullish;
1348
+ }
1349
+ });
1350
+ Object.defineProperty(exports, "createNullishTransform", {
1351
+ enumerable: true,
1352
+ get: function () {
1353
+ return _nullishTransform.createNullishTransform;
1354
+ }
1355
+ });
1344
1356
  Object.defineProperty(exports, "createNumber", {
1345
1357
  enumerable: true,
1346
1358
  get: function () {
@@ -2255,6 +2267,7 @@ var _conj = require("./function/complex/conj.js");
2255
2267
  var _im = require("./function/complex/im.js");
2256
2268
  var _re = require("./function/complex/re.js");
2257
2269
  var _not = require("./function/logical/not.js");
2270
+ var _nullish = require("./function/logical/nullish.js");
2258
2271
  var _or = require("./function/logical/or.js");
2259
2272
  var _xor = require("./function/logical/xor.js");
2260
2273
  var _concat = require("./function/matrix/concat.js");
@@ -2481,5 +2494,6 @@ var _varianceTransform = require("./expression/transform/variance.transform.js")
2481
2494
  var _printTransform = require("./expression/transform/print.transform.js");
2482
2495
  var _andTransform = require("./expression/transform/and.transform.js");
2483
2496
  var _orTransform = require("./expression/transform/or.transform.js");
2497
+ var _nullishTransform = require("./expression/transform/nullish.transform.js");
2484
2498
  var _bitAndTransform = require("./expression/transform/bitAnd.transform.js");
2485
2499
  var _bitOrTransform = require("./expression/transform/bitOr.transform.js");
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createNullish = void 0;
7
+ var _factory = require("../../utils/factory.js");
8
+ var _matAlgo03xDSf = require("../../type/matrix/utils/matAlgo03xDSf.js");
9
+ var _matAlgo14xDs = require("../../type/matrix/utils/matAlgo14xDs.js");
10
+ var _matAlgo13xDD = require("../../type/matrix/utils/matAlgo13xDD.js");
11
+ var _DimensionError = require("../../error/DimensionError.js");
12
+ const name = 'nullish';
13
+ const dependencies = ['typed', 'matrix', 'size', 'flatten', 'deepEqual'];
14
+ const createNullish = exports.createNullish = /* #__PURE__ */(0, _factory.factory)(name, dependencies, _ref => {
15
+ let {
16
+ typed,
17
+ matrix,
18
+ size,
19
+ flatten,
20
+ deepEqual
21
+ } = _ref;
22
+ const matAlgo03xDSf = (0, _matAlgo03xDSf.createMatAlgo03xDSf)({
23
+ typed
24
+ });
25
+ const matAlgo14xDs = (0, _matAlgo14xDs.createMatAlgo14xDs)({
26
+ typed
27
+ });
28
+ const matAlgo13xDD = (0, _matAlgo13xDD.createMatAlgo13xDD)({
29
+ typed
30
+ });
31
+
32
+ /**
33
+ * Nullish coalescing operator (??). Returns the right-hand side operand
34
+ * when the left-hand side operand is null or undefined, and otherwise
35
+ * returns the left-hand side operand.
36
+ *
37
+ * For matrices, the function is evaluated element wise.
38
+ *
39
+ * Syntax:
40
+ *
41
+ * math.nullish(x, y)
42
+ *
43
+ * Examples:
44
+ *
45
+ * math.nullish(null, 42) // returns 42
46
+ * math.nullish(undefined, 42) // returns 42
47
+ * math.nullish(0, 42) // returns 0
48
+ * math.nullish(false, 42) // returns false
49
+ * math.nullish('', 42) // returns ''
50
+ *
51
+ * // Object property access with fallback
52
+ * const obj = {foo: 7, bar: 3}
53
+ * math.nullish(obj.baz, 0) // returns 0
54
+ *
55
+ * See also:
56
+ *
57
+ * and, or, not
58
+ *
59
+ * @param {*} x First value to check
60
+ * @param {*} y Fallback value
61
+ * @return {*} Returns y when x is null or undefined, otherwise returns x
62
+ */
63
+
64
+ return typed(name, {
65
+ // Scalar and SparseMatrix-first short-circuit handlers
66
+ 'number|bigint|Complex|BigNumber|Fraction|Unit|string|boolean|SparseMatrix, any': (x, _y) => x,
67
+ 'null, any': (_x, y) => y,
68
+ 'undefined, any': (_x, y) => y,
69
+ // SparseMatrix-first with collection RHS: enforce exact shape match
70
+ 'SparseMatrix, Array | Matrix': (x, y) => {
71
+ const sx = flatten(size(x).valueOf()); // work around #3529/#3530
72
+ const sy = flatten(size(y).valueOf());
73
+ if (deepEqual(sx, sy)) return x;
74
+ throw new _DimensionError.DimensionError(sx, sy);
75
+ },
76
+ // DenseMatrix-first handlers (no broadcasting between collections)
77
+ 'DenseMatrix, DenseMatrix': typed.referToSelf(self => (x, y) => matAlgo13xDD(x, y, self)),
78
+ 'DenseMatrix, SparseMatrix': typed.referToSelf(self => (x, y) => matAlgo03xDSf(x, y, self, false)),
79
+ 'DenseMatrix, Array': typed.referToSelf(self => (x, y) => matAlgo13xDD(x, matrix(y), self)),
80
+ 'DenseMatrix, any': typed.referToSelf(self => (x, y) => matAlgo14xDs(x, y, self, false)),
81
+ // Array-first handlers (bridge via matrix() where needed)
82
+ 'Array, Array': typed.referToSelf(self => (x, y) => matAlgo13xDD(matrix(x), matrix(y), self).valueOf()),
83
+ 'Array, DenseMatrix': typed.referToSelf(self => (x, y) => matAlgo13xDD(matrix(x), y, self)),
84
+ 'Array, SparseMatrix': typed.referToSelf(self => (x, y) => matAlgo03xDSf(matrix(x), y, self, false)),
85
+ 'Array, any': typed.referToSelf(self => (x, y) => matAlgo14xDs(matrix(x), y, self, false).valueOf())
86
+ });
87
+ });
@@ -22,7 +22,7 @@ const createRange = exports.createRange = /* #__PURE__ */(0, _factory.factory)(n
22
22
  isPositive
23
23
  } = _ref;
24
24
  /**
25
- * Create an array from a range.
25
+ * Create a matrix or array containing a range of values.
26
26
  * By default, the range end is excluded. This can be customized by providing
27
27
  * an extra parameter `includeEnd`.
28
28
  *
@@ -50,10 +50,12 @@ const createRange = exports.createRange = /* #__PURE__ */(0, _factory.factory)(n
50
50
  * - `includeEnd: boolean`
51
51
  * Option to specify whether to include the end or not. False by default.
52
52
  *
53
- * Note that the return type of the range is taken from the type of
54
- * the start/end. If only one these is a built-in `number` type, it will
55
- * be promoted to the type of the other endpoint. However, in the case of
56
- * Unit values, both endpoints must have compatible units, and the return
53
+ * The function returns a `DenseMatrix` when the library is configured with
54
+ * `config = { matrix: 'Matrix' }, and returns an Array otherwise.
55
+ * Note that the type of the returned values is taken from the type of the
56
+ * provided start/end value. If only one of these is a built-in `number` type,
57
+ * it will be promoted to the type of the other endpoint. However, in the case
58
+ * of Unit values, both endpoints must have compatible units, and the return
57
59
  * value will have compatible units as well.
58
60
  *
59
61
  * Examples:
package/lib/cjs/header.js CHANGED
@@ -6,8 +6,8 @@
6
6
  * It features real and complex numbers, units, matrices, a large set of
7
7
  * mathematical functions, and a flexible expression parser.
8
8
  *
9
- * @version 14.6.0
10
- * @date 2025-07-25
9
+ * @version 14.8.0
10
+ * @date 2025-09-24
11
11
  *
12
12
  * @license
13
13
  * Copyright (C) 2013-2025 Jos de Jong <wjosdejong@gmail.com>
@@ -679,24 +679,28 @@ const createDenseMatrixClass = exports.createDenseMatrixClass = /* #__PURE__ */(
679
679
  }
680
680
  return;
681
681
  }
682
- const index = [];
683
- const recurse = function* (value, depth) {
684
- if (depth < maxDepth) {
685
- for (let i = 0; i < value.length; i++) {
686
- index[depth] = i;
687
- yield* recurse(value[i], depth + 1);
688
- }
689
- } else {
690
- for (let i = 0; i < value.length; i++) {
691
- index[depth] = i;
692
- yield {
693
- value: value[i],
694
- index: index.slice()
695
- };
696
- }
682
+
683
+ // Multi-dimensional matrix: iterate over all elements
684
+ const index = Array(maxDepth + 1).fill(0);
685
+ const totalElements = this._size.reduce((a, b) => a * b, 1);
686
+ for (let count = 0; count < totalElements; count++) {
687
+ // Traverse to the current element using indices
688
+ let current = this._data;
689
+ for (let d = 0; d < maxDepth; d++) {
690
+ current = current[index[d]];
697
691
  }
698
- };
699
- yield* recurse(this._data, 0);
692
+ yield {
693
+ value: current[index[maxDepth]],
694
+ index: index.slice()
695
+ };
696
+
697
+ // Increment indices for next element
698
+ for (let d = maxDepth; d >= 0; d--) {
699
+ index[d]++;
700
+ if (index[d] < this._size[d]) break;
701
+ index[d] = 0;
702
+ }
703
+ }
700
704
  };
701
705
 
702
706
  /**
@@ -23,13 +23,13 @@ const createString = exports.createString = /* #__PURE__ */(0, _factory.factory)
23
23
  *
24
24
  * Examples:
25
25
  *
26
- * math.string(4.2) // returns string '4.2'
27
- * math.string(math.complex(3, 2) // returns string '3 + 2i'
26
+ * math.string(4.2) // returns string '4.2'
27
+ * math.string(math.complex(3, 2)) // returns string '3 + 2i'
28
28
  *
29
29
  * const u = math.unit(5, 'km')
30
- * math.string(u.to('m')) // returns string '5000 m'
30
+ * math.string(u.to('m')) // returns string '5000 m'
31
31
  *
32
- * math.string([true, false]) // returns ['true', 'false']
32
+ * math.string([true, false]) // returns ['true', 'false']
33
33
  *
34
34
  * See also:
35
35
  *
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.version = void 0;
7
- const version = exports.version = '14.6.0';
7
+ const version = exports.version = '14.8.0';
8
8
  // Note: This file is automatically generated when building math.js.
9
9
  // Changes made in this file will be overwritten.
@@ -16,7 +16,6 @@ export function configFactory(config, emit) {
16
16
  *
17
17
  * Examples:
18
18
  *
19
- *
20
19
  * import { create, all } from 'mathjs'
21
20
  *
22
21
  * // create a mathjs instance
@@ -0,0 +1,18 @@
1
+ /**
2
+ * THIS FILE IS AUTO-GENERATED
3
+ * DON'T MAKE CHANGES HERE
4
+ */
5
+ import { deepEqualDependencies } from './dependenciesDeepEqual.generated.js';
6
+ import { flattenDependencies } from './dependenciesFlatten.generated.js';
7
+ import { matrixDependencies } from './dependenciesMatrix.generated.js';
8
+ import { sizeDependencies } from './dependenciesSize.generated.js';
9
+ import { typedDependencies } from './dependenciesTyped.generated.js';
10
+ import { createNullish } from '../../factoriesAny.js';
11
+ export var nullishDependencies = {
12
+ deepEqualDependencies,
13
+ flattenDependencies,
14
+ matrixDependencies,
15
+ sizeDependencies,
16
+ typedDependencies,
17
+ createNullish
18
+ };
@@ -0,0 +1,18 @@
1
+ /**
2
+ * THIS FILE IS AUTO-GENERATED
3
+ * DON'T MAKE CHANGES HERE
4
+ */
5
+ import { deepEqualDependencies } from './dependenciesDeepEqual.generated.js';
6
+ import { flattenDependencies } from './dependenciesFlatten.generated.js';
7
+ import { matrixDependencies } from './dependenciesMatrix.generated.js';
8
+ import { sizeDependencies } from './dependenciesSize.generated.js';
9
+ import { typedDependencies } from './dependenciesTyped.generated.js';
10
+ import { createNullishTransform } from '../../factoriesAny.js';
11
+ export var nullishTransformDependencies = {
12
+ deepEqualDependencies,
13
+ flattenDependencies,
14
+ matrixDependencies,
15
+ sizeDependencies,
16
+ typedDependencies,
17
+ createNullishTransform
18
+ };