From c241d2f90b6901c616368507a9345d7664c33c3f Mon Sep 17 00:00:00 2001 From: Matt C Date: Wed, 3 Jan 2018 11:26:31 +0000 Subject: [PATCH 1/6] Adds basic BigNumber type support Fixes `To Base` & `From Base` issues as reported on twitter --- package-lock.json | 917 +---------------------------- package.json | 1 + src/core/Dish.js | 46 +- src/core/config/OperationConfig.js | 4 +- src/core/operations/Base.js | 11 +- 5 files changed, 47 insertions(+), 932 deletions(-) diff --git a/package-lock.json b/package-lock.json index afc07887..b4b3164d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1053,6 +1053,11 @@ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", "dev": true }, + "bignumber.js": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-KWTu6ZMVk9sxlDJQh2YH1UOnfDP8O8TpxUxgQG/vKASoSnEjK9aVuOueFaPcQEYQ5fyNXNTOYwYw3099RYebWg==" + }, "binary-extensions": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", @@ -1407,7 +1412,6 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", - "fsevents": "1.1.3", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -3334,910 +3338,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.8.0", - "node-pre-gyp": "0.6.39" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -6462,13 +5562,6 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, - "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", - "dev": true, - "optional": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", diff --git a/package.json b/package.json index fe524dfa..c90bf420 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ }, "dependencies": { "babel-polyfill": "^6.26.0", + "bignumber.js": "^5.0.0", "bootstrap": "^3.3.7", "bootstrap-colorpicker": "^2.5.2", "bootstrap-switch": "^3.3.4", diff --git a/src/core/Dish.js b/src/core/Dish.js index 001f78e1..d5f2c492 100755 --- a/src/core/Dish.js +++ b/src/core/Dish.js @@ -1,14 +1,16 @@ import Utils from "./Utils.js"; +import BigNumber from "bignumber.js"; /** * The data being operated on by each operation. * * @author n1474335 [n1474335@gmail.com] + * @author Matt C [matt@artemisbot.uk] * @copyright Crown Copyright 2016 * @license Apache-2.0 * * @class - * @param {byteArray|string|number|ArrayBuffer} value - The value of the input data. + * @param {byteArray|string|number|ArrayBuffer|BigNumber} value - The value of the input data. * @param {number} type - The data type of value, see Dish enums. */ const Dish = function(value, type) { @@ -47,6 +49,12 @@ Dish.HTML = 3; * @enum */ Dish.ARRAY_BUFFER = 4; +/** + * Dish data type enum for BigNumbers. + * @readonly + * @enum + */ +Dish.BIG_NUMBER = 5; /** @@ -57,22 +65,22 @@ Dish.ARRAY_BUFFER = 4; * @returns {number} The data type enum value. */ Dish.typeEnum = function(typeStr) { - switch (typeStr) { - case "byteArray": - case "Byte array": + switch (typeStr.toLowerCase()) { + case "bytearray": + case "byte array": return Dish.BYTE_ARRAY; case "string": - case "String": return Dish.STRING; case "number": - case "Number": return Dish.NUMBER; case "html": - case "HTML": return Dish.HTML; - case "arrayBuffer": - case "ArrayBuffer": + case "arraybuffer": + case "array buffer": return Dish.ARRAY_BUFFER; + case "bignumber": + case "big number": + return Dish.BIG_NUMBER; default: throw "Invalid data type string. No matching enum."; } @@ -83,8 +91,8 @@ Dish.typeEnum = function(typeStr) { * Returns the data type string for the given type enum. * * @static - * @param {string} typeEnum - The enum value of the data type. - * @returns {number} The data type as a string. + * @param {number} typeEnum - The enum value of the data type. + * @returns {string} The data type as a string. */ Dish.enumLookup = function(typeEnum) { switch (typeEnum) { @@ -98,6 +106,8 @@ Dish.enumLookup = function(typeEnum) { return "html"; case Dish.ARRAY_BUFFER: return "ArrayBuffer"; + case Dish.BIG_NUMBER: + return "BigNumber"; default: throw "Invalid data type enum. No matching type."; } @@ -107,7 +117,7 @@ Dish.enumLookup = function(typeEnum) { /** * Sets the data value and type and then validates them. * - * @param {byteArray|string|number|ArrayBuffer} value - The value of the input data. + * @param {byteArray|string|number|ArrayBuffer|BigNumber} value - The value of the input data. * @param {number} type - The data type of value, see Dish enums. */ Dish.prototype.set = function(value, type) { @@ -126,7 +136,7 @@ Dish.prototype.set = function(value, type) { * Returns the value of the data in the type format specified. * * @param {number} type - The data type of value, see Dish enums. - * @returns {byteArray|string|number|ArrayBuffer} The value of the output data. + * @returns {byteArray|string|number|ArrayBuffer|BigNumber} The value of the output data. */ Dish.prototype.get = function(type) { if (this.type !== type) { @@ -159,6 +169,9 @@ Dish.prototype.translate = function(toType) { // Array.from() would be nicer here, but it's slightly slower this.value = Array.prototype.slice.call(new Uint8Array(this.value)); break; + case Dish.BIG_NUMBER: + this.value = this.value instanceof BigNumber ? Utils.strToByteArray(this.value.toString()) : []; + break; default: break; } @@ -180,6 +193,10 @@ Dish.prototype.translate = function(toType) { this.value = new Uint8Array(this.value).buffer; this.type = Dish.ARRAY_BUFFER; break; + case Dish.BIG_NUMBER: + this.value = new BigNumber(Utils.byteArrayToUtf8(this.value)); + this.type = Dish.BIG_NUMBER; + break; default: break; } @@ -215,6 +232,8 @@ Dish.prototype.valid = function() { return typeof this.value === "number"; case Dish.ARRAY_BUFFER: return this.value instanceof ArrayBuffer; + case Dish.BIG_NUMBER: + return this.value instanceof BigNumber; default: return false; } @@ -235,6 +254,7 @@ Dish.prototype.size = function() { case Dish.HTML: return this.value.length; case Dish.NUMBER: + case Dish.BIG_NUMBER: return this.value.toString().length; case Dish.ARRAY_BUFFER: return this.value.byteLength; diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index 43e06c31..26a8e678 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -806,7 +806,7 @@ const OperationConfig = { module: "Default", description: "Converts a number to decimal from a given numerical base.", inputType: "string", - outputType: "number", + outputType: "BigNumber", args: [ { name: "Radix", @@ -818,7 +818,7 @@ const OperationConfig = { "To Base": { module: "Default", description: "Converts a decimal number to a given numerical base.", - inputType: "number", + inputType: "BigNumber", outputType: "string", args: [ { diff --git a/src/core/operations/Base.js b/src/core/operations/Base.js index 8a79bf3b..372a815b 100755 --- a/src/core/operations/Base.js +++ b/src/core/operations/Base.js @@ -1,3 +1,4 @@ +import BigNumber from "bignumber.js"; /** * Numerical base operations. * @@ -18,7 +19,7 @@ const Base = { /** * To Base operation. * - * @param {number} input + * @param {BigNumber} input * @param {Object[]} args * @returns {string} */ @@ -39,7 +40,7 @@ const Base = { * * @param {string} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runFrom: function(input, args) { const radix = args[0] || Base.DEFAULT_RADIX; @@ -48,14 +49,14 @@ const Base = { } let number = input.replace(/\s/g, "").split("."), - result = parseInt(number[0], radix) || 0; + result = new BigNumber(number[0], radix) || 0; if (number.length === 1) return result; // Fractional part for (let i = 0; i < number[1].length; i++) { - const digit = parseInt(number[1][i], radix); - result += digit / Math.pow(radix, i+1); + const digit = new BigNumber(number[1][i], radix); + result += digit.div(Math.pow(radix, i+1)); } return result; From 3f3e7a78eb595019433b625d4070ef5fc24f8909 Mon Sep 17 00:00:00 2001 From: n1474335 Date: Fri, 5 Jan 2018 18:04:55 +0000 Subject: [PATCH 2/6] Arithmetic operations now support BigNumbers --- package-lock.json | 912 +++++++++++++++++++++++++++++ src/core/config/OperationConfig.js | 14 +- src/core/operations/Arithmetic.js | 93 +-- 3 files changed, 966 insertions(+), 53 deletions(-) diff --git a/package-lock.json b/package-lock.json index da6a059d..a951fc89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1412,6 +1412,7 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", + "fsevents": "1.1.3", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -3338,6 +3339,910 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.8.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -5562,6 +6467,13 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "dev": true, + "optional": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index ccd6a62f..a47af9a6 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -524,7 +524,7 @@ const OperationConfig = { module: "Default", description: "Adds together a list of numbers. If an item in the string is not a number it is excluded from the list.

e.g. 0x0a 8 .5 becomes 18.5", inputType: "string", - outputType: "number", + outputType: "BigNumber", args: [ { name: "Delimiter", @@ -537,7 +537,7 @@ const OperationConfig = { module: "Default", description: "Subtracts a list of numbers. If an item in the string is not a number it is excluded from the list.

e.g. 0x0a 8 .5 becomes 1.5", inputType: "string", - outputType: "number", + outputType: "BigNumber", args: [ { name: "Delimiter", @@ -550,7 +550,7 @@ const OperationConfig = { module: "Default", description: "Multiplies a list of numbers. If an item in the string is not a number it is excluded from the list.

e.g. 0x0a 8 .5 becomes 40", inputType: "string", - outputType: "number", + outputType: "BigNumber", args: [ { name: "Delimiter", @@ -563,7 +563,7 @@ const OperationConfig = { module: "Default", description: "Divides a list of numbers. If an item in the string is not a number it is excluded from the list.

e.g. 0x0a 8 .5 becomes 2.5", inputType: "string", - outputType: "number", + outputType: "BigNumber", args: [ { name: "Delimiter", @@ -576,7 +576,7 @@ const OperationConfig = { module: "Default", description: "Computes the mean (average) of a number list. If an item in the string is not a number it is excluded from the list.

e.g. 0x0a 8 .5 .5 becomes 4.75", inputType: "string", - outputType: "number", + outputType: "BigNumber", args: [ { name: "Delimiter", @@ -589,7 +589,7 @@ const OperationConfig = { module: "Default", description: "Computes the median of a number list. If an item in the string is not a number it is excluded from the list.

e.g. 0x0a 8 1 .5 becomes 4.5", inputType: "string", - outputType: "number", + outputType: "BigNumber", args: [ { name: "Delimiter", @@ -602,7 +602,7 @@ const OperationConfig = { module: "Default", description: "Computes the standard deviation of a number list. If an item in the string is not a number it is excluded from the list.

e.g. 0x0a 8 .5 becomes 4.089281382128433", inputType: "string", - outputType: "number", + outputType: "BigNumber", args: [ { name: "Delimiter", diff --git a/src/core/operations/Arithmetic.js b/src/core/operations/Arithmetic.js index 1fe73ac1..070cea80 100644 --- a/src/core/operations/Arithmetic.js +++ b/src/core/operations/Arithmetic.js @@ -1,4 +1,5 @@ import Utils from "../Utils.js"; +import BigNumber from "bignumber.js"; /** @@ -24,11 +25,11 @@ const Arithmetic = { * * @param {string} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runSum: function(input, args) { const val = Arithmetic._sum(Arithmetic._createNumArray(input, args[0])); - return typeof(val) === "number" ? val : NaN; + return val instanceof BigNumber ? val : new BigNumber(NaN); }, @@ -37,11 +38,11 @@ const Arithmetic = { * * @param {string} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runSub: function(input, args) { let val = Arithmetic._sub(Arithmetic._createNumArray(input, args[0])); - return typeof(val) === "number" ? val : NaN; + return val instanceof BigNumber ? val : new BigNumber(NaN); }, @@ -50,11 +51,11 @@ const Arithmetic = { * * @param {string} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runMulti: function(input, args) { let val = Arithmetic._multi(Arithmetic._createNumArray(input, args[0])); - return typeof(val) === "number" ? val : NaN; + return val instanceof BigNumber ? val : new BigNumber(NaN); }, @@ -63,11 +64,11 @@ const Arithmetic = { * * @param {string} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runDiv: function(input, args) { let val = Arithmetic._div(Arithmetic._createNumArray(input, args[0])); - return typeof(val) === "number" ? val : NaN; + return val instanceof BigNumber ? val : new BigNumber(NaN); }, @@ -76,11 +77,11 @@ const Arithmetic = { * * @param {string} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runMean: function(input, args) { let val = Arithmetic._mean(Arithmetic._createNumArray(input, args[0])); - return typeof(val) === "number" ? val : NaN; + return val instanceof BigNumber ? val : new BigNumber(NaN); }, @@ -89,11 +90,11 @@ const Arithmetic = { * * @param {string} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runMedian: function(input, args) { let val = Arithmetic._median(Arithmetic._createNumArray(input, args[0])); - return typeof(val) === "number" ? val : NaN; + return val instanceof BigNumber ? val : new BigNumber(NaN); }, @@ -102,11 +103,11 @@ const Arithmetic = { * * @param {string} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runStdDev: function(input, args) { let val = Arithmetic._stdDev(Arithmetic._createNumArray(input, args[0])); - return typeof(val) === "number" ? val : NaN; + return val instanceof BigNumber ? val : new BigNumber(NaN); }, @@ -116,7 +117,7 @@ const Arithmetic = { * @private * @param {string[]} input * @param {string} delim - * @returns {number[]} + * @returns {BigNumber[]} */ _createNumArray: function(input, delim) { delim = Utils.charRep[delim || "Space"]; @@ -125,13 +126,13 @@ const Arithmetic = { num; for (let i = 0; i < splitNumbers.length; i++) { - if (splitNumbers[i].indexOf(".") >= 0) { - num = parseFloat(splitNumbers[i].trim()); - } else { - num = parseInt(splitNumbers[i].trim(), 0); - } - if (!isNaN(num)) { - numbers.push(num); + try { + num = BigNumber(splitNumbers[i].trim()); + if (!num.isNaN()) { + numbers.push(num); + } + } catch (err) { + // This line is not a valid number } } return numbers; @@ -142,12 +143,12 @@ const Arithmetic = { * Adds an array of numbers and returns the value. * * @private - * @param {number[]} data - * @returns {number} + * @param {BigNumber[]} data + * @returns {BigNumber} */ _sum: function(data) { if (data.length > 0) { - return data.reduce((acc, curr) => acc + curr); + return data.reduce((acc, curr) => acc.plus(curr)); } }, @@ -156,12 +157,12 @@ const Arithmetic = { * Subtracts an array of numbers and returns the value. * * @private - * @param {number[]} data - * @returns {number} + * @param {BigNumber[]} data + * @returns {BigNumber} */ _sub: function(data) { if (data.length > 0) { - return data.reduce((acc, curr) => acc - curr); + return data.reduce((acc, curr) => acc.minus(curr)); } }, @@ -170,12 +171,12 @@ const Arithmetic = { * Multiplies an array of numbers and returns the value. * * @private - * @param {number[]} data - * @returns {number} + * @param {BigNumber[]} data + * @returns {BigNumber} */ _multi: function(data) { if (data.length > 0) { - return data.reduce((acc, curr) => acc * curr); + return data.reduce((acc, curr) => acc.times(curr)); } }, @@ -184,12 +185,12 @@ const Arithmetic = { * Divides an array of numbers and returns the value. * * @private - * @param {number[]} data - * @returns {number} + * @param {BigNumber[]} data + * @returns {BigNumber} */ _div: function(data) { if (data.length > 0) { - return data.reduce((acc, curr) => acc / curr); + return data.reduce((acc, curr) => acc.div(curr)); } }, @@ -198,12 +199,12 @@ const Arithmetic = { * Computes mean of a number array and returns the value. * * @private - * @param {number[]} data - * @returns {number} + * @param {BigNumber[]} data + * @returns {BigNumber} */ _mean: function(data) { if (data.length > 0) { - return Arithmetic._sum(data) / data.length; + return Arithmetic._sum(data).div(data.length); } }, @@ -212,14 +213,14 @@ const Arithmetic = { * Computes median of a number array and returns the value. * * @private - * @param {number[]} data - * @returns {number} + * @param {BigNumber[]} data + * @returns {BigNumber} */ _median: function (data) { - if ((data.length % 2) === 0) { + if ((data.length % 2) === 0 && data.length > 0) { let first, second; data.sort(function(a, b){ - return a - b; + return a.minus(b); }); first = data[Math.floor(data.length / 2)]; second = data[Math.floor(data.length / 2) - 1]; @@ -234,17 +235,17 @@ const Arithmetic = { * Computes standard deviation of a number array and returns the value. * * @private - * @param {number[]} data - * @returns {number} + * @param {BigNumber[]} data + * @returns {BigNumber} */ _stdDev: function (data) { if (data.length > 0) { let avg = Arithmetic._mean(data); - let devSum = 0; + let devSum = new BigNumber(0); for (let i = 0; i < data.length; i++) { - devSum += (data[i] - avg) ** 2; + devSum = devSum.plus(data[i].minus(avg).pow(2)); } - return Math.sqrt(devSum / data.length); + return devSum.div(data.length).sqrt(); } }, }; From 7992a540aec46a4671f93602a6f32daa1dfb59f3 Mon Sep 17 00:00:00 2001 From: n1474335 Date: Fri, 5 Jan 2018 18:14:03 +0000 Subject: [PATCH 3/6] Conversion operations now support BigNumbers --- src/core/config/OperationConfig.js | 20 +++++++-------- src/core/operations/Convert.js | 41 +++++++++++++++--------------- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index a47af9a6..273b6c76 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -2515,8 +2515,8 @@ const OperationConfig = { "Convert distance": { module: "Default", description: "Converts a unit of distance to another format.", - inputType: "number", - outputType: "number", + inputType: "BigNumber", + outputType: "BigNumber", args: [ { name: "Input units", @@ -2533,8 +2533,8 @@ const OperationConfig = { "Convert area": { module: "Default", description: "Converts a unit of area to another format.", - inputType: "number", - outputType: "number", + inputType: "BigNumber", + outputType: "BigNumber", args: [ { name: "Input units", @@ -2551,8 +2551,8 @@ const OperationConfig = { "Convert mass": { module: "Default", description: "Converts a unit of mass to another format.", - inputType: "number", - outputType: "number", + inputType: "BigNumber", + outputType: "BigNumber", args: [ { name: "Input units", @@ -2569,8 +2569,8 @@ const OperationConfig = { "Convert speed": { module: "Default", description: "Converts a unit of speed to another format.", - inputType: "number", - outputType: "number", + inputType: "BigNumber", + outputType: "BigNumber", args: [ { name: "Input units", @@ -2587,8 +2587,8 @@ const OperationConfig = { "Convert data units": { module: "Default", description: "Converts a unit of data to another format.", - inputType: "number", - outputType: "number", + inputType: "BigNumber", + outputType: "BigNumber", args: [ { name: "Input units", diff --git a/src/core/operations/Convert.js b/src/core/operations/Convert.js index 2c95253d..d47166ce 100755 --- a/src/core/operations/Convert.js +++ b/src/core/operations/Convert.js @@ -60,17 +60,16 @@ const Convert = { /** * Convert distance operation. * - * @param {number} input + * @param {BigNumber} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runDistance: function (input, args) { let inputUnits = args[0], outputUnits = args[1]; - input = input * Convert.DISTANCE_FACTOR[inputUnits]; - return input / Convert.DISTANCE_FACTOR[outputUnits]; - // TODO Remove rounding errors (e.g. 1.000000000001) + input = input.mul(Convert.DISTANCE_FACTOR[inputUnits]); + return input.div(Convert.DISTANCE_FACTOR[outputUnits]); }, @@ -141,16 +140,16 @@ const Convert = { /** * Convert data units operation. * - * @param {number} input + * @param {BigNumber} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runDataSize: function (input, args) { let inputUnits = args[0], outputUnits = args[1]; - input = input * Convert.DATA_FACTOR[inputUnits]; - return input / Convert.DATA_FACTOR[outputUnits]; + input = input.mul(Convert.DATA_FACTOR[inputUnits]); + return input.div(Convert.DATA_FACTOR[outputUnits]); }, @@ -221,16 +220,16 @@ const Convert = { /** * Convert area operation. * - * @param {number} input + * @param {BigNumber} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runArea: function (input, args) { let inputUnits = args[0], outputUnits = args[1]; - input = input * Convert.AREA_FACTOR[inputUnits]; - return input / Convert.AREA_FACTOR[outputUnits]; + input = input.mul(Convert.AREA_FACTOR[inputUnits]); + return input.div(Convert.AREA_FACTOR[outputUnits]); }, @@ -332,16 +331,16 @@ const Convert = { /** * Convert mass operation. * - * @param {number} input + * @param {BigNumber} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runMass: function (input, args) { let inputUnits = args[0], outputUnits = args[1]; - input = input * Convert.MASS_FACTOR[inputUnits]; - return input / Convert.MASS_FACTOR[outputUnits]; + input = input.mul(Convert.MASS_FACTOR[inputUnits]); + return input.div(Convert.MASS_FACTOR[outputUnits]); }, @@ -397,16 +396,16 @@ const Convert = { /** * Convert speed operation. * - * @param {number} input + * @param {BigNumber} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runSpeed: function (input, args) { let inputUnits = args[0], outputUnits = args[1]; - input = input * Convert.SPEED_FACTOR[inputUnits]; - return input / Convert.SPEED_FACTOR[outputUnits]; + input = input.mul(Convert.SPEED_FACTOR[inputUnits]); + return input.div(Convert.SPEED_FACTOR[outputUnits]); }, }; From 283d3e1e7b4cbae0ef39a91a749c3552be62d6cc Mon Sep 17 00:00:00 2001 From: n1474335 Date: Fri, 5 Jan 2018 18:20:06 +0000 Subject: [PATCH 4/6] Blank BigNumber dishes are now treat as NaN instead of erroring --- src/core/Dish.js | 6 +++++- src/core/operations/Base.js | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/core/Dish.js b/src/core/Dish.js index d5f2c492..8ab00eac 100755 --- a/src/core/Dish.js +++ b/src/core/Dish.js @@ -194,7 +194,11 @@ Dish.prototype.translate = function(toType) { this.type = Dish.ARRAY_BUFFER; break; case Dish.BIG_NUMBER: - this.value = new BigNumber(Utils.byteArrayToUtf8(this.value)); + try { + this.value = new BigNumber(Utils.byteArrayToUtf8(this.value)); + } catch (err) { + this.value = new BigNumber(NaN); + } this.type = Dish.BIG_NUMBER; break; default: diff --git a/src/core/operations/Base.js b/src/core/operations/Base.js index 372a815b..06bbeb7c 100755 --- a/src/core/operations/Base.js +++ b/src/core/operations/Base.js @@ -1,4 +1,5 @@ import BigNumber from "bignumber.js"; + /** * Numerical base operations. * From 53eba2337c4ad39129e65ac1219a98de66b83d6d Mon Sep 17 00:00:00 2001 From: n1474335 Date: Fri, 5 Jan 2018 18:38:23 +0000 Subject: [PATCH 5/6] BCD operations now support BigNumbers --- src/core/config/OperationConfig.js | 4 ++-- src/core/operations/BCD.js | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index 273b6c76..8b3b61ff 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -3750,7 +3750,7 @@ const OperationConfig = { module: "Default", description: "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign.", inputType: "string", - outputType: "number", + outputType: "BigNumber", args: [ { name: "Scheme", @@ -3778,7 +3778,7 @@ const OperationConfig = { "To BCD": { module: "Default", description: "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign", - inputType: "number", + inputType: "BigNumber", outputType: "string", args: [ { diff --git a/src/core/operations/BCD.js b/src/core/operations/BCD.js index d3efbc71..7d29f4e5 100755 --- a/src/core/operations/BCD.js +++ b/src/core/operations/BCD.js @@ -1,4 +1,5 @@ import Utils from "../Utils.js"; +import BigNumber from "bignumber.js"; /** @@ -61,14 +62,14 @@ const BCD = { /** * To BCD operation. * - * @param {number} input + * @param {BigNumber} input * @param {Object[]} args * @returns {string} */ runToBCD: function(input, args) { - if (isNaN(input)) + if (input.isNaN()) return "Invalid input"; - if (Math.floor(input) !== input) + if (!input.floor().equals(input)) return "Fractional values are not supported by BCD"; const encoding = BCD.ENCODING_LOOKUP[args[0]], @@ -77,7 +78,7 @@ const BCD = { outputFormat = args[3]; // Split input number up into separate digits - const digits = input.toString().split(""); + const digits = input.toFixed().split(""); if (digits[0] === "-" || digits[0] === "+") { digits.shift(); @@ -152,7 +153,7 @@ const BCD = { * * @param {string} input * @param {Object[]} args - * @returns {number} + * @returns {BigNumber} */ runFromBCD: function(input, args) { const encoding = BCD.ENCODING_LOOKUP[args[0]], @@ -206,7 +207,7 @@ const BCD = { output += val.toString(); }); - return parseInt(output, 10); + return new BigNumber(output); }, }; From 0586fa0e0153777e80ff251188b103e1bd929fe3 Mon Sep 17 00:00:00 2001 From: n1474335 Date: Fri, 5 Jan 2018 18:49:51 +0000 Subject: [PATCH 6/6] Fixed failing Fork test that required an error. --- test/tests/operations/FlowControl.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/tests/operations/FlowControl.js b/test/tests/operations/FlowControl.js index 04ed93eb..51b21f34 100644 --- a/test/tests/operations/FlowControl.js +++ b/test/tests/operations/FlowControl.js @@ -37,7 +37,7 @@ TestRegister.addTests([ }, { name: "Fork, (expect) Error, Merge", - input: "1\n2\na\n4", + input: "1.1\n2.5\na\n3.4", expectedError: true, recipeConfig: [ { @@ -45,8 +45,8 @@ TestRegister.addTests([ args: ["\n", "\n", false], }, { - op: "To Base", - args: [16], + op: "Object Identifier to Hex", + args: [], }, { op: "Merge",