136 lines
3.2 KiB
JavaScript
136 lines
3.2 KiB
JavaScript
var fs = require('fs'),
|
|
path = require('path');
|
|
|
|
var //项目名
|
|
prefix,
|
|
//项目路径
|
|
jsDir,
|
|
//依赖文件路径
|
|
depsPath,
|
|
//依赖关系缓存
|
|
dependencies = {
|
|
pathToNames: {}, // 1 to many
|
|
nameToPath: {}, // 1 to 1
|
|
requires: {} // 1 to many
|
|
};
|
|
|
|
function addDepsToFile(src, provides, requires) {
|
|
var insertText, fd;
|
|
|
|
requires = '[' + requires.join(',') + ']';
|
|
provides = '[' + provides.join(',') + ']';
|
|
|
|
insertText = [
|
|
prefix,
|
|
'.addDependency(\'',
|
|
src,
|
|
'\', ',
|
|
provides,
|
|
', ',
|
|
requires,
|
|
');\n'
|
|
].join('');
|
|
|
|
try{
|
|
fd = fs.openSync(depsPath, 'a');
|
|
fs.writeSync(fd, insertText, 0, 'utf8');
|
|
}catch(e){
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function addDepsToObj(src, provides, requires) {
|
|
var provide, require, deps = dependencies;
|
|
|
|
for( var i = 0; (provide = provides[i]); i++) {
|
|
deps.nameToPath[provide] = src;
|
|
if (!(src in deps.pathToNames)) {
|
|
deps.pathToNames[src] = {};
|
|
}
|
|
deps.pathToNames[src][provide] = true;
|
|
}
|
|
|
|
for( var j = 0; (require = requires[j]); j++) {
|
|
if (!(src in deps.requires)) {
|
|
deps.requires[src] = {};
|
|
}
|
|
deps.requires[src][require] = true;
|
|
}
|
|
}
|
|
|
|
function scanFile(uri) {
|
|
if( path.basename(uri) === 'deps.js') {
|
|
return;
|
|
}
|
|
|
|
var reg = prefix + '\\.(require|provide)\\([\'\"]([-_\\.a-zA-Z0-9]+)[\'\"]\\);[\n\r]*',
|
|
provides = [],
|
|
requires = [],
|
|
content = fs.readFileSync(uri),
|
|
match;
|
|
|
|
reg = new RegExp(reg, 'g');
|
|
uri = path.relative(jsDir, uri).replace(/\\/g, '/');
|
|
|
|
do {
|
|
match = reg.exec(content);
|
|
|
|
if(match) {
|
|
if( match[1] === 'require' ) {
|
|
requires.push('\'' + match[2] + '\'');
|
|
}
|
|
if( match[1] === 'provide' ) {
|
|
//prefix不应该被包含在provide name中
|
|
var provide = match[2].split('.');
|
|
if(provide[0] === prefix) {
|
|
provide = provide.slice(1).join('.');
|
|
} else {
|
|
provide = match[2];
|
|
}
|
|
|
|
provides.push('\'' + provide + '\'');
|
|
}
|
|
}
|
|
} while(match);
|
|
|
|
addDepsToFile( uri, provides, requires );
|
|
addDepsToObj( uri, provides, requires );
|
|
console.log('success! -> create one dependency record : ' + uri);
|
|
}
|
|
|
|
exports.scan = function(uri) {
|
|
var stat = fs.statSync(uri);
|
|
|
|
if( stat.isDirectory() ) {
|
|
fs.readdirSync(uri).forEach(function(part) {
|
|
exports.scan( path.join(uri, part) );
|
|
});
|
|
} else if( stat.isFile() ) {
|
|
scanFile(uri);
|
|
}
|
|
};
|
|
|
|
exports.init = function(config) {
|
|
prefix = config.getProjectName();
|
|
jsDir = config.getJsDir();
|
|
depsPath = path.join(jsDir, 'deps.js');
|
|
|
|
fs.writeFile(depsPath, '');
|
|
console.log('success! -> create a new deps.js');
|
|
|
|
exports.scan(jsDir);
|
|
};
|
|
|
|
exports.getRequiresByPath = function(src) {
|
|
return dependencies.requires[src];
|
|
};
|
|
|
|
exports.getPathByName = function(name) {
|
|
return dependencies.nameToPath[name];
|
|
};
|
|
|
|
exports.getDepsPath = function() {
|
|
return depsPath;
|
|
}; |