dojo-util
Version:
Dojo utilities including build system for optimizing JavaScript application performance, and DOH testing tool
190 lines (167 loc) • 4.71 kB
JavaScript
define([
"./fs",
"./buildControlBase",
"dojo/has"
], function(fs, bc, has){
var
getFilename = function(filename){
if(/\//.test(filename)){
return filename.match(/^.*\/([^\/]+)$/)[1];
}
return filename;
},
getFilepath = function(filename){
if(/\//.test(filename)){
var result = filename.match(/^(.*)\/[^\/]+$/)[1];
// if result=="", then must have been something like "/someFile"
return result.length ? result : "/";
}
return "";
},
getFiletype = function(filename, trimDot){
var match = filename.match(/(\.([^\/]*))$/);
return (match && (trimDot ? match[2] : match[1])) || "";
},
cleanupPath = function(path){
// change any falsy to ""
path = path || "";
// change all backslashes to forward slashes for those with bad habits from windows
path = path.replace(/\\/g, "/");
// remove any trailing "/" to be less sensitive to careless user input
// but remember "/" is not a trailing slash--it's the root
if(path.length>1 && path.charAt(path.length-1)=="/"){
path = path.substring(0, path.length-1);
}
return path;
},
catPath = function(lhs, rhs){
if(arguments.length>2){
for(var args = [], i = 1; i<arguments.length; args.push(arguments[i++]));
return catPath(cleanupPath(lhs), catPath.apply(this, args));
}else if(!rhs || !rhs.length){
return cleanupPath(lhs);
}else if(!lhs || !lhs.length){
return cleanupPath(rhs);
}else{
return (cleanupPath(lhs) + "/" + cleanupPath(rhs)).replace(/\/\/\/?/g, "/");
}
},
compactPath = function(path){
var result = [],
segment, lastSegment;
path = path.replace(/\\/g, '/').split('/');
while(path.length){
segment = path.shift();
if(segment==".." && result.length && lastSegment!=".."){
result.pop();
lastSegment = result[result.length - 1];
}else if(segment!="."){
result.push(lastSegment = segment);
}// else ignore "."
}
return result.join("/");
},
isAbsolutePathRe = has("is-windows") ?
// for windows, starts with "\\" or a drive designator (anything other than "/" or "\" followed by a ":")
/^((\\\\)|([^\/\\]+\:))/ :
// for unix, starts with "/"
/^\//,
isAbsolutePath = function(path){
return path && path.length && isAbsolutePathRe.test(path);
},
normalize = function(filename){
return has("is-windows") ? filename.replace(/\//g, "\\") : filename;
},
getAbsolutePath = function(src, base){
src = cleanupPath(src);
if(!isAbsolutePath(src)){
src = catPath(base, src);
}
return compactPath(src);
},
computePath = function(path, base){
path = cleanupPath(path);
return compactPath(isAbsolutePath(path) ? path : catPath(base, path));
},
getTimestamp = function(ts){
var f = function(i){ return "-" + (i<10 ? "0" + i : i); };
return ts.getFullYear() + f(ts.getMonth()+1) + f(ts.getDate()) + f(ts.getHours()) + f(ts.getMinutes()) + f(ts.getSeconds());
},
dirExists = function(
filename
){
try{
return fs.statSync(filename).isDirectory();
}catch(e){
return false;
}
},
fileExists = function(
filename
){
try{
return fs.statSync(filename).isFile();
}catch(e){
return false;
}
},
checkedDirectories = {},
clearCheckedDirectoriesCache = function(){
checkedDirectories = {};
},
ensureDirectory = function(path){
if(!checkedDirectories[path]){
if(!dirExists(path)){
ensureDirectory(getFilepath(path));
try{
fs.mkdirSync(path, 0755);
}catch(e){
//squelch
}
}
checkedDirectories[path] = 1;
}
},
ensureDirectoryByFilename = function(filename){
ensureDirectory(getFilepath(filename));
},
readAndEval = function(filename, type){
try{
if(fileExists(filename)){
return eval("(" + fs.readFileSync(filename, "utf8") + ")");
}
}catch(e){
bc.log("failedReadAndEval", ["filename", filename, "type", type, "error", e]);
}
return {};
},
maybeRead = function(filename){
try{
if(fileExists(filename)){
return fs.readFileSync(filename, "utf8");
}
}catch(e){
}
return 0;
};
return {
getFilename:getFilename,
getFilepath:getFilepath,
getFiletype:getFiletype,
cleanupPath:cleanupPath,
isAbsolutePath:isAbsolutePath,
normalize:normalize,
getAbsolutePath:getAbsolutePath,
catPath:catPath,
compactPath:compactPath,
computePath:computePath,
getTimestamp:getTimestamp,
dirExists:dirExists,
ensureDirectory:ensureDirectory,
ensureDirectoryByFilename:ensureDirectoryByFilename,
clearCheckedDirectoriesCache:clearCheckedDirectoriesCache,
readAndEval:readAndEval,
maybeRead:maybeRead,
fileExists:fileExists
};
});