diff --git a/src/__tests__/browser-test.js b/src/__tests__/browser-test.js index a882b4aa9..f9842658c 100644 --- a/src/__tests__/browser-test.js +++ b/src/__tests__/browser-test.js @@ -161,4 +161,17 @@ describe('Browser', () => { expect(uuid2).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i); expect(uuid1).not.toEqual(uuid2); }); + + it('throw error if randomUUID is not available', () => { + const tmp = global.crypto; + delete global.crypto; + try { + const uuidv4 = require('../uuid').default; + uuidv4(); + expect(true).toBe(false); + } catch (e) { + expect(e.message).toBe('crypto.randomUUID is not available. For React Native, import "react-native-random-uuid"'); + } + global.crypto = tmp; + }); }); diff --git a/src/uuid.ts b/src/uuid.ts index 8edd3e86c..caa76b18e 100644 --- a/src/uuid.ts +++ b/src/uuid.ts @@ -1,25 +1,11 @@ -let uuid: () => string; - -if (process.env.PARSE_BUILD === 'weapp') { - uuid = function () { - const s: string[] = []; - const hexDigits = '0123456789abcdef'; - - for (let i = 0; i < 36; i++) { - s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); - } - - s[14] = '4'; // bits 12-15 of the time_hi_and_version field to 0010 - s[19] = hexDigits.substr((Number(s[19]) & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01 - s[8] = s[13] = s[18] = s[23] = '-'; - return s.join(''); - }; -} else if (process.env.PARSE_BUILD === 'browser') { - // Use native crypto.randomUUID() from the Web Crypto API in browsers - uuid = () => globalThis.crypto.randomUUID(); -} else { - // Use Node.js crypto.randomUUID() for Node and React Native builds - uuid = require('crypto').randomUUID; -} +const uuid = (): string => { + if (typeof crypto === 'undefined' || typeof crypto.randomUUID !== 'function') { + throw new Error( + 'crypto.randomUUID is not available. ' + + 'For React Native, import "react-native-random-uuid"' + ); + } + return crypto.randomUUID(); +}; export default uuid; diff --git a/types/uuid.d.ts b/types/uuid.d.ts index 8ce0850a8..854cc9c2c 100644 --- a/types/uuid.d.ts +++ b/types/uuid.d.ts @@ -1,2 +1,2 @@ -declare let uuid: () => string; +declare const uuid: () => string; export default uuid;