UNPKG

kab

Version:

Know About Better - test your code

136 lines (113 loc) 2.95 kB
/** * @file 工具函数 * @author chris<wfsr@foxmail.com> */ var fs = require('fs'); var path = require('path'); var log = require('./log'); var util = require('util'); /** * 格式化字符串 * * @param {string} pattern 字符串模式 * @param {...*} args 要替换的数据 * @return {string} 数据格式化后的字符串 */ exports.format = function (pattern, args) { return util.format.apply(null, arguments); }; /** * 对象属性拷贝 * * @param {Object} target 目标对象 * @param {...Object} source 源对象 * @return {Object} 返回目标对象 */ exports.extend = function extend(target) { for (var i = 1; i < arguments.length; i++) { var src = arguments[i]; if (src == null) { continue; } for (var key in src) { if (src.hasOwnProperty(key)) { target[key] = src[key]; } } } return target; }; /** * 混合对象 * * @param {...Object} source 要混合的对象 * @return {Object} 混合后的对象 */ exports.mix = function () { var o = {}; var src = Array.prototype.slice.call(arguments); return exports.extend.apply(this, [o].concat(src)); }; /** * 获取本机IP * 默认取 127.0.0.1 之外的第一个IP地址 * * @return {string} */ exports.getIP = function () { var ifaces = require('os').networkInterfaces(); var defultAddress = '127.0.0.1'; var ip = defultAddress; var find = function (details) { if (ip === defultAddress && details.family === 'IPv4') { ip = details.address; } }; Object.keys(ifaces).forEach(function (dev) { ifaces[dev].forEach(find); }); return ip; }; /** * 获取可用端口 * * @param {module:lib/config} config 配置模块 * @param {Function} callback 回调函数 */ exports.getPort = function (config, callback) { var server = require('http').createServer(); server.on('error', function (e) { if (~'EADDRINUSE,EACCES'.indexOf(e.code)) { log.warn('Port %d not available, test next: %d', config.port, ++config.port); server.listen(config.port); } else { callback(e); } }); server.on('listening', function (e) { log.info('Port %d available', config.port); server.close(); callback(null, config); }); log.trace('Test port %d...', config.port); server.listen(config.port); }; /** * 创建目录 * * @param {string} directory 目录路径 * @param {Function} callback 创建成功后的回调函数 */ exports.mkdir = function (directory, callback) { fs.stat(directory, function (err, stat) { if (stat && stat.isDirectory()) { callback(); } else { exports.mkdir(path.dirname(directory), function () { fs.mkdir(directory, callback); }); } }); };