diff --git a/.nvmrc b/.nvmrc index 9a2a0e219c..53d1c14db3 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v20 +v22 diff --git a/package.json b/package.json index 386366ca4d..2d18827b83 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,7 @@ }, "packageManager": "yarn@4.4.1", "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "lavamoat": { "allowScripts": { diff --git a/packages/create-snap/package.json b/packages/create-snap/package.json index ec48fb9d4e..5040d11dda 100644 --- a/packages/create-snap/package.json +++ b/packages/create-snap/package.json @@ -86,7 +86,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/create-snap/src/cmds/init/initHandler.test.ts b/packages/create-snap/src/cmds/init/initHandler.test.ts index 5695e01a6e..edf7da673d 100644 --- a/packages/create-snap/src/cmds/init/initHandler.test.ts +++ b/packages/create-snap/src/cmds/init/initHandler.test.ts @@ -212,7 +212,7 @@ describe('initialize', () => { }; await expect(initHandler({ ...getMockArgv() })).rejects.toThrow( - `Init Error: You are using an outdated version of Node (${process.version}). Please update to Node 18.16.0 or later.`, + `Init Error: You are using an outdated version of Node (${process.version}). Please update to Node 20.0.0 or later.`, ); }); diff --git a/packages/examples/package.json b/packages/examples/package.json index df4e4ba449..e1be072838 100644 --- a/packages/examples/package.json +++ b/packages/examples/package.json @@ -52,6 +52,6 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" } } diff --git a/packages/examples/packages/background-events/package.json b/packages/examples/packages/background-events/package.json index 85ee16d514..aad64c4fb5 100644 --- a/packages/examples/packages/background-events/package.json +++ b/packages/examples/packages/background-events/package.json @@ -65,7 +65,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/bip32/package.json b/packages/examples/packages/bip32/package.json index 6af7388318..91523c6076 100644 --- a/packages/examples/packages/bip32/package.json +++ b/packages/examples/packages/bip32/package.json @@ -68,7 +68,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/bip44/package.json b/packages/examples/packages/bip44/package.json index ca09fd5b16..992107914e 100644 --- a/packages/examples/packages/bip44/package.json +++ b/packages/examples/packages/bip44/package.json @@ -68,7 +68,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/client-status/package.json b/packages/examples/packages/client-status/package.json index cb96a69d5e..368379fb5e 100644 --- a/packages/examples/packages/client-status/package.json +++ b/packages/examples/packages/client-status/package.json @@ -65,7 +65,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/cronjobs/package.json b/packages/examples/packages/cronjobs/package.json index 2526b7df51..46f56ef2b7 100644 --- a/packages/examples/packages/cronjobs/package.json +++ b/packages/examples/packages/cronjobs/package.json @@ -65,7 +65,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/dialogs/package.json b/packages/examples/packages/dialogs/package.json index 4628e2a46f..d9ca396a56 100644 --- a/packages/examples/packages/dialogs/package.json +++ b/packages/examples/packages/dialogs/package.json @@ -64,7 +64,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/errors/package.json b/packages/examples/packages/errors/package.json index 061ca10098..875d9822ab 100644 --- a/packages/examples/packages/errors/package.json +++ b/packages/examples/packages/errors/package.json @@ -64,7 +64,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/ethereum-provider/package.json b/packages/examples/packages/ethereum-provider/package.json index 019cdf642f..07e259350c 100644 --- a/packages/examples/packages/ethereum-provider/package.json +++ b/packages/examples/packages/ethereum-provider/package.json @@ -65,7 +65,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/ethers-js/package.json b/packages/examples/packages/ethers-js/package.json index f1bc71390e..9fb67c6ac7 100644 --- a/packages/examples/packages/ethers-js/package.json +++ b/packages/examples/packages/ethers-js/package.json @@ -66,7 +66,7 @@ "webpack": "^5.97.1" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/file-upload/package.json b/packages/examples/packages/file-upload/package.json index 23bf5c570f..db68651512 100644 --- a/packages/examples/packages/file-upload/package.json +++ b/packages/examples/packages/file-upload/package.json @@ -66,7 +66,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/get-entropy/package.json b/packages/examples/packages/get-entropy/package.json index 4206c5b46b..93e0ee7b02 100644 --- a/packages/examples/packages/get-entropy/package.json +++ b/packages/examples/packages/get-entropy/package.json @@ -66,7 +66,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/get-file/package.json b/packages/examples/packages/get-file/package.json index 87d8c3d368..66f921f8b1 100644 --- a/packages/examples/packages/get-file/package.json +++ b/packages/examples/packages/get-file/package.json @@ -65,7 +65,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/home-page/package.json b/packages/examples/packages/home-page/package.json index 48c85e31e8..f34030a822 100644 --- a/packages/examples/packages/home-page/package.json +++ b/packages/examples/packages/home-page/package.json @@ -64,7 +64,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/images/package.json b/packages/examples/packages/images/package.json index b362de8018..619b28abf2 100644 --- a/packages/examples/packages/images/package.json +++ b/packages/examples/packages/images/package.json @@ -65,7 +65,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/interactive-ui/package.json b/packages/examples/packages/interactive-ui/package.json index 4c22b13aa2..bbcdcc6f2b 100644 --- a/packages/examples/packages/interactive-ui/package.json +++ b/packages/examples/packages/interactive-ui/package.json @@ -66,7 +66,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/invoke-snap/package.json b/packages/examples/packages/invoke-snap/package.json index 8dbaef3b3c..e12e29fa19 100644 --- a/packages/examples/packages/invoke-snap/package.json +++ b/packages/examples/packages/invoke-snap/package.json @@ -50,6 +50,6 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" } } diff --git a/packages/examples/packages/invoke-snap/packages/consumer-signer/package.json b/packages/examples/packages/invoke-snap/packages/consumer-signer/package.json index 0735fda36f..509d9cf511 100644 --- a/packages/examples/packages/invoke-snap/packages/consumer-signer/package.json +++ b/packages/examples/packages/invoke-snap/packages/consumer-signer/package.json @@ -67,7 +67,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/invoke-snap/packages/core-signer/package.json b/packages/examples/packages/invoke-snap/packages/core-signer/package.json index fedea0a1b3..79dbb08d7e 100644 --- a/packages/examples/packages/invoke-snap/packages/core-signer/package.json +++ b/packages/examples/packages/invoke-snap/packages/core-signer/package.json @@ -69,7 +69,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/json-rpc/package.json b/packages/examples/packages/json-rpc/package.json index 61d12a8e8c..b79471d96f 100644 --- a/packages/examples/packages/json-rpc/package.json +++ b/packages/examples/packages/json-rpc/package.json @@ -63,7 +63,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/jsx/package.json b/packages/examples/packages/jsx/package.json index 77d760ca43..f22a085fad 100644 --- a/packages/examples/packages/jsx/package.json +++ b/packages/examples/packages/jsx/package.json @@ -66,7 +66,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/lifecycle-hooks/package.json b/packages/examples/packages/lifecycle-hooks/package.json index 5fc12264b7..fd12cf32bc 100644 --- a/packages/examples/packages/lifecycle-hooks/package.json +++ b/packages/examples/packages/lifecycle-hooks/package.json @@ -64,7 +64,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/localization/package.json b/packages/examples/packages/localization/package.json index feea70c59f..27a7e3e6fa 100644 --- a/packages/examples/packages/localization/package.json +++ b/packages/examples/packages/localization/package.json @@ -65,7 +65,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/manage-state/package.json b/packages/examples/packages/manage-state/package.json index 46a06cda26..f44f557a38 100644 --- a/packages/examples/packages/manage-state/package.json +++ b/packages/examples/packages/manage-state/package.json @@ -65,7 +65,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/name-lookup/package.json b/packages/examples/packages/name-lookup/package.json index d06f730628..3020e1d15d 100644 --- a/packages/examples/packages/name-lookup/package.json +++ b/packages/examples/packages/name-lookup/package.json @@ -64,7 +64,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/network-access/package.json b/packages/examples/packages/network-access/package.json index e286c7625e..48b552c3e6 100644 --- a/packages/examples/packages/network-access/package.json +++ b/packages/examples/packages/network-access/package.json @@ -65,7 +65,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/notifications/package.json b/packages/examples/packages/notifications/package.json index 4a5fe6424a..686ee39e22 100644 --- a/packages/examples/packages/notifications/package.json +++ b/packages/examples/packages/notifications/package.json @@ -64,7 +64,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/preferences/package.json b/packages/examples/packages/preferences/package.json index c1fe85831c..181f561809 100644 --- a/packages/examples/packages/preferences/package.json +++ b/packages/examples/packages/preferences/package.json @@ -65,7 +65,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/preinstalled/package.json b/packages/examples/packages/preinstalled/package.json index b34afce915..1e6cf229b2 100644 --- a/packages/examples/packages/preinstalled/package.json +++ b/packages/examples/packages/preinstalled/package.json @@ -69,7 +69,7 @@ "yocto-spinner": "^0.1.0" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/protocol/package.json b/packages/examples/packages/protocol/package.json index 35ef55c7b7..6e97d06d28 100644 --- a/packages/examples/packages/protocol/package.json +++ b/packages/examples/packages/protocol/package.json @@ -66,7 +66,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/rollup-plugin/package.json b/packages/examples/packages/rollup-plugin/package.json index a3c0ae8d05..29b07035e3 100644 --- a/packages/examples/packages/rollup-plugin/package.json +++ b/packages/examples/packages/rollup-plugin/package.json @@ -72,7 +72,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/send-flow/package.json b/packages/examples/packages/send-flow/package.json index f77bd91ed3..50b81929a7 100644 --- a/packages/examples/packages/send-flow/package.json +++ b/packages/examples/packages/send-flow/package.json @@ -66,7 +66,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/signature-insights/package.json b/packages/examples/packages/signature-insights/package.json index 9ddd52f91b..cb169bf021 100644 --- a/packages/examples/packages/signature-insights/package.json +++ b/packages/examples/packages/signature-insights/package.json @@ -64,7 +64,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/transaction-insights/package.json b/packages/examples/packages/transaction-insights/package.json index c46767c67a..2e10e70ab4 100644 --- a/packages/examples/packages/transaction-insights/package.json +++ b/packages/examples/packages/transaction-insights/package.json @@ -65,7 +65,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/wasm/package.json b/packages/examples/packages/wasm/package.json index f99d47f9d5..ff2068e295 100644 --- a/packages/examples/packages/wasm/package.json +++ b/packages/examples/packages/wasm/package.json @@ -66,7 +66,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/examples/packages/webpack-plugin/package.json b/packages/examples/packages/webpack-plugin/package.json index bd7ad377e9..85c9fcbf5e 100644 --- a/packages/examples/packages/webpack-plugin/package.json +++ b/packages/examples/packages/webpack-plugin/package.json @@ -69,7 +69,7 @@ "webpack-cli": "^5.1.4" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/snaps-cli/package.json b/packages/snaps-cli/package.json index bc5a32bbed..fa4dd11967 100644 --- a/packages/snaps-cli/package.json +++ b/packages/snaps-cli/package.json @@ -132,7 +132,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/snaps-cli/src/cli.test.ts b/packages/snaps-cli/src/cli.test.ts index b564694f6b..30caf6a6ad 100644 --- a/packages/snaps-cli/src/cli.test.ts +++ b/packages/snaps-cli/src/cli.test.ts @@ -28,7 +28,7 @@ const getMockArgv = (...args: string[]) => { const HELP_TEXT_REGEX = /^\s*Usage: .+ \[options\]/u; describe('checkNodeVersion', () => { - it.each(['18.16.0', '18.17.0', '20.0.0'])( + it.each(['20.0.0', '20.1.2', '22.0.0'])( 'does not exit if the Node version is %s', (version) => { const spy = jest.spyOn(process, 'exit').mockImplementation(); @@ -38,24 +38,29 @@ describe('checkNodeVersion', () => { }, ); - it.each(['14.0.0', '16.0.0', '16.16.1', '18.0.0', '18.5.0'])( - 'logs a message and exits if the Node version is %s', - (version) => { - const spy = jest.spyOn(process, 'exit').mockImplementation(); - const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(); - - checkNodeVersion(version); - - expect(spy).toHaveBeenCalledTimes(1); - expect(spy).toHaveBeenCalledWith(1); - expect(consoleErrorSpy).toHaveBeenCalledTimes(1); - expect(consoleErrorSpy).toHaveBeenCalledWith( - expect.stringContaining( - `Node version ${version} is not supported. Please use Node 18.16.0 or later.`, - ), - ); - }, - ); + it.each([ + '14.0.0', + '16.0.0', + '16.16.1', + '18.0.0', + '18.5.0', + '18.6.0', + '21.0.0', + ])('logs a message and exits if the Node version is %s', (version) => { + const spy = jest.spyOn(process, 'exit').mockImplementation(); + const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(); + + checkNodeVersion(version); + + expect(spy).toHaveBeenCalledTimes(1); + expect(spy).toHaveBeenCalledWith(1); + expect(consoleErrorSpy).toHaveBeenCalledTimes(1); + expect(consoleErrorSpy).toHaveBeenCalledWith( + expect.stringContaining( + `Node version ${version} is not supported. Please use Node 20.0.0 or later.`, + ), + ); + }); }); describe('cli', () => { diff --git a/packages/snaps-controllers/package.json b/packages/snaps-controllers/package.json index c27bcbc367..640c26ebf6 100644 --- a/packages/snaps-controllers/package.json +++ b/packages/snaps-controllers/package.json @@ -157,7 +157,7 @@ } }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/snaps-controllers/src/snaps/SnapController.test.tsx b/packages/snaps-controllers/src/snaps/SnapController.test.tsx index e333bfd3ee..b178329fc1 100644 --- a/packages/snaps-controllers/src/snaps/SnapController.test.tsx +++ b/packages/snaps-controllers/src/snaps/SnapController.test.tsx @@ -69,7 +69,6 @@ import { import { hmac } from '@noble/hashes/hmac'; import { sha512 } from '@noble/hashes/sha512'; import { File } from 'buffer'; -import { webcrypto } from 'crypto'; import fetchMock from 'jest-fetch-mock'; import { pipeline } from 'readable-stream'; import type { Duplex } from 'readable-stream'; @@ -122,14 +121,6 @@ import { } from '../test-utils'; import { delay } from '../utils'; -if (!('CryptoKey' in globalThis)) { - // We can remove this once we drop Node 18 - Object.defineProperty(globalThis, 'CryptoKey', { - value: webcrypto.CryptoKey, - }); -} - -globalThis.crypto ??= webcrypto as typeof globalThis.crypto; globalThis.crypto.getRandomValues = ( array: Type, ) => { @@ -11256,11 +11247,6 @@ describe('SnapController', () => { it('supports hex encoding', async () => { fetchMock.disableMocks(); - // We can remove this once we drop Node 18 - Object.defineProperty(globalThis, 'File', { - value: File, - }); - // Because jest-fetch-mock replaces native fetch, we mock it here Object.defineProperty(globalThis, 'fetch', { value: async (dataUrl: string) => { diff --git a/packages/snaps-execution-environments/coverage.json b/packages/snaps-execution-environments/coverage.json index d30f06ac47..c52103b7ed 100644 --- a/packages/snaps-execution-environments/coverage.json +++ b/packages/snaps-execution-environments/coverage.json @@ -1,6 +1,6 @@ { - "branches": 90.14, + "branches": 89.94, "functions": 94.65, - "lines": 90.21, - "statements": 89.56 + "lines": 90.32, + "statements": 89.65 } diff --git a/packages/snaps-execution-environments/package.json b/packages/snaps-execution-environments/package.json index 836f5f1d0b..19e3a9f9d1 100644 --- a/packages/snaps-execution-environments/package.json +++ b/packages/snaps-execution-environments/package.json @@ -122,7 +122,7 @@ "webpack-merge": "^5.9.0" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/snaps-execution-environments/src/common/endowments/crypto.test.ts b/packages/snaps-execution-environments/src/common/endowments/crypto.test.ts index e4a8aa20c1..ee0e2e0c4b 100644 --- a/packages/snaps-execution-environments/src/common/endowments/crypto.test.ts +++ b/packages/snaps-execution-environments/src/common/endowments/crypto.test.ts @@ -36,15 +36,4 @@ describe('Crypto endowment', () => { SubtleCrypto: undefined, }); }); - - it('returns Node.js webcrypto module', () => { - // eslint-disable-next-line jest/prefer-strict-equal - expect(crypto.factory()).toEqual({ - crypto: { - mock: true, - subtle: { mock: true, constructor: { mock: true } }, - }, - SubtleCrypto: { mock: true }, - }); - }); }); diff --git a/packages/snaps-execution-environments/src/common/endowments/crypto.ts b/packages/snaps-execution-environments/src/common/endowments/crypto.ts index 0bc2b13eef..f425482211 100644 --- a/packages/snaps-execution-environments/src/common/endowments/crypto.ts +++ b/packages/snaps-execution-environments/src/common/endowments/crypto.ts @@ -1,25 +1,22 @@ +import { assert } from '@metamask/utils'; + import { rootRealmGlobal } from '../globalObject'; export const createCrypto = () => { - if ( - 'crypto' in rootRealmGlobal && - typeof rootRealmGlobal.crypto === 'object' && - 'SubtleCrypto' in rootRealmGlobal && - typeof rootRealmGlobal.SubtleCrypto === 'function' - ) { - return { - crypto: harden(rootRealmGlobal.crypto), - SubtleCrypto: harden(rootRealmGlobal.SubtleCrypto), - }; - } - // For now, we expose the experimental webcrypto API for Node.js execution environments - // TODO: Figure out if this is enough long-term or if we should use a polyfill. - /* eslint-disable-next-line @typescript-eslint/no-require-imports, import-x/no-nodejs-modules, no-restricted-globals */ - const crypto = require('crypto').webcrypto; + assert( + rootRealmGlobal.crypto, + 'Crypto endowment requires `globalThis.crypto` to be defined.', + ); + + assert( + rootRealmGlobal.SubtleCrypto, + 'Crypto endowment requires `globalThis.SubtleCrypto` to be defined.', + ); + return { - crypto: harden(crypto), - SubtleCrypto: harden(crypto.subtle.constructor), - } as const; + crypto: harden(rootRealmGlobal.crypto), + SubtleCrypto: harden(rootRealmGlobal.SubtleCrypto), + }; }; const endowmentModule = { diff --git a/packages/snaps-jest/package.json b/packages/snaps-jest/package.json index 04ee38ca3f..2152d11243 100644 --- a/packages/snaps-jest/package.json +++ b/packages/snaps-jest/package.json @@ -90,7 +90,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/snaps-rollup-plugin/package.json b/packages/snaps-rollup-plugin/package.json index 02227b6698..6d77c8c600 100644 --- a/packages/snaps-rollup-plugin/package.json +++ b/packages/snaps-rollup-plugin/package.json @@ -79,7 +79,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/snaps-rpc-methods/package.json b/packages/snaps-rpc-methods/package.json index f9d02960e9..1c5ad175fd 100644 --- a/packages/snaps-rpc-methods/package.json +++ b/packages/snaps-rpc-methods/package.json @@ -82,7 +82,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/snaps-rpc-methods/src/restricted/manageState.test.ts b/packages/snaps-rpc-methods/src/restricted/manageState.test.ts index f4444a35d5..c1a04b8cff 100644 --- a/packages/snaps-rpc-methods/src/restricted/manageState.test.ts +++ b/packages/snaps-rpc-methods/src/restricted/manageState.test.ts @@ -4,7 +4,6 @@ import { MOCK_SNAP_ID, TEST_SECRET_RECOVERY_PHRASE_SEED_BYTES, } from '@metamask/snaps-utils/test-utils'; -import { webcrypto } from 'crypto'; import { getEncryptionEntropy, @@ -66,13 +65,6 @@ describe('snap_manageState', () => { }); describe('getManageStateImplementation', () => { - if (!('CryptoKey' in globalThis)) { - // We can remove this once we drop Node 18 - Object.defineProperty(globalThis, 'CryptoKey', { - value: webcrypto.CryptoKey, - }); - } - it('gets snap state', async () => { const mockSnapState = { some: { diff --git a/packages/snaps-sandbox/package.json b/packages/snaps-sandbox/package.json index 0781192186..bd9a1ff578 100644 --- a/packages/snaps-sandbox/package.json +++ b/packages/snaps-sandbox/package.json @@ -71,7 +71,7 @@ "vitest": "^3.1.1" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/snaps-sandbox/src/features/sidebar/components/History.tsx b/packages/snaps-sandbox/src/features/sidebar/components/History.tsx index 9b39dd9384..24c23c3a73 100644 --- a/packages/snaps-sandbox/src/features/sidebar/components/History.tsx +++ b/packages/snaps-sandbox/src/features/sidebar/components/History.tsx @@ -18,8 +18,7 @@ export const History: FunctionComponent = () => { const [favorite, regular] = useMemo( () => history - // TODO: Use `toSorted` when dropping support for Node 18. - .sort((a, b) => b.timestamp - a.timestamp) + .toSorted((a, b) => b.timestamp - a.timestamp) .reduce<[favorite: HistoryEntry[], regular: HistoryEntry[]]>( (array, entry) => { if (entry.favorite) { diff --git a/packages/snaps-sdk/package.json b/packages/snaps-sdk/package.json index 678151a5f0..a082ee56c8 100644 --- a/packages/snaps-sdk/package.json +++ b/packages/snaps-sdk/package.json @@ -115,7 +115,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/snaps-simulation/package.json b/packages/snaps-simulation/package.json index 45d93bb717..5d056be2d9 100644 --- a/packages/snaps-simulation/package.json +++ b/packages/snaps-simulation/package.json @@ -95,7 +95,7 @@ "typescript": "~5.3.3" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/snaps-utils/package.json b/packages/snaps-utils/package.json index 53ee10b876..b713ce71f3 100644 --- a/packages/snaps-utils/package.json +++ b/packages/snaps-utils/package.json @@ -138,7 +138,7 @@ "vitest": "^3.1.1" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/snaps-utils/src/base64.test.ts b/packages/snaps-utils/src/base64.test.ts index 7bc7a849bc..b6134e8dde 100644 --- a/packages/snaps-utils/src/base64.test.ts +++ b/packages/snaps-utils/src/base64.test.ts @@ -1,5 +1,5 @@ import { bytesToBase64, stringToBytes } from '@metamask/utils'; -import { File } from 'buffer'; +import type { File } from 'buffer'; import { decodeBase64, encodeBase64 } from './base64'; import { VirtualFile } from './virtual-file'; @@ -34,11 +34,6 @@ class MockFileReader { } describe('encodeBase64', () => { - // We can remove this once we drop Node 18 - Object.defineProperty(globalThis, 'File', { - value: File, - }); - it('encodes vfile to base64', async () => { const vfile = new VirtualFile( stringToBytes(JSON.stringify({ foo: 'bar' })), diff --git a/packages/snaps-webpack-plugin/package.json b/packages/snaps-webpack-plugin/package.json index 95e75b36ea..4cfdb7edff 100644 --- a/packages/snaps-webpack-plugin/package.json +++ b/packages/snaps-webpack-plugin/package.json @@ -84,7 +84,7 @@ "webpack": "^5.97.1" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" }, "publishConfig": { "access": "public", diff --git a/packages/test-snaps/package.json b/packages/test-snaps/package.json index aef7be8e83..a400e3b0c4 100644 --- a/packages/test-snaps/package.json +++ b/packages/test-snaps/package.json @@ -117,6 +117,6 @@ "webpack-dev-server": "^5.2.1" }, "engines": { - "node": "^18.16 || >=20" + "node": "^20 || >=22" } } diff --git a/yarn.config.cjs b/yarn.config.cjs index 63a1cb1fc2..0353a1aafe 100644 --- a/yarn.config.cjs +++ b/yarn.config.cjs @@ -246,7 +246,7 @@ module.exports = defineConfig({ } // All packages must specify a minimum Node.js version of 18.18. - expectWorkspaceField(workspace, 'engines.node', '^18.16 || >=20'); + expectWorkspaceField(workspace, 'engines.node', '^20 || >=22'); // All non-root public packages should be published to the NPM registry; // all non-root private packages should not.