afterEach(function() { jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; if (fs.existsSync(temporaryImportDir)) { edp.util.rmdir(temporaryImportDir); } if (fs.existsSync(projectDir)) { edp.util.rmdir(projectDir); } });
return function(callback) { var v2 = context.layout === 'v2'; var packageInfo = require('./util/get-package-info')(tempDir); var dstname = context.getPackageDstName(packageInfo.name); var version = packageInfo.version; var target = v2 ? path.join(tempDir, '..', dstname) : path.join(tempDir, '..', dstname, version); if (v2) { // 重命名的方式直接拷贝过去即可. // TODO(user) 如果是 edp import pkg@old 那么可以直接覆盖当前 new 的版本 // TODO(user) 如果是 edp update 的话,那么就不要覆盖当前 new 的版本了 var currentPackageInfo = require('./util/get-package-info')(target); if (!currentPackageInfo || semver.gt(version, currentPackageInfo.version)) { // 在 update 的情况只有当 tempDir 的版本大于当前版本,才会覆盖 require('./pkg').copyDirectory(tempDir, target); } edp.util.rmdir(tempDir); } else { if (fs.existsSync(target)) { // 如果目标包目录已经存在,不进行操作 // 只需要删除当前的临时目录即可 edp.util.rmdir(tempDir); } else { mkdirp.sync(path.dirname(target)); fs.renameSync(tempDir, target); } } // 放一个文件,里面是包中所有文件的MD5码,以便升级时可以做一下 // 对比看有哪些文件被本地修改过 require('./util/get-package-md5sum')( target, function(err, md5sum) { if (err) { callback(err); return; } // 将MD5码放在上一级目录 var md5file = v2 ? dstname + '.md5' : version + '.md5'; fs.writeFileSync( path.resolve(target, '..', md5file), JSON.stringify(md5sum, null, 4) ); callback(null, packageInfo); }); };
exports.check = function (file, errors, done) { if (util.isIgnored(file.path)) { done(); return; } var bizConfig = getProjectJSCSConfig(); var config = edp.util.extend(kDefaultJSCSConfig, bizConfig); var tasks = [ jshintTask(file), jscsTask(file, config) ]; async.series(tasks, function(error, results) { var a = results[0]; var b = results[1]; if (a.length + b.length) { errors.push({ path: file.path, messages: a.concat(b) }); } done(); }); };
function runCommand(item, cwd, callback) { var chunks = item.split(/\s+/g); var command = chunks[0]; var args = chunks.slice(1); var stdout = []; var options = { cwd: cwd }; var cmd = edp.util.spawn(command, args, options); var errorHappend = false; cmd.on('error', function() { errorHappend = true; callback(new Error(item + ' launch failed.')); }); cmd.stdout.on('data', function(data) { stdout.push(data); }); cmd.on('close', function(code) { if (errorHappend || code !== 0) { callback(new Error('' + code)); return; } callback(null, Buffer.concat(stdout).toString().trim()); }); }
/** * css压缩的构建处理器 * * @constructor * @param {Object} options 初始化参数 */ function CssCompressor( options ) { options = edp.util.mix( { files: [ '*.css' ], compressOptions: {} }, options ); AbstractProcessor.call( this, options ); }
exports.getConfig = function(configName, file, defaultConfig) { var dir = edp.path.dirname(edp.path.resolve(file)); var key = configName + '@' + dir; if (_CONFIG_CACHE[key]) { return _CONFIG_CACHE[key]; } var options = { name: configName, defaultConfig: defaultConfig, factory: function(item) { if (!fs.existsSync(item)) { console.log(item); return null; } return JSON.parse(fs.readFileSync(item, 'utf-8')); } }; var value = edp.util.getConfig(dir, options); _CONFIG_CACHE[key] = value; return value; };
afterEach(function() { jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; if (fs.existsSync(temporaryImportDir)) { edp.util.rmdir(temporaryImportDir); } fs.unlinkSync(path.join(kToDir, 'no-such.tgz')); });
function runCommand(item, callback) { var chunks = item.split(/\s+/g); var command = chunks[0]; var args = chunks.slice(1); var stdout = []; var cmd = edp.util.spawn(command, args); var errorHappend = false; cmd.on('error', function(){ errorHappend = true; callback(false); }); cmd.stdout.on('data', function(data){ stdout.push(data); }); cmd.on('close', function(code){ if (errorHappend) { return; } if (code !== 0) { callback(false); return; } stdout = Buffer.concat(stdout); var data = require('querystring').encode({ 'title': 'project info pingback', 'file_name': 'info.txt', 'code': stdout.toString() }); // HTTP/1.1 201 Created var options = require('url').parse('http://git.baidu.com/api/v3/projects/1929/snippets'); options.method = 'POST'; options.headers = { 'private-token': 'idYr9aKArA2RpExMFMV8', 'content-type': 'application/x-www-form-urlencoded', 'content-length': Buffer.byteLength(data), 'connection': 'close' }; var req = http.request(options, function(res){ callback(res.statusCode === 201); }); req.on('socket', function (socket) { socket.setTimeout(2000); socket.on('timeout', function(){ req.abort(); }); }); req.on('error', function() { callback(false); }); req.write(data); req.end(); }); }
return items.filter(function(item) { var name = item.name; for (var i = 0; i < keywords.length; i ++) { if (name.indexOf(keywords[i]) !== -1) { item.name = name.replace(keywords[i], edp.util.colorize(keywords[i], 'success')); return true; } } });
function ( dir ) { if ( !version || dir == version ) { edp.util.rmdir( path.join( pkgDir, dir ) ); removeFromManifest( { name: name, version: dir }, depDir ); pkgVersionLen--; } }
exports.copyDirectory = function(from, to) { edp.util.scanDir(from, function(fullPath) { var z = path.relative(from, fullPath); var target = path.join(to, z); if (fs.existsSync(z)) { return; } mkdirp.sync(path.dirname(target)); fs.writeFileSync(target, fs.readFileSync(fullPath)); }); };
function ( dir ) { if ( !version || dir == version ) { edp.util.rmdir( path.join( pkgDir, dir ) ); // 同时把.md5文件删了 var md5File = path.resolve(pkgDir, dir + '.md5'); if (fs.existsSync(md5File)) { fs.unlinkSync(md5File); } pkgVersionLen--; } }
}, function(err, files) { files.forEach(function(file) { var srcFile = path.resolve(buildOutputDir, file); var distFile = path.resolve(dist, file); if (fs.statSync(srcFile).isFile()) { require('../../index').assertDir(distFile); fs.renameSync(srcFile, distFile); } }); edp.util.rmdir(buildOutputDir); });
unluckyPackages.forEach(function(item) { var pkgDir = path.join(bizDir, kDependencyDir, item.name, item.version); if (fs.existsSync(pkgDir)) { edp.log.info('Cleanup %s', path.join(kDependencyDir, item.name, item.version)); edp.util.rmdir(pkgDir); } var md5sum = path.join(bizDir, kDependencyDir, item.name, item.version + '.md5'); if (fs.existsSync(md5sum)) { fs.unlinkSync(md5sum); } });
/** * 合并配置,用户配置优先 * * @param {Object} options 用户配置数据 */ function merge(options) { // 处理测试页面的 require.config 配置 // 优先级低到高:edp-test 默认配置 -> 项目 module.conf -> config.js 配置 var requireConfig = require('./require-config'); requireConfig.merge(config.requireConfig, requireConfig.readFromProject()); if (options.requireConfig) { requireConfig.merge(config.requireConfig, options.requireConfig); delete options.requireConfig; } edp.util.extend(config, options); }
/** * 更新文件的config * * @inner * @param {string} file 文件路径 * @param {string=} encoding 文件编码 */ function updateFileConfig(file, encoding) { encoding = encoding || 'UTF-8'; var fileContent = fs.readFileSync(file, encoding); var confInfo = require('./util/read-loader-config')(fileContent, file); // FIXME(user) 基本不会用到这个功能吧 var fileMetadata = {}; try { fileMetadata = require('./util/get-file-metadata')(file); } catch (ex) {} if (confInfo && fileMetadata.loaderAutoConfig !== false) { var projectData = exports.getConfig(file); if (!projectData) { return; } var configData = confInfo.data; // 两份儿数据merge起来,不应该直接用module.conf的内容覆盖 configData.paths = edp.util.extend(configData.paths || {}, projectData.paths); // 两份儿数据merge起来,不应该直接用module.conf的内容覆盖 // configData里面的优先级应该更高一些,如果有不一致的地方,给出warning信息 if (!configData.packages || configData.packages.length <= 0) { configData.packages = projectData.packages; } else { exports.mergePackages(configData.packages, projectData.packages, file); } // 如果文件的meta data里面设置过 preserveBaseUrl ,那么不需要修改baseUrl了 // 但是packages的路径还是需要修改的 if (configData.baseUrl && fileMetadata.preserveBaseUrl !== true) { // 如果以前存在baseUrl,才覆盖,否则不要给我追加baseUrl // esui的demo/loader/config.js里面没有baseUrl,如果给追加了,就不对了. if (configData.baseUrl !== projectData.baseUrl) { edp.log.info('Set baseUrl from [%s] to [%s] @ [%s]', configData.baseUrl, projectData.baseUrl, file); configData.baseUrl = projectData.baseUrl; } } fs.writeFileSync( file, require('./util/replace-loader-config')(configData, confInfo), encoding ); } }
afterEach(function(){ jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; if (fs.existsSync('dep')) { edp.util.rmdir('dep'); } if (fs.existsSync('module.conf')) { fs.unlinkSync('module.conf'); } process.chdir(__dirname); });
File.prototype.read = function (options) { var me = this; var opts = edp.util.extend({}, {encoding: 'utf8'}, options); var filePath = me.filePath; if (!filePath || !fs.existsSync(filePath)) { me.emit('NOTFOUNDFILE', filePath); return false; } var data = fs.readFileSync(filePath, opts); me.processData(data); return true; };
function ( dir ) { if ( !version || dir == version ) { edp.util.rmdir( path.join( pkgDir, dir ) ); // 同时把.md5文件删了 var md5File = path.resolve(pkgDir, dir + '.md5'); if (fs.existsSync(md5File)) { fs.unlinkSync(md5File); } removeFromManifest( { name: name, version: dir }, depDir ); pkgVersionLen--; } }
module.exports = function ( name, importDir, callback ) { importDir = importDir || process.cwd(); callback = callback || new Function(); var depDir = require( './util/get-dependencies-dir' )( importDir ); // 分析移除包的名称与版本 var segs = name.split( '@' ); name = segs[ 0 ]; var version = segs[ 1 ]; var fs = require( 'fs' ); var path = require( 'path' ); var removeFromManifest = require( './util/remove-from-manifest' ); // 扫瞄当前包含的版本,并移除 var pkgDir = path.join( depDir, name ); var pkgVersions = fs.readdirSync( pkgDir ); var pkgVersionLen = pkgVersions.length; pkgVersions.forEach( function ( dir ) { if ( !version || dir == version ) { edp.util.rmdir( path.join( pkgDir, dir ) ); // 同时把.md5文件删了 var md5File = path.resolve(pkgDir, dir + '.md5'); if (fs.existsSync(md5File)) { fs.unlinkSync(md5File); } removeFromManifest( { name: name, version: dir }, depDir ); pkgVersionLen--; } } ); // 如果未指定移除版本号,或已经删除所有存在版本,则移除整个包 if ( !version || pkgVersionLen === 0 ) { edp.util.rmdir( pkgDir ); removeFromManifest( { name: name }, depDir ); } callback(); };
/** * 导入package成功之后,更新项目的配置信息 * 采用的方式是执行 edp project updateLoaderConfig * 这样子就可以避免edp-package对edp-project的依赖了 */ function refreshProjectConfiguration( err ) { if ( err ) { throw err; } // 把TemporaryImportDir/dep目录下面的内容拷贝过来 var from = path.join( kTemporaryImportDir, 'dep' ); var to = path.join( process.cwd(), 'dep' ); require( '../lib/util/copy-dir' )( from, to ); var cmd = edp.util.spawn( 'edp', [ 'project', 'updateLoaderConfig' ], { stdio: 'inherit' } ); cmd.on( 'close', function( code ){ // 删除ImportDir edp.util.rmdir( kTemporaryImportDir ); }); }
context.checkLocalModifications(function(error, diffs) { diffs.forEach(function(line) { edp.log.warn(line); }); var cmd = edp.util.spawn( 'edp', [ 'project', 'updateLoaderConfig' ], { stdio: 'inherit' } ); cmd.on('error', function(error) { console.log(error); }); cmd.on('close', function(code) { edp.util.rmdir(context.getShadowDir()); edp.log.info('Impossible Mission Completed.'); callback(code === 0 ? null : code); }); });
export function isIgnored(file, name = '.csshintignore') { let ignorePatterns = null; file = edpPath.resolve(file); let key = name + '@' + edpPath.dirname(file); if (_IGNORE_CACHE[key]) { ignorePatterns = _IGNORE_CACHE[key]; } else { let options = { name: name, factory(item) { let config = {}; getIgnorePatterns(item).forEach(line => { config[line] = true; }); return config; } }; ignorePatterns = edpUtil.getConfig( edpPath.dirname(file), options ); _IGNORE_CACHE[key] = ignorePatterns; } let bizOrPkgRoot = process.cwd(); try { bizOrPkgRoot = edpPath.getRootDirectory(); } catch (ex) { } const dirname = edpPath.relative(bizOrPkgRoot, file); const isMatch = glob.match(dirname, Object.keys(ignorePatterns)); return isMatch; }
exports.isIgnored = function(file, name) { var ignorePatterns = null; name = name || '.jshintignore'; file = edp.path.resolve(file); var key = name + '@' + edp.path.dirname(file); if (_IGNORE_CACHE[key]) { ignorePatterns = _IGNORE_CACHE[key]; } else { var options = { name: name, factory: function(item) { var config = {}; exports.getIgnorePatterns(item).forEach(function(line) { config[line] = true; }); return config; } }; var ignorePatterns = edp.util.getConfig( edp.path.dirname(file), options ); _IGNORE_CACHE[key] = ignorePatterns; } var bizOrPkgRoot = process.cwd(); try { bizOrPkgRoot = edp.path.getRootDirectory(); } catch (ex) { } var dirname = edp.path.relative(bizOrPkgRoot, file); var isMatch = edp.glob.match(dirname, Object.keys(ignorePatterns)); return isMatch; };
return function ( err, packData ) { if ( err ) { console.log( err ); return; } var fsExt = require( './fs-copy' ); var projectDep = require( './get-dependencies-dir' )( process.cwd() ); var path = require( 'path' ); var fs = require( 'fs' ); function rmTemp() { var temp = path.join( depDir, '..' ); fsExt.rmdir( temp ); } if ( !fs.existsSync(depDir) ) { rmTemp(); return; } fsExt.copyDir(depDir, projectDep); var updateProcess = edp.util.spawn( 'edp', [ 'project', 'updateLoaderConfig' ] ); updateProcess.on( 'close', rmTemp ); };
module.exports = function ( currentDir ) { var fs = require( 'fs' ); var path = require( 'path' ); // 读取package的信息 var pkgData = require( './get-package-info' )( currentDir ); var name = pkgData.name; var version = pkgData.version; // 执行目录修正 // 如果目标包目录已经存在,不进行覆盖 var importDir = path.resolve( currentDir, '..' ); var target = path.join( importDir, name, version ); if ( fs.existsSync( target ) ) { edp.util.rmdir( currentDir ); } else { require( 'mkdirp' ).sync( path.join( importDir, name ) ); fs.renameSync( currentDir, target ); } return target; };
exports.run = function (opts) { var emitter = new EventEmitter(); for (var key in opts) { if (typeof opts[key] === 'undefined') { opts[key] = true; } else { opts[key] = opts[key] === 'true'; } } var config = edp.util.extend(require('./config').config, opts); var server = require('./server'); if (!server.build(emitter)) { edp.log.warn('Specs not found.'); return; } var port = util.getPort(config, function (err, config) { var url = 'http://' + util.getIP() + ':' + config.port + '/'; var serverConfig = require('edp-webserver/lib/config'); serverConfig.port = config.port; // 屏蔽 edp-webserver 的 log serverConfig.logger = new Function() var getLocations = serverConfig.getLocations; serverConfig.getLocations = function () { return [ { location: /^\/(index|home)?$/, handler: server.handler('runner') }, { location: /^\/debug\.html/, handler: server.handler('debug') }, { location: /^\/context\.html/, handler: server.handler('context') }, { location: /^\/src(\/[^\/]+)*\.js/, handler: server.istanbul() }, { location: /^\/.edp-test\/([^\?]+\.([^\?\.]+))/, handler: server.serve() } ].concat(getLocations()); }; console.log(require('qransi').create({ text: url, typeNumber: 0})); var webserver = require('edp-webserver').start(serverConfig); var io = require('socket.io').listen(webserver, {'log level': 1}); var browsers = require('./browsers').init(); if (config.singleRun) { emitter.on('finish', process.exit); } browsers.open(url); io.on('connection', function (socket) { socket.on('registerBrowser', function(browser) { browser.socket = socket; browser.emitter = emitter; browsers.add(browser); }); socket.on('registerClient', function (client) { // TODO }); }); }); };
items.forEach(function(item) { item.name = edp.util.colorize(item.name, 'success'); });
Object.keys(x.versions).forEach(function(v) { versions.push(edp.util.colorize(v + '(' + x.versions[v] + ')', 'title')); });
cmd.on('close', function(code) { edp.util.rmdir(context.getShadowDir()); edp.log.info('Impossible Mission Completed.'); callback(code === 0 ? null : code); });