diff --git a/.eslintrc.js b/.eslintrc.js index 15060abbe8..12819f6665 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -28,7 +28,7 @@ module.exports = { 'eqeqeq': ['error', 'always', { null: 'ignore' }], 'prefer-const': ['error', { ignoreReadBeforeAssign: true }], 'no-var': 'error', - 'valid-typeof': 'off', + 'valid-typeof': 'error', 'no-restricted-syntax': [ 'error', { selector: 'ForInStatement', message: 'Use Object.{keys,values,entries} instead.' }, diff --git a/packages/sdk/browser/__tests__/BrowserApi.test.ts b/packages/sdk/browser/__tests__/BrowserApi.test.ts new file mode 100644 index 0000000000..391e1d11a0 --- /dev/null +++ b/packages/sdk/browser/__tests__/BrowserApi.test.ts @@ -0,0 +1,29 @@ +import { isDocument, isWindow } from '../src/BrowserApi'; + +it('isDocument returns true when document is defined', () => { + expect(isDocument()).toBe(true); +}); + +it('isDocument returns false when document is not defined', () => { + const original = Object.getOwnPropertyDescriptor(globalThis, 'document'); + Object.defineProperty(globalThis, 'document', { value: undefined, configurable: true }); + try { + expect(isDocument()).toBe(false); + } finally { + Object.defineProperty(globalThis, 'document', original!); + } +}); + +it('isWindow returns true when window is defined', () => { + expect(isWindow()).toBe(true); +}); + +it('isWindow returns false when window is not defined', () => { + const original = Object.getOwnPropertyDescriptor(globalThis, 'window'); + Object.defineProperty(globalThis, 'window', { value: undefined, configurable: true }); + try { + expect(isWindow()).toBe(false); + } finally { + Object.defineProperty(globalThis, 'window', original!); + } +}); diff --git a/packages/sdk/browser/__tests__/platform/randomUuidV4.test.ts b/packages/sdk/browser/__tests__/platform/randomUuidV4.test.ts index 73be7647bc..748dfe547f 100644 --- a/packages/sdk/browser/__tests__/platform/randomUuidV4.test.ts +++ b/packages/sdk/browser/__tests__/platform/randomUuidV4.test.ts @@ -1,4 +1,4 @@ -import { fallbackUuidV4, formatDataAsUuidV4 } from '../../src/platform/randomUuidV4'; +import randomUuidV4, { fallbackUuidV4, formatDataAsUuidV4 } from '../../src/platform/randomUuidV4'; it('formats conformant UUID', () => { // For this test we remove the random component and just inspect the variant and version. @@ -26,3 +26,19 @@ it('formats conformant UUID', () => { expect(specifierB).toEqual(0x8); expect(specifierC).toEqual(0x8); }); + +it('falls back when crypto.randomUUID is unavailable', () => { + const original = globalThis.crypto; + Object.defineProperty(globalThis, 'crypto', { + value: { getRandomValues: original.getRandomValues.bind(original) }, + configurable: true, + }); + + try { + const uuid = randomUuidV4(); + expect(uuid).toHaveLength(36); + expect(uuid[14]).toEqual('4'); + } finally { + Object.defineProperty(globalThis, 'crypto', { value: original, configurable: true }); + } +}); diff --git a/packages/sdk/browser/src/BrowserApi.ts b/packages/sdk/browser/src/BrowserApi.ts index a9c233b7a6..512220a3de 100644 --- a/packages/sdk/browser/src/BrowserApi.ts +++ b/packages/sdk/browser/src/BrowserApi.ts @@ -5,11 +5,11 @@ */ export function isDocument() { - return typeof document !== undefined; + return typeof document !== 'undefined'; } export function isWindow() { - return typeof window !== undefined; + return typeof window !== 'undefined'; } /** @@ -91,7 +91,7 @@ export function getLocationHash(): string { } export function getCrypto(): Crypto { - if (typeof crypto !== undefined) { + if (typeof crypto !== 'undefined') { return crypto; } // This would indicate running in an environment that doesn't have window.crypto or self.crypto. diff --git a/packages/sdk/browser/src/platform/randomUuidV4.ts b/packages/sdk/browser/src/platform/randomUuidV4.ts index 0659d58f72..620cd9acc1 100644 --- a/packages/sdk/browser/src/platform/randomUuidV4.ts +++ b/packages/sdk/browser/src/platform/randomUuidV4.ts @@ -91,7 +91,7 @@ export function fallbackUuidV4(): string { } export default function randomUuidV4(): string { - if (typeof crypto !== undefined && typeof crypto.randomUUID === 'function') { + if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') { return crypto.randomUUID(); } diff --git a/packages/telemetry/browser-telemetry/src/randomUuidV4.ts b/packages/telemetry/browser-telemetry/src/randomUuidV4.ts index ba455a577c..7e9c065c57 100644 --- a/packages/telemetry/browser-telemetry/src/randomUuidV4.ts +++ b/packages/telemetry/browser-telemetry/src/randomUuidV4.ts @@ -94,7 +94,7 @@ export function fallbackUuidV4(): string { } export default function randomUuidV4(): string { - if (typeof crypto !== undefined && typeof crypto.randomUUID === 'function') { + if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') { return crypto.randomUUID(); }