diff --git a/package.json b/package.json index 1a7fe97abc9..c5f228312ce 100644 --- a/package.json +++ b/package.json @@ -82,11 +82,10 @@ "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-promise": "^7.1.0", "execa": "^5.0.0", - "isomorphic-fetch": "^3.0.0", "jest": "^29.7.0", "jest-silent-reporter": "^0.5.0", "lodash": "^4.17.21", - "nock": "^13.3.1", + "nock": "^14.0.11", "prettier": "^3.3.3", "prettier-2": "npm:prettier@^2.8.8", "prettier-plugin-packagejson": "^2.4.5", diff --git a/packages/analytics-data-regulation-controller/package.json b/packages/analytics-data-regulation-controller/package.json index e904df27480..999b21474b2 100644 --- a/packages/analytics-data-regulation-controller/package.json +++ b/packages/analytics-data-regulation-controller/package.json @@ -59,7 +59,7 @@ "@types/jest": "^29.5.14", "deepmerge": "^4.2.2", "jest": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "sinon": "^9.2.4", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", diff --git a/packages/assets-controllers/jest.config.js b/packages/assets-controllers/jest.config.js index add4e35680f..f58516c7b55 100644 --- a/packages/assets-controllers/jest.config.js +++ b/packages/assets-controllers/jest.config.js @@ -31,5 +31,5 @@ module.exports = merge(baseConfig, { }, // We rely on `window` to make requests - testEnvironment: '/jest.environment.js', + testEnvironment: '../../tests/jest-environment-jsdom.js', }); diff --git a/packages/assets-controllers/jest.environment.js b/packages/assets-controllers/jest.environment.js deleted file mode 100644 index da37ea53702..00000000000 --- a/packages/assets-controllers/jest.environment.js +++ /dev/null @@ -1,17 +0,0 @@ -const { TestEnvironment } = require('jest-environment-jsdom'); - -// Custom test environment copied from https://github.com/jsdom/jsdom/issues/2524 -// in order to add TextEncoder to jsdom. TextEncoder is expected by jose. - -module.exports = class CustomTestEnvironment extends TestEnvironment { - async setup() { - await super.setup(); - if (typeof this.global.TextEncoder === 'undefined') { - const { TextEncoder, TextDecoder } = require('util'); - this.global.TextEncoder = TextEncoder; - this.global.TextDecoder = TextDecoder; - this.global.ArrayBuffer = ArrayBuffer; - this.global.Uint8Array = Uint8Array; - } - } -}; diff --git a/packages/assets-controllers/package.json b/packages/assets-controllers/package.json index 2e366508368..90342aa563b 100644 --- a/packages/assets-controllers/package.json +++ b/packages/assets-controllers/package.json @@ -109,7 +109,7 @@ "deepmerge": "^4.2.2", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "sinon": "^9.2.4", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", diff --git a/packages/bridge-controller/package.json b/packages/bridge-controller/package.json index dfcdc212e86..36bee2520fa 100644 --- a/packages/bridge-controller/package.json +++ b/packages/bridge-controller/package.json @@ -82,7 +82,7 @@ "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "lodash": "^4.17.21", - "nock": "^13.3.1", + "nock": "^14.0.11", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", "typedoc-plugin-missing-exports": "^2.0.0", diff --git a/packages/bridge-status-controller/package.json b/packages/bridge-status-controller/package.json index 97d12a630e7..eae841df127 100644 --- a/packages/bridge-status-controller/package.json +++ b/packages/bridge-status-controller/package.json @@ -70,7 +70,7 @@ "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "lodash": "^4.17.21", - "nock": "^13.3.1", + "nock": "^14.0.11", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", "typedoc-plugin-missing-exports": "^2.0.0", diff --git a/packages/controller-utils/jest.config.js b/packages/controller-utils/jest.config.js index 8e0bb5320db..71d85a5fb5f 100644 --- a/packages/controller-utils/jest.config.js +++ b/packages/controller-utils/jest.config.js @@ -25,5 +25,5 @@ module.exports = merge(baseConfig, { }, // We rely on `window` to make requests - testEnvironment: '/jest.environment.js', + testEnvironment: '../../tests/jest-environment-jsdom.js', }); diff --git a/packages/controller-utils/jest.environment.js b/packages/controller-utils/jest.environment.js deleted file mode 100644 index 35f9c47b2ad..00000000000 --- a/packages/controller-utils/jest.environment.js +++ /dev/null @@ -1,19 +0,0 @@ -const { TestEnvironment } = require('jest-environment-jsdom'); - -// Custom test environment copied from https://github.com/jsdom/jsdom/issues/2524 -// in order to add TextEncoder to jsdom. TextEncoder is expected by @noble/hashes. - -module.exports = class CustomTestEnvironment extends TestEnvironment { - async setup() { - await super.setup(); - if (typeof this.global.TextEncoder === 'undefined') { - // Needed for the JSDOM environment. - // eslint-disable-next-line no-shadow, n/prefer-global/text-encoder, n/prefer-global/text-decoder - const { TextEncoder, TextDecoder } = require('util'); - this.global.TextEncoder = TextEncoder; - this.global.TextDecoder = TextDecoder; - this.global.ArrayBuffer = ArrayBuffer; - this.global.Uint8Array = Uint8Array; - } - } -}; diff --git a/packages/controller-utils/package.json b/packages/controller-utils/package.json index 577d3d9c1df..d8b19d372b3 100644 --- a/packages/controller-utils/package.json +++ b/packages/controller-utils/package.json @@ -69,7 +69,7 @@ "deepmerge": "^4.2.2", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "sinon": "^9.2.4", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", diff --git a/packages/core-backend/jest.config.js b/packages/core-backend/jest.config.js index 4512a71fcd9..35f812f3691 100644 --- a/packages/core-backend/jest.config.js +++ b/packages/core-backend/jest.config.js @@ -15,8 +15,7 @@ module.exports = merge(baseConfig, { displayName, // Use jsdom for BackendWebSocketService tests - testEnvironment: 'jsdom', - testEnvironmentOptions: {}, + testEnvironment: '../../tests/jest-environment-jsdom.js', // An object that configures minimum threshold enforcement for coverage results coverageThreshold: { diff --git a/packages/foundryup/package.json b/packages/foundryup/package.json index e48fdd50b12..353a12d0786 100644 --- a/packages/foundryup/package.json +++ b/packages/foundryup/package.json @@ -57,7 +57,7 @@ "@types/yargs-parser": "^21.0.3", "deepmerge": "^4.2.2", "jest": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", "typedoc-plugin-missing-exports": "^2.0.0", diff --git a/packages/foundryup/src/foundryup.test.ts b/packages/foundryup/src/foundryup.test.ts index da3268a3dfa..f2999d8c941 100644 --- a/packages/foundryup/src/foundryup.test.ts +++ b/packages/foundryup/src/foundryup.test.ts @@ -238,7 +238,7 @@ describe('foundryup', () => { Architecture.Amd64, ); await expect(result).rejects.toThrow( - 'Request to https://example.com/binaries.zip failed. Status Code: 500 - null', + 'Request to https://example.com/binaries.zip failed. Status Code: 500 - Internal Server Error', ); }); }); diff --git a/packages/gas-fee-controller/package.json b/packages/gas-fee-controller/package.json index 92ee857db9b..91bd5aa526b 100644 --- a/packages/gas-fee-controller/package.json +++ b/packages/gas-fee-controller/package.json @@ -69,7 +69,7 @@ "deepmerge": "^4.2.2", "jest": "^29.7.0", "jest-when": "^3.4.2", - "nock": "^13.3.1", + "nock": "^14.0.11", "sinon": "^9.2.4", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", diff --git a/packages/multichain-network-controller/package.json b/packages/multichain-network-controller/package.json index 57b35e9f580..af8b1a1ed50 100644 --- a/packages/multichain-network-controller/package.json +++ b/packages/multichain-network-controller/package.json @@ -70,7 +70,7 @@ "deepmerge": "^4.2.2", "immer": "^9.0.6", "jest": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", "typedoc-plugin-missing-exports": "^2.0.0", diff --git a/packages/network-controller/jest.config.js b/packages/network-controller/jest.config.js index 621e01529f5..a8451bddcf0 100644 --- a/packages/network-controller/jest.config.js +++ b/packages/network-controller/jest.config.js @@ -26,5 +26,5 @@ module.exports = merge(baseConfig, { // Currently the tests for NetworkController have a race condition which // causes intermittent failures. This seems to fix it. - testEnvironment: 'jsdom', + testEnvironment: '../../tests/jest-environment-jsdom.js', }); diff --git a/packages/network-controller/package.json b/packages/network-controller/package.json index a206fdac703..47b611de1e7 100644 --- a/packages/network-controller/package.json +++ b/packages/network-controller/package.json @@ -85,7 +85,7 @@ "jest-environment-jsdom": "^29.7.0", "jest-when": "^3.4.2", "lodash": "^4.17.21", - "nock": "^13.3.1", + "nock": "^14.0.11", "node-fetch": "^2.7.0", "sinon": "^9.2.4", "ts-jest": "^29.2.5", diff --git a/packages/network-controller/src/rpc-service/rpc-service.test.ts b/packages/network-controller/src/rpc-service/rpc-service.test.ts index 18edeb6c867..036626924d5 100644 --- a/packages/network-controller/src/rpc-service/rpc-service.test.ts +++ b/packages/network-controller/src/rpc-service/rpc-service.test.ts @@ -594,9 +594,7 @@ describe('RpcService', () => { code: -32700, message: 'RPC endpoint did not return JSON.', }), - expectedOnBreakError: expect.objectContaining({ - message: expect.stringContaining('invalid json'), - }), + expectedOnBreakError: expect.any(SyntaxError), }); }, ); diff --git a/packages/network-controller/tests/network-client/block-hash-in-response.ts b/packages/network-controller/tests/network-client/block-hash-in-response.ts index 1ed8a59407f..3d350fca071 100644 --- a/packages/network-controller/tests/network-client/block-hash-in-response.ts +++ b/packages/network-controller/tests/network-client/block-hash-in-response.ts @@ -624,9 +624,9 @@ export function testsForRpcMethodsThatCheckForBlockHashInResponse( }), failure: error, isRetriableFailure: true, - getExpectedError: (url: string) => + getExpectedError: () => expect.objectContaining({ - message: `request to ${url} failed, reason: ${errorCode}`, + message: expect.stringContaining(errorCode), }), }); }, @@ -806,9 +806,9 @@ export function testsForRpcMethodsThatCheckForBlockHashInResponse( }), failure: error, isRetriableFailure: true, - getExpectedError: (url: string) => + getExpectedError: () => expect.objectContaining({ - message: `request to ${url} failed, reason: ${error.message}`, + message: expect.stringContaining(error.message), }), }); }); diff --git a/packages/network-controller/tests/network-client/block-param.ts b/packages/network-controller/tests/network-client/block-param.ts index f2e1cd268c3..22e64f3249f 100644 --- a/packages/network-controller/tests/network-client/block-param.ts +++ b/packages/network-controller/tests/network-client/block-param.ts @@ -798,9 +798,9 @@ export function testsForRpcMethodSupportingBlockParam( }, failure: error, isRetriableFailure: true, - getExpectedError: (url: string) => + getExpectedError: () => expect.objectContaining({ - message: `request to ${url} failed, reason: ${errorCode}`, + message: expect.stringContaining(errorCode), }), }); }, @@ -1048,9 +1048,9 @@ export function testsForRpcMethodSupportingBlockParam( }, failure: error, isRetriableFailure: true, - getExpectedError: (url: string) => + getExpectedError: () => expect.objectContaining({ - message: `request to ${url} failed, reason: ${error.message}`, + message: expect.stringContaining(error.message), }), }); }); diff --git a/packages/network-controller/tests/network-client/no-block-param.ts b/packages/network-controller/tests/network-client/no-block-param.ts index 8c73a77775f..7f9571a0035 100644 --- a/packages/network-controller/tests/network-client/no-block-param.ts +++ b/packages/network-controller/tests/network-client/no-block-param.ts @@ -577,9 +577,9 @@ export function testsForRpcMethodAssumingNoBlockParam( }), failure: error, isRetriableFailure: true, - getExpectedError: (url: string) => + getExpectedError: () => expect.objectContaining({ - message: `request to ${url} failed, reason: ${errorCode}`, + message: expect.stringContaining(errorCode), }), }); }, @@ -759,9 +759,9 @@ export function testsForRpcMethodAssumingNoBlockParam( }), failure: error, isRetriableFailure: true, - getExpectedError: (url: string) => + getExpectedError: () => expect.objectContaining({ - message: `request to ${url} failed, reason: ${error.message}`, + message: expect.stringContaining(error.message), }), }); }); diff --git a/packages/notification-services-controller/jest.config.js b/packages/notification-services-controller/jest.config.js index 91dccc79ab3..66ccb55a32e 100644 --- a/packages/notification-services-controller/jest.config.js +++ b/packages/notification-services-controller/jest.config.js @@ -32,5 +32,5 @@ module.exports = merge(baseConfig, { ], // These tests rely on the Crypto API - testEnvironment: '/jest.environment.js', + testEnvironment: '../../tests/jest-environment-jsdom.js', }); diff --git a/packages/notification-services-controller/jest.environment.js b/packages/notification-services-controller/jest.environment.js deleted file mode 100644 index f67bb89df5d..00000000000 --- a/packages/notification-services-controller/jest.environment.js +++ /dev/null @@ -1,29 +0,0 @@ -const { TestEnvironment } = require('jest-environment-jsdom'); - -/** - * ProfileSync SDK & Controllers depends on @noble/hashes, which as of 1.3.2 relies on the - * Web Crypto API in Node and browsers. - * - * There are also EIP6963 utils that utilize window - */ -class CustomTestEnvironment extends TestEnvironment { - async setup() { - await super.setup(); - - // jest runs in a node environment, so need to polyfil webAPIs - // eslint-disable-next-line no-shadow, n/prefer-global/text-encoder, n/prefer-global/text-decoder - const { TextEncoder, TextDecoder } = require('util'); - this.global.TextEncoder = TextEncoder; - this.global.TextDecoder = TextDecoder; - this.global.ArrayBuffer = ArrayBuffer; - this.global.Uint8Array = Uint8Array; - - if (typeof this.global.crypto === 'undefined') { - // jest runs in a node environment, so need to polyfil webAPIs - // eslint-disable-next-line n/no-unsupported-features/node-builtins - this.global.crypto = require('crypto').webcrypto; - } - } -} - -module.exports = CustomTestEnvironment; diff --git a/packages/notification-services-controller/package.json b/packages/notification-services-controller/package.json index 6e20a59ffe4..4d1b445dafb 100644 --- a/packages/notification-services-controller/package.json +++ b/packages/notification-services-controller/package.json @@ -125,7 +125,7 @@ "deepmerge": "^4.2.2", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", "typedoc-plugin-missing-exports": "^2.0.0", diff --git a/packages/phishing-controller/package.json b/packages/phishing-controller/package.json index 0e892111965..52d74d154d4 100644 --- a/packages/phishing-controller/package.json +++ b/packages/phishing-controller/package.json @@ -64,7 +64,7 @@ "@types/jest": "^29.5.14", "deepmerge": "^4.2.2", "jest": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "sinon": "^9.2.4", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", diff --git a/packages/profile-metrics-controller/package.json b/packages/profile-metrics-controller/package.json index 2acee307649..ed14f5d2783 100644 --- a/packages/profile-metrics-controller/package.json +++ b/packages/profile-metrics-controller/package.json @@ -66,7 +66,7 @@ "@types/jest": "^29.5.14", "deepmerge": "^4.2.2", "jest": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "sinon": "^9.2.4", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", diff --git a/packages/profile-sync-controller/jest.config.js b/packages/profile-sync-controller/jest.config.js index 91dccc79ab3..66ccb55a32e 100644 --- a/packages/profile-sync-controller/jest.config.js +++ b/packages/profile-sync-controller/jest.config.js @@ -32,5 +32,5 @@ module.exports = merge(baseConfig, { ], // These tests rely on the Crypto API - testEnvironment: '/jest.environment.js', + testEnvironment: '../../tests/jest-environment-jsdom.js', }); diff --git a/packages/profile-sync-controller/jest.environment.js b/packages/profile-sync-controller/jest.environment.js deleted file mode 100644 index 2e6fb2965b7..00000000000 --- a/packages/profile-sync-controller/jest.environment.js +++ /dev/null @@ -1,29 +0,0 @@ -/* eslint-disable n/prefer-global/text-encoder */ -/* eslint-disable n/prefer-global/text-decoder */ -const { TestEnvironment } = require('jest-environment-jsdom'); - -/** - * ProfileSync SDK & Controllers depends on @noble/hashes, which as of 1.3.2 relies on the - * Web Crypto API in Node and browsers. - * - * There are also EIP6963 utils that utilize window - */ -class CustomTestEnvironment extends TestEnvironment { - async setup() { - await super.setup(); - - // eslint-disable-next-line no-shadow - const { TextEncoder, TextDecoder } = require('util'); - this.global.TextEncoder = TextEncoder; - this.global.TextDecoder = TextDecoder; - this.global.ArrayBuffer = ArrayBuffer; - this.global.Uint8Array = Uint8Array; - - if (typeof this.global.crypto === 'undefined') { - // eslint-disable-next-line n/no-unsupported-features/node-builtins - this.global.crypto = require('crypto').webcrypto; - } - } -} - -module.exports = CustomTestEnvironment; diff --git a/packages/profile-sync-controller/package.json b/packages/profile-sync-controller/package.json index c77b258cfcb..5dc85f28339 100644 --- a/packages/profile-sync-controller/package.json +++ b/packages/profile-sync-controller/package.json @@ -128,7 +128,7 @@ "ethers": "^6.12.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", "typedoc-plugin-missing-exports": "^2.0.0", diff --git a/packages/ramps-controller/package.json b/packages/ramps-controller/package.json index 84a2d6c44d0..1f4ce838033 100644 --- a/packages/ramps-controller/package.json +++ b/packages/ramps-controller/package.json @@ -60,7 +60,7 @@ "@types/sinon": "^9.0.10", "deepmerge": "^4.2.2", "jest": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "sinon": "^9.2.4", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", diff --git a/packages/remote-feature-flag-controller/package.json b/packages/remote-feature-flag-controller/package.json index 7cb80e80045..f85cbba2501 100644 --- a/packages/remote-feature-flag-controller/package.json +++ b/packages/remote-feature-flag-controller/package.json @@ -61,7 +61,7 @@ "@types/jest": "^29.5.14", "deepmerge": "^4.2.2", "jest": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", "typedoc-plugin-missing-exports": "^2.0.0", diff --git a/packages/sample-controllers/package.json b/packages/sample-controllers/package.json index df73896b5ac..2fe39e9f3ae 100644 --- a/packages/sample-controllers/package.json +++ b/packages/sample-controllers/package.json @@ -60,7 +60,7 @@ "@types/jest": "^29.5.14", "deepmerge": "^4.2.2", "jest": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "sinon": "^9.2.4", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", diff --git a/packages/seedless-onboarding-controller/package.json b/packages/seedless-onboarding-controller/package.json index 1b76ac45fe0..b66779e2d1f 100644 --- a/packages/seedless-onboarding-controller/package.json +++ b/packages/seedless-onboarding-controller/package.json @@ -71,7 +71,7 @@ "deepmerge": "^4.2.2", "jest": "^29.7.0", "jest-environment-node": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", "typedoc-plugin-missing-exports": "^2.0.0", diff --git a/packages/selected-network-controller/jest.config.js b/packages/selected-network-controller/jest.config.js index 5806b6db61b..f03e293fe11 100644 --- a/packages/selected-network-controller/jest.config.js +++ b/packages/selected-network-controller/jest.config.js @@ -26,5 +26,5 @@ module.exports = merge(baseConfig, { // Currently the tests for NetworkController have a race condition which // causes intermittent failures. This seems to fix it. - testEnvironment: 'jsdom', + testEnvironment: '../../tests/jest-environment-jsdom.js', }); diff --git a/packages/selected-network-controller/package.json b/packages/selected-network-controller/package.json index 317494d4ba7..9bfb79f21ab 100644 --- a/packages/selected-network-controller/package.json +++ b/packages/selected-network-controller/package.json @@ -65,7 +65,7 @@ "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "lodash": "^4.17.21", - "nock": "^13.3.1", + "nock": "^14.0.11", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", "typedoc-plugin-missing-exports": "^2.0.0", diff --git a/packages/transaction-controller/jest.config.js b/packages/transaction-controller/jest.config.js index 5fc74a1ac09..0b2439a8cb8 100644 --- a/packages/transaction-controller/jest.config.js +++ b/packages/transaction-controller/jest.config.js @@ -25,5 +25,5 @@ module.exports = merge(baseConfig, { }, // We rely on `XMLHttpRequest` to make requests - testEnvironment: 'jsdom', + testEnvironment: '../../tests/jest-environment-jsdom.js', }); diff --git a/packages/transaction-controller/package.json b/packages/transaction-controller/package.json index 8c567ac5158..f8a116b5072 100644 --- a/packages/transaction-controller/package.json +++ b/packages/transaction-controller/package.json @@ -91,7 +91,7 @@ "immer": "^9.0.6", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "nock": "^13.3.1", + "nock": "^14.0.11", "sinon": "^9.2.4", "ts-jest": "^29.2.5", "typedoc": "^0.25.13", diff --git a/tests/jest-environment-jsdom.js b/tests/jest-environment-jsdom.js new file mode 100644 index 00000000000..0cd99c68209 --- /dev/null +++ b/tests/jest-environment-jsdom.js @@ -0,0 +1,42 @@ +const { TestEnvironment } = require('jest-environment-jsdom'); + +class JsdomEnvironment extends TestEnvironment { + constructor(config, context) { + super(config, context); + + // The jsdom VM context is available after super() in the constructor. + // Set globals here so they're available to setupFiles. + // Fetch API globals — needed by nock v14's @mswjs/interceptors. + // Also override AbortController/AbortSignal so that signals created in + // the jsdom context are compatible with the native fetch. + this.global.fetch = fetch; + this.global.Response = Response; + this.global.Request = Request; + this.global.Headers = Headers; + this.global.AbortController = AbortController; + this.global.AbortSignal = AbortSignal; + + // Stream API globals — needed by @mswjs/interceptors + this.global.TransformStream = TransformStream; + this.global.ReadableStream = ReadableStream; + this.global.WritableStream = WritableStream; + this.global.CompressionStream = CompressionStream; + this.global.DecompressionStream = DecompressionStream; + + // Encoding globals — needed by @noble/hashes and jose + const { TextEncoder, TextDecoder } = require('util'); + this.global.TextEncoder = TextEncoder; + this.global.TextDecoder = TextDecoder; + + // Typed array globals + this.global.ArrayBuffer = ArrayBuffer; + this.global.Uint8Array = Uint8Array; + + // Web Crypto API — needed by @noble/hashes and profile-sync + if (typeof this.global.crypto === 'undefined') { + this.global.crypto = require('crypto').webcrypto; + } + } +} + +module.exports = JsdomEnvironment; diff --git a/tests/setup.ts b/tests/setup.ts index b9508687d77..bf172e3ed9e 100644 --- a/tests/setup.ts +++ b/tests/setup.ts @@ -1,14 +1,29 @@ -// Node.js v24 native fetch uses undici, which nock cannot intercept. -// Clear it so isomorphic-fetch sets up node-fetch (http-based, nock-compatible). -// @ts-expect-error Intentionally clearing native globals -delete globalThis.fetch; -// @ts-expect-error - Clear Response to ensure isomorphic-fetch sets up node-fetch version -delete globalThis.Headers; -// @ts-expect-error - Clear Response to ensure isomorphic-fetch sets up node-fetch version -delete globalThis.Request; -// @ts-expect-error - Clear Response to ensure isomorphic-fetch sets up node-fetch version -delete globalThis.Response; -// We need to import this *after* we delete `fetch` etc. above. -// Additionally, this import is used for side effects only. -// eslint-disable-next-line import-x/first, import-x/no-unassigned-import -import 'isomorphic-fetch'; +// nock v14 uses @mswjs/interceptors which creates Response objects internally. +// When Response.json() parses the body, the resulting objects may have a +// different Object.prototype than the test context (cross-realm issue with +// VM contexts used by msw interceptors). Override json() to re-parse +// through the current context's JSON.parse, ensuring prototype consistency +// for assertions like toStrictEqual. +if (typeof Response !== 'undefined') { + Response.prototype.json = async function () { + const text = await this.text(); + return JSON.parse(text); + }; +} + +// nock v14's @mswjs/interceptors uses a MockHttpSocket that doesn't properly +// terminate HTTP response streams when Connection: keep-alive is set. xhr2 +// (used by @metamask/ethjs-provider-http) sets keep-alive by default, causing +// response bodies to never complete. Patch xhr2 to use Connection: close so +// the mock socket correctly signals end-of-response. +try { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const XHR2 = require('xhr2'); + const originalFinalizeHeaders = XHR2.prototype._finalizeHeaders; + XHR2.prototype._finalizeHeaders = function () { + originalFinalizeHeaders.call(this); + this._headers['Connection'] = 'close'; + }; +} catch { + // xhr2 not available in this package — no patch needed +} diff --git a/yarn.lock b/yarn.lock index 2d4536b1f92..861a41b8a21 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2433,7 +2433,7 @@ __metadata: "@types/jest": "npm:^29.5.14" deepmerge: "npm:^4.2.2" jest: "npm:^29.7.0" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" sinon: "npm:^9.2.4" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" @@ -2606,7 +2606,7 @@ __metadata: jest-environment-jsdom: "npm:^29.7.0" lodash: "npm:^4.17.21" multiformats: "npm:^9.9.0" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" reselect: "npm:^5.1.1" single-call-balance-checker-abi: "npm:^1.0.0" sinon: "npm:^9.2.4" @@ -2743,7 +2743,7 @@ __metadata: jest: "npm:^29.7.0" jest-environment-jsdom: "npm:^29.7.0" lodash: "npm:^4.17.21" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" reselect: "npm:^5.1.1" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" @@ -2776,7 +2776,7 @@ __metadata: jest: "npm:^29.7.0" jest-environment-jsdom: "npm:^29.7.0" lodash: "npm:^4.17.21" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" typedoc-plugin-missing-exports: "npm:^2.0.0" @@ -2926,7 +2926,7 @@ __metadata: jest: "npm:^29.7.0" jest-environment-jsdom: "npm:^29.7.0" lodash: "npm:^4.17.21" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" sinon: "npm:^9.2.4" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" @@ -3014,11 +3014,10 @@ __metadata: eslint-plugin-prettier: "npm:^5.2.1" eslint-plugin-promise: "npm:^7.1.0" execa: "npm:^5.0.0" - isomorphic-fetch: "npm:^3.0.0" jest: "npm:^29.7.0" jest-silent-reporter: "npm:^0.5.0" lodash: "npm:^4.17.21" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" prettier: "npm:^3.3.3" prettier-2: "npm:prettier@^2.8.8" prettier-plugin-packagejson: "npm:^2.4.5" @@ -3644,7 +3643,7 @@ __metadata: deepmerge: "npm:^4.2.2" jest: "npm:^29.7.0" minipass: "npm:^7.1.2" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" tar: "npm:^7.4.3" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" @@ -3681,7 +3680,7 @@ __metadata: deepmerge: "npm:^4.2.2" jest: "npm:^29.7.0" jest-when: "npm:^3.4.2" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" sinon: "npm:^9.2.4" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" @@ -4074,7 +4073,7 @@ __metadata: immer: "npm:^9.0.6" jest: "npm:^29.7.0" lodash: "npm:^4.17.21" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" typedoc-plugin-missing-exports: "npm:^2.0.0" @@ -4170,7 +4169,7 @@ __metadata: jest-when: "npm:^3.4.2" lodash: "npm:^4.17.21" loglevel: "npm:^1.8.1" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" node-fetch: "npm:^2.7.0" reselect: "npm:^5.1.1" sinon: "npm:^9.2.4" @@ -4247,7 +4246,7 @@ __metadata: jest: "npm:^29.7.0" jest-environment-jsdom: "npm:^29.7.0" loglevel: "npm:^1.8.1" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" semver: "npm:^7.6.3" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" @@ -4364,7 +4363,7 @@ __metadata: ethereum-cryptography: "npm:^2.1.2" fastest-levenshtein: "npm:^1.0.16" jest: "npm:^29.7.0" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" punycode: "npm:^2.1.1" sinon: "npm:^9.2.4" ts-jest: "npm:^29.2.5" @@ -4450,7 +4449,7 @@ __metadata: async-mutex: "npm:^0.5.0" deepmerge: "npm:^4.2.2" jest: "npm:^29.7.0" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" sinon: "npm:^9.2.4" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" @@ -4487,7 +4486,7 @@ __metadata: jest: "npm:^29.7.0" jest-environment-jsdom: "npm:^29.7.0" loglevel: "npm:^1.8.1" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" siwe: "npm:^2.3.2" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" @@ -4534,7 +4533,7 @@ __metadata: "@types/sinon": "npm:^9.0.10" deepmerge: "npm:^4.2.2" jest: "npm:^29.7.0" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" sinon: "npm:^9.2.4" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" @@ -4577,7 +4576,7 @@ __metadata: "@types/jest": "npm:^29.5.14" deepmerge: "npm:^4.2.2" jest: "npm:^29.7.0" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" typedoc-plugin-missing-exports: "npm:^2.0.0" @@ -4617,7 +4616,7 @@ __metadata: "@types/jest": "npm:^29.5.14" deepmerge: "npm:^4.2.2" jest: "npm:^29.7.0" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" sinon: "npm:^9.2.4" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" @@ -4661,7 +4660,7 @@ __metadata: deepmerge: "npm:^4.2.2" jest: "npm:^29.7.0" jest-environment-node: "npm:^29.7.0" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" typedoc-plugin-missing-exports: "npm:^2.0.0" @@ -4688,7 +4687,7 @@ __metadata: jest: "npm:^29.7.0" jest-environment-jsdom: "npm:^29.7.0" lodash: "npm:^4.17.21" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" typedoc-plugin-missing-exports: "npm:^2.0.0" @@ -5035,7 +5034,7 @@ __metadata: jest: "npm:^29.7.0" jest-environment-jsdom: "npm:^29.7.0" lodash: "npm:^4.17.21" - nock: "npm:^13.3.1" + nock: "npm:^14.0.11" sinon: "npm:^9.2.4" ts-jest: "npm:^29.2.5" typedoc: "npm:^0.25.13" @@ -5154,6 +5153,20 @@ __metadata: languageName: node linkType: hard +"@mswjs/interceptors@npm:^0.41.0": + version: 0.41.2 + resolution: "@mswjs/interceptors@npm:0.41.2" + dependencies: + "@open-draft/deferred-promise": "npm:^2.2.0" + "@open-draft/logger": "npm:^0.3.0" + "@open-draft/until": "npm:^2.0.0" + is-node-process: "npm:^1.2.0" + outvariant: "npm:^1.4.3" + strict-event-emitter: "npm:^0.5.1" + checksum: 10/417c5ebdfe620f1c026352a57493ced51bee7f7a7dfa68e48abea86330776752660a0f7a34a514c19f91bce57cc17d849aaa83a61a13a791f6690c29bb3ea671 + languageName: node + linkType: hard + "@noble/ciphers@npm:^1.2.1, @noble/ciphers@npm:^1.3.0": version: 1.3.0 resolution: "@noble/ciphers@npm:1.3.0" @@ -5334,6 +5347,30 @@ __metadata: languageName: node linkType: hard +"@open-draft/deferred-promise@npm:^2.2.0": + version: 2.2.0 + resolution: "@open-draft/deferred-promise@npm:2.2.0" + checksum: 10/bc3bb1668a555bb87b33383cafcf207d9561e17d2ca0d9e61b7ce88e82b66e36a333d3676c1d39eb5848022c03c8145331fcdc828ba297f88cb1de9c5cef6c19 + languageName: node + linkType: hard + +"@open-draft/logger@npm:^0.3.0": + version: 0.3.0 + resolution: "@open-draft/logger@npm:0.3.0" + dependencies: + is-node-process: "npm:^1.2.0" + outvariant: "npm:^1.4.0" + checksum: 10/7a280f170bcd4e91d3eedbefe628efd10c3bd06dd2461d06a7fdbced89ef457a38785847f88cc630fb4fd7dfa176d6f77aed17e5a9b08000baff647433b5ff78 + languageName: node + linkType: hard + +"@open-draft/until@npm:^2.0.0": + version: 2.1.0 + resolution: "@open-draft/until@npm:2.1.0" + checksum: 10/622be42950afc8e89715d0fd6d56cbdcd13e36625e23b174bd3d9f06f80e25f9adf75d6698af93bca1e1bf465b9ce00ec05214a12189b671fb9da0f58215b6f4 + languageName: node + linkType: hard + "@open-rpc/meta-schema@npm:^1.14.6, @open-rpc/meta-schema@npm:^1.14.9": version: 1.14.9 resolution: "@open-rpc/meta-schema@npm:1.14.9" @@ -9881,6 +9918,13 @@ __metadata: languageName: node linkType: hard +"is-node-process@npm:^1.2.0": + version: 1.2.0 + resolution: "is-node-process@npm:1.2.0" + checksum: 10/930765cdc6d81ab8f1bbecbea4a8d35c7c6d88a3ff61f3630e0fc7f22d624d7661c1df05c58547d0eb6a639dfa9304682c8e342c4113a6ed51472b704cee2928 + languageName: node + linkType: hard + "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" @@ -11468,14 +11512,14 @@ __metadata: languageName: node linkType: hard -"nock@npm:^13.3.1": - version: 13.5.5 - resolution: "nock@npm:13.5.5" +"nock@npm:^14.0.11": + version: 14.0.11 + resolution: "nock@npm:14.0.11" dependencies: - debug: "npm:^4.1.0" + "@mswjs/interceptors": "npm:^0.41.0" json-stringify-safe: "npm:^5.0.1" propagate: "npm:^2.0.0" - checksum: 10/c19d7bf9654db056357a22b00127bb5606c1bbdff188a5b6c469825e580e31cd0cb0701bce8dd8b4876dbbd36a145fdb681fd69fd59308d6db4923ce8ab2439e + checksum: 10/2fc579f3bee5148ebfacdfc7588a1f45205b139dcc6e32a5bef436f74f479383c7445a9812f433908600f62a0e142ff4bbbe7da7d5e9ed1781bad278b792cf98 languageName: node linkType: hard @@ -11753,6 +11797,13 @@ __metadata: languageName: node linkType: hard +"outvariant@npm:^1.4.0, outvariant@npm:^1.4.3": + version: 1.4.3 + resolution: "outvariant@npm:1.4.3" + checksum: 10/3a7582745850cb344d49641867a4c080858c54f4091afd91b9c0765ba6e471c2bc841348f0fff344845ddd0a4db42fd5d68c6f7ebaf32d4b676a3a9987b2488a + languageName: node + linkType: hard + "p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -13106,6 +13157,13 @@ __metadata: languageName: node linkType: hard +"strict-event-emitter@npm:^0.5.1": + version: 0.5.1 + resolution: "strict-event-emitter@npm:0.5.1" + checksum: 10/25c84d88be85940d3547db665b871bfecea4ea0bedfeb22aae8db48126820cfb2b0bc2fba695392592a09b1aa36b686d6eede499e1ecd151593c03fe5a50d512 + languageName: node + linkType: hard + "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2"