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(); }); };
/** * 合并配置,用户配置优先 * * @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 ); } }
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; };
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 }); }); }); };
return function (context) { var request = context.request; var proxyMap = context.conf.proxyMap; if (!hostname && !proxyMap) { // 没有响应不友好,根本看不出来啥问题 context.content = '<h1>Not Found</h1>' + '<p>The requested URL '+ request.pathname +' was not found on this server.</p>'; return; } else if (!hostname) { var host = request.headers['host']; if (proxyMap[host]) { var matched = proxyMap[host].split(':'); hostname = matched[0]; port = matched[1] || port; } else { edp.log.warn('Can not find matched host for %s', chalk.red(host)); return; } } // http or https var agent = /^https:/.test(hostname) ? https : http; var index = hostname.indexOf('://'); if (index !== -1) { hostname = hostname.substring(index + 3); } else if (port == 443) { // 如果hostname没有https或者http开头,则如果port是443,使用https agent = https; } context.stop(); // build request options var targetHost = hostname + ( port ? ':' + port : '' ); var reqHeaders = request.headers; if ( typeof context.conf.overrideProxyRequestHeader === 'function' ) { // modify the request host to target host context.conf.overrideProxyRequestHeader( reqHeaders ); } else if ( typeof requestHeaders === 'object' ) { reqHeaders = edp.util.extend( reqHeaders, requestHeaders ); } var reqOptions = { hostname : hostname, port : port || 80, method : request.method, path : request.url, headers : reqHeaders }; // create request object var start = Date.now(); var req = agent.request( reqOptions, function ( res ) { var content = []; res.on( 'data', function ( chunk ) { content.push( chunk ); } ); res.on( 'end', function () { edp.log.info( chalk.yellow( 'PROXY' ) + ' %s to %s - - %s ms', chalk.green(request.url), chalk.green(targetHost + request.url), Date.now() - start ); context.content = Buffer.concat( content ); context.header = res.headers; if ( !res.headers.connection ) { context.header.connection = 'close'; } if ( typeof context.conf.overrideProxyResponseHeader === 'function' ) { context.conf.overrideProxyResponseHeader( context.header ); } context.status = res.statusCode; context.start(); } ); } ); req.on('error', function (err) { edp.log.error( chalk.yellow( 'PROXY' ) + ' %s to %s - - %s ms', chalk.green(request.url), chalk.green(targetHost + request.url), Date.now() - start ); context.status = 500; context.content = ''; context.start(); }); // send request data var buffer = context.request.bodyBuffer; buffer && req.write( buffer ); req.end(); };