diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index c196947a144a6..4174d104aa17d 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 bfe41ac3eae16..b78caa278fb03 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 eb7276862888e..7faa531a67cd3 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 31b03faa4b509..15beca6e150ad 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( 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 f3ca3a261f4ca..e13964ecf7300 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 c19ee8fe7a695..b33c3e13d0ff4 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 {