I DO want renaming.

My point is that we really need to have an option to disable renaming in 
specific places in the code.

My example is a very classic case when interop between outside code is going to 
cause problems. I CAN’T use class definitions everywhere. There needs to be a 
method to properly deal with that.

I don’t have types for JSZip, and create extern files for every use of third 
party libraries is not a practical option.

If you read my email you will see I already stated that using quoted strings is 
the work-around here, but IMO, it’s not a solution to require client code to 
always do that.

On Dec 11, 2016, at 5:04 PM, Alex Harui <aha...@adobe.com> wrote:

> There is a compiler option to turn off renaming in the release build if
> you don't care about size.
> 
> IMO, use of * and plain Object is going to result in renaming issues.  Use
> class definitions everywhere.  I've mentioned in the past about a compiler
> warning on use of * and Object to help.  For Object you might also be able
> to use JSON quoted keys.
> 
> HTH,
> -Ales
> 
> On 12/11/16, 2:14 AM, "Harbs" <harbs.li...@gmail.com> wrote:
> 
>> I’ve been spending WAY too much time dealing with goog renaming.
>> 
>> I have a good example of the kind of issues I’ve been dealing with. I
>> think this is an area where Falcon needs to do a better job.
>> 
>> I have some code which looks like this:
>> 
>>                      var JSZip:* = require("jszip");
>> 
>>                      var zip:* = new JSZip();
>>                      var name:String = folderToZip.name;
>>                      recursiveAdd(folderToZip,zip,"");
>>                      var promise:Promise = new 
>> Promise(function(resolve:*,reject:*):void{
>>                              var zipFile:File = 
>> destinationFolder.resolvePath(folderToZip.name +
>> ".zip");
>>                              var zipStream:Stream  = zip.generateNodeStream(
>>                              {type:'nodebuffer',streamFiles:true}).pipe(
>>                              fs.createWriteStream(zipFile.nativePath));
>> 
>>                              zipStream.on('finish', function ():* {
>>                              // JSZip generates a readable stream with a 
>> "end" event,
>>                              // but is piped here in a writable stream which 
>> emits a "finish"
>> event.
>>                                      console.log(zipFile.name + " written.");
>>                                              resolve(zipFile);
>>                              });
>>                              zipStream.on('error',function():void{
>>                                      console.log("zip error");
>>                                      reject("error");
>>                              })
>>                      });
>>                      return promise;
>> 
>> jszip is a Node module I’m using with require().
>> 
>> This code works perfectly in a debug build of my app.
>> 
>> When I run a release build I get an “undefined function” error.
>> 
>> The problematic code is here:
>>                              var zipStream:Stream  = zip.generateNodeStream(
>>                              {type:'nodebuffer',streamFiles:true}).pipe(
>>                              fs.createWriteStream(zipFile.nativePath));
>> 
>> The code gets minified to this:
>> 
>> return new Promise(function(d,f){var
>> h=b.ba(a.name+Zc),k=c.Br({type:yA,Vr:!0}).pipe(fs.createWriteStream(h.nati
>> vePath));k.on(Nw,function(){console.log(h.name+ib);d(h)});k.on(vw,function
>> (){console.log(hI);f(vw)
>> 
>> This is broken on multiple fronts:
>> 1. zip. zip.generateNodeStream is renamed to c.Br. Br is quite obviously
>> not defined.
>> 2. streamFiles is renamed to Vr, so the wrong options are being passed
>> into jszip. I have no idea why streamFiles is being renamed, but type is
>> not.
>> 
>> To fix this you need to do something like this:
>> 
>>                              var zipStream:Stream  = 
>> zip["generateNodeStream"](
>>                              
>> {"type":'nodebuffer',"streamFiles":true})["pipe"](
>>                              fs.createWriteStream(zipFile.nativePath));
>> 
>> Which generates:
>> return new Promise(function(d,f){var
>> h=b.ba(a.name+Zc),k=c.generateNodeStream({type:yA,streamFiles:!0}).pipe(fs
>> .createWriteStream(h.nativePath));k.on(Nw,function(){console.log(h.name+ib
>> );d(h)});k.on(vw,function(){console.log(hI);f(vw)})}
>> 
>> I also have no idea why nativePath is not renamed. It’s a property of a
>> class which I defined. It seems like it would be a good candidate for
>> renaming.
>> 
>> We need some kind of annotation in ActionScript code to enable output of
>> annotations for the Google Compiler to know that it’s not okay to rename
>> properties of the objects. I’ve had this problem with object literals
>> that are being sent as well as accessing properties and methods of
>> external objects.
>> 
>> Having manually use bracket notation instead of dot notation is error
>> prone. It would be much better to have Falcon automatically change the
>> notations or annotate the code in such a way that goog does not rename
>> them.
>> 
>> On Dec 6, 2016, at 6:02 PM, Alex Harui <aha...@adobe.com> wrote:
>> 
>>> 
>>> 
>>> On 12/5/16, 11:47 PM, "Harbs" <harbs.li...@gmail.com> wrote:
>>> 
>>>> OK. I guess I’ll rework the definitions into extern js files when I
>>>> have
>>>> time.
>>> 
>>> In theory, if you use FalconJX to cross-compile those AS files, you
>>> should
>>> get the right set of JS files to stick a folder called externs (instead
>>> of
>>> js/out).  The build scripts and settings should be almost the same as
>>> how
>>> we build the framework SWCs.
>>> 
>>> HTH,
>>> -Alex
>>> 
>> 
> 

Reply via email to