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.nativePath));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