flexdinesh / browser-or-node

Check where your code is running. In the browser or in node.js environment.
MIT License
245 stars 20 forks source link

in isJsDom there is no check on navigator.userAgent #28

Open locustshadow opened 1 year ago

locustshadow commented 1 year ago

even using 2.1.1 logic, when i run it in node (alpine14), i get the following error:

    (navigator.userAgent.includes("Node.js") ||
                         ^
TypeError: Cannot read property 'includes' of undefined

when i evaluate each part, i can see these various values: typeof window !== "undefined" true

window.name === "nodejs" false

therefore, (typeof window !== "undefined" && window.name === "nodejs") is false

so, one would think it would short circuit, but for some reason it continues on to the OR where

typeof navigator !== "undefined" is true

because

navigator is an object with {appName: 'nodejs'}

but then it blows up here because there i no userAgent:

navigator.userAgent.includes("Node.js") Uncaught TypeError TypeError: Cannot read property 'includes' of undefined

so, it seems like the checks are not preventing it from trying to access a property on an undefined object (navigator.userAgent). would appreciate if you could identify a way to make this work for me. we are using bitgo_service which uses your code. not sure how this works for others and not for me, but i can override the dependency of the current bitgo version we are using, if you can create an updated package.

many thanks!

dabit3 commented 1 year ago

I also ran into this error, had to polyfill in order to get it to work, if anyone else wants to do the same, just fork it and do this:

const isJsDom =
  (typeof window !== "undefined" && window.name === "nodejs") ||
  (typeof navigator !== "undefined" && navigator.userAgent &&
    (navigator.userAgent.includes("Node.js") ||
      navigator.userAgent.includes("jsdom")));