const isStandardBrowserEnv = () => { // window is only defined when it is a browser if (typeof window !== 'undefined') { // Is the process an electron application // check if we are in electron `renderer` const electronRenderCheck = typeof navigator !== 'undefined' && navigator.userAgent?.toLowerCase().indexOf(' electron/') > -1 if (electronRenderCheck && process?.versions) { const electronMainCheck = Object.prototype.hasOwnProperty.call( process.versions, 'electron', ) // Both electron checks are only true if the following webPreferences are set in the main electron BrowserWindow() // webPreferences: { // sandbox: false, // nodeIntegration: true // contextIsolation: false // } return !electronMainCheck } return typeof window.document !== 'undefined' } // return false if nothing is detected return false } const isWebWorkerEnv = () => Boolean( // eslint-disable-next-line no-restricted-globals typeof self === 'object' && // eslint-disable-next-line no-restricted-globals self?.constructor?.name?.includes('WorkerGlobalScope'), ) const isReactNativeEnv = () => typeof navigator !== 'undefined' && navigator.product === 'ReactNative' const isBrowser = isStandardBrowserEnv() || isWebWorkerEnv() || isReactNativeEnv() export const isWebWorker = isWebWorkerEnv() export const isReactNativeBrowser = isReactNativeEnv() export default isBrowser