mirror of
https://github.com/thinkjs/thinkjs.git
synced 2026-01-25 14:42:47 +00:00
354 lines
74 KiB
HTML
354 lines
74 KiB
HTML
<!DOCTYPE html><html><head><title>Coverage</title><script>
|
||
|
||
headings = [];
|
||
|
||
onload = function(){
|
||
headings = document.querySelectorAll('h2');
|
||
};
|
||
|
||
onscroll = function(e){
|
||
var heading = find(window.scrollY);
|
||
if (!heading) return;
|
||
var links = document.querySelectorAll('#menu a')
|
||
, link;
|
||
|
||
for (var i = 0, len = links.length; i < len; ++i) {
|
||
link = links[i];
|
||
link.className = link.getAttribute('href') == '#' + heading.id
|
||
? 'active'
|
||
: '';
|
||
}
|
||
};
|
||
|
||
function find(y) {
|
||
var i = headings.length
|
||
, heading;
|
||
|
||
while (i--) {
|
||
heading = headings[i];
|
||
if (y >= heading.offsetTop) {
|
||
return heading;
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
<style>
|
||
|
||
body {
|
||
font: 14px/1.6 "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||
margin: 0;
|
||
color: #2C2C2C;
|
||
border-top: 2px solid #ddd;
|
||
}
|
||
|
||
#coverage {
|
||
padding: 60px;
|
||
}
|
||
|
||
h1 a {
|
||
color: inherit;
|
||
font-weight: inherit;
|
||
}
|
||
|
||
h1 a:hover {
|
||
text-decoration: none;
|
||
}
|
||
|
||
.onload h1 {
|
||
opacity: 1;
|
||
}
|
||
|
||
h2 {
|
||
width: 80%;
|
||
margin-top: 80px;
|
||
margin-bottom: 0;
|
||
font-weight: 100;
|
||
letter-spacing: 1px;
|
||
border-bottom: 1px solid #eee;
|
||
}
|
||
|
||
a {
|
||
color: #8A6343;
|
||
font-weight: bold;
|
||
text-decoration: none;
|
||
}
|
||
|
||
a:hover {
|
||
text-decoration: underline;
|
||
}
|
||
|
||
ul {
|
||
margin-top: 20px;
|
||
padding: 0 15px;
|
||
width: 100%;
|
||
}
|
||
|
||
ul li {
|
||
float: left;
|
||
width: 40%;
|
||
margin-top: 5px;
|
||
margin-right: 60px;
|
||
list-style: none;
|
||
border-bottom: 1px solid #eee;
|
||
padding: 5px 0;
|
||
font-size: 12px;
|
||
}
|
||
|
||
ul::after {
|
||
content: '.';
|
||
height: 0;
|
||
display: block;
|
||
visibility: hidden;
|
||
clear: both;
|
||
}
|
||
|
||
code {
|
||
font: 12px monaco, monospace;
|
||
}
|
||
|
||
pre {
|
||
margin: 30px;
|
||
padding: 30px;
|
||
border: 1px solid #eee;
|
||
border-bottom-color: #ddd;
|
||
-webkit-border-radius: 2px;
|
||
-moz-border-radius: 2px;
|
||
border-radius: 2px;
|
||
-webkit-box-shadow: inset 0 0 10px #eee;
|
||
-moz-box-shadow: inset 0 0 10px #eee;
|
||
box-shadow: inset 0 0 10px #eee;
|
||
overflow-x: auto;
|
||
}
|
||
|
||
img {
|
||
margin: 30px;
|
||
padding: 1px;
|
||
-webkit-border-radius: 3px;
|
||
-moz-border-radius: 3px;
|
||
border-radius: 3px;
|
||
-webkit-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
|
||
-moz-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
|
||
box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
|
||
max-width: 100%;
|
||
}
|
||
|
||
footer {
|
||
background: #eee;
|
||
width: 100%;
|
||
padding: 50px 0;
|
||
text-align: right;
|
||
border-top: 1px solid #ddd;
|
||
}
|
||
|
||
footer span {
|
||
display: block;
|
||
margin-right: 30px;
|
||
color: #888;
|
||
font-size: 12px;
|
||
}
|
||
|
||
#menu {
|
||
position: fixed;
|
||
font-size: 12px;
|
||
overflow-y: auto;
|
||
top: 0;
|
||
right: 0;
|
||
margin: 0;
|
||
height: 100%;
|
||
padding: 15px 0;
|
||
text-align: right;
|
||
border-left: 1px solid #eee;
|
||
-moz-box-shadow: 0 0 2px #888
|
||
, inset 5px 0 20px rgba(0,0,0,.5)
|
||
, inset 5px 0 3px rgba(0,0,0,.3);
|
||
-webkit-box-shadow: 0 0 2px #888
|
||
, inset 5px 0 20px rgba(0,0,0,.5)
|
||
, inset 5px 0 3px rgba(0,0,0,.3);
|
||
box-shadow: 0 0 2px #888
|
||
, inset 5px 0 20px rgba(0,0,0,.5)
|
||
, inset 5px 0 3px rgba(0,0,0,.3);
|
||
-webkit-font-smoothing: antialiased;
|
||
background: url("data:image/png;base64,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");
|
||
}
|
||
|
||
#menu::after {
|
||
display: block;
|
||
content: '';
|
||
padding-top: 80px;
|
||
}
|
||
|
||
#logo {
|
||
position: fixed;
|
||
bottom: 10px;
|
||
right: 10px;
|
||
background: rgba(255,255,255,.1);
|
||
font-size: 11px;
|
||
display: block;
|
||
width: 20px;
|
||
height: 20px;
|
||
line-height: 20px;
|
||
text-align: center;
|
||
-webkit-border-radius: 20px;
|
||
-moz-border-radius: 20px;
|
||
border-radius: 20px;
|
||
-webkit-box-shadow: 0 0 3px rgba(0,0,0,.2);
|
||
-moz-box-shadow: 0 0 3px rgba(0,0,0,.2);
|
||
box-shadow: 0 0 3px rgba(0,0,0,.2);
|
||
color: inherit;
|
||
}
|
||
|
||
#menu li a {
|
||
display: block;
|
||
color: white;
|
||
padding: 0 35px 0 25px;
|
||
-webkit-transition: background 300ms;
|
||
-moz-transition: background 300ms;
|
||
}
|
||
|
||
#menu li {
|
||
position: relative;
|
||
list-style: none;
|
||
}
|
||
|
||
#menu a:hover,
|
||
#menu a.active {
|
||
text-decoration: none;
|
||
background: rgba(255,255,255,.1);
|
||
}
|
||
|
||
#menu li:hover .cov {
|
||
opacity: 1;
|
||
}
|
||
|
||
#menu li .dirname {
|
||
opacity: .60;
|
||
padding-right: 2px;
|
||
}
|
||
|
||
#menu li .basename {
|
||
opacity: 1;
|
||
}
|
||
|
||
#menu .cov {
|
||
background: rgba(0,0,0,.4);
|
||
position: absolute;
|
||
top: 0;
|
||
right: 8px;
|
||
font-size: 9px;
|
||
opacity: .6;
|
||
text-align: left;
|
||
width: 17px;
|
||
-webkit-border-radius: 10px;
|
||
-moz-border-radius: 10px;
|
||
border-radius: 10px;
|
||
padding: 2px 3px;
|
||
text-align: center;
|
||
}
|
||
|
||
#stats:nth-child(2n) {
|
||
display: inline-block;
|
||
margin-top: 15px;
|
||
border: 1px solid #eee;
|
||
padding: 10px;
|
||
-webkit-box-shadow: inset 0 0 2px #eee;
|
||
-moz-box-shadow: inset 0 0 2px #eee;
|
||
box-shadow: inset 0 0 2px #eee;
|
||
-webkit-border-radius: 5px;
|
||
-moz-border-radius: 5px;
|
||
border-radius: 5px;
|
||
}
|
||
|
||
#stats div {
|
||
float: left;
|
||
padding: 0 5px;
|
||
}
|
||
|
||
#stats::after {
|
||
display: block;
|
||
content: '';
|
||
clear: both;
|
||
}
|
||
|
||
#stats .sloc::after {
|
||
content: ' SLOC';
|
||
color: #b6b6b6;
|
||
}
|
||
|
||
#stats .percentage::after {
|
||
content: ' coverage';
|
||
color: #b6b6b6;
|
||
}
|
||
|
||
#stats .hits,
|
||
#stats .misses {
|
||
display: none;
|
||
}
|
||
|
||
.high {
|
||
color: #00d4b4;
|
||
}
|
||
.medium {
|
||
color: #e87d0d;
|
||
}
|
||
.low {
|
||
color: #d4081a;
|
||
}
|
||
.terrible {
|
||
color: #d4081a;
|
||
font-weight: bold;
|
||
}
|
||
|
||
table {
|
||
width: 80%;
|
||
margin-top: 10px;
|
||
border-collapse: collapse;
|
||
border: 1px solid #cbcbcb;
|
||
color: #363636;
|
||
-webkit-border-radius: 3px;
|
||
-moz-border-radius: 3px;
|
||
border-radius: 3px;
|
||
}
|
||
|
||
table thead {
|
||
display: none;
|
||
}
|
||
|
||
table td.line,
|
||
table td.hits {
|
||
width: 20px;
|
||
background: #eaeaea;
|
||
text-align: center;
|
||
font-size: 11px;
|
||
padding: 0 10px;
|
||
color: #949494;
|
||
}
|
||
|
||
table td.hits {
|
||
width: 10px;
|
||
padding: 2px 5px;
|
||
color: rgba(0,0,0,.2);
|
||
background: #f0f0f0;
|
||
}
|
||
|
||
tr.miss td.line,
|
||
tr.miss td.hits {
|
||
background: #e6c3c7;
|
||
}
|
||
|
||
tr.miss td {
|
||
background: #f8d5d8;
|
||
}
|
||
|
||
td.source {
|
||
padding-left: 15px;
|
||
line-height: 15px;
|
||
white-space: pre;
|
||
font: 12px monaco, monospace;
|
||
}
|
||
|
||
code .comment { color: #ddd }
|
||
code .init { color: #2F6FAD }
|
||
code .string { color: #5890AD }
|
||
code .keyword { color: #8A6343 }
|
||
code .number { color: #2F6FAD }
|
||
</style></head><body><div id="coverage"><h1 id="overview">Coverage</h1><div id="menu"><li><a href="#overview">overview</a></li><li><span class="cov high">93</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Common/common.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Common/</span><span class="basename">common.js</span></a></li><li><span class="cov high">100</span><a href="#/Users/welefen/Develop/git/thinkjs/lib/Common/extend.js"><span class="dirname">/Users/welefen/Develop/git/thinkjs/lib/Common/</span><span class="basename">extend.js</span></a></li><a id="logo" href="http://visionmedia.github.io/mocha/">m</a></div><div id="stats" class="high"><div class="percentage">94%</div><div class="sloc">252</div><div class="hits">237</div><div class="misses">15</div></div><div id="files"><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Common/common.js">/Users/welefen/Develop/git/thinkjs/lib/Common/common.js</h2><div id="stats" class="high"><div class="percentage">93%</div><div class="sloc">239</div><div class="hits">224</div><div class="misses">15</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">var fs = require('fs');</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source">var path = require('path');</td></tr><tr class="hit"><td class="line">3</td><td class="hits">1</td><td class="source">var util = require('util');</td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source">var crypto = require('crypto');</td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source">var net = require('net');</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> * 由于非常依赖promise,所以将promise设置为全局变量</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> * @type {[type]}</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source">global.Promise = require('es6-promise').Promise;</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> * 动态创建一个类</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> * 提供了继承、扩展、调用父级别方法等方法</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">18</td><td class="hits">1</td><td class="source">global.Class = function (prop, superCls) {</td></tr><tr class="hit"><td class="line">19</td><td class="hits">4</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">20</td><td class="hits">4</td><td class="source"> var cls = function () {</td></tr><tr class="hit"><td class="line">21</td><td class="hits">4</td><td class="source"> function T(args) {</td></tr><tr class="hit"><td class="line">22</td><td class="hits">4</td><td class="source"> for(var name in cls.__prop){</td></tr><tr class="hit"><td class="line">23</td><td class="hits">10</td><td class="source"> var val = cls.__prop[name];</td></tr><tr class="hit"><td class="line">24</td><td class="hits">10</td><td class="source"> this[name] = isObject(val) ? extend({}, val) : val;</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> //自动执行init方法</td></tr><tr class="hit"><td class="line">27</td><td class="hits">4</td><td class="source"> if(isFunction(this.init)){</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> //获取init返回值,如果返回一个promise,可以让后续执行在then之后</td></tr><tr class="hit"><td class="line">29</td><td class="hits">4</td><td class="source"> this.__initReturn = this.init.apply(this, args);</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">31</td><td class="hits">4</td><td class="source"> return this;</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">33</td><td class="hits">4</td><td class="source"> T.prototype = cls.prototype;</td></tr><tr class="hit"><td class="line">34</td><td class="hits">4</td><td class="source"> T.constructor = cls;</td></tr><tr class="hit"><td class="line">35</td><td class="hits">4</td><td class="source"> return new T(arguments);</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> //类的属性,不放在原型上,实例化的时候调用</td></tr><tr class="hit"><td class="line">38</td><td class="hits">4</td><td class="source"> cls.__prop = {};</td></tr><tr class="hit"><td class="line">39</td><td class="hits">4</td><td class="source"> cls.extend = function(prop){</td></tr><tr class="hit"><td class="line">40</td><td class="hits">3</td><td class="source"> if (isFunction(prop)) {</td></tr><tr class="hit"><td class="line">41</td><td class="hits">1</td><td class="source"> prop = prop();</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">43</td><td class="hits">3</td><td class="source"> if (isObject(prop)) {</td></tr><tr class="hit"><td class="line">44</td><td class="hits">3</td><td class="source"> for(var name in prop){</td></tr><tr class="hit"><td class="line">45</td><td class="hits">16</td><td class="source"> var val = prop[name];</td></tr><tr class="hit"><td class="line">46</td><td class="hits">16</td><td class="source"> if (isFunction(val)) {</td></tr><tr class="hit"><td class="line">47</td><td class="hits">10</td><td class="source"> this.prototype[name] = val;</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="hit"><td class="line">49</td><td class="hits">6</td><td class="source"> cls.__prop[name] = isObject(val) ? extend({}, val) : val;</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">53</td><td class="hits">3</td><td class="source"> return this;</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">55</td><td class="hits">4</td><td class="source"> cls.inherits = function(superCls){</td></tr><tr class="hit"><td class="line">56</td><td class="hits">3</td><td class="source"> util.inherits(this, superCls);</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> //将父级的属性复制到当前类上</td></tr><tr class="hit"><td class="line">58</td><td class="hits">3</td><td class="source"> extend(cls.__prop, superCls.__prop);</td></tr><tr class="hit"><td class="line">59</td><td class="hits">3</td><td class="source"> return this;</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">61</td><td class="hits">4</td><td class="source"> if (superCls === true && isFunction(prop)) {</td></tr><tr class="hit"><td class="line">62</td><td class="hits">1</td><td class="source"> superCls = prop;</td></tr><tr class="hit"><td class="line">63</td><td class="hits">1</td><td class="source"> prop = undefined;</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">65</td><td class="hits">4</td><td class="source"> if (isFunction(superCls)) {</td></tr><tr class="hit"><td class="line">66</td><td class="hits">3</td><td class="source"> cls.inherits(superCls);</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> //调用父级方法</td></tr><tr class="hit"><td class="line">69</td><td class="hits">4</td><td class="source"> cls.prototype.super = cls.prototype.super_ = function(name, data){</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> //如果当前类没有这个方法,则直接返回。</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> //用于在a方法调用父级的b方法</td></tr><tr class="hit"><td class="line">72</td><td class="hits">6</td><td class="source"> if (!this[name]) {</td></tr><tr class="hit"><td class="line">73</td><td class="hits">1</td><td class="source"> return;</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">75</td><td class="hits">5</td><td class="source"> var super_ = this.constructor.super_;</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> //如果父级没有这个方法,那么直接返回</td></tr><tr class="hit"><td class="line">77</td><td class="hits">5</td><td class="source"> if (!isFunction(super_.prototype[name])) {</td></tr><tr class="hit"><td class="line">78</td><td class="hits">1</td><td class="source"> return;</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">80</td><td class="hits"></td><td class="source"> //如果参数不是数组,自动转为数组</td></tr><tr class="hit"><td class="line">81</td><td class="hits">4</td><td class="source"> if (!isArray(data)) {</td></tr><tr class="hit"><td class="line">82</td><td class="hits">4</td><td class="source"> data = [data];</td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">84</td><td class="hits">4</td><td class="source"> while(1){</td></tr><tr class="hit"><td class="line">85</td><td class="hits">5</td><td class="source"> if (this[name] === super_.prototype[name] && super_.super_) {</td></tr><tr class="hit"><td class="line">86</td><td class="hits">1</td><td class="source"> super_ = super_.super_;</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="hit"><td class="line">88</td><td class="hits">4</td><td class="source"> break;</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">91</td><td class="hits">4</td><td class="source"> var method = super_.prototype[name];</td></tr><tr class="hit"><td class="line">92</td><td class="hits">4</td><td class="source"> delete super_.prototype[name];</td></tr><tr class="hit"><td class="line">93</td><td class="hits">4</td><td class="source"> var ret = method.apply(this, data);</td></tr><tr class="hit"><td class="line">94</td><td class="hits">4</td><td class="source"> super_.prototype[name] = method;</td></tr><tr class="hit"><td class="line">95</td><td class="hits">4</td><td class="source"> return ret;</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">97</td><td class="hits">4</td><td class="source"> if (prop) {</td></tr><tr class="hit"><td class="line">98</td><td class="hits">3</td><td class="source"> cls.extend(prop);</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">100</td><td class="hits">4</td><td class="source"> return cls;</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">102</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> * extend, from jquery,具有深度复制功能</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">106</td><td class="hits">1</td><td class="source">global.extend = function(){</td></tr><tr class="hit"><td class="line">107</td><td class="hits">23</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">108</td><td class="hits">23</td><td class="source"> var args = [].slice.call(arguments);</td></tr><tr class="hit"><td class="line">109</td><td class="hits">23</td><td class="source"> var deep = true;</td></tr><tr class="hit"><td class="line">110</td><td class="hits">23</td><td class="source"> var target = args.shift();</td></tr><tr class="hit"><td class="line">111</td><td class="hits">23</td><td class="source"> if (isBoolean(target)) {</td></tr><tr class="hit"><td class="line">112</td><td class="hits">8</td><td class="source"> deep = target;</td></tr><tr class="hit"><td class="line">113</td><td class="hits">8</td><td class="source"> target = args.shift();</td></tr><tr><td class="line">114</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">115</td><td class="hits">23</td><td class="source"> target = target || {};</td></tr><tr class="hit"><td class="line">116</td><td class="hits">23</td><td class="source"> var length = args.length;</td></tr><tr class="hit"><td class="line">117</td><td class="hits">23</td><td class="source"> var options, name, src, copy, copyAsArray, clone;</td></tr><tr class="hit"><td class="line">118</td><td class="hits">23</td><td class="source"> for(var i = 0; i < length; i++){</td></tr><tr class="hit"><td class="line">119</td><td class="hits">23</td><td class="source"> options = args[i] || {};</td></tr><tr class="hit"><td class="line">120</td><td class="hits">23</td><td class="source"> if (isFunction(options)) {</td></tr><tr class="hit"><td class="line">121</td><td class="hits">1</td><td class="source"> options = options();</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">123</td><td class="hits">23</td><td class="source"> for(name in options){</td></tr><tr class="hit"><td class="line">124</td><td class="hits">34</td><td class="source"> src = target[name];</td></tr><tr class="hit"><td class="line">125</td><td class="hits">34</td><td class="source"> copy = options[name];</td></tr><tr class="hit"><td class="line">126</td><td class="hits">34</td><td class="source"> if (src === copy) {</td></tr><tr class="hit"><td class="line">127</td><td class="hits">2</td><td class="source"> continue;</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">129</td><td class="hits">32</td><td class="source"> if (deep && copy && (isObject(copy) || (copyAsArray = isArray(copy) ))) {</td></tr><tr class="hit"><td class="line">130</td><td class="hits">6</td><td class="source"> if (copyAsArray) {</td></tr><tr class="hit"><td class="line">131</td><td class="hits">1</td><td class="source"> copyAsArray = false;</td></tr><tr class="hit"><td class="line">132</td><td class="hits">1</td><td class="source"> clone = src && isArray(src) ? src : [];</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="hit"><td class="line">134</td><td class="hits">5</td><td class="source"> clone = src && isObject(src) ? src : {}; </td></tr><tr><td class="line">135</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">136</td><td class="hits">6</td><td class="source"> target[name] = extend(deep, clone, copy);</td></tr><tr class="hit"><td class="line">137</td><td class="hits">26</td><td class="source"> }else if (copy !== undefined) {</td></tr><tr class="hit"><td class="line">138</td><td class="hits">26</td><td class="source"> target[name] = copy;</td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">142</td><td class="hits">23</td><td class="source"> return target;</td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">145</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source">//Object上toString方法</td></tr><tr class="hit"><td class="line">147</td><td class="hits">1</td><td class="source">var toString = Object.prototype.toString;</td></tr><tr><td class="line">148</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">149</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">150</td><td class="hits"></td><td class="source"> * 是否是boolean</td></tr><tr><td class="line">151</td><td class="hits"></td><td class="source"> * @param {[type]} obj</td></tr><tr><td class="line">152</td><td class="hits"></td><td class="source"> * @return {Boolean}</td></tr><tr><td class="line">153</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">154</td><td class="hits">1</td><td class="source">global.isBoolean = function(obj){</td></tr><tr class="hit"><td class="line">155</td><td class="hits">34</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">156</td><td class="hits">34</td><td class="source"> return toString.call(obj) === '[object Boolean]';</td></tr><tr><td class="line">157</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">159</td><td class="hits"></td><td class="source"> * 是否是数字</td></tr><tr><td class="line">160</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">161</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">162</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">163</td><td class="hits">1</td><td class="source">global.isNumber = function(obj){</td></tr><tr class="hit"><td class="line">164</td><td class="hits">18</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">165</td><td class="hits">18</td><td class="source"> return toString.call(obj) === '[object Number]';</td></tr><tr><td class="line">166</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">167</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">168</td><td class="hits"></td><td class="source"> * 是否是个对象</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">170</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">171</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">172</td><td class="hits">1</td><td class="source">global.isObject = function(obj){</td></tr><tr class="hit"><td class="line">173</td><td class="hits">66</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">174</td><td class="hits">66</td><td class="source"> return toString.call(obj) === '[object Object]';</td></tr><tr><td class="line">175</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">176</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">177</td><td class="hits"></td><td class="source"> * 是否是字符串</td></tr><tr><td class="line">178</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">179</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">180</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">181</td><td class="hits">1</td><td class="source">global.isString = function(obj){</td></tr><tr class="hit"><td class="line">182</td><td class="hits">12</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">183</td><td class="hits">12</td><td class="source"> return toString.call(obj) === '[object String]';</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">185</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source"> * 是否是个function</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">188</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">189</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">190</td><td class="hits">1</td><td class="source">global.isFunction = function(obj){</td></tr><tr class="hit"><td class="line">191</td><td class="hits">65</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">192</td><td class="hits">65</td><td class="source"> return typeof obj === 'function';</td></tr><tr><td class="line">193</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">195</td><td class="hits"></td><td class="source"> * 是否是日期</td></tr><tr><td class="line">196</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">197</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">198</td><td class="hits">1</td><td class="source">global.isDate = function(obj){</td></tr><tr class="hit"><td class="line">199</td><td class="hits">2</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">200</td><td class="hits">2</td><td class="source"> return util.isDate(obj);</td></tr><tr><td class="line">201</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">203</td><td class="hits"></td><td class="source"> * 是否是正则</td></tr><tr><td class="line">204</td><td class="hits"></td><td class="source"> * @param {[type]} reg [description]</td></tr><tr><td class="line">205</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">206</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">207</td><td class="hits">1</td><td class="source">global.isRegexp = function(obj){</td></tr><tr class="hit"><td class="line">208</td><td class="hits">2</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">209</td><td class="hits">2</td><td class="source"> return util.isRegExp(obj);</td></tr><tr><td class="line">210</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">211</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">212</td><td class="hits"></td><td class="source"> * 是否是个错误</td></tr><tr><td class="line">213</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">214</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">215</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">216</td><td class="hits">1</td><td class="source">global.isError = function(obj){</td></tr><tr class="hit"><td class="line">217</td><td class="hits">2</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">218</td><td class="hits">2</td><td class="source"> return util.isError(obj);</td></tr><tr><td class="line">219</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">220</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">221</td><td class="hits"></td><td class="source"> * 判断对象是否为空</td></tr><tr><td class="line">222</td><td class="hits"></td><td class="source"> * @param {[type]} obj</td></tr><tr><td class="line">223</td><td class="hits"></td><td class="source"> * @return {Boolean}</td></tr><tr><td class="line">224</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">225</td><td class="hits">1</td><td class="source">global.isEmpty = function(obj){</td></tr><tr class="hit"><td class="line">226</td><td class="hits">12</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">227</td><td class="hits">12</td><td class="source"> if (isObject(obj)) {</td></tr><tr class="hit"><td class="line">228</td><td class="hits">2</td><td class="source"> var key;</td></tr><tr class="hit"><td class="line">229</td><td class="hits">2</td><td class="source"> for(key in obj){</td></tr><tr class="hit"><td class="line">230</td><td class="hits">1</td><td class="source"> return false;</td></tr><tr><td class="line">231</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">232</td><td class="hits">1</td><td class="source"> return true;</td></tr><tr class="hit"><td class="line">233</td><td class="hits">10</td><td class="source"> }else if (isArray(obj)) {</td></tr><tr class="hit"><td class="line">234</td><td class="hits">1</td><td class="source"> return obj.length === 0;</td></tr><tr class="hit"><td class="line">235</td><td class="hits">9</td><td class="source"> }else if (isString(obj)) {</td></tr><tr class="hit"><td class="line">236</td><td class="hits">2</td><td class="source"> return obj.length === 0;</td></tr><tr class="hit"><td class="line">237</td><td class="hits">7</td><td class="source"> }else if (isNumber(obj)) {</td></tr><tr class="hit"><td class="line">238</td><td class="hits">2</td><td class="source"> return obj === 0;</td></tr><tr class="hit"><td class="line">239</td><td class="hits">5</td><td class="source"> }else if (obj === null || obj === undefined) {</td></tr><tr class="hit"><td class="line">240</td><td class="hits">2</td><td class="source"> return true;</td></tr><tr class="hit"><td class="line">241</td><td class="hits">3</td><td class="source"> }else if (isBoolean(obj)) {</td></tr><tr class="hit"><td class="line">242</td><td class="hits">2</td><td class="source"> return !obj;</td></tr><tr><td class="line">243</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">244</td><td class="hits">1</td><td class="source"> return false;</td></tr><tr><td class="line">245</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">246</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">247</td><td class="hits"></td><td class="source"> * 是否是个标量</td></tr><tr><td class="line">248</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">249</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">250</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">251</td><td class="hits">1</td><td class="source">global.isScalar = function(obj){</td></tr><tr class="hit"><td class="line">252</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">253</td><td class="hits">1</td><td class="source"> return isBoolean(obj) || isNumber(obj) || isString(obj);</td></tr><tr><td class="line">254</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">255</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">256</td><td class="hits"></td><td class="source"> * 是否是个数组</td></tr><tr><td class="line">257</td><td class="hits"></td><td class="source"> * @type {Boolean}</td></tr><tr><td class="line">258</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">259</td><td class="hits">1</td><td class="source">global.isArray = Array.isArray;</td></tr><tr><td class="line">260</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">261</td><td class="hits"></td><td class="source"> * 是否是IP</td></tr><tr><td class="line">262</td><td class="hits"></td><td class="source"> * @type {Boolean}</td></tr><tr><td class="line">263</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">264</td><td class="hits">1</td><td class="source">global.isIP = net.isIP;</td></tr><tr class="hit"><td class="line">265</td><td class="hits">1</td><td class="source">global.isIP4 = net.isIP4;</td></tr><tr class="hit"><td class="line">266</td><td class="hits">1</td><td class="source">global.isIP6 = net.isIP6;</td></tr><tr><td class="line">267</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">268</td><td class="hits"></td><td class="source"> * 是否是个文件</td></tr><tr><td class="line">269</td><td class="hits"></td><td class="source"> * @param {[type]} p [description]</td></tr><tr><td class="line">270</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">271</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">272</td><td class="hits">1</td><td class="source">global.isFile = function(p){</td></tr><tr class="hit"><td class="line">273</td><td class="hits">4</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">274</td><td class="hits">4</td><td class="source"> if (!fs.existsSync(p)) {</td></tr><tr class="hit"><td class="line">275</td><td class="hits">2</td><td class="source"> return false;</td></tr><tr><td class="line">276</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">277</td><td class="hits">2</td><td class="source"> var stats = fs.statSync(p);</td></tr><tr class="hit"><td class="line">278</td><td class="hits">2</td><td class="source"> return stats.isFile();</td></tr><tr><td class="line">279</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">280</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">281</td><td class="hits"></td><td class="source"> * 是否是个目录</td></tr><tr><td class="line">282</td><td class="hits"></td><td class="source"> * @param {[type]} p [description]</td></tr><tr><td class="line">283</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">284</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">285</td><td class="hits">1</td><td class="source">global.isDir = function(p){</td></tr><tr class="hit"><td class="line">286</td><td class="hits">3</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">287</td><td class="hits">3</td><td class="source"> if (!fs.existsSync(p)) {</td></tr><tr class="hit"><td class="line">288</td><td class="hits">1</td><td class="source"> return false;</td></tr><tr><td class="line">289</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">290</td><td class="hits">2</td><td class="source"> var stats = fs.statSync(p);</td></tr><tr class="hit"><td class="line">291</td><td class="hits">2</td><td class="source"> return stats.isDirectory();</td></tr><tr><td class="line">292</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">293</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">294</td><td class="hits"></td><td class="source"> * 是否是buffer</td></tr><tr><td class="line">295</td><td class="hits"></td><td class="source"> * @type {Boolean}</td></tr><tr><td class="line">296</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">297</td><td class="hits">1</td><td class="source">global.isBuffer = Buffer.isBuffer;</td></tr><tr><td class="line">298</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">299</td><td class="hits"></td><td class="source"> * 是否是个数字的字符串</td></tr><tr><td class="line">300</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">301</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">302</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">303</td><td class="hits">1</td><td class="source">var numberReg = /^((\d*\.?\d*(?:e[+-]?\d*(?:\d?\.?|\.?\d?)\d*)?)|(0[0-7]+)|(0x[0-9a-f]+))$/i;</td></tr><tr class="hit"><td class="line">304</td><td class="hits">1</td><td class="source">global.isNumberString = function(obj){</td></tr><tr class="hit"><td class="line">305</td><td class="hits">3</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">306</td><td class="hits">3</td><td class="source"> return numberReg.test(obj);</td></tr><tr><td class="line">307</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">308</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">309</td><td class="hits"></td><td class="source"> * 判断是否是个promise</td></tr><tr><td class="line">310</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">311</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">312</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">313</td><td class="hits">1</td><td class="source">global.isPromise = function(obj){</td></tr><tr class="hit"><td class="line">314</td><td class="hits">12</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">315</td><td class="hits">12</td><td class="source"> return !!(obj && typeof obj.then === 'function');</td></tr><tr><td class="line">316</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">317</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">318</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">319</td><td class="hits"></td><td class="source"> * 判断一个文件或者目录是否可写</td></tr><tr><td class="line">320</td><td class="hits"></td><td class="source"> * @param {[type]} p [description]</td></tr><tr><td class="line">321</td><td class="hits"></td><td class="source"> * @return {Boolean} [description]</td></tr><tr><td class="line">322</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">323</td><td class="hits">1</td><td class="source">global.isWritable = function(p){</td></tr><tr class="hit"><td class="line">324</td><td class="hits">3</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">325</td><td class="hits">3</td><td class="source"> if (!fs.existsSync(p)) {</td></tr><tr class="hit"><td class="line">326</td><td class="hits">1</td><td class="source"> return false;</td></tr><tr><td class="line">327</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">328</td><td class="hits">2</td><td class="source"> var stats = fs.statSync(p);</td></tr><tr class="hit"><td class="line">329</td><td class="hits">2</td><td class="source"> var mode = stats.mode;</td></tr><tr class="hit"><td class="line">330</td><td class="hits">2</td><td class="source"> var uid = process.getuid ? process.getuid() : 0;</td></tr><tr class="hit"><td class="line">331</td><td class="hits">2</td><td class="source"> var gid = process.getgid ? process.getgid() : 0;</td></tr><tr class="hit"><td class="line">332</td><td class="hits">2</td><td class="source"> var owner = uid === stats.uid;</td></tr><tr class="hit"><td class="line">333</td><td class="hits">2</td><td class="source"> var group = gid === stats.gid;</td></tr><tr class="hit"><td class="line">334</td><td class="hits">2</td><td class="source"> return !!(owner && (mode & parseInt('00200', 8)) || </td></tr><tr><td class="line">335</td><td class="hits"></td><td class="source"> group && (mode & parseInt('00020', 8)) || </td></tr><tr><td class="line">336</td><td class="hits"></td><td class="source"> (mode & parseInt('00002', 8)));</td></tr><tr><td class="line">337</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">338</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">339</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">340</td><td class="hits"></td><td class="source"> * 递归创建目录,同步模式</td></tr><tr><td class="line">341</td><td class="hits"></td><td class="source"> * @param {[type]} p [description]</td></tr><tr><td class="line">342</td><td class="hits"></td><td class="source"> * @param {[type]} mode [description]</td></tr><tr><td class="line">343</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">344</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">345</td><td class="hits">1</td><td class="source">global.mkdir = function(p, mode){</td></tr><tr class="hit"><td class="line">346</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">347</td><td class="hits">1</td><td class="source"> mode = mode || '0777';</td></tr><tr class="hit"><td class="line">348</td><td class="hits">1</td><td class="source"> if (fs.existsSync(p)) {</td></tr><tr class="miss"><td class="line">349</td><td class="hits">0</td><td class="source"> chmod(p, mode);</td></tr><tr class="miss"><td class="line">350</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr><td class="line">351</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">352</td><td class="hits">1</td><td class="source"> var pp = path.dirname(p);</td></tr><tr class="hit"><td class="line">353</td><td class="hits">1</td><td class="source"> if (fs.existsSync(pp)) {</td></tr><tr class="hit"><td class="line">354</td><td class="hits">1</td><td class="source"> fs.mkdirSync(p, mode);</td></tr><tr><td class="line">355</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="miss"><td class="line">356</td><td class="hits">0</td><td class="source"> mkdir(pp, mode);</td></tr><tr class="miss"><td class="line">357</td><td class="hits">0</td><td class="source"> mkdir(p, mode);</td></tr><tr><td class="line">358</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">359</td><td class="hits">1</td><td class="source"> return true;</td></tr><tr><td class="line">360</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">361</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">362</td><td class="hits"></td><td class="source"> * 修改目录或者文件权限</td></tr><tr><td class="line">363</td><td class="hits"></td><td class="source"> * @param {[type]} p [description]</td></tr><tr><td class="line">364</td><td class="hits"></td><td class="source"> * @param {[type]} mode [description]</td></tr><tr><td class="line">365</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">366</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">367</td><td class="hits">1</td><td class="source">global.chmod = function(p, mode){</td></tr><tr class="miss"><td class="line">368</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">369</td><td class="hits">0</td><td class="source"> mode = mode || '0777';</td></tr><tr class="miss"><td class="line">370</td><td class="hits">0</td><td class="source"> if (!fs.existsSync(p)) {</td></tr><tr class="miss"><td class="line">371</td><td class="hits">0</td><td class="source"> return true;</td></tr><tr><td class="line">372</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">373</td><td class="hits">0</td><td class="source"> return fs.chmodSync(p, mode);</td></tr><tr><td class="line">374</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">375</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">376</td><td class="hits"></td><td class="source"> * 获取文件内容</td></tr><tr><td class="line">377</td><td class="hits"></td><td class="source"> * @param {[type]} file [description]</td></tr><tr><td class="line">378</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">379</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">380</td><td class="hits">1</td><td class="source">global.getFileContent = function(file, encoding){</td></tr><tr class="miss"><td class="line">381</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">382</td><td class="hits">0</td><td class="source"> if (!fs.existsSync(file)) {</td></tr><tr class="miss"><td class="line">383</td><td class="hits">0</td><td class="source"> return '';</td></tr><tr><td class="line">384</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">385</td><td class="hits">0</td><td class="source"> return fs.readFileSync(file, {</td></tr><tr><td class="line">386</td><td class="hits"></td><td class="source"> encoding: encoding || 'utf8'</td></tr><tr><td class="line">387</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">388</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">389</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">390</td><td class="hits"></td><td class="source"> * 设置文件内容</td></tr><tr><td class="line">391</td><td class="hits"></td><td class="source"> * @param {[type]} file [description]</td></tr><tr><td class="line">392</td><td class="hits"></td><td class="source"> * @param {[type]} data [description]</td></tr><tr><td class="line">393</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">394</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">395</td><td class="hits">1</td><td class="source">global.setFileContent = function(file, data){</td></tr><tr class="miss"><td class="line">396</td><td class="hits">0</td><td class="source"> 'use strict';</td></tr><tr class="miss"><td class="line">397</td><td class="hits">0</td><td class="source"> return fs.writeFileSync(file, data);</td></tr><tr><td class="line">398</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">399</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">400</td><td class="hits"></td><td class="source"> * 大写首字符</td></tr><tr><td class="line">401</td><td class="hits"></td><td class="source"> * @param {[type]} name [description]</td></tr><tr><td class="line">402</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">403</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">404</td><td class="hits">1</td><td class="source">global.ucfirst = function(name){</td></tr><tr class="hit"><td class="line">405</td><td class="hits">6</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">406</td><td class="hits">6</td><td class="source"> name = (name || '') + '';</td></tr><tr class="hit"><td class="line">407</td><td class="hits">6</td><td class="source"> return name.substr(0,1).toUpperCase() + name.substr(1).toLowerCase();</td></tr><tr><td class="line">408</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">409</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">410</td><td class="hits"></td><td class="source"> * 获取字符串的md5</td></tr><tr><td class="line">411</td><td class="hits"></td><td class="source"> * @param {[type]} str [description]</td></tr><tr><td class="line">412</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">413</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">414</td><td class="hits">1</td><td class="source">global.md5 = function(str){</td></tr><tr class="hit"><td class="line">415</td><td class="hits">2</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">416</td><td class="hits">2</td><td class="source"> var instance = crypto.createHash('md5');</td></tr><tr class="hit"><td class="line">417</td><td class="hits">2</td><td class="source"> instance.update(str + '');</td></tr><tr class="hit"><td class="line">418</td><td class="hits">2</td><td class="source"> return instance.digest('hex');</td></tr><tr><td class="line">419</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">420</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">421</td><td class="hits"></td><td class="source"> * 生成一个promise,如果传入的参数是promise则直接返回</td></tr><tr><td class="line">422</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">423</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">424</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">425</td><td class="hits">1</td><td class="source">global.getPromise = function(obj, reject){</td></tr><tr class="hit"><td class="line">426</td><td class="hits">7</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">427</td><td class="hits">7</td><td class="source"> if (isPromise(obj)) {</td></tr><tr class="hit"><td class="line">428</td><td class="hits">1</td><td class="source"> return obj;</td></tr><tr><td class="line">429</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">430</td><td class="hits">6</td><td class="source"> if (reject) {</td></tr><tr class="hit"><td class="line">431</td><td class="hits">2</td><td class="source"> return Promise.reject(obj);</td></tr><tr><td class="line">432</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">433</td><td class="hits">4</td><td class="source"> return Promise.resolve(obj);</td></tr><tr><td class="line">434</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">435</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">436</td><td class="hits"></td><td class="source"> * 生成一个defer对象</td></tr><tr><td class="line">437</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">438</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">439</td><td class="hits">1</td><td class="source">global.getDefer = function(){</td></tr><tr class="hit"><td class="line">440</td><td class="hits">1</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">441</td><td class="hits">1</td><td class="source"> var deferred = {};</td></tr><tr class="hit"><td class="line">442</td><td class="hits">1</td><td class="source"> deferred.promise = new Promise(function(resolve, reject){</td></tr><tr class="hit"><td class="line">443</td><td class="hits">1</td><td class="source"> deferred.resolve = resolve;</td></tr><tr class="hit"><td class="line">444</td><td class="hits">1</td><td class="source"> deferred.reject = reject;</td></tr><tr><td class="line">445</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">446</td><td class="hits">1</td><td class="source"> return deferred;</td></tr><tr><td class="line">447</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">448</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">449</td><td class="hits"></td><td class="source"> * 快速生成一个object</td></tr><tr><td class="line">450</td><td class="hits"></td><td class="source"> * @param {[type]} key [description]</td></tr><tr><td class="line">451</td><td class="hits"></td><td class="source"> * @param {[type]} value [description]</td></tr><tr><td class="line">452</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">453</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">454</td><td class="hits">1</td><td class="source">global.getObject = function(key, value){</td></tr><tr class="hit"><td class="line">455</td><td class="hits">5</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">456</td><td class="hits">5</td><td class="source"> var obj = {};</td></tr><tr class="hit"><td class="line">457</td><td class="hits">5</td><td class="source"> if (!isArray(key)) {</td></tr><tr class="hit"><td class="line">458</td><td class="hits">2</td><td class="source"> obj[key] = value;</td></tr><tr class="hit"><td class="line">459</td><td class="hits">2</td><td class="source"> return obj;</td></tr><tr><td class="line">460</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">461</td><td class="hits">3</td><td class="source"> key.forEach(function(item, i){</td></tr><tr class="hit"><td class="line">462</td><td class="hits">5</td><td class="source"> obj[item] = value[i];</td></tr><tr><td class="line">463</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">464</td><td class="hits">3</td><td class="source"> return obj;</td></tr><tr><td class="line">465</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">466</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">467</td><td class="hits"></td><td class="source"> * 将数组变成对象</td></tr><tr><td class="line">468</td><td class="hits"></td><td class="source"> * @param {[type]} arr [description]</td></tr><tr><td class="line">469</td><td class="hits"></td><td class="source"> * @param {[type]} key [description]</td></tr><tr><td class="line">470</td><td class="hits"></td><td class="source"> * @param {[type]} valueKeys [description]</td></tr><tr><td class="line">471</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">472</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">473</td><td class="hits">1</td><td class="source">global.arrToObj = function(arr, key, valueKey){</td></tr><tr class="hit"><td class="line">474</td><td class="hits">4</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">475</td><td class="hits">4</td><td class="source"> var result = {};</td></tr><tr class="hit"><td class="line">476</td><td class="hits">4</td><td class="source"> var arrResult = [];</td></tr><tr class="hit"><td class="line">477</td><td class="hits">4</td><td class="source"> arr.forEach(function(item){</td></tr><tr class="hit"><td class="line">478</td><td class="hits">8</td><td class="source"> var keyValue = item[key];</td></tr><tr class="hit"><td class="line">479</td><td class="hits">8</td><td class="source"> if (valueKey === null) {</td></tr><tr class="hit"><td class="line">480</td><td class="hits">4</td><td class="source"> arrResult.push(keyValue);</td></tr><tr class="hit"><td class="line">481</td><td class="hits">4</td><td class="source"> }else if (valueKey) {</td></tr><tr class="hit"><td class="line">482</td><td class="hits">2</td><td class="source"> result[keyValue] = item[valueKey];</td></tr><tr><td class="line">483</td><td class="hits"></td><td class="source"> }else{</td></tr><tr class="hit"><td class="line">484</td><td class="hits">2</td><td class="source"> result[keyValue] = item;</td></tr><tr><td class="line">485</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">486</td><td class="hits"></td><td class="source"> })</td></tr><tr class="hit"><td class="line">487</td><td class="hits">4</td><td class="source"> return valueKey === null ? arrResult : result;</td></tr><tr><td class="line">488</td><td class="hits"></td><td class="source">}</td></tr></tbody></table></div><div class="file"><h2 id="/Users/welefen/Develop/git/thinkjs/lib/Common/extend.js">/Users/welefen/Develop/git/thinkjs/lib/Common/extend.js</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">13</div><div class="hits">13</div><div class="misses">0</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">//该文件内容为原生对象的扩展</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> * 获取对象的值</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> * @param {[type]} obj [description]</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source">Object.values = function(obj){</td></tr><tr class="hit"><td class="line">9</td><td class="hits">2</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">10</td><td class="hits">2</td><td class="source"> var values = [];</td></tr><tr class="hit"><td class="line">11</td><td class="hits">2</td><td class="source"> for(var key in obj){</td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source"> if (obj.hasOwnProperty(key)) {</td></tr><tr class="hit"><td class="line">13</td><td class="hits">1</td><td class="source"> values.push(obj[key])</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">16</td><td class="hits">2</td><td class="source"> return values;</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source">/**</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> * 数组求和</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> * @return {[type]} [description]</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> */</td></tr><tr class="hit"><td class="line">22</td><td class="hits">1</td><td class="source">Array.prototype.sum = function(){</td></tr><tr class="hit"><td class="line">23</td><td class="hits">7</td><td class="source"> 'use strict';</td></tr><tr class="hit"><td class="line">24</td><td class="hits">7</td><td class="source"> var count = 0;</td></tr><tr class="hit"><td class="line">25</td><td class="hits">7</td><td class="source"> this.forEach(function(item){</td></tr><tr class="hit"><td class="line">26</td><td class="hits">23</td><td class="source"> count += parseFloat(item) || 0;</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">28</td><td class="hits">7</td><td class="source"> return count;</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div></div></div></body></html> |