UNPKG

dojo-util

Version:

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

171 lines (156 loc) 5.73 kB
define([ "../buildControl", "../fileUtils", "../fs", "../stringify", "./writeAmd", "../process", "dojo/json", "dojo/text!./dojoBoot.js" ], function(bc, fileUtils, fs, stringify, writeAmd, process, json, dojoBootText){ return function(resource, callback){ var getUserConfig = function(){ if(!bc.userConfig){ return "function(global){ return global.dojoConfig || global.djConfig || global.require || {}; }"; } if(typeof bc.userConfig == "string"){ return bc.userConfig; } var result = stringify(bc.userConfig); if(result.unsolved){ bc.log("configUnresolvedValues"); } return result; }, computeLocation = function(basePath, path){ if(path.indexOf(basePath + "/")==0){ return "." + path.substring(basePath.length); } var parts = basePath.split("/"), prefix = ""; for(var i = parts.length-1; i>=0; i--){ prefix+= (prefix ? "/.." : ".."); var check = parts.slice(0, i).join("/") + "/"; if(path.indexOf(check)==0){ return prefix + path.substring(check.length-1); } } return path; }, getPackage = function(name){ // the purpose of this somewhat verbose routine is to write a minimal package object for each // package, yet allow client code to pass extra (i.e., outside the scope of CJS specs) config // information within the package object var destPack = bc.destPackages[name], result = {}; result.name = destPack.name; if(destPack.main!="main"){ result.main = destPack.main; } // everything relative to the dojo dir // TODO: making everything relative to dojo needs to be optional if(name=="dojo"){ result.location = "."; }else{ result.location = computeLocation(bc.destBasePath + "/dojo", destPack.location); } var packageDefaultConfig = bc.defaultConfig && bc.defaultConfig.packages && bc.defaultConfig.packages[name]; for(var p in packageDefaultConfig){ result[p] = packageDefaultConfig[p]; } return result; }, getDefaultConfig = function(){ var p, config = {packages:[], hasCache:{}}; if(bc.baseUrl){ config.baseUrl = bc.baseUrl; } for(p in bc.packages){ config.packages.push(getPackage(p)); } for(p in bc.defaultConfig){ if(p!=="packages"){ // per-package default config was handled above config[p] = bc.defaultConfig[p]; } } config = stringify(config); if(config.unsolved){ bc.log("configUnresolvedValues"); } return config; }, stampVersion = function(text){ // summary: // Changes the version number for dojo. Input should be the fileContents // of a file that contains the version number. version = bc.version; if(version){ //First, break apart the version string. var verSegments = (version+"").match(/^(\d*)\.?(\d*)\.?(\d*)\.?(.*)$/); var majorValue = verSegments[1] || 0; var minorValue = verSegments[2] || 0; var patchValue = verSegments[3] || 0; var flagValue = verSegments[4] || ""; //Do the final version replacement. return text.replace( /major:\s*\d*,\s*minor:\s*\d*,\s*patch:\s*\d*,\s*flag:\s*".*?"\s*,/g, "major: " + majorValue + ", minor: " + minorValue + ", patch: " + patchValue + ", flag: \"" + flagValue + "\"," ); }else{ return text; } }, waitCount = 1, // matches *1* errors = [], onWriteComplete = function(err){ if(err){ errors.push(err); } if(--waitCount==0){ callback(resource, errors.length && errors); } }, doWrite = function(filename, text){ fileUtils.ensureDirectoryByFilename(filename); waitCount++; fs.writeFile(filename, bc.newlineFilter(text, resource, "writeDojo"), "utf8", onWriteComplete); }; // the writeDojo transform... try{ var loaderText = resource.getText(), // the default application to the loader constructor is replaced with purpose-build user and default config values configText = "(" + getUserConfig() + ", " + getDefaultConfig() + ");", // the construction of the layer is slightly different than standard, so don't pass a module to getLayerText dojoLayerText = stampVersion(writeAmd.getLayerText(resource, "")), // 1.6 compat chunk dojoLayerCompat = (resource.layer.compat=="1.6" && resource.layer.include.length) ? "require(" + json.stringify(resource.layer.include) + ");" + bc.newline : ""; // assemble and write the dojo layer resource.uncompressedText = loaderText + configText + dojoLayerText + (bc.dojoBootText || dojoBootText) + dojoLayerCompat; doWrite(writeAmd.getDestFilename(resource), resource.layer.copyright + resource.uncompressedText); //write any bootstraps; boots is a vector of resources that have been marked as bootable by the discovery process resource.boots.forEach(function(item){ // don't process the dojo layer, which is === resource if(item!==resource){ // each item is a hash of include, exclude, boot, bootText var compat = (item.layer.compat=="1.6" && item.layer.include.length) ? "require(" + json.stringify(item.layer.include) + ");" + bc.newline : ""; item.uncompressedText= loaderText + configText + dojoLayerText + writeAmd.getLayerText(item, false) + (item.layer.bootText || bc.dojoBootText || dojoBootText) + dojoLayerCompat + compat; doWrite(writeAmd.getDestFilename(item), resource.layer.copyright + item.uncompressedText); } }); onWriteComplete(0); // matches *1* }catch(e){ if(waitCount){ // can't return the error since there are async processes already going errors.push(e); return 0; }else{ return e; } } return callback; }; });