UNPKG

dojo-util

Version:

Dojo utilities including build system for optimizing JavaScript application performance, and DOH testing tool

115 lines (107 loc) 3.26 kB
define([ "../buildControl", "../fileUtils", "../fs", "../replace" ], function(bc, fileUtils, fs, replace) { var symctr = 1, m = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", len = m.length, generateSym = function(name, symtbl){ var ret = name; //defaults to long symbol if(bc.symbol === "short"){ var s=[], c = symctr; while(c){ s.unshift(m[c%len]); c = Math.floor(c/len); } s = "$D" + s.join(''); symctr++; symtbl[s + "_"] = name; ret = s + "_"; } return ret; }, convertSym = function(orig_name, symtbl){ var name = orig_name.replace(/\./g, "_"); if(bc.symbol !== "short" && orig_name === name){ if(name === 'define'){ //if the function is assigned to a variable named define, use //DEFINE instead to prevent messing up other transform steps name = 'DEFINE'; } //if the original name does not have dot in it, don't use //the name directly: it will mess up the original logic, such as //in the following case: // if(some_condition){ // var my_special_func=function(){...}; // }else{ // var my_special_func=function(){...}; // } //if the two anonymous functions are named my_special_func, //no matter what "some_condition" evaluates to, in the built //code, my_special_func will always be equal to the //implementation in the else branch //so we have to append something random to the name return name+"__"+Math.floor(Math.random()*10000); } return generateSym(name, symtbl); }, insertSymbols = function(resource, symtbl){ var content = resource.getText(), prefixes = [], addFunctionName = function(str, p1, p2, p3, p4){ return p1+p2+p3+" "+generateSym(prefixes+p2, symtbl)+p4; }; if(resource.pid){ prefixes.push(resource.pid); } if(resource.mid){ prefixes.push(resource.mid.replace(/\//g,'_')); } if(!prefixes.length){ var m = content.match(/dojo\.provide\("(.*)"\);/); if(m){ prefixes.push(m[1].replace(/\./g, "_")); } } if(prefixes.length){ prefixes = prefixes.join('_').replace(/\.|\-/g,'_')+"_"; content = content.replace(/^(\s*)(\w+)(\s*:\s*function)\s*(\(.*)$/mg, addFunctionName). replace(/^(\s*this\.)(\w+)(\s*=\s*function)\s*(\(.*)$/mg, addFunctionName); } content = content.replace(/^(\s*)([\w\.]+)(\s*=\s*function)\s*(\(.*)/mg,function(str, p1, p2, p3, p4){ return p1+p2+p3+" "+convertSym(p2, symtbl)+p4; }); return content; }, warningIssued = 0; return function(resource, callback) { if(bc.symbol){ if(resource.tag.report){ if(bc.symbol === 'short'){ bc.symbolTable = {}; resource.reports.push({ dir:".", filename:"symboltable.txt", content: function(){ var symbolText = [], key, symtbl = bc.symbolTable; for(key in symtbl){ symbolText.push(key + ": \"" + symtbl[key] + "\"" + bc.newline); } return symbolText.join(''); } }); } }else{ if(!warningIssued){ warningIssued = 1; bc.log("symbolsLeak", []); } fileUtils.ensureDirectoryByFilename(resource.dest); resource.text = insertSymbols(resource, bc.symbolTable); } } return 0; }; });