This is an automated email from the ASF dual-hosted git repository.

johnbodley pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new 3a023392e6 fix: invalid float number format by json-bigint (#21996)
3a023392e6 is described below

commit 3a023392e6bfec9660449b7b739530574d2a8238
Author: JUST.in DO IT <[email protected]>
AuthorDate: Wed Nov 2 01:04:17 2022 -0700

    fix: invalid float number format by json-bigint (#21996)
---
 superset-frontend/package-lock.json                | 52 +++++++++++++++++-----
 superset-frontend/package.json                     |  3 +-
 .../packages/superset-ui-core/package.json         |  2 +-
 .../src/connection/callApi/parseResponse.ts        |  9 +++-
 .../test/connection/callApi/parseResponse.test.ts  | 22 +++++----
 .../src/components/FilterableTable/index.tsx       |  2 +-
 6 files changed, 66 insertions(+), 24 deletions(-)

diff --git a/superset-frontend/package-lock.json 
b/superset-frontend/package-lock.json
index c196947a14..4174d104aa 100644
--- a/superset-frontend/package-lock.json
+++ b/superset-frontend/package-lock.json
@@ -80,7 +80,7 @@
         "jquery": "^3.5.1",
         "js-levenshtein": "^1.1.6",
         "js-yaml-loader": "^1.2.2",
-        "json-bigint-native": "^1.2.0",
+        "json-bigint": "^1.0.0",
         "json-stringify-pretty-compact": "^2.0.0",
         "lodash": "^4.17.21",
         "lodash-es": "^4.17.21",
@@ -183,6 +183,7 @@
         "@types/jest": "^26.0.3",
         "@types/jquery": "^3.5.8",
         "@types/js-levenshtein": "^1.1.0",
+        "@types/json-bigint": "^1.0.1",
         "@types/react": "^16.9.43",
         "@types/react-dom": "^16.9.8",
         "@types/react-gravatar": "^2.6.8",
@@ -18196,6 +18197,11 @@
       "integrity": 
"sha512-14t0v1ICYRtRVcHASzes0v/O+TIeASb8aD55cWF1PidtInhFWSXcmhzhHqGjUWf9SUq1w70cvd1cWKUULubAfQ==",
       "dev": true
     },
+    "node_modules/@types/json-bigint": {
+      "version": "1.0.1",
+      "resolved": 
"https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.1.tgz";,
+      "integrity": 
"sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw=="
+    },
     "node_modules/@types/json-schema": {
       "version": "7.0.9",
       "resolved": 
"https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz";,
@@ -21823,6 +21829,14 @@
         "node": "*"
       }
     },
+    "node_modules/bignumber.js": {
+      "version": "9.0.0",
+      "resolved": 
"https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz";,
+      "integrity": 
"sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==",
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/bin-links": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-2.3.0.tgz";,
@@ -37490,10 +37504,13 @@
         "node": ">=4"
       }
     },
-    "node_modules/json-bigint-native": {
-      "version": "1.2.0",
-      "resolved": 
"https://registry.npmjs.org/json-bigint-native/-/json-bigint-native-1.2.0.tgz";,
-      "integrity": 
"sha512-qC9EtJsyULhbwC2KEYoR8sRsC+PH7VwwPdxU6+CZTZxMtM23zlxCfhIa+6Sn74FQ4VqDqWUaHaBeU0bMUTU9jQ=="
+    "node_modules/json-bigint": {
+      "version": "1.0.0",
+      "resolved": 
"https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz";,
+      "integrity": 
"sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+      "dependencies": {
+        "bignumber.js": "^9.0.0"
+      }
     },
     "node_modules/json-bignum": {
       "version": "0.0.3",
@@ -54752,6 +54769,7 @@
         "@types/d3-time-format": "^2.1.0",
         "@types/enzyme": "^3.10.5",
         "@types/fetch-mock": "^7.3.3",
+        "@types/json-bigint": "^1.0.1",
         "@types/lodash": "^4.14.149",
         "@types/math-expression-evaluator": "^1.2.1",
         "@types/node": "^18.0.0",
@@ -54767,7 +54785,6 @@
         "d3-time-format": "^2.2.0",
         "fetch-retry": "^4.0.1",
         "jed": "^1.1.1",
-        "json-bigint-native": "^1.2.0",
         "lodash": "^4.17.11",
         "math-expression-evaluator": "^1.3.8",
         "pretty-ms": "^7.0.0",
@@ -69154,6 +69171,7 @@
         "@types/d3-time-format": "^2.1.0",
         "@types/enzyme": "^3.10.5",
         "@types/fetch-mock": "^7.3.3",
+        "@types/json-bigint": "^1.0.1",
         "@types/lodash": "^4.14.149",
         "@types/math-expression-evaluator": "^1.2.1",
         "@types/node": "^18.0.0",
@@ -69171,7 +69189,6 @@
         "fetch-retry": "^4.0.1",
         "jed": "^1.1.1",
         "jest-mock-console": "^1.0.0",
-        "json-bigint-native": "^1.2.0",
         "lodash": "^4.17.11",
         "math-expression-evaluator": "^1.3.8",
         "pretty-ms": "^7.0.0",
@@ -71033,6 +71050,11 @@
       "integrity": 
"sha512-14t0v1ICYRtRVcHASzes0v/O+TIeASb8aD55cWF1PidtInhFWSXcmhzhHqGjUWf9SUq1w70cvd1cWKUULubAfQ==",
       "dev": true
     },
+    "@types/json-bigint": {
+      "version": "1.0.1",
+      "resolved": 
"https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.1.tgz";,
+      "integrity": 
"sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw=="
+    },
     "@types/json-schema": {
       "version": "7.0.9",
       "resolved": 
"https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz";,
@@ -73958,6 +73980,11 @@
       "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz";,
       "integrity": 
"sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
     },
+    "bignumber.js": {
+      "version": "9.0.0",
+      "resolved": 
"https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz";,
+      "integrity": 
"sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="
+    },
     "bin-links": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-2.3.0.tgz";,
@@ -86034,10 +86061,13 @@
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz";,
       "integrity": 
"sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
     },
-    "json-bigint-native": {
-      "version": "1.2.0",
-      "resolved": 
"https://registry.npmjs.org/json-bigint-native/-/json-bigint-native-1.2.0.tgz";,
-      "integrity": 
"sha512-qC9EtJsyULhbwC2KEYoR8sRsC+PH7VwwPdxU6+CZTZxMtM23zlxCfhIa+6Sn74FQ4VqDqWUaHaBeU0bMUTU9jQ=="
+    "json-bigint": {
+      "version": "1.0.0",
+      "resolved": 
"https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz";,
+      "integrity": 
"sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+      "requires": {
+        "bignumber.js": "^9.0.0"
+      }
     },
     "json-bignum": {
       "version": "0.0.3",
diff --git a/superset-frontend/package.json b/superset-frontend/package.json
index bfe41ac3ea..b78caa278f 100644
--- a/superset-frontend/package.json
+++ b/superset-frontend/package.json
@@ -144,7 +144,7 @@
     "jquery": "^3.5.1",
     "js-levenshtein": "^1.1.6",
     "js-yaml-loader": "^1.2.2",
-    "json-bigint-native": "^1.2.0",
+    "json-bigint": "^1.0.0",
     "json-stringify-pretty-compact": "^2.0.0",
     "lodash": "^4.17.21",
     "lodash-es": "^4.17.21",
@@ -247,6 +247,7 @@
     "@types/jest": "^26.0.3",
     "@types/jquery": "^3.5.8",
     "@types/js-levenshtein": "^1.1.0",
+    "@types/json-bigint": "^1.0.1",
     "@types/react": "^16.9.43",
     "@types/react-dom": "^16.9.8",
     "@types/react-gravatar": "^2.6.8",
diff --git a/superset-frontend/packages/superset-ui-core/package.json 
b/superset-frontend/packages/superset-ui-core/package.json
index eb72768628..7faa531a67 100644
--- a/superset-frontend/packages/superset-ui-core/package.json
+++ b/superset-frontend/packages/superset-ui-core/package.json
@@ -40,6 +40,7 @@
     "@types/d3-time-format": "^2.1.0",
     "@types/enzyme": "^3.10.5",
     "@types/fetch-mock": "^7.3.3",
+    "@types/json-bigint": "^1.0.1",
     "@types/lodash": "^4.14.149",
     "@types/math-expression-evaluator": "^1.2.1",
     "@types/node": "^18.0.0",
@@ -55,7 +56,6 @@
     "d3-time-format": "^2.2.0",
     "fetch-retry": "^4.0.1",
     "jed": "^1.1.1",
-    "json-bigint-native": "^1.2.0",
     "lodash": "^4.17.11",
     "math-expression-evaluator": "^1.3.8",
     "pretty-ms": "^7.0.0",
diff --git 
a/superset-frontend/packages/superset-ui-core/src/connection/callApi/parseResponse.ts
 
b/superset-frontend/packages/superset-ui-core/src/connection/callApi/parseResponse.ts
index 31b03faa4b..15beca6e15 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/connection/callApi/parseResponse.ts
+++ 
b/superset-frontend/packages/superset-ui-core/src/connection/callApi/parseResponse.ts
@@ -16,7 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import JSONbig from 'json-bigint-native';
+import JSONbig from 'json-bigint';
+import { cloneDeepWith } from 'lodash';
 
 import { ParseMethod, TextResponse, JsonResponse } from '../types';
 
@@ -52,7 +53,11 @@ export default async function parseResponse<T extends 
ParseMethod = 'json'>(
     const json = JSONbig.parse(rawData);
     const result: JsonResponse = {
       response,
-      json,
+      // `json-bigint` could not handle floats well, see 
sidorares/json-bigint#62
+      // TODO: clean up after json-bigint>1.0.1 is released
+      json: cloneDeepWith(json, (value: any) =>
+        value?.isInteger?.() === false ? Number(value) : undefined,
+      ),
     };
     return result as ReturnType;
   }
diff --git 
a/superset-frontend/packages/superset-ui-core/test/connection/callApi/parseResponse.test.ts
 
b/superset-frontend/packages/superset-ui-core/test/connection/callApi/parseResponse.test.ts
index f3ca3a261f..e13964ecf7 100644
--- 
a/superset-frontend/packages/superset-ui-core/test/connection/callApi/parseResponse.test.ts
+++ 
b/superset-frontend/packages/superset-ui-core/test/connection/callApi/parseResponse.test.ts
@@ -140,27 +140,33 @@ describe('parseResponse()', () => {
   it('resolves to big number value if `parseMethod=json-bigint`', async () => {
     const mockBigIntUrl = '/mock/get/bigInt';
     const mockGetBigIntPayload =
-      '{ "value": 9223372036854775807, "minusValue": -483729382918228373892, 
"number": 1234, "floatValue": 0.345221136, "minusFloatValue": -0.345221136 }';
+      '{ "value": 9223372036854775807, "minus": { "value": 
-483729382918228373892, "str": "something" }, "number": 1234, "floatValue": { 
"plus": 0.3452211361231223, "minus": -0.3452211361231223 } }';
     fetchMock.get(mockBigIntUrl, mockGetBigIntPayload);
     const responseBigNumber = await parseResponse(
       callApi({ url: mockBigIntUrl, method: 'GET' }),
       'json-bigint',
     );
     expect(`${responseBigNumber.json.value}`).toEqual('9223372036854775807');
-    expect(`${responseBigNumber.json.minusValue}`).toEqual(
+    expect(`${responseBigNumber.json.minus.value}`).toEqual(
       '-483729382918228373892',
     );
     expect(responseBigNumber.json.number).toEqual(1234);
-    expect(responseBigNumber.json.floatValue).toEqual(0.345221136);
-    expect(responseBigNumber.json.minusFloatValue).toEqual(-0.345221136);
+    expect(responseBigNumber.json.floatValue.plus).toEqual(0.3452211361231223);
+    expect(responseBigNumber.json.floatValue.minus).toEqual(
+      -0.3452211361231223,
+    );
     expect(
-      responseBigNumber.json.floatValue +
-        responseBigNumber.json.minusFloatValue,
+      responseBigNumber.json.floatValue.plus +
+        responseBigNumber.json.floatValue.minus,
     ).toEqual(0);
     expect(
-      responseBigNumber.json.floatValue /
-        responseBigNumber.json.minusFloatValue,
+      responseBigNumber.json.floatValue.plus /
+        responseBigNumber.json.floatValue.minus,
     ).toEqual(-1);
+    expect(Math.min(responseBigNumber.json.floatValue.plus, 0)).toEqual(0);
+    expect(Math.abs(responseBigNumber.json.floatValue.minus)).toEqual(
+      responseBigNumber.json.floatValue.plus,
+    );
   });
 
   it('rejects if request.ok=false', async () => {
diff --git a/superset-frontend/src/components/FilterableTable/index.tsx 
b/superset-frontend/src/components/FilterableTable/index.tsx
index c19ee8fe7a..b33c3e13d0 100644
--- a/superset-frontend/src/components/FilterableTable/index.tsx
+++ b/superset-frontend/src/components/FilterableTable/index.tsx
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import JSONbig from 'json-bigint-native';
+import JSONbig from 'json-bigint';
 import React, { useEffect, useRef, useState } from 'react';
 import JSONTree from 'react-json-tree';
 import {

Reply via email to