IIRC, the compiler doesn't special case handling of that code. "window" is defined in missing.js so the js.swc knows there is such an entity. Is there any reason not to add a "global" to node.swc?
-Alex On 7/13/17, 12:29 AM, "Harbs" <harbs.li...@gmail.com> wrote: >Right now, if you have code that looks like this, the compiler will >report and error and it will fail: > >global[“foo”]; > >I would like for that to be legal code in a COMPILE::JS block and it >should compile to: > >global[“foo”]; > >Exactly the same as window: > >If you write: >window[“foo”]; > >It’s legal code and will compile to: >window[“foo”]; > >That’s it. > >> On Jul 13, 2017, at 10:18 AM, Alex Harui <aha...@adobe.com.INVALID> >>wrote: >> >> I'm still not clear what changes are needed. >> >> Are you trying to access APIs that are global but not defined in JS.SWC >>or >> Node.SWC? Otherwise, the APIs on window/global should be defined in >>those >> SWCs. >> >> I'm not sure what the test case is supposed to look like. >> >> Thanks, >> -Alex >> >> On 7/13/17, 12:11 AM, "Harbs" <harbs.li...@gmail.com> wrote: >> >>> Electron has both window and global. Node has global and no window. I >>> think CEF has window and no global. Browsers have window but not >>>global. >>> Depending on which environment you are writing for, you’re going to >>>need >>> either window or global for accessing global variables. >>> >>> I’m more concerned with general global access in Node than my specific >>> use case. If general global access works, then that gives a solution >>>for >>> my specific case as well as an other arbitrary one where you’d use >>>window >>> in the browser. >>> >>> I think it’s fine to cross compile global[“foo”] to the exact same >>> global[“foo”] in JS. In other words, the compiler should accept global >>> with bracket notation and pass it through unchanged. >>> >>>> On Jul 13, 2017, at 9:33 AM, Alex Harui <aha...@adobe.com.INVALID> >>>> wrote: >>>> >>>> I think the only thing the compiler does with "window" is allow you to >>>> use >>>> "window" to disambiguate between a "global" API and another API in a >>>> package with the same name. >>>> >>>> And then the JS.SWC typedefs specify certain APIs. >>>> >>>> AIUI, Electron is another runtime that has a window variable and you >>>> want >>>> to detect the difference between Browser, Node and Electron? Or are >>>>you >>>> willing to just try to check for features instead? >>>> >>>> If you can show what JS code you'd want to end up with we can look >>>>into >>>> changing the compiler so you can write AS to generate that JS. >>>> >>>> Thanks, >>>> -Alex >>>> >>>> On 7/12/17, 9:03 PM, "Harbs" <harbs.li...@gmail.com> wrote: >>>> >>>>> What do we currently do with window? >>>>> >>>>> global in Node is the same as window in the browser. All global >>>>> variables >>>>> are attached to the global object. >>>>> >>>>> global[“foo”] could compile to global[“foo”], global.foo, or just >>>>>plain >>>>> foo, and it all means the same thing. >>>>> >>>>>> On Jul 13, 2017, at 2:14 AM, Alex Harui <aha...@adobe.com.INVALID> >>>>>> wrote: >>>>>> >>>>>> What AS do you want to write and what JS do you want as output? >>>>>> >>>>>> -Alex >>>>>> >>>>>> On 7/9/17, 12:53 AM, "Harbs" <harbs.li...@gmail.com> wrote: >>>>>> >>>>>>> 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 >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> >