Are you saying we should add node.swc to Core? FWIW, I just tried setting targets to JSNode and global is still not recognized. node.swc does not seem to be used even when that’s the target. That does not seem right either.
> On Jul 13, 2017, at 7:42 PM, Josh Tynjala <joshtynj...@gmail.com> wrote: > > I think the correct solution is to add node.swc to the > -external-library-path when you need access to global. You need js.swc on > the -external-library-path when you want to access window. You can't use > window in a SWF-only project, for instance. > > - Josh > > On Thu, Jul 13, 2017 at 9:29 AM, Harbs <harbs.li...@gmail.com> wrote: > >> There is a mention of window in the NativeJSType enums. Not sure why it’s >> needed there. >> >> global should already be in node.js (I think). I’m pretty sure it’s >> defined in the node typedefs >> >> I don’t really care how it’s achieved, but by default (without doing any >> special imports) global should be recognized. (just like window is) >> >> Right now, typing global into a FlexJS project targeting “JSFlex” or any >> one of the framework projects results in a compiler error. How do we fix >> that? >> >>> On Jul 13, 2017, at 7:17 PM, Alex Harui <aha...@adobe.com.INVALID> >> wrote: >>> >>> 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 >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> >>