Checking for window will work for Node, but it will not work for Electron.

I tried adding global to Falcon, but I was obviously going about it wrong, 
because what I tried did not work.

This is not really high priority for me right now, so I’m moving on to 
something else…

> On Jul 6, 2017, at 3:05 AM, Alex Harui <aha...@adobe.com.INVALID> wrote:
> 
> I've noticed lots of advice on the internet to use feature detection
> instead of browser/runtime detection.  Did you rule out doing that?
> Browsers may implement new features over time.
> 
> But otherwise, I see some clever tests that check for "window" and a few
> other things.
> 
> HTH,
> -Alex
> 
> On 7/5/17, 1:54 PM, "Harbs" <harbs.li...@gmail.com> wrote:
> 
>> No. I was trying to use process to check whether it’s running in a Node
>> runtime (such as Node or Electron). window does not have process.
>> 
>> I’m trying to add a class that lets the client know what environment it’s
>> running in.
>> 
>> Adding global sounds like a good idea. Between window and global, I think
>> that would offer a solution everywhere.
>> 
>>> On Jul 5, 2017, at 7:48 PM, Alex Harui <aha...@adobe.com.INVALID> wrote:
>>> 
>>> Sure, I know it wouldn't work at runtime, but it sounded like Harbs
>>> couldn't even get the compiler to accept window["process"] which it
>>> should.
>>> 
>>> So, it should be ok to write:
>>> 
>>> if(typeof window !== "undefined")
>>> {
>>>   theProcess = window["process"];
>>> }
>>> else
>>> 
>>>   theProcess = global.process
>>> 
>>> But is there really a process property in the browser?
>>> 
>>> We could create or own single variable if we want.  How often do
>>> libraries
>>> need stuff in window/global?  Classes that need it should be able to use
>>> inject_html and run some JS that maps window to global or the other way
>>> around.
>>> 
>>> HTH,
>>> -Alex
>>> 
>>> On 7/5/17, 6:43 AM, "Josh Tynjala" <joshtynj...@gmail.com> wrote:
>>> 
>>>> Node.js doesn't have a window variable, so window["process"] won't
>>>> work.
>>>> They have a global variable instead.
>>>> 
>>>> I remember reading that there is a proposal for ECMAScript to
>>>> standardize
>>>> a
>>>> single variable that refers to window in the browser and global in
>>>> Node.js,
>>>> but that doesn't exist yet.
>>>> 
>>>> - Josh
>>>> 
>>>> On Tue, Jul 4, 2017 at 11:35 PM, Alex Harui <aha...@adobe.com.invalid>
>>>> wrote:
>>>> 
>>>>> What class in Core needs this dependency?  I think one drawback is
>>>>> that
>>>>> users of that class will need to add node.swc to their project
>>>>> dependencies.  But I don't think every consumer of Core will need
>>>>> node.swc.
>>>>> 
>>>>> But first, why didn't window["process"] work?  In theory Falcon will
>>>>> let
>>>>> you access anything off of window.  We could also add global if we
>>>>> want.
>>>>> Or maybe we should only allow global and have some bootstrap code that
>>>>> maps global to window?
>>>>> 
>>>>> -Alex
>>>>> 
>>>>> On 7/4/17, 2:09 PM, "Harbs" <harbs.li...@gmail.com> wrote:
>>>>> 
>>>>>> Actually, I see that the Node typedefs has all the process
>>>>>> declarations
>>>>>> in global.js.
>>>>>> 
>>>>>> Is there an issue with adding a dependency in CoreJS to node.swc?
>>>>>> 
>>>>>> Should a class that has this dependency go somewhere else? (I don’t
>>>>>> really see an issue with adding the dependency, but I’m throwing this
>>>>> out
>>>>>> in case I’m missing something.)
>>>>>> 
>>>>>> Harbs
>>>>>> 
>>>>>>> On Jul 5, 2017, at 12:00 AM, Harbs <harbs.li...@gmail.com> wrote:
>>>>>>> 
>>>>>>> Looks like it.
>>>>>>> 
>>>>>>> I see this in missing.js:
>>>>>>> 
>>>>>>> /**
>>>>>>> * @export
>>>>>>> * This gets mapped to org.apache.flex.utils.Language.trace() by the
>>>>>>> compiler
>>>>>>> * @param {...} rest
>>>>>>> */
>>>>>>> function trace(rest) {}
>>>>>>> 
>>>>>>> /**
>>>>>>> * @type {!Console}
>>>>>>> * @const
>>>>>>> */
>>>>>>> var console;
>>>>>>> 
>>>>>>> 
>>>>>>> I guess I can add another one like so:
>>>>>>> 
>>>>>>> /**
>>>>>>> * @type {!Process}
>>>>>>> * @const
>>>>>>> */
>>>>>>> var process;
>>>>>>> 
>>>>>>> However, it seems like a drag to have to add a typedef every time a
>>>>>>> developer needs to check for the existence of a global that we did
>>>>>>> not
>>>>>>> think of.
>>>>>>> 
>>>>>>>> On Jul 4, 2017, at 9:13 PM, Harbs <harbs.li...@gmail.com> wrote:
>>>>>>>> 
>>>>>>>> Thanks. Here’s what I see:
>>>>>>>> 
>>>>>>>> if(typeof window !== "undefined")
>>>>>>>> {
>>>>>>>>   theConsole = window.console;
>>>>>>>> }
>>>>>>>> else if(typeof console !== "undefined")
>>>>>>>> {
>>>>>>>>   theConsole = console;
>>>>>>>> }
>>>>>>>> 
>>>>>>>> Did you define console in a typedef maybe?
>>>>>>>> 
>>>>>>>> I’m thinking that Falcon should really allow undefined variables
>>>>> when
>>>>>>>> used with “typeof”.
>>>>>>>> 
>>>>>>>> Truth be told, I really need to do something like one of these:
>>>>>>>> if(typeof (process) != 'undefined' && {}.toString.call(process) ==
>>>>>>>> '[object process]’)
>>>>>>>> or:
>>>>>>>> if(typeof process != 'undefined' && process &&
>>>>>>>> process.constructor.name == "process”)
>>>>>>>> 
>>>>>>>> Of course every reference to process causes a compiler error. I
>>>>> wonder
>>>>>>>> if there’s some way to tell the compiler to accept it without
>>>>>>>> complaining…
>>>>>>>> 
>>>>>>>>> On Jul 4, 2017, at 8:54 PM, Josh Tynjala <joshtynj...@gmail.com>
>>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>> I don't remember exactly what I did, but in order to get trace()
>>>>>>>>> working in
>>>>>>>>> Node.js, I had to figure out how to find the console object on
>>>>> window
>>>>>>>>> versus global. I feel like I remember using typeof, but maybe it
>>>>> was
>>>>>>>>> something else. Take a look at the implementation of
>>>>> Language.trace()
>>>>>>>>> to
>>>>>>>>> see what I did.
>>>>>>>>> 
>>>>>>>>> - Josh
>>>>>>>>> 
>>>>>>>>> On Jul 4, 2017 5:26 AM, "Harbs" <harbs.li...@gmail.com> wrote:
>>>>>>>>> 
>>>>>>>>>> I’m trying to figure out how to solve this dilemma:
>>>>>>>>>> 
>>>>>>>>>> Browsers attach global variables to window.
>>>>>>>>>> 
>>>>>>>>>> Node.js attaches globals to global.
>>>>>>>>>> 
>>>>>>>>>> I’m trying to check for the existence of a global called process.
>>>>> In
>>>>>>>>>> JS,
>>>>>>>>>> you’d generally do that by checking typeof process ==
>>>>>>>>>> ‘undefined’.
>>>>>>>>>> Falcon
>>>>>>>>>> does not allow you to do that and complains that process is an
>>>>>>>>>> undefined
>>>>>>>>>> property. In the browser you can use window[“process”] ==
>>>>> undefined
>>>>>>>>>> and in
>>>>>>>>>> node you can (theoretically) use global[“process”] == undefined.
>>>>>>>>>> I
>>>>>>>>>> can’t
>>>>>>>>>> think of a generic way to do this though.
>>>>>>>>>> 
>>>>>>>>>> Thoughts?
>>>>>>>>>> Harbs
>>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>>> 
>> 
> 

Reply via email to