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 }