1 /* See license.txt for terms of usage */
  2 
  3 // ********************************************************************************************* //
  4 // johnjbarton@johnjbarton.com May 2011 IBM Corp.
  5 // Extend require.js to add debugging information
  6 // Include this file immediately after require.js
  7 // ********************************************************************************************* //
  8 
  9 /*
 10  * Override this function to write output from the debug support for require.
 11  * @param see Firebug console.log
 12  */
 13 require.log = function()
 14 {
 15     try
 16     {
 17         FBTrace.sysout.apply(FBTrace, arguments);
 18     }
 19     catch(exc)
 20     {
 21         if (window.console)
 22             console.log.apply(console, arguments);
 23         else
 24             alert.apply(null, arguments);
 25     }
 26 }
 27 
 28 /*
 29  * Called by require for each completed module
 30  * @param fullName module name
 31  * @param deps array of module names that fullName depends upon
 32  */
 33 require.onDebugDAG = function(fullName, deps, url)
 34 {
 35     if (!require.depsNamesByName)
 36     {
 37         require.depsNamesByName = {};
 38         require.urlByFullName = {};
 39     }
 40 
 41 
 42     var arr = [];
 43     for (var p in deps)
 44         arr.push(p);
 45     require.depsNamesByName[fullName] = arr;
 46     require.urlByFullName[fullName] = url;
 47 }
 48 
 49 require.originalExecCb = require.execCb;
 50 require.execCbOFF = function (name)
 51 {
 52     var ret = require.originalExecCb.apply(require, arguments);
 53     try
 54     {
 55         if (ret)
 56         {
 57             var basename = "requirejs("+name+")";
 58             for (var prop in ret)
 59             {
 60                 try
 61                 {
 62                     if (ret.hasOwnProperty(prop))
 63                     {
 64                         var value = ret[prop];
 65                         if (value !== null &&
 66                             (typeof value == "function"/* || typeof value == "object"*/))
 67                         {
 68                                 var funcName = name + "_" + prop;
 69                                 funcName = funcName.replace("/", "_", "g");
 70                                 funcName = funcName.replace("-", "_", "g");
 71                                 var namedFunction = eval("(function(){ return function " + funcName +
 72                                     "(){return true;} })()");
 73                                 value.displayName = namedFunction;
 74                                 //value.displayName = basename+"/"+prop;
 75                         }
 76                     }
 77                 }
 78                 catch (e)
 79                 {
 80                     require.log("Could not displayName module "+name+" prop "+prop+": "+
 81                         e.toString(), [ret, prop, value]);
 82                 }
 83             }
 84             ret.displayName = basename;
 85         }
 86     }
 87     catch(e)
 88     {
 89         require.log("Could not displayName module "+name+": "+e.toString());
 90     }
 91 
 92     return ret;
 93 };
 94 
 95 /* Calls require.log to record dependency analysis.
 96  * Call this function from your main require.js callback function
 97  * @param none
 98  *
 99  */
100 require.analyzeDependencyTree = function()
101 {
102     require.log("Firebug module list: ", require.depsNamesByName);
103 
104     // For each deps item create an object referencing dependencies
105     function linkArrayItems(id, depNamesByName, path)
106     {
107         var deps = depNamesByName[id];
108         var result = {};
109         for (var i = 0; i < deps.length; i++)
110         {
111             var depID = deps[i];
112             if (path.indexOf(":"+depID+":") == -1) // Then depId is not already an dependent
113                 result[depID] = linkArrayItems(depID, depNamesByName, path+":"+depID+":");
114             else
115                 require.log("Circular dependency: "+path+":"+depID+":");
116         }
117         return result;
118     }
119 
120     var linkedDependencies = {};
121     var dependents = {}; // reversed list, dependents by name
122     var depNamesByName = require.depsNamesByName;
123 
124     for (var name in depNamesByName)
125     {
126         var depArray = depNamesByName[name];
127 
128         if (name === "undefined")
129         {
130             linkedDependencies["__main__"] = linkArrayItems(name, depNamesByName, "");
131             name = "__main__";
132         }
133 
134         for (var i = 0; i < depArray.length; i++)
135         {
136             var dependent = depArray[i];
137             if (!dependents[dependent])
138                 dependents[dependent] = [];
139             dependents[dependent].push(name);
140         }
141     }
142     var minimal = [];
143     var mainDeps = depNamesByName["undefined"];
144     for (var i = 0; i < mainDeps.length; i++)
145     {
146         var dependencyOfMain = mainDeps[i];
147         var dependentsOfDependencyOfMain = dependents[dependencyOfMain];
148         if (dependentsOfDependencyOfMain.length === 1)
149             minimal.push(dependencyOfMain);
150     }
151 
152     require.log("Firebug module dependency tree: ", linkedDependencies);
153     require.log("Firebug dependents: ", dependents);
154     require.log("Firebug minimal modules list: ", minimal);
155     require.log("Firebug URLs: ", require.urlByFullName);
156 }
157 
158 /*
159  * Calls require.log for warning and debug of require.js.
160  * Called by require.js diagnostic branch
161  */
162 require.onDebug = function()
163 {
164     try
165     {
166         require.log.apply(null,arguments);
167     }
168     catch(exc)
169     {
170         var msg = "";
171         for (var i = 0; i < arguments.length; i++)
172             msg += arguments[i]+", ";
173         window.alert("Loader; onDebug:"+msg+"\n");
174     }
175 }
176 
177 /*
178  * Calls require.log for errors, then throws exception
179  * Called by require.js
180  */
181 require.onError = function(exc)
182 {
183     require.onDebug.apply(require, arguments);
184     throw exc;
185 }