mathjs 7.5.1 → 7.6.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 (64) hide show
  1. package/HISTORY.md +7 -0
  2. package/dist/math.js +123 -29
  3. package/dist/math.min.js +3 -3
  4. package/dist/math.min.map +1 -1
  5. package/docs/datatypes/units.md +21 -0
  6. package/docs/reference/functions/rotate.md +47 -0
  7. package/docs/reference/functions/rotationMatrix.md +1 -1
  8. package/docs/reference/functions.md +1 -0
  9. package/es/entry/dependenciesAny/dependenciesRotate.generated.js +14 -0
  10. package/es/entry/dependenciesAny.generated.js +1 -0
  11. package/es/entry/impureFunctionsAny.generated.js +24 -23
  12. package/es/entry/pureFunctionsAny.generated.js +10 -5
  13. package/es/expression/embeddedDocs/embeddedDocs.js +2 -0
  14. package/es/expression/embeddedDocs/function/matrix/rotate.js +8 -0
  15. package/es/expression/node/FunctionNode.js +1 -1
  16. package/es/expression/node/Node.js +2 -2
  17. package/es/factoriesAny.js +1 -0
  18. package/es/function/matrix/rotate.js +78 -0
  19. package/es/function/matrix/rotationMatrix.js +5 -4
  20. package/es/function/special/erf.js +1 -0
  21. package/es/plain/number/constants.js +1 -1
  22. package/es/plain/number/probability.js +1 -0
  23. package/es/type/unit/Unit.js +17 -18
  24. package/es/version.js +1 -1
  25. package/examples/bignumbers.js +2 -0
  26. package/lib/entry/dependenciesAny/dependenciesRotate.generated.js +26 -0
  27. package/lib/entry/dependenciesAny.generated.js +8 -0
  28. package/lib/entry/impureFunctionsAny.generated.js +27 -26
  29. package/lib/entry/mainAny.js +5 -0
  30. package/lib/entry/mainNumber.js +5 -0
  31. package/lib/entry/pureFunctionsAny.generated.js +14 -8
  32. package/lib/expression/embeddedDocs/embeddedDocs.js +3 -0
  33. package/lib/expression/embeddedDocs/function/matrix/rotate.js +15 -0
  34. package/lib/expression/node/FunctionNode.js +1 -1
  35. package/lib/expression/node/Node.js +2 -2
  36. package/lib/factoriesAny.js +8 -0
  37. package/lib/function/matrix/rotate.js +88 -0
  38. package/lib/function/matrix/rotationMatrix.js +5 -4
  39. package/lib/function/special/erf.js +1 -0
  40. package/lib/header.js +2 -2
  41. package/lib/plain/bignumber/index.js +1 -0
  42. package/lib/plain/number/constants.js +2 -1
  43. package/lib/plain/number/index.js +9 -0
  44. package/lib/plain/number/probability.js +1 -0
  45. package/lib/type/unit/Unit.js +17 -18
  46. package/lib/version.js +1 -1
  47. package/package.json +9 -9
  48. package/src/core/function/import.js +2 -2
  49. package/src/entry/dependenciesAny/dependenciesRotate.generated.js +15 -0
  50. package/src/entry/dependenciesAny.generated.js +1 -0
  51. package/src/entry/impureFunctionsAny.generated.js +20 -18
  52. package/src/entry/pureFunctionsAny.generated.js +7 -5
  53. package/src/expression/embeddedDocs/embeddedDocs.js +2 -0
  54. package/src/expression/embeddedDocs/function/matrix/rotate.js +19 -0
  55. package/src/expression/node/FunctionNode.js +1 -1
  56. package/src/expression/node/Node.js +2 -1
  57. package/src/factoriesAny.js +1 -0
  58. package/src/function/matrix/rotate.js +79 -0
  59. package/src/function/matrix/rotationMatrix.js +5 -4
  60. package/src/function/special/erf.js +2 -0
  61. package/src/plain/number/constants.js +1 -1
  62. package/src/plain/number/probability.js +2 -0
  63. package/src/type/unit/Unit.js +18 -21
  64. package/src/version.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mathjs",
3
- "version": "7.5.1",
3
+ "version": "7.6.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",
@@ -35,10 +35,10 @@
35
35
  "typed-function": "^2.0.0"
36
36
  },
37
37
  "devDependencies": {
38
- "@babel/core": "7.11.6",
39
- "@babel/plugin-transform-object-assign": "7.10.4",
40
- "@babel/preset-env": "7.11.5",
41
- "@babel/register": "7.11.5",
38
+ "@babel/core": "7.12.3",
39
+ "@babel/plugin-transform-object-assign": "7.12.1",
40
+ "@babel/preset-env": "7.12.1",
41
+ "@babel/register": "7.12.1",
42
42
  "babel-loader": "8.1.0",
43
43
  "benchmark": "2.1.4",
44
44
  "codecov": "3.8.0",
@@ -53,14 +53,14 @@
53
53
  "jsep": "0.3.5",
54
54
  "karma": "5.2.3",
55
55
  "karma-browserstack-launcher": "1.6.0",
56
- "karma-firefox-launcher": "1.3.0",
56
+ "karma-firefox-launcher": "2.0.0",
57
57
  "karma-mocha": "2.0.1",
58
58
  "karma-mocha-reporter": "2.2.5",
59
59
  "karma-webpack": "4.0.2",
60
60
  "lodash": "4.17.20",
61
61
  "math-expression-evaluator": "1.2.22",
62
62
  "mkdirp": "1.0.4",
63
- "mocha": "8.1.3",
63
+ "mocha": "8.2.0",
64
64
  "ndarray": "1.0.19",
65
65
  "ndarray-determinant": "1.0.0",
66
66
  "ndarray-gemm": "1.0.0",
@@ -69,9 +69,9 @@
69
69
  "numericjs": "1.2.6",
70
70
  "nyc": "15.1.0",
71
71
  "pad-right": "0.2.2",
72
- "standard": "14.3.4",
72
+ "standard": "16.0.1",
73
73
  "sylvester": "0.0.21",
74
- "uglify-js": "3.11.1",
74
+ "uglify-js": "3.11.4",
75
75
  "webpack": "4.44.2",
76
76
  "zeros": "1.0.0"
77
77
  },
@@ -82,8 +82,8 @@ export function importFactory (typed, load, math, importedFactories) {
82
82
  } else if (isFactory(value) || name !== undefined) {
83
83
  const flatName = isFactory(value)
84
84
  ? isTransformFunctionFactory(value)
85
- ? (value.fn + '.transform') // TODO: this is ugly
86
- : value.fn
85
+ ? (value.fn + '.transform') // TODO: this is ugly
86
+ : value.fn
87
87
  : name
88
88
 
89
89
  // we allow importing the same function twice if it points to the same implementation
@@ -0,0 +1,15 @@
1
+ /**
2
+ * THIS FILE IS AUTO-GENERATED
3
+ * DON'T MAKE CHANGES HERE
4
+ */
5
+ import { multiplyDependencies } from './dependenciesMultiply.generated'
6
+ import { rotationMatrixDependencies } from './dependenciesRotationMatrix.generated'
7
+ import { typedDependencies } from './dependenciesTyped.generated'
8
+ import { createRotate } from '../../factoriesAny.js'
9
+
10
+ export const rotateDependencies = {
11
+ multiplyDependencies,
12
+ rotationMatrixDependencies,
13
+ typedDependencies,
14
+ createRotate
15
+ }
@@ -82,6 +82,7 @@ export { onesDependencies } from './dependenciesAny/dependenciesOnes.generated'
82
82
  export { rangeDependencies } from './dependenciesAny/dependenciesRange.generated'
83
83
  export { reshapeDependencies } from './dependenciesAny/dependenciesReshape.generated'
84
84
  export { resizeDependencies } from './dependenciesAny/dependenciesResize.generated'
85
+ export { rotateDependencies } from './dependenciesAny/dependenciesRotate.generated'
85
86
  export { rotationMatrixDependencies } from './dependenciesAny/dependenciesRotationMatrix.generated'
86
87
  export { rowDependencies } from './dependenciesAny/dependenciesRow.generated'
87
88
  export { sizeDependencies } from './dependenciesAny/dependenciesSize.generated'
@@ -26,13 +26,13 @@ import {
26
26
  createParse,
27
27
  createEvaluate,
28
28
  createHelpClass,
29
+ createParserClass,
30
+ createHelp,
31
+ createCompile,
29
32
  createSimplify,
30
33
  createRationalize,
31
- createCompile,
32
- createHelp,
33
- createParserClass,
34
- createDerivative,
35
34
  createParser,
35
+ createDerivative,
36
36
  createApplyTransform,
37
37
  createFilterTransform,
38
38
  createMapTransform,
@@ -325,13 +325,14 @@ import {
325
325
  molarVolume,
326
326
  planckTime,
327
327
  thomsonCrossSection,
328
- unit,
328
+ rotate,
329
329
  mad,
330
330
  coulomb,
331
331
  magneticFluxQuantum,
332
332
  rydberg,
333
- planckConstant,
334
- gasConstant
333
+ unit,
334
+ gasConstant,
335
+ planckConstant
335
336
  } from './pureFunctionsAny.generated'
336
337
 
337
338
  const math = {} // NOT pure!
@@ -360,13 +361,13 @@ export const FunctionNode = createFunctionNode({ Node, SymbolNode, math })
360
361
  export const parse = createParse({ AccessorNode, ArrayNode, AssignmentNode, BlockNode, ConditionalNode, ConstantNode, FunctionAssignmentNode, FunctionNode, IndexNode, ObjectNode, OperatorNode, ParenthesisNode, RangeNode, RelationalNode, SymbolNode, config, numeric, typed })
361
362
  export const evaluate = createEvaluate({ parse, typed })
362
363
  export const Help = createHelpClass({ parse })
364
+ export const Parser = createParserClass({ parse })
365
+ export const help = createHelp({ Help, mathWithTransform, typed })
366
+ export const compile = createCompile({ parse, typed })
363
367
  export const simplify = createSimplify({ bignumber, fraction, ConstantNode, FunctionNode, OperatorNode, ParenthesisNode, SymbolNode, add, config, divide, equal, isZero, mathWithTransform, multiply, parse, pow, subtract, typed })
364
368
  export const rationalize = createRationalize({ bignumber, fraction, ConstantNode, FunctionNode, OperatorNode, ParenthesisNode, SymbolNode, add, config, divide, equal, isZero, mathWithTransform, multiply, parse, pow, simplify, subtract, typed })
365
- export const compile = createCompile({ parse, typed })
366
- export const help = createHelp({ Help, mathWithTransform, typed })
367
- export const Parser = createParserClass({ parse })
368
- export const derivative = createDerivative({ ConstantNode, FunctionNode, OperatorNode, ParenthesisNode, SymbolNode, config, equal, isZero, numeric, parse, simplify, typed })
369
369
  export const parser = createParser({ Parser, typed })
370
+ export const derivative = createDerivative({ ConstantNode, FunctionNode, OperatorNode, ParenthesisNode, SymbolNode, config, equal, isZero, numeric, parse, simplify, typed })
370
371
 
371
372
  Object.assign(math, {
372
373
  reviver,
@@ -633,21 +634,22 @@ Object.assign(math, {
633
634
  molarVolume,
634
635
  planckTime,
635
636
  thomsonCrossSection,
636
- unit,
637
+ rotate,
638
+ parse,
639
+ evaluate,
637
640
  mad,
638
641
  coulomb,
639
642
  magneticFluxQuantum,
640
643
  rydberg,
641
- parse,
642
- evaluate,
644
+ unit,
645
+ help,
646
+ gasConstant,
647
+ compile,
643
648
  simplify,
644
649
  rationalize,
650
+ parser,
645
651
  planckConstant,
646
- compile,
647
- help,
648
- gasConstant,
649
652
  derivative,
650
- parser,
651
653
  config
652
654
  })
653
655
 
@@ -277,13 +277,14 @@ import {
277
277
  createMolarVolume,
278
278
  createPlanckTime,
279
279
  createThomsonCrossSection,
280
- createUnitFunction,
280
+ createRotate,
281
281
  createMad,
282
282
  createCoulomb,
283
283
  createMagneticFluxQuantum,
284
284
  createRydberg,
285
- createPlanckConstant,
286
- createGasConstant
285
+ createUnitFunction,
286
+ createGasConstant,
287
+ createPlanckConstant
287
288
  } from '../factoriesAny'
288
289
 
289
290
  export const ResultSet = /* #__PURE__ */ createResultSet({})
@@ -559,10 +560,11 @@ export const inverseConductanceQuantum = /* #__PURE__ */ createInverseConductanc
559
560
  export const molarVolume = /* #__PURE__ */ createMolarVolume({ BigNumber, Unit, config })
560
561
  export const planckTime = /* #__PURE__ */ createPlanckTime({ BigNumber, Unit, config })
561
562
  export const thomsonCrossSection = /* #__PURE__ */ createThomsonCrossSection({ BigNumber, Unit, config })
562
- export const unit = /* #__PURE__ */ createUnitFunction({ Unit, typed })
563
+ export const rotate = /* #__PURE__ */ createRotate({ multiply, rotationMatrix, typed })
563
564
  export const mad = /* #__PURE__ */ createMad({ abs, map, median, subtract, typed })
564
565
  export const coulomb = /* #__PURE__ */ createCoulomb({ BigNumber, Unit, config })
565
566
  export const magneticFluxQuantum = /* #__PURE__ */ createMagneticFluxQuantum({ BigNumber, Unit, config })
566
567
  export const rydberg = /* #__PURE__ */ createRydberg({ BigNumber, Unit, config })
567
- export const planckConstant = /* #__PURE__ */ createPlanckConstant({ BigNumber, Unit, config })
568
+ export const unit = /* #__PURE__ */ createUnitFunction({ Unit, typed })
568
569
  export const gasConstant = /* #__PURE__ */ createGasConstant({ BigNumber, Unit, config })
570
+ export const planckConstant = /* #__PURE__ */ createPlanckConstant({ BigNumber, Unit, config })
@@ -215,6 +215,7 @@ import { numericDocs } from './function/utils/numeric'
215
215
  import { columnDocs } from './function/matrix/column'
216
216
  import { rowDocs } from './function/matrix/row'
217
217
  import { rotationMatrixDocs } from './function/matrix/rotationMatrix'
218
+ import { rotateDocs } from './function/matrix/rotate'
218
219
 
219
220
  export const embeddedDocs = {
220
221
 
@@ -427,6 +428,7 @@ export const embeddedDocs = {
427
428
  range: rangeDocs,
428
429
  resize: resizeDocs,
429
430
  reshape: reshapeDocs,
431
+ rotate: rotateDocs,
430
432
  rotationMatrix: rotationMatrixDocs,
431
433
  row: rowDocs,
432
434
  size: sizeDocs,
@@ -0,0 +1,19 @@
1
+ export const rotateDocs = {
2
+ name: 'rotate',
3
+ category: 'Matrix',
4
+ syntax: [
5
+ 'rotate(w, theta)',
6
+ 'rotate(w, theta, v)'
7
+ ],
8
+ description: 'Returns a 2-D rotation matrix (2x2) for a given angle (in radians). ' +
9
+ 'Returns a 2-D rotation matrix (3x3) of a given angle (in radians) around given axis.',
10
+ examples: [
11
+ 'rotate([1, 0], math.pi / 2)',
12
+ 'rotate(matrix([1, 0]), unit("35deg"))',
13
+ 'rotate([1, 0, 0], unit("90deg"), [0, 0, 1])',
14
+ 'rotate(matrix([1, 0, 0]), unit("90deg"), matrix([0, 0, 1]))'
15
+ ],
16
+ seealso: [
17
+ 'matrix', 'rotationMatrix'
18
+ ]
19
+ }
@@ -287,7 +287,7 @@ export const createFunctionNode = /* #__PURE__ */ factory(name, dependencies, ({
287
287
 
288
288
  // Match everything of the form ${identifier} or ${identifier[2]} or $$
289
289
  // while submatching identifier and 2 (in the second case)
290
- const regex = new RegExp('\\$(?:\\{([a-z_][a-z_0-9]*)(?:\\[([0-9]+)\\])?\\}|\\$)', 'ig')
290
+ const regex = /\$(?:\{([a-z_][a-z_0-9]*)(?:\[([0-9]+)\])?\}|\$)/gi
291
291
 
292
292
  let inputPos = 0 // position in the input string
293
293
  let match
@@ -115,7 +115,8 @@ export const createNode = /* #__PURE__ */ factory(name, dependencies, ({ mathWit
115
115
  */
116
116
  Node.prototype.traverse = function (callback) {
117
117
  // execute callback for itself
118
- callback(this, null, null) // eslint-disable-line standard/no-callback-literal
118
+ // eslint-disable-next-line
119
+ callback(this, null, null)
119
120
 
120
121
  // recursively traverse over all childs of a node
121
122
  function _traverse (node, callback) {
@@ -78,6 +78,7 @@ export { createOnes } from './function/matrix/ones'
78
78
  export { createRange } from './function/matrix/range'
79
79
  export { createReshape } from './function/matrix/reshape'
80
80
  export { createResize } from './function/matrix/resize'
81
+ export { createRotate } from './function/matrix/rotate'
81
82
  export { createRotationMatrix } from './function/matrix/rotationMatrix'
82
83
  export { createRow } from './function/matrix/row'
83
84
  export { createSize } from './function/matrix/size'
@@ -0,0 +1,79 @@
1
+ import { factory } from '../../utils/factory'
2
+ import { arraySize } from '../../utils/array'
3
+
4
+ const name = 'rotate'
5
+ const dependencies = [
6
+ 'typed',
7
+ 'multiply',
8
+ 'rotationMatrix'
9
+ ]
10
+
11
+ export const createRotate = /* #__PURE__ */ factory(name, dependencies, (
12
+ {
13
+ typed, multiply, rotationMatrix
14
+ }) => {
15
+ /**
16
+ * Rotate a vector of size 1x2 counter-clockwise by a given angle
17
+ * Rotate a vector of size 1x3 counter-clockwise by a given angle around the given axis
18
+ *
19
+ * Syntax:
20
+ *
21
+ * math.rotate(w, theta)
22
+ * math.rotate(w, theta, v)
23
+ *
24
+ * Examples:
25
+ *
26
+ * math.rotate([11, 12], math.pi / 2) // returns matrix([-12, 11])
27
+ * math.rotate(matrix([11, 12]), math.pi / 2) // returns matrix([-12, 11])
28
+ *
29
+ * math.rotate([1, 0, 0], unit('90deg'), [0, 0, 1]) // returns matrix([0, 1, 0])
30
+ * math.rotate(matrix([1, 0, 0]), unit('90deg'), [0, 0, 1]) // returns matrix([0, 1, 0])
31
+ *
32
+ * math.rotate([1, 0], math.complex(1 + i)) // returns matrix([cos(1 + i) - sin(1 + i), sin(1 + i) + cos(1 + i)])
33
+ *
34
+ * See also:
35
+ *
36
+ * matrix, rotationMatrix
37
+ *
38
+ * @param {Array | Matrix} w Vector to rotate
39
+ * @param {number | BigNumber | Complex | Unit} theta Rotation angle
40
+ * @param {Array | Matrix} [v] Rotation axis
41
+ * @return {Array | Matrix} Multiplication of the rotation matrix and w
42
+ */
43
+ return typed(name, {
44
+ 'Array , number | BigNumber | Complex | Unit': function (w, theta) {
45
+ _validateSize(w, 2)
46
+ const matrixRes = multiply(rotationMatrix(theta), w)
47
+ return matrixRes.toArray()
48
+ },
49
+
50
+ 'Matrix , number | BigNumber | Complex | Unit': function (w, theta) {
51
+ _validateSize(w, 2)
52
+ return multiply(rotationMatrix(theta), w)
53
+ },
54
+
55
+ 'Array, number | BigNumber | Complex | Unit, Array | Matrix': function (w, theta, v) {
56
+ _validateSize(w, 3)
57
+ const matrixRes = multiply(rotationMatrix(theta, v), w)
58
+ return matrixRes
59
+ },
60
+
61
+ 'Matrix, number | BigNumber | Complex | Unit, Array | Matrix': function (w, theta, v) {
62
+ _validateSize(w, 3)
63
+ return multiply(rotationMatrix(theta, v), w)
64
+ }
65
+ })
66
+
67
+ function _validateSize (v, expectedSize) {
68
+ const actualSize = Array.isArray(v) ? arraySize(v) : v.size()
69
+ if (actualSize.length > 2) {
70
+ throw new RangeError(`Vector must be of dimensions 1x${expectedSize}`)
71
+ }
72
+ if (actualSize.length === 2 && actualSize[1] !== 1) {
73
+ throw new RangeError(`Vector must be of dimensions 1x${expectedSize}`)
74
+ }
75
+ if (actualSize[0] !== expectedSize) {
76
+ throw new RangeError(`Vector must be of dimensions 1x${expectedSize}`)
77
+ }
78
+ }
79
+ })
@@ -37,7 +37,7 @@ export const createRotationMatrix = /* #__PURE__ */ factory(name, dependencies,
37
37
  * Examples:
38
38
  *
39
39
  * math.rotationMatrix(math.pi / 2) // returns [[0, -1], [1, 0]]
40
- * math.rotationMatrix(math.bignumber(45)) // returns [[ bignumber(1 / sqrt(2)), - bignumber(1 / sqrt(2))], [ bignumber(1 / sqrt(2)), bignumber(1 / sqrt(2))]]
40
+ * math.rotationMatrix(math.bignumber(1)) // returns [[bignumber(cos(1)), bignumber(-sin(1))], [bignumber(sin(1)), bignumber(cos(1))]]
41
41
  * math.rotationMatrix(math.complex(1 + i)) // returns [[cos(1 + i), -sin(1 + i)], [sin(1 + i), cos(1 + i)]]
42
42
  * math.rotationMatrix(math.unit('1rad')) // returns [[cos(1), -sin(1)], [sin(1), cos(1)]]
43
43
  *
@@ -76,12 +76,13 @@ export const createRotationMatrix = /* #__PURE__ */ factory(name, dependencies,
76
76
  'number | BigNumber | Complex | Unit, Array': function (theta, v) {
77
77
  const matrixV = matrix(v)
78
78
  _validateVector(matrixV)
79
- return _rotationMatrix3x3(theta, matrixV, config.matrix === 'Matrix' ? 'dense' : undefined)
79
+ return _rotationMatrix3x3(theta, matrixV, undefined)
80
80
  },
81
81
 
82
82
  'number | BigNumber | Complex | Unit, Matrix': function (theta, v) {
83
83
  _validateVector(v)
84
- return _rotationMatrix3x3(theta, v, config.matrix === 'Matrix' ? 'dense' : undefined)
84
+ const storageType = v.storage() || (config.matrix === 'Matrix' ? 'dense' : undefined)
85
+ return _rotationMatrix3x3(theta, v, storageType)
85
86
  },
86
87
 
87
88
  'number | BigNumber | Complex | Unit, Array, string': function (theta, v, format) {
@@ -152,7 +153,7 @@ export const createRotationMatrix = /* #__PURE__ */ factory(name, dependencies,
152
153
  function _rotationMatrix3x3 (theta, v, format) {
153
154
  const normV = norm(v)
154
155
  if (normV === 0) {
155
- return _convertToFormat([], format)
156
+ throw new RangeError('Rotation around zero vector')
156
157
  }
157
158
 
158
159
  const Big = isBigNumber(theta) ? BigNumber : null
@@ -1,3 +1,5 @@
1
+ /* eslint-disable no-loss-of-precision */
2
+
1
3
  import { deepMap } from '../../utils/collection'
2
4
  import { sign } from '../../utils/number'
3
5
  import { factory } from '../../utils/factory'
@@ -2,4 +2,4 @@
2
2
  export const pi = Math.PI
3
3
  export const tau = 2 * Math.PI
4
4
  export const e = Math.E
5
- export const phi = 1.61803398874989484820458683436563811772030917980576286213545
5
+ export const phi = 1.6180339887498948 // eslint-disable-line no-loss-of-precision
@@ -1,3 +1,5 @@
1
+ /* eslint-disable no-loss-of-precision */
2
+
1
3
  import { isInteger } from '../../utils/number'
2
4
  import { product } from '../../utils/product'
3
5
 
@@ -216,20 +216,15 @@ export const createUnitClass = /* #__PURE__ */ factory(name, dependencies, ({
216
216
  let unitName = ''
217
217
 
218
218
  // Alphanumeric characters only; matches [a-zA-Z0-9]
219
- let code = text.charCodeAt(index)
220
- while ((code >= 48 && code <= 57) ||
221
- (code >= 65 && code <= 90) ||
222
- (code >= 97 && code <= 122)) {
219
+ while (isDigit(c) || Unit.isValidAlpha(c)) {
223
220
  unitName += c
224
221
  next()
225
- code = text.charCodeAt(index)
226
222
  }
227
223
 
228
224
  // Must begin with [a-zA-Z]
229
- code = unitName.charCodeAt(0)
230
- if ((code >= 65 && code <= 90) ||
231
- (code >= 97 && code <= 122)) {
232
- return unitName || null
225
+ const firstC = unitName.charAt(0)
226
+ if (Unit.isValidAlpha(firstC)) {
227
+ return unitName
233
228
  } else {
234
229
  return null
235
230
  }
@@ -1103,7 +1098,8 @@ export const createUnitClass = /* #__PURE__ */ factory(name, dependencies, ({
1103
1098
  // Simplfy the unit list, unless it is valueless or was created directly in the
1104
1099
  // constructor or as the result of to or toSI
1105
1100
  const simp = this.skipAutomaticSimplification || this.value === null
1106
- ? this.clone() : this.simplify()
1101
+ ? this.clone()
1102
+ : this.simplify()
1107
1103
 
1108
1104
  // Apply some custom logic for handling VA and VAR. The goal is to express the value of the unit as a real value, if possible. Otherwise, use a real-valued unit instead of a complex-valued one.
1109
1105
  let isImaginary = false
@@ -3030,21 +3026,22 @@ export const createUnitClass = /* #__PURE__ */ factory(name, dependencies, ({
3030
3026
  }
3031
3027
  }
3032
3028
 
3029
+ /**
3030
+ * Checks if a character is a valid latin letter (upper or lower case).
3031
+ * Note that this function can be overridden, for example to allow support of other alphabets.
3032
+ * @param {string} c Tested character
3033
+ */
3034
+ Unit.isValidAlpha = function isValidAlpha (c) {
3035
+ return /^[a-zA-Z]$/.test(c)
3036
+ }
3037
+
3033
3038
  function assertUnitNameIsValid (name) {
3034
3039
  for (let i = 0; i < name.length; i++) {
3035
- const c = name.charAt(i)
3036
-
3037
- const isValidAlpha = function (p) {
3038
- return /^[a-zA-Z]$/.test(p)
3039
- }
3040
-
3041
- const isDigit = function (c) {
3042
- return (c >= '0' && c <= '9')
3043
- }
3040
+ c = name.charAt(i)
3044
3041
 
3045
- if (i === 0 && !isValidAlpha(c)) { throw new Error('Invalid unit name (must begin with alpha character): "' + name + '"') }
3042
+ if (i === 0 && !Unit.isValidAlpha(c)) { throw new Error('Invalid unit name (must begin with alpha character): "' + name + '"') }
3046
3043
 
3047
- if (i > 0 && !(isValidAlpha(c) ||
3044
+ if (i > 0 && !(Unit.isValidAlpha(c) ||
3048
3045
  isDigit(c))) { throw new Error('Invalid unit name (only alphanumeric characters are allowed): "' + name + '"') }
3049
3046
  }
3050
3047
  }
package/src/version.js CHANGED
@@ -1,3 +1,3 @@
1
- export const version = '7.5.1'
1
+ export const version = '7.6.0'
2
2
  // Note: This file is automatically generated when building math.js.
3
3
  // Changes made in this file will be overwritten.