diff --git a/.changeset/wet-camels-tell.md b/.changeset/wet-camels-tell.md new file mode 100644 index 00000000000..ebd666d9f73 --- /dev/null +++ b/.changeset/wet-camels-tell.md @@ -0,0 +1,6 @@ +--- +"@fuel-ts/account": patch +"@fuel-ts/crypto": patch +--- + +feat: add randomUUID into `fuel-ts/crypto` diff --git a/packages/account/package.json b/packages/account/package.json index d984691ef5d..f0d0c084235 100644 --- a/packages/account/package.json +++ b/packages/account/package.json @@ -66,8 +66,7 @@ "graphql-request": "5.0.0", "graphql-tag": "^2.12.6", "portfinder": "^1.0.32", - "ramda": "^0.30.1", - "uuid": "^10.0.0" + "ramda": "^0.30.1" }, "devDependencies": { "type-fest": "^4.6.0", @@ -79,7 +78,6 @@ "@graphql-codegen/typescript-generic-sdk": "^4.0.1", "@graphql-codegen/typescript-operations": "^4.2.3", "@types/ramda": "^0.30.1", - "@types/uuid": "^9.0.1", "get-graphql-schema": "^2.1.2" } } diff --git a/packages/account/src/test-utils/launchNode.ts b/packages/account/src/test-utils/launchNode.ts index 7c3f49418d9..875acc86800 100644 --- a/packages/account/src/test-utils/launchNode.ts +++ b/packages/account/src/test-utils/launchNode.ts @@ -1,9 +1,8 @@ import { BYTES_32 } from '@fuel-ts/abi-coder'; -import { randomBytes } from '@fuel-ts/crypto'; +import { randomBytes, randomUUID } from '@fuel-ts/crypto'; import { FuelError } from '@fuel-ts/errors'; import type { SnapshotConfigs } from '@fuel-ts/utils'; import { defaultConsensusKey, hexlify, defaultSnapshotConfigs } from '@fuel-ts/utils'; -import { randomUUID } from 'crypto'; import { existsSync, mkdirSync, rmSync, writeFileSync } from 'fs'; import os from 'os'; import path from 'path'; diff --git a/packages/account/src/wallet/keystore-wallet.ts b/packages/account/src/wallet/keystore-wallet.ts index 75bced4e2f3..fa488f75845 100644 --- a/packages/account/src/wallet/keystore-wallet.ts +++ b/packages/account/src/wallet/keystore-wallet.ts @@ -7,11 +7,11 @@ import { stringFromBuffer, decryptJsonWalletData, encryptJsonWalletData, + randomUUID, } from '@fuel-ts/crypto'; import { ErrorCode, FuelError } from '@fuel-ts/errors'; import type { AbstractAddress } from '@fuel-ts/interfaces'; import { hexlify } from '@fuel-ts/utils'; -import { v4 as uuidv4 } from 'uuid'; export type KeystoreWallet = { id: string; @@ -90,7 +90,7 @@ export async function encryptKeystoreWallet( // Construct keystore. const keystore: KeystoreWallet = { - id: uuidv4(), + id: randomUUID(), version: 3, address: removeHexPrefix(ownerAddress.toHexString()), crypto: { diff --git a/packages/contract/src/test-utils/launch-test-node.test.ts b/packages/contract/src/test-utils/launch-test-node.test.ts index 854376b5336..69634ad6428 100644 --- a/packages/contract/src/test-utils/launch-test-node.test.ts +++ b/packages/contract/src/test-utils/launch-test-node.test.ts @@ -1,11 +1,11 @@ import type { JsonAbi } from '@fuel-ts/abi-coder'; import { Provider } from '@fuel-ts/account'; import * as setupTestProviderAndWalletsMod from '@fuel-ts/account/test-utils'; +import { randomBytes, randomUUID } from '@fuel-ts/crypto'; import { FuelError } from '@fuel-ts/errors'; import { expectToThrowFuelError, safeExec } from '@fuel-ts/errors/test-utils'; import { hexlify, type SnapshotConfigs } from '@fuel-ts/utils'; import { getForcProject, waitUntilUnreachable } from '@fuel-ts/utils/test-utils'; -import { randomBytes, randomUUID } from 'crypto'; import { existsSync, mkdirSync, readFileSync, rmSync } from 'fs'; import { writeFile, copyFile } from 'fs/promises'; import os from 'os'; diff --git a/packages/crypto/src/browser/index.ts b/packages/crypto/src/browser/index.ts index 2f421939723..ef5b6fa86ad 100644 --- a/packages/crypto/src/browser/index.ts +++ b/packages/crypto/src/browser/index.ts @@ -7,6 +7,7 @@ import { decryptJsonWalletData, encryptJsonWalletData } from './encryptJsonWalle import { computeHmac } from './hmac'; import { pbkdf2 } from './pbkdf2'; import { randomBytes } from './randomBytes'; +import { randomUUID } from './randomUUID'; import { stringFromBuffer } from './stringFromBuffer'; const api: CryptoApi = { @@ -23,6 +24,7 @@ const api: CryptoApi = { computeHmac, pbkdf2, ripemd160, + randomUUID, }; export default api; diff --git a/packages/crypto/src/browser/randomUUID.ts b/packages/crypto/src/browser/randomUUID.ts new file mode 100644 index 00000000000..d96d11b8fd7 --- /dev/null +++ b/packages/crypto/src/browser/randomUUID.ts @@ -0,0 +1,5 @@ +import type { CryptoApi } from '../types'; + +import { crypto } from './crypto'; + +export const randomUUID: CryptoApi['randomUUID'] = () => crypto.randomUUID(); diff --git a/packages/crypto/src/index.browser.ts b/packages/crypto/src/index.browser.ts index ddd3a4f4777..c08eb2bc221 100644 --- a/packages/crypto/src/index.browser.ts +++ b/packages/crypto/src/index.browser.ts @@ -16,4 +16,5 @@ export const { pbkdf2, computeHmac, ripemd160, + randomUUID, } = cryptoApi; diff --git a/packages/crypto/src/index.ts b/packages/crypto/src/index.ts index e3cb916b2dd..5fcbfaecc03 100644 --- a/packages/crypto/src/index.ts +++ b/packages/crypto/src/index.ts @@ -16,4 +16,5 @@ export const { computeHmac, pbkdf2, ripemd160, + randomUUID, } = cryptoApi; diff --git a/packages/crypto/src/node/index.ts b/packages/crypto/src/node/index.ts index 2f421939723..ef5b6fa86ad 100644 --- a/packages/crypto/src/node/index.ts +++ b/packages/crypto/src/node/index.ts @@ -7,6 +7,7 @@ import { decryptJsonWalletData, encryptJsonWalletData } from './encryptJsonWalle import { computeHmac } from './hmac'; import { pbkdf2 } from './pbkdf2'; import { randomBytes } from './randomBytes'; +import { randomUUID } from './randomUUID'; import { stringFromBuffer } from './stringFromBuffer'; const api: CryptoApi = { @@ -23,6 +24,7 @@ const api: CryptoApi = { computeHmac, pbkdf2, ripemd160, + randomUUID, }; export default api; diff --git a/packages/crypto/src/node/randomUUID.ts b/packages/crypto/src/node/randomUUID.ts new file mode 100644 index 00000000000..1a07e68415a --- /dev/null +++ b/packages/crypto/src/node/randomUUID.ts @@ -0,0 +1,5 @@ +import { randomUUID as UUID } from 'crypto'; + +import type { CryptoApi } from '../types'; + +export const randomUUID: CryptoApi['randomUUID'] = () => UUID(); diff --git a/packages/crypto/src/types.ts b/packages/crypto/src/types.ts index 4abf34808e4..842c5198f4b 100644 --- a/packages/crypto/src/types.ts +++ b/packages/crypto/src/types.ts @@ -29,6 +29,7 @@ export interface CryptoApi { encryptJsonWalletData(data: Uint8Array, key: Uint8Array, iv: Uint8Array): Promise; decryptJsonWalletData(data: Uint8Array, key: Uint8Array, iv: Uint8Array): Promise; computeHmac(algorithm: 'sha256' | 'sha512', key: BytesLike, data: BytesLike): string; + randomUUID(): string; pbkdf2( password: BytesLike, salt: BytesLike, diff --git a/packages/crypto/test/randomUUID.test.ts b/packages/crypto/test/randomUUID.test.ts new file mode 100644 index 00000000000..f5b68b2e0eb --- /dev/null +++ b/packages/crypto/test/randomUUID.test.ts @@ -0,0 +1,15 @@ +import { randomUUID } from '..'; + +/** + * @group node + * @group browser + */ +describe('randomUUID', () => { + const UUID_V4_REGEX = + /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-4[0-9a-fA-F]{3}\b-[89ABab][0-9a-fA-F]{3}\b-[0-9a-fA-F]{12}$/; + + it('generates a V4 UUID', () => { + const uuidV4 = randomUUID(); + expect(uuidV4).toMatch(UUID_V4_REGEX); + }); +}); diff --git a/packages/crypto/tsconfig.json b/packages/crypto/tsconfig.json index b0fced27d72..b22c89a4b35 100644 --- a/packages/crypto/tsconfig.json +++ b/packages/crypto/tsconfig.json @@ -3,5 +3,5 @@ "compilerOptions": { "outDir": "./dist" }, - "include": ["src"] + "include": ["src", "test"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1795d6372f3..0d7c50ce052 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -728,9 +728,6 @@ importers: ramda: specifier: ^0.30.1 version: 0.30.1 - uuid: - specifier: ^10.0.0 - version: 10.0.0 devDependencies: '@graphql-codegen/cli': specifier: ^5.0.2 @@ -747,9 +744,6 @@ importers: '@types/ramda': specifier: ^0.30.1 version: 0.30.1 - '@types/uuid': - specifier: ^9.0.1 - version: 9.0.1 get-graphql-schema: specifier: ^2.1.2 version: 2.1.2 @@ -5278,9 +5272,6 @@ packages: '@types/unist@2.0.6': resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} - '@types/uuid@9.0.1': - resolution: {integrity: sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==} - '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} @@ -13703,10 +13694,6 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -20359,8 +20346,6 @@ snapshots: '@types/unist@2.0.6': {} - '@types/uuid@9.0.1': {} - '@types/web-bluetooth@0.0.20': {} '@types/web@0.0.153': {} @@ -31074,8 +31059,6 @@ snapshots: utils-merge@1.0.1: {} - uuid@10.0.0: {} - uuid@8.3.2: {} uuid@9.0.1: {}