Socket
Socket
Sign inDemoInstall

mockjs

Package Overview
Dependencies
Maintainers
1
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

mockjs - npm Package Compare versions

Comparing version 0.1.1 to 0.1.2

bin/random

9

CHANGELOG.md
# Changelog
### 3013.9.6
### 2014.5.9 V0.1.2
1. [+] 支持 [`Mock.mock(rurl, rtype, template)`](http://mockjs.com/#mock)
2. [+] 支持 [`'name|min-max': {}`、`'name|count': {}`](http://mockjs.com/#语法规范)
3. [+] 支持 [`'name': function(){}`](http://mockjs.com/#语法规范)
4. [+] 新增占位符 [@NOW](http://mockjs.com/#now)
5. [+] 更新了 [语法规范](http://mockjs.com/#语法规范)
### 2013.9.6
1. 增加占位符 @DATAIMAGE

@@ -5,0 +12,0 @@ 2. 解析占位符时**完全**忽略大小写

8

demo/assets/catalog.js

@@ -104,3 +104,3 @@ function htree(headers) {

text = anchor(text)
text = '<a href="#' + text + '">' + text + '</a>';
text = '<a href="' + (tree[i].el.attr('href') || '#' + text) + '">' + text + '</a>';
if (tree[i].level <= level) html += '<li>' + text + '</li>';

@@ -132,3 +132,7 @@ if (level) {

headers.each(function(index, elem) {
$(elem).before($('<a>').attr('name', anchor($(elem).text())))
$(elem).before(
$('<a>').attr('name',
anchor($(elem).attr('href') || $(elem).text())
)
)
});

@@ -135,0 +139,0 @@ // 回到顶部

@@ -39,2 +39,3 @@ $(function() {

$('#save').on('click', function(event) {
return
try {

@@ -41,0 +42,0 @@ var data = editor.getValue()

@@ -1,3 +0,3 @@

/*! mockjs 23-09-2013 */
(function(a){var b={version:"0.1.1",_mocked:{}},c=function(){var b={};return b.extend=function(){var c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length;for(1===i&&(g=this,h=0);i>h;h++)if(c=arguments[h])for(d in c)e=g[d],f=c[d],g!==f&&f!==a&&(b.isArray(f)||b.isObject(f)?(b.isArray(f)&&(clone=e&&b.isArray(e)?e:[]),b.isObject(f)&&(clone=e&&b.isObject(e)?e:{}),g[d]=b.extend(clone,f)):g[d]=f);return g},b.each=function(a,b,c){var d,e;if("number"===this.type(a))for(d=0;a>d;d++)b(d,d);else if(a.length===+a.length)for(d=0;d<a.length&&b.call(c,a[d],d,a)!==!1;d++);else for(e in a)if(b.call(c,a[e],e,a)===!1)break},b.type=function(b){return null===b||b===a?String(b):Object.prototype.toString.call(b).match(/\[object (\w+)\]/)[1].toLowerCase()},b.each("String Object Array".split(" "),function(a){b["is"+a]=function(c){return b.type(c)===a.toLowerCase()}}),b.isObjectOrArray=function(a){return b.isObject(a)||b.isArray(a)},b.isNumeric=function(a){return!isNaN(parseFloat(a))&&isFinite(a)},b.heredoc=function(a){return a.toString().replace(/^[^\/]+\/\*!?/,"").replace(/\*\/[^\/]+$/,"").replace(/^[\s\xA0]+/,"").replace(/[\s\xA0]+$/,"")},b.noop=function(){},b}(),d=function(){var b={extend:c.extend};return b.extend({"boolean":function(b,c,d){return d!==a?(b="undefined"==typeof b||isNaN(b)?1:parseInt(b,10),c="undefined"==typeof c||isNaN(c)?1:parseInt(c,10),Math.random()>1/(b+c)*b?!d:d):Math.random()>=.5},bool:function(a,b,c){return this.boolean(a,b,c)},natural:function(a,b){return a="undefined"!=typeof a?parseInt(a,10):0,b="undefined"!=typeof b?parseInt(b,10):9007199254740992,Math.round(Math.random()*(b-a))+a},integer:function(a,b){return a="undefined"!=typeof a?parseInt(a,10):-9007199254740992,b="undefined"!=typeof b?parseInt(b,10):9007199254740992,Math.round(Math.random()*(b-a))+a},"int":function(a,b){return this.integer(a,b)},"float":function(b,c,d,e){d=d===a?0:d,d=Math.max(Math.min(d,17),0),e=e===a?17:e,e=Math.max(Math.min(e,17),0);for(var f=this.integer(b,c)+".",g=0,h=this.natural(d,e);h>g;g++)f+=this.character("number");return parseFloat(f,10)},character:function(a){var c={lower:"abcdefghijklmnopqrstuvwxyz",upper:"ABCDEFGHIJKLMNOPQRSTUVWXYZ",number:"0123456789",symbol:"!@#$%^&*()[]"};return c.alpha=c.lower+c.upper,c.undefined=c.lower+c.upper+c.number+c.symbol,a=c[(""+a).toLowerCase()]||a,a.charAt(b.natural(0,a.length-1))},"char":function(a){return this.character(a)},string:function(c,d,e){var f;3===arguments.length&&(f=b.natural(d,e)),2===arguments.length&&("string"==typeof arguments[0]?f=d:(f=b.natural(c,d),c=a)),1===arguments.length&&(f=c,c=a),0===arguments.length&&(f=b.natural(3,7));for(var g="",h=0;f>h;h++)g+=b.character(c);return g},str:function(a,b,c){return this.string(a,b,c)},range:function(a,b,c){arguments.length<=1&&(b=a||0,a=0),c=arguments[2]||1;for(var d=Math.max(Math.ceil((b-a)/c),0),e=0,f=new Array(d);d>e;)f[e++]=a,a+=c;return f}}),b.extend({patternLetters:{yyyy:"getFullYear",yy:function(a){return(""+a.getFullYear()).slice(2)},y:"yy",MM:function(a){var b=a.getMonth()+1;return 10>b?"0"+b:b},M:function(a){return a.getMonth()+1},dd:function(a){var b=a.getDate();return 10>b?"0"+b:b},d:"getDate",HH:function(a){var b=a.getHours();return 10>b?"0"+b:b},H:"getHours",hh:function(a){var b=a.getHours()%12;return 10>b?"0"+b:b},h:function(a){return a.getHours()%12},mm:function(a){var b=a.getMinutes();return 10>b?"0"+b:b},m:"getMinutes",ss:function(a){var b=a.getSeconds();return 10>b?"0"+b:b},s:"getSeconds",SS:function(a){var b=a.getMilliseconds();return 10>b&&"00"+b||100>b&&"0"+b||b},S:"getMilliseconds",A:function(a){return a.getHours()<12?"AM":"PM"},a:function(a){return a.getHours()<12?"am":"pm"}}}),b.extend({rformat:new RegExp(function(){var a=[];for(var c in b.patternLetters)a.push(c);return"("+a.join("|")+")"}(),"g"),format:function(a,c){var d=b.patternLetters,e=b.rformat;return c.replace(e,function(b,c){return"function"==typeof d[c]?d[c](a):d[c]in d?arguments.callee(b,d[c]):a[d[c]]()})},randomDate:function(b,c){return b=b===a?new Date(0):b,c=c===a?new Date:c,new Date(Math.random()*(c.getTime()-b.getTime()))},date:function(a){return a=a||"yyyy-MM-dd",this.format(this.randomDate(),a)},time:function(a){return a=a||"HH:mm:ss",this.format(this.randomDate(),a)},datetime:function(a){return a=a||"yyyy-MM-dd HH:mm:ss",this.format(this.randomDate(),a)}}),b.extend({ad_size:["300x250","250x250","240x400","336x280","180x150","720x300","468x60","234x60","88x31","120x90","120x60","120x240","125x125","728x90","160x600","120x600","300x600"],screen_size:["320x200","320x240","640x480","800x480","800x480","1024x600","1024x768","1280x800","1440x900","1920x1200","2560x1600"],video_size:["720x480","768x576","1280x720","1920x1080"],image:function(b,c,d,e,f){return 4===arguments.length&&(f=e,e=a),3===arguments.length&&(f=d,d=a),b||(b=this.pick(this.ad_size)),c&&~c.indexOf("#")&&(c=c.slice(1)),d&&~d.indexOf("#")&&(d=d.slice(1)),"http://dummyimage.com/"+b+(c?"/"+c:"")+(d?"/"+d:"")+(e?"."+e:"")+(f?"&text="+f:"")},img:function(){return this.image.apply(this,arguments)}}),b.extend({brandColors:{"4ormat":"#fb0a2a","500px":"#02adea","About.me (blue)":"#00405d","About.me (yellow)":"#ffcc33",Addvocate:"#ff6138",Adobe:"#ff0000",Aim:"#fcd20b",Amazon:"#e47911",Android:"#a4c639","Angie's List":"#7fbb00",AOL:"#0060a3",Atlassian:"#003366",Behance:"#053eff","Big Cartel":"#97b538",bitly:"#ee6123",Blogger:"#fc4f08",Boeing:"#0039a6","Booking.com":"#003580",Carbonmade:"#613854",Cheddar:"#ff7243","Code School":"#3d4944",Delicious:"#205cc0",Dell:"#3287c1",Designmoo:"#e54a4f",Deviantart:"#4e6252","Designer News":"#2d72da",Devour:"#fd0001",DEWALT:"#febd17","Disqus (blue)":"#59a3fc","Disqus (orange)":"#db7132",Dribbble:"#ea4c89",Dropbox:"#3d9ae8",Drupal:"#0c76ab",Dunked:"#2a323a",eBay:"#89c507",Ember:"#f05e1b",Engadget:"#00bdf6",Envato:"#528036",Etsy:"#eb6d20",Evernote:"#5ba525","Fab.com":"#dd0017",Facebook:"#3b5998",Firefox:"#e66000","Flickr (blue)":"#0063dc","Flickr (pink)":"#ff0084",Forrst:"#5b9a68",Foursquare:"#25a0ca",Garmin:"#007cc3",GetGlue:"#2d75a2",Gimmebar:"#f70078",GitHub:"#171515","Google Blue":"#0140ca","Google Green":"#16a61e","Google Red":"#dd1812","Google Yellow":"#fcca03","Google+":"#dd4b39",Grooveshark:"#f77f00",Groupon:"#82b548","Hacker News":"#ff6600",HelloWallet:"#0085ca","Heroku (light)":"#c7c5e6","Heroku (dark)":"#6567a5",HootSuite:"#003366",Houzz:"#73ba37",HTML5:"#ec6231",IKEA:"#ffcc33",IMDb:"#f3ce13",Instagram:"#3f729b",Intel:"#0071c5",Intuit:"#365ebf",Kickstarter:"#76cc1e",kippt:"#e03500",Kodery:"#00af81",LastFM:"#c3000d",LinkedIn:"#0e76a8",Livestream:"#cf0005",Lumo:"#576396",Mixpanel:"#a086d3",Meetup:"#e51937",Nokia:"#183693",NVIDIA:"#76b900",Opera:"#cc0f16",Path:"#e41f11","PayPal (dark)":"#1e477a","PayPal (light)":"#3b7bbf",Pinboard:"#0000e6",Pinterest:"#c8232c",PlayStation:"#665cbe",Pocket:"#ee4056",Prezi:"#318bff",Pusha:"#0f71b4",Quora:"#a82400","QUOTE.fm":"#66ceff",Rdio:"#008fd5",Readability:"#9c0000","Red Hat":"#cc0000",Resource:"#7eb400",Rockpack:"#0ba6ab",Roon:"#62b0d9",RSS:"#ee802f",Salesforce:"#1798c1",Samsung:"#0c4da2",Shopify:"#96bf48",Skype:"#00aff0",Snagajob:"#f47a20",Softonic:"#008ace",SoundCloud:"#ff7700","Space Box":"#f86960",Spotify:"#81b71a",Sprint:"#fee100",Squarespace:"#121212",StackOverflow:"#ef8236",Staples:"#cc0000","Status Chart":"#d7584f",Stripe:"#008cdd",StudyBlue:"#00afe1",StumbleUpon:"#f74425","T-Mobile":"#ea0a8e",Technorati:"#40a800","The Next Web":"#ef4423",Treehouse:"#5cb868",Trulia:"#5eab1f",Tumblr:"#34526f","Twitch.tv":"#6441a5",Twitter:"#00acee",TYPO3:"#ff8700",Ubuntu:"#dd4814",Ustream:"#3388ff",Verizon:"#ef1d1d",Vimeo:"#86c9ef",Vine:"#00a478",Virb:"#06afd8","Virgin Media":"#cc0000",Wooga:"#5b009c","WordPress (blue)":"#21759b","WordPress (orange)":"#d54e21","WordPress (grey)":"#464646",Wunderlist:"#2b88d9",XBOX:"#9bc848",XING:"#126567","Yahoo!":"#720e9e",Yandex:"#ffcc00",Yelp:"#c41200",YouTube:"#c4302b",Zalongo:"#5498dc",Zendesk:"#78a300",Zerply:"#9dcc7a",Zootool:"#5e8b1d"},brands:function(){var a=[];for(var b in this.brandColors)a.push(b);return a},dataImageHolder:function(a){return"holder.js/"+a},dataImage:function(b,c){var d="undefined"!=typeof document&&document.createElement("canvas"),e=d&&d.getContext&&d.getContext("2d");if(!d||!e)return"";b||(b=this.pick(this.ad_size)),c=c!==a?c:b,b=b.split("x");var f=parseInt(b[0],10),g=parseInt(b[1],10),h=this.brandColors[this.pick(this.brands())],i="#FFF",j=14,k="sans-serif";return d.width=f,d.height=g,e.textAlign="center",e.textBaseline="middle",e.fillStyle=h,e.fillRect(0,0,f,g),e.fillStyle=i,e.font="bold "+j+"px "+k,e.fillText(c,f/2,g/2,f),d.toDataURL("image/png")}}),b.extend({color:function(){var a=Math.floor(16777215*Math.random()).toString(16);return a="#"+("000000"+a).slice(-6)}}),b.extend({capitalize:function(a){return a.charAt(0).toUpperCase()+a.substr(1)},upper:function(a){return a.toUpperCase()},lower:function(a){return a.toLowerCase()},pick:function(a){return a[this.natural(0,a.length-1)]},shuffle:function(a){for(var b=a.slice(0),c=[],d=0,e=b.length,f=0;e>f;f++)d=this.natural(0,b.length-1),c.push(b[d]),b.splice(d,1);return c}}),b.extend({paragraph:function(a,c){var d;0===arguments.length&&(d=b.natural(3,7)),1===arguments.length&&(d=c=a),2===arguments.length&&(a=parseInt(a,10),c=parseInt(c,10),d=b.natural(a,c));for(var e=[],f=0;d>f;f++)e.push(b.sentence());return e.join(" ")},sentence:function(a,c){var d;0===arguments.length&&(d=b.natural(12,18)),1===arguments.length&&(d=c=a),2===arguments.length&&(a=parseInt(a,10),c=parseInt(c,10),d=b.natural(a,c));for(var e=[],f=0;d>f;f++)e.push(b.word());return b.capitalize(e.join(" "))+"."},word:function(a,c){var d;0===arguments.length&&(d=b.natural(3,10)),1===arguments.length&&(d=c=a),2===arguments.length&&(a=parseInt(a,10),c=parseInt(c,10),d=b.natural(a,c));for(var e="",f=0;d>f;f++)e+=b.character("lower");return e},title:function(a,c){var d,e=[];0===arguments.length&&(d=b.natural(3,7)),1===arguments.length&&(d=c=a),2===arguments.length&&(a=parseInt(a,10),c=parseInt(c,10),d=b.natural(a,c));for(var f=0;d>f;f++)e.push(this.capitalize(this.word()));return e.join(" ")}}),b.extend({first:function(){var a=["James","John","Robert","Michael","William","David","Richard","Charles","Joseph","Thomas","Christopher","Daniel","Paul","Mark","Donald","George","Kenneth","Steven","Edward","Brian","Ronald","Anthony","Kevin","Jason","Matthew","Gary","Timothy","Jose","Larry","Jeffrey","Frank","Scott","Eric"].concat(["Mary","Patricia","Linda","Barbara","Elizabeth","Jennifer","Maria","Susan","Margaret","Dorothy","Lisa","Nancy","Karen","Betty","Helen","Sandra","Donna","Carol","Ruth","Sharon","Michelle","Laura","Sarah","Kimberly","Deborah","Jessica","Shirley","Cynthia","Angela","Melissa","Brenda","Amy","Anna"]);return this.pick(a)},last:function(){var a=["Smith","Johnson","Williams","Brown","Jones","Miller","Davis","Garcia","Rodriguez","Wilson","Martinez","Anderson","Taylor","Thomas","Hernandez","Moore","Martin","Jackson","Thompson","White","Lopez","Lee","Gonzalez","Harris","Clark","Lewis","Robinson","Walker","Perez","Hall","Young","Allen"];return this.pick(a)},name:function(a){return this.first()+" "+(a?this.first()+" ":"")+this.last()}}),b.extend({url:function(){return"http://"+this.domain()+"/"+this.word()},domain:function(a){return this.word()+"."+(a||this.tld())},email:function(a){return this.character("lower")+"."+this.last().toLowerCase()+"@"+this.last().toLowerCase()+"."+this.tld()},ip:function(){return this.natural(0,255)+"."+this.natural(0,255)+"."+this.natural(0,255)+"."+this.natural(0,255)},tlds:["com","org","edu","gov","co.uk","net","io"],tld:function(){return this.pick(this.tlds)}}),b.extend({areas:["东北","华北","华东","华中","华南","西南","西北"],area:function(){return this.pick(this.areas)},regions:["110000 北京市","120000 天津市","130000 河北省","140000 山西省","150000 内蒙古自治区","210000 辽宁省","220000 吉林省","230000 黑龙江省","310000 上海市","320000 江苏省","330000 浙江省","340000 安徽省","350000 福建省","360000 江西省","370000 山东省","410000 河南省","420000 湖北省","430000 湖南省","440000 广东省","450000 广西壮族自治区","460000 海南省","500000 重庆市","510000 四川省","520000 贵州省","530000 云南省","540000 西藏自治区","610000 陕西省","620000 甘肃省","630000 青海省","640000 宁夏回族自治区","650000 新疆维吾尔自治区","650000 新疆维吾尔自治区","710000 台湾省","810000 香港特别行政区","820000 澳门特别行政区"],region:function(){return this.pick(this.regions).split(" ")[1]},address:function(){},city:function(){},phone:function(){},areacode:function(){},street:function(){},street_suffixes:function(){},street_suffix:function(){},states:function(){},state:function(){},zip:function(a){for(var b="",c=0;(a||6)>c;c++)b+=this.natural(0,9);return b}}),b.extend({todo:function(){return"todo"}}),b.extend({d4:function(){return this.natural(1,4)},d6:function(){return this.natural(1,6)},d8:function(){return this.natural(1,8)},d12:function(){return this.natural(1,12)},d20:function(){return this.natural(1,20)},d100:function(){return this.natural(1,100)},guid:function(){var a="ABCDEF1234567890",b=this.string(a,8)+"-"+this.string(a,4)+"-"+this.string(a,4)+"-"+this.string(a,4)+"-"+this.string(a,12);return b},id:function(){var a,b=0,c=["7","9","10","5","8","4","2","1","6","3","7","9","10","5","8","4","2"],d=["1","0","X","9","8","7","6","5","4","3","2"];a=this.pick(this.regions).split(" ")[0]+this.date("yyyyMMdd")+this.string("number",3);for(var e=0;e<a.length;e++)b+=a[e]*c[e];return a+=d[b%11]}}),b}(),e=/(.+)\|(?:\+(\d+)|(\d+-?\d*)?(?:\.(\d+-?\d*))?)/,f=/(\d+)-?(\d+)?/,g=/\\*@([^@#%&()\?\s\/\.]+)(?:\((.+?)\))?/g;b.extend=c.extend,b.mock=function(a,c){return 1===arguments.length?h.gen(a):(b._mocked[a]={rurl:a,template:c},b)};var h={extend:c.extend};h.gen=function(a,b,g){var i,j=(b=b||"").match(e),k=j&&j[3]&&j[3].match(f),l=k&&parseInt(k[1],10),m=k&&parseInt(k[2],10),n=k?!k[2]&&parseInt(k[1],10)||d.integer(l,m):1,o=j&&j[4]&&j[4].match(f),p=o&&parseInt(o[1],10),q=o&&parseInt(o[2],10),r=o?!o[2]&&parseInt(o[1],10)||d.integer(p,q):0,s=j&&j[4],t=c.type(a);return h[t]?i=h[t]({type:t,template:a,name:b,obj:g,parameters:j,range:k,min:l,max:m,count:n,decimal:o,dmin:p,dmax:q,dcount:r,point:s}):a},h.extend({array:function(a){var b,c,e=[];if(a.parameters)if(1===a.count&&a.template.length>1)e=d.pick(h.gen(a.template));else for(b=0;b<a.count;b++){c=0;do e.push(h.gen(a.template[c++]));while(c<a.template.length)}else for(b=0;b<a.template.length;b++)e.push(h.gen(a.template[b]));return e},object:function(a){var b,d,f={};for(b in a.template)f[b.replace(e,"$1")]=h.gen(a.template[b],b,f),d=b.match(e),d&&d[2]&&"number"===c.type(a.template[b])&&(a.template[b]+=parseInt(d[2],10));return f},number:function(a){var b,c,e;if(a.point){for(a.template+="",c=a.template.split("."),c[0]=a.range?a.count:c[0],c[1]=(c[1]||"").slice(0,a.dcount),e=0;c[1].length<a.dcount;e++)c[1]+=d.character("number");b=parseFloat(c.join("."),10)}else b=a.range&&!a.parameters[2]?a.count:a.template;return b},"boolean":function(a){var b;return b=a.parameters?d.bool(a.min,a.max,a.template):a.template},string:function(a){var b,e,f,i,j="";if(a.template.length){for(b=0;b<a.count;b++)j+=a.template;for(e=j.match(g)||[],b=0;b<e.length;b++)if(f=e[b],/^\\/.test(f))e.splice(b--,1);else{if(i=h.placeholder(f,a.obj),1===e.length&&f===j){if(c.isNumeric(i)){j=parseFloat(i,10);break}if(/^(true|false)$/.test(i)){j="true"===i?!0:"false"===i?!1:i;break}}j=j.replace(f,i)}}else j=a.range?d.string(a.count):a.template;return j}}),h.extend({_all:function(){var a={};for(var b in d)a[b.toLowerCase()]=b;return a},placeholder:function(b,e){g.exec("");var f=g.exec(b),i=f&&f[1],j=i&&i.toLowerCase(),k=this._all()[j],l=f&&f[2]?f[2].split(/,\s*/):[];if(e&&i in e)return e[i];if(!(i in d||j in d||k in d))return b;for(var m=0;m<l.length;m++)g.exec(""),g.test(l[m])&&(l[m]=h.placeholder(l[m],e));var n=d[i]||d[j]||d[k];switch(c.type(n)){case"array":return d.pick(n);case"function":var o=n.apply(d,l);return o===a&&(o=""),o}}}),b.mockjax=function(a){function c(){return{open:a.noop,send:a.noop,getAllResponseHeaders:a.noop,readyState:4,status:200}}function d(a){return function(){return b.mock(a.template)}}function e(e){for(var f in b._mocked){var g=b._mocked[f];if(("string"!==a.type(g.rurl)||g.rurl===e.url)&&("regexp"!==a.type(g.rurl)||g.rurl.test(e.url))){e.dataFilter=d(g),e.converters["text json"]=d(g),e.xhr=c;break}}}return a.ajaxPrefilter("*",e),a.ajaxPrefilter("json",e),a.ajaxPrefilter("jsonp",e),b},"undefined"!=typeof jQuery&&b.mockjax(jQuery),"undefined"!=typeof KISSY&&KISSY.add&&(b.mockjax=function(a){var c=a.io,d={readyState:4,responseText:"",responseXML:null,state:2,status:200,statusText:"success",timeoutTimer:null};a.io=function(e){for(var f in b._mocked){var g=b._mocked[f];if(("string"!==a.type(g.rurl)||g.rurl===e.url)&&("regexp"!==a.type(g.rurl)||g.rurl.test(e.url))){console.log("[mock]",e.url,">",g.rurl);var h=b.mock(g.template);return console.log("[mock]",h),e.success&&e.success(h,"success",d),e.complete&&e.complete(h,"success",d),a}}return c.apply(this,arguments)}}),b.Util=c,b.Random=d,b.heredoc=c.heredoc,"object"==typeof module&&module.exports?module.exports=b:"function"==typeof define&&define.amd?define(function(){return b}):"function"==typeof define&&define.cmd&&define(function(){return b}),this.Mock=b,this.Random=d,"undefined"!=typeof KISSY&&c.each(["mock","components/mock/index","mock/dist/mock"],function(a){KISSY.add(a,function(a){return b.mockjax(a),b},{requires:["ajax"]})}),function(a){var e={version:"0.0.1"};this.Mock||(module.exports=e),b.tpl=function(a,b,c,d){return e.mock(a,b,c,d)},b.parse=function(a){return Handlebars.parse(a)},e.mock=function(a,b,d,e){return d=d?c.extend({},d,Handlebars.helpers):Handlebars.helpers,e=e?c.extend({},e,Handlebars.partials):Handlebars.partials,f.gen(a,null,b,d,e)};var f={debug:e.debug||!1,extend:c.extend};f.gen=function(a,b,d,g,h){if(c.isString(a)){var i=Handlebars.parse(a);d=f.parseOptions(a,d);var j=f.gen(i,b,d,g,h);return j}if(b=b||[{}],d=d||{},this[a.type]!==c.noop){d.__path=d.__path||[],(e.debug||f.debug)&&(console.log(),console.group("["+a.type+"]",JSON.stringify(a)),console.log("[options]",d.__path.length,JSON.stringify(d)));var k=d.__path.length;return this[a.type](a,b,d,g,h),d.__path.splice(k),(e.debug||f.debug)&&console.groupEnd(),b[b.length-1]}},f.parseOptions=function(a,b){var d,e,f,g=/<!--\s*\n*Mock\s*\n*([\w\W]+?)\s*\n*-->/g,h=a.match(g),i={};for(d=0;h&&d<h.length;d++)g.lastIndex=0,e=g.exec(h[d]),e&&(f=new Function("return "+e[1]),f=f(),c.extend(i,f));return c.extend(i,b)},f.val=function(g,h,i,j){if(g!==h.__path[h.__path.length-1])throw new Error(g+"!=="+h.__path);if((e.debug||f.debug)&&console.log("[options]",g,h.__path),j!==a&&(j=b.mock(j)),h){var k=b.mock(h);if(c.isString(k))return k;if(g in k)return k[g]}return c.isArray(i[0])?{}:j!==a?j:g||d.word()},f.program=function(a,b,c,d,e){for(var f=0;f<a.statements.length;f++)this.gen(a.statements[f],b,c,d,e)},f.mustache=function(a,b,d,e,f){var g,h=b[0],i=b.length;if("array"===c.type(h)&&(h.push({}),h=h[h.length-1],b.unshift(h)),a.isHelper||e&&e[a.id.string]){if(0===a.params.length);else for(g=0;g<a.params.length;g++)this.gen(a.params[g],b,d,e,f);a.hash&&this.gen(a.hash,b,d,e,f)}else this.gen(a.id,b,d,e,f);b.length>i&&b.splice(0,b.length-i)},f.block=function(a,b,e,f,h){var i,j,k,l,m,n=a.mustache.id.parts,o=b[0],p=b.length;if(a.inverse,a.mustache.isHelper||f&&f[a.mustache.id.string])m=n[0],l=(g[m]||g.custom).apply(this,arguments),o=b[0];else for(i=0;i<n.length;i++)e.__path.push(n[i]),k=n[i],l=this.val(k,e,b,{}),o[k]=c.isArray(l)&&[]||l,m=c.type(o[k]),("object"===m||"array"===m)&&(o=o[k],b.unshift(o));if(a.program)if("array"===c.type(o))for(j=l.length||d.integer(3,7),i=0;j>i;i++)o.push("undefined"!=typeof l[i]?l[i]:{}),e.__path.push("[]"),b.unshift(o[o.length-1]),this.gen(a.program,b,e,f,h),e.__path.pop(),b.shift();else this.gen(a.program,b,e,f,h);b.length>p&&b.splice(0,b.length-p)},f.hash=function(a,b,c,d,e){var f,g,h,i=a.pairs;for(g=0;g<i.length;g++)for(f=i[g],h=1;h<f.length;h++)this.gen(f[h],b,c,d,e)},f.ID=function(a,b,d){var e,f,g,h,i,j,k,l,m,n=a.parts,o=b[a.depth],p=b.length;if(c.isArray(o)&&(o=b[a.depth+1]),n.length)for(e=0,f=n.length;f>e;e++)d.__path.push(n[e]),g=n[e],h=n[e-1],m=d[h],i=e===f-1?o[g]:{},j=this.val(g,d,b,i),k=c.type(o[g]),l=c.type(j),"undefined"===k?o[g]=f-1>e&&"object"!==l&&"array"!==l?{}:c.isArray(j)&&[]||j:f-1>e&&"object"!==k&&"array"!==k&&(o[g]=c.isArray(j)&&[]||{}),k=c.type(o[g]),("object"===k||"array"===k)&&(o=o[g],b.unshift(o));else;b.length>p&&b.splice(0,b.length-p)},f.partial=function(a,b,c,d,e){var g=a.partialName.name,h=e&&e[g],i=b.length;h&&f.gen(h,b,c,d,e),b.length>i&&b.splice(0,b.length-i)},f.content=c.noop,f.PARTIAL_NAME=c.noop,f.DATA=c.noop,f.STRING=c.noop,f.INTEGER=c.noop,f.BOOLEAN=c.noop,f.comment=c.noop;var g={};g.each=function(a,b,d){var e,f,g,h,i,j,k,l=b[0];for(i=a.mustache.params[0].parts,e=0,f=i.length;f>e;e++)d.__path.push(i[e]),g=i[e],j=e===f-1?[]:{},h=this.val(g,d,b,j),l[g]=c.isArray(h)&&[]||h,k=c.type(l[g]),("object"===k||"array"===k)&&(l=l[g],b.unshift(l));return h},g["if"]=g.unless=function(a,b,d){var e,f,g,h,i,j,k=a.mustache.params,l=b[0];for(e=0;e<k.length;e++)for(parts=k[e].parts,f=0;f<parts.length;f++)0===e&&d.__path.push(parts[f]),g=parts[f],i=f===parts.length-1?"@BOOL(2,1,true)":{},h=this.val(g,d,b,i),f===parts.length-1&&(h="true"===h?!0:"false"===h?!1:h),l[g]=c.isArray(h)?[]:h,j=c.type(l[g]),("object"===j||"array"===j)&&(l=l[g],b.unshift(l));return h},g["with"]=function(a,b,c){var d,e,f,g,h,i=b[0];for(g=a.mustache.params[0].parts,d=0;d<g.length;d++)c.__path.push(g[d]),e=g[d],h={},f=this.val(e,c,b,h),i=i[e]=f,b.unshift(i);return f},g.log=function(){},g.custom=function(a,b,d){var e,f,g,h,i,j,k,l=b[0];if(0!==a.mustache.params.length){for(i=a.mustache.params[0].parts,e=0,f=i.length;f>e;e++)d.__path.push(i[e]),g=i[e],j=e===f-1?[]:{},h=this.val(g,d,b,j),l[g]=c.isArray(h)&&[]||h,k=c.type(l[g]),("object"===k||"array"===k)&&(l=l[g],b.unshift(l));return h}}}.call(this),function(a){if("undefined"!=typeof KISSY){var e,f={debug:!1};KISSY.use("xtemplate",function(a,b){e=b}),this.Mock||(module.exports=f),b.xtpl=function(a,b,c,d){return f.mock(a,b,c,d)},b.xparse=function(a){return e.compiler.parse(a)},f.mock=function(a,b,d,f){return d=d?c.extend({},d,e.RunTime.commands):e.RunTime.commands,f=f?c.extend({},f,e.RunTime.subTpls):e.RunTime.subTpls,this.gen(a,null,b,d,f,{})},f.parse=function(a){return e.compiler.parse(a)},f.gen=function(a,b,d,e,g,h){if("string"==typeof a){f.debug&&console.log("[tpl ]\n",a);var i=this.parse(a);d=this.parseOptions(a,d);var j=this.gen(i,b,d,e,g,h);return j}if(b=b||[{}],d=d||{},this[a.type]!==c.noop){d.__path=d.__path||[],f.debug&&(console.log(),console.group("["+a.type+"]",JSON.stringify(a)),console.log("[context]","[before]",b.length,JSON.stringify(b)),console.log("[options]","[before]",d.__path.length,JSON.stringify(d)),console.log("[other ]","[before]",JSON.stringify(h)));var k=d.__path.length;return this[a.type](a,b,d,e,g,h),f.debug&&console.log("[__path ]","[after ]",d.__path),(!h.hold||"function"==typeof h.hold&&!h.hold(a,d,b))&&d.__path.splice(k),f.debug&&(console.log("[context]","[after ]",b.length,JSON.stringify(b)),console.groupEnd()),b[b.length-1]}},f.parseOptions=function(a,b){var d,e,f,g=/<!--\s*\n*Mock\s*\n*([\w\W]+?)\s*\n*-->/g,h=a.match(g),i={};for(d=0;h&&d<h.length;d++)g.lastIndex=0,e=g.exec(h[d]),e&&(f=new Function("return "+e[1]),f=f(),c.extend(i,f));return c.extend(i,b)},f.parseVal=function(a,b){function d(a,b){if("object"==typeof b&&a in b)return[b[a]];for(var c=[],d=0;d<b.length;d++)c.push.apply(c,f(a,[b[d]]));return c}function e(a,b){if("object"==typeof b&&a in b)return[b[a]];var c=[];for(var d in b)c.push.apply(c,f(a,[b[d]]));return c}function f(a,b){for(var f=[],g=0;g<b.length;g++)"object"==typeof b[g]&&(a in b[g]?f.push(b[g][a]):f.push.apply(f,c.isArray(b[g])?d(a,b[g]):e(a,b[g])));return f}function g(a,b){for(var c="string"==typeof a?a.split("."):a.slice(0),d=[b];c.length;)d=f(c.shift(),d);return d}return g(a,b)},f.val=function(d,e,g,h){if(d!==e.__path[e.__path.length-1])throw new Error(d+"!=="+e.__path);if(h!==a&&(h=b.mock(h)),e){var i=b.mock(e);if(c.isString(i))return i;var j=f.parseVal(e.__path,i);if(j.length>0)return j[0];if(d in i)return i[d]}return c.isArray(g[0])?{}:h!==a?h:d},f.program=function(a,b,c,d,e,f){for(var g=0;g<a.statements.length;g++)this.gen(a.statements[g],b,c,d,e,f);for(var h=0;a.inverse&&h<a.inverse.length;h++)this.gen(a.inverse[h],b,c,d,e,f)},f.block=function(b,e,f,g,h,i){var j=e.length;this.gen(b.tpl,e,f,g,h,c.extend({},i,{def:{},hold:!0}));var k,l,m,n=e[0];if("array"===c.type(n))for(k=this.val(f.__path[f.__path.length-1],f,e),m=k&&k.length||d.integer(3,7),l=0;m>l;l++)n.push(k&&k[l]!==a?k[l]:{}),f.__path.push(l),e.unshift(n[n.length-1]),this.gen(b.program,e,f,g,h,i),f.__path.pop(),e.shift();else this.gen(b.program,e,f,g,h,i);(!i.hold||"function"==typeof i.hold&&!i.hold(b,f,e))&&e.splice(0,e.length-j)},f.tpl=function(a,b,d,e,f,g){if(a.params&&a.params.length){g=c.extend({},g,{def:{each:[],"if":"@BOOL(2,1,true)",unless:"@BOOL(2,1,false)","with":{}}[a.path.string],hold:{each:!0,"if":function(a,b,c,d,e){return"object"==typeof e},unless:function(a,b,c,d,e){return"object"==typeof e},"with":!0,include:!1}[a.path.string]});for(var h,i=0;i<a.params.length;i++)h="include"===a.path.string?f&&f[a.params[i].value]:a.params[i],h&&this.gen(h,b,d,e,f,g);a.hash&&this.gen(a.hash,b,d,e,f,g)}else this.gen(a.path,b,d,e,f,g)},f.tplExpression=function(a,b,c,d,e,f){this.gen(a.expression,b,c,d,e,f)},f.content=c.noop,f.unaryExpression=c.noop,f.multiplicativeExpression=f.additiveExpression=function(b,e,f,g,h,i){this.gen(b.op1,e,f,g,h,c.extend({},i,{def:function(){return"number"===b.op2.type?b.op2.value.indexOf(".")>-1?d.float(-Math.pow(10,10),Math.pow(10,10),1,Math.pow(10,6)):d.integer():a}()})),this.gen(b.op2,e,f,g,h,c.extend({},i,{def:function(){return"number"===b.op1.type?b.op1.value.indexOf(".")>-1?d.float(-Math.pow(10,10),Math.pow(10,10),1,Math.pow(10,6)):d.integer():a}()}))},f.relationalExpression=function(a,b,c,d,e,f){this.gen(a.op1,b,c,d,e,f),this.gen(a.op2,b,c,d,e,f)},f.equalityExpression=c.noop,f.conditionalAndExpression=c.noop,f.conditionalOrExpression=c.noop,f.string=c.noop,f.number=c.noop,f.boolean=c.noop,f.hash=function(a,b,c,d,e,f){var g,h=a.value;for(g in h)this.gen(h[g],b,c,d,e,f)},f.id=function(b,d,e,g,h,i){function j(a,b,d,e,f){var g=c.type(a[e]),h=c.type(f);return f="true"===f?!0:"false"===f?!1:f,"undefined"===g?a[e]=d-1>b&&!c.isObjectOrArray(f)?{}:c.isArray(f)&&[]||f:d-1>b&&"object"!==g&&"array"!==g?a[e]=c.isArray(f)&&[]||{}:"object"!==g&&"array"!==g&&"object"!==h&&"array"!==h&&(a[e]=f),a[e]}var k,l,m,n,o,p=d.length,q=b.parts,r=d[b.depth];for(c.isArray(r)&&(r=d[b.depth+1]),k=0,l=q.length;l>k;k++)(0!==k||"this"!==q[k])&&(/^(xindex|xcount|xkey)$/.test(q[k])||0===k&&1===l&&q[k]in g||(e.__path.push(q[k]),m=q[k],n=k===l-1?i.def!==a?i.def:d[0][m]:{},o=this.val(m,e,d,n),f.debug&&(console.log("[def ]",JSON.stringify(n)),console.log("[val ]",JSON.stringify(o))),o=j(r,k,l,m,o),c.isObjectOrArray(r[m])&&d.unshift(r=r[m])));(!i.hold||"function"==typeof i.hold&&!i.hold(b,e,d,m,o))&&d.splice(0,d.length-p)}}}.call(this)}).call(this);
/*! mockjs 13-05-2014 19:33:58 */
(function(undefined){var Mock={version:"0.1.2",_mocked:{}},Util=function(){var a={};return a.extend=function(){var b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length;for(1===i&&(g=this,h=0);i>h;h++)if(b=arguments[h])for(c in b)d=g[c],e=b[c],g!==e&&e!==undefined&&(a.isArray(e)||a.isObject(e)?(a.isArray(e)&&(f=d&&a.isArray(d)?d:[]),a.isObject(e)&&(f=d&&a.isObject(d)?d:{}),g[c]=a.extend(f,e)):g[c]=e);return g},a.each=function(a,b,c){var d,e;if("number"===this.type(a))for(d=0;a>d;d++)b(d,d);else if(a.length===+a.length)for(d=0;d<a.length&&b.call(c,a[d],d,a)!==!1;d++);else for(e in a)if(b.call(c,a[e],e,a)===!1)break},a.type=function(a){return null===a||a===undefined?String(a):Object.prototype.toString.call(a).match(/\[object (\w+)\]/)[1].toLowerCase()},a.each("String Object Array RegExp Function".split(" "),function(b){a["is"+b]=function(c){return a.type(c)===b.toLowerCase()}}),a.isObjectOrArray=function(b){return a.isObject(b)||a.isArray(b)},a.isNumeric=function(a){return!isNaN(parseFloat(a))&&isFinite(a)},a.keys=function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},a.values=function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(a[c]);return b},a.heredoc=function(a){return a.toString().replace(/^[^\/]+\/\*!?/,"").replace(/\*\/[^\/]+$/,"").replace(/^[\s\xA0]+/,"").replace(/[\s\xA0]+$/,"")},a.noop=function(){},a}(),Random=function(){var a={extend:Util.extend};return a.extend({"boolean":function(a,b,c){return c!==undefined?(a="undefined"==typeof a||isNaN(a)?1:parseInt(a,10),b="undefined"==typeof b||isNaN(b)?1:parseInt(b,10),Math.random()>1/(a+b)*a?!c:c):Math.random()>=.5},bool:function(a,b,c){return this.boolean(a,b,c)},natural:function(a,b){return a="undefined"!=typeof a?parseInt(a,10):0,b="undefined"!=typeof b?parseInt(b,10):9007199254740992,Math.round(Math.random()*(b-a))+a},integer:function(a,b){return a="undefined"!=typeof a?parseInt(a,10):-9007199254740992,b="undefined"!=typeof b?parseInt(b,10):9007199254740992,Math.round(Math.random()*(b-a))+a},"int":function(a,b){return this.integer(a,b)},"float":function(a,b,c,d){c=c===undefined?0:c,c=Math.max(Math.min(c,17),0),d=d===undefined?17:d,d=Math.max(Math.min(d,17),0);for(var e=this.integer(a,b)+".",f=0,g=this.natural(c,d);g>f;f++)e+=this.character("number");return parseFloat(e,10)},character:function(b){var c={lower:"abcdefghijklmnopqrstuvwxyz",upper:"ABCDEFGHIJKLMNOPQRSTUVWXYZ",number:"0123456789",symbol:"!@#$%^&*()[]"};return c.alpha=c.lower+c.upper,c.undefined=c.lower+c.upper+c.number+c.symbol,b=c[(""+b).toLowerCase()]||b,b.charAt(a.natural(0,b.length-1))},"char":function(a){return this.character(a)},string:function(b,c,d){var e;3===arguments.length&&(e=a.natural(c,d)),2===arguments.length&&("string"==typeof arguments[0]?e=c:(e=a.natural(b,c),b=undefined)),1===arguments.length&&(e=b,b=undefined),0===arguments.length&&(e=a.natural(3,7));for(var f="",g=0;e>g;g++)f+=a.character(b);return f},str:function(a,b,c){return this.string(a,b,c)},range:function(a,b,c){arguments.length<=1&&(b=a||0,a=0),c=arguments[2]||1,a=+a,b=+b,c=+c;for(var d=Math.max(Math.ceil((b-a)/c),0),e=0,f=new Array(d);d>e;)f[e++]=a,a+=c;return f}}),a.extend({patternLetters:{yyyy:"getFullYear",yy:function(a){return(""+a.getFullYear()).slice(2)},y:"yy",MM:function(a){var b=a.getMonth()+1;return 10>b?"0"+b:b},M:function(a){return a.getMonth()+1},dd:function(a){var b=a.getDate();return 10>b?"0"+b:b},d:"getDate",HH:function(a){var b=a.getHours();return 10>b?"0"+b:b},H:"getHours",hh:function(a){var b=a.getHours()%12;return 10>b?"0"+b:b},h:function(a){return a.getHours()%12},mm:function(a){var b=a.getMinutes();return 10>b?"0"+b:b},m:"getMinutes",ss:function(a){var b=a.getSeconds();return 10>b?"0"+b:b},s:"getSeconds",SS:function(a){var b=a.getMilliseconds();return 10>b&&"00"+b||100>b&&"0"+b||b},S:"getMilliseconds",A:function(a){return a.getHours()<12?"AM":"PM"},a:function(a){return a.getHours()<12?"am":"pm"},T:"getTime"}}),a.extend({rformat:new RegExp(function(){var b=[];for(var c in a.patternLetters)b.push(c);return"("+b.join("|")+")"}(),"g"),format:function(b,c){var d=a.patternLetters,e=a.rformat;return c.replace(e,function(a,c){return"function"==typeof d[c]?d[c](b):d[c]in d?arguments.callee(a,d[c]):b[d[c]]()})},randomDate:function(a,b){return a=a===undefined?new Date(0):a,b=b===undefined?new Date:b,new Date(Math.random()*(b.getTime()-a.getTime()))},date:function(a){return a=a||"yyyy-MM-dd",this.format(this.randomDate(),a)},time:function(a){return a=a||"HH:mm:ss",this.format(this.randomDate(),a)},datetime:function(a){return a=a||"yyyy-MM-dd HH:mm:ss",this.format(this.randomDate(),a)},now:function(a,b){1===arguments.length&&(/year|month|week|day|hour|minute|second|week/.test(a)||(b=a,a="")),a=(a||"").toLowerCase(),b=b||"yyyy-MM-dd HH:mm:ss";var c=new Date;switch(a){case"year":c.setMonth(0);case"month":c.setDate(1);case"week":case"day":c.setHours(0);case"hour":c.setMinutes(0);case"minute":c.setSeconds(0);case"second":c.setMilliseconds(0)}switch(a){case"week":c.setDate(c.getDate()-c.getDay())}return this.format(c,b)}}),a.extend({ad_size:["300x250","250x250","240x400","336x280","180x150","720x300","468x60","234x60","88x31","120x90","120x60","120x240","125x125","728x90","160x600","120x600","300x600"],screen_size:["320x200","320x240","640x480","800x480","800x480","1024x600","1024x768","1280x800","1440x900","1920x1200","2560x1600"],video_size:["720x480","768x576","1280x720","1920x1080"],image:function(a,b,c,d,e){return 4===arguments.length&&(e=d,d=undefined),3===arguments.length&&(e=c,c=undefined),a||(a=this.pick(this.ad_size)),b&&~b.indexOf("#")&&(b=b.slice(1)),c&&~c.indexOf("#")&&(c=c.slice(1)),"http://dummyimage.com/"+a+(b?"/"+b:"")+(c?"/"+c:"")+(d?"."+d:"")+(e?"&text="+e:"")},img:function(){return this.image.apply(this,arguments)}}),a.extend({brandColors:{"4ormat":"#fb0a2a","500px":"#02adea","About.me (blue)":"#00405d","About.me (yellow)":"#ffcc33",Addvocate:"#ff6138",Adobe:"#ff0000",Aim:"#fcd20b",Amazon:"#e47911",Android:"#a4c639","Angie's List":"#7fbb00",AOL:"#0060a3",Atlassian:"#003366",Behance:"#053eff","Big Cartel":"#97b538",bitly:"#ee6123",Blogger:"#fc4f08",Boeing:"#0039a6","Booking.com":"#003580",Carbonmade:"#613854",Cheddar:"#ff7243","Code School":"#3d4944",Delicious:"#205cc0",Dell:"#3287c1",Designmoo:"#e54a4f",Deviantart:"#4e6252","Designer News":"#2d72da",Devour:"#fd0001",DEWALT:"#febd17","Disqus (blue)":"#59a3fc","Disqus (orange)":"#db7132",Dribbble:"#ea4c89",Dropbox:"#3d9ae8",Drupal:"#0c76ab",Dunked:"#2a323a",eBay:"#89c507",Ember:"#f05e1b",Engadget:"#00bdf6",Envato:"#528036",Etsy:"#eb6d20",Evernote:"#5ba525","Fab.com":"#dd0017",Facebook:"#3b5998",Firefox:"#e66000","Flickr (blue)":"#0063dc","Flickr (pink)":"#ff0084",Forrst:"#5b9a68",Foursquare:"#25a0ca",Garmin:"#007cc3",GetGlue:"#2d75a2",Gimmebar:"#f70078",GitHub:"#171515","Google Blue":"#0140ca","Google Green":"#16a61e","Google Red":"#dd1812","Google Yellow":"#fcca03","Google+":"#dd4b39",Grooveshark:"#f77f00",Groupon:"#82b548","Hacker News":"#ff6600",HelloWallet:"#0085ca","Heroku (light)":"#c7c5e6","Heroku (dark)":"#6567a5",HootSuite:"#003366",Houzz:"#73ba37",HTML5:"#ec6231",IKEA:"#ffcc33",IMDb:"#f3ce13",Instagram:"#3f729b",Intel:"#0071c5",Intuit:"#365ebf",Kickstarter:"#76cc1e",kippt:"#e03500",Kodery:"#00af81",LastFM:"#c3000d",LinkedIn:"#0e76a8",Livestream:"#cf0005",Lumo:"#576396",Mixpanel:"#a086d3",Meetup:"#e51937",Nokia:"#183693",NVIDIA:"#76b900",Opera:"#cc0f16",Path:"#e41f11","PayPal (dark)":"#1e477a","PayPal (light)":"#3b7bbf",Pinboard:"#0000e6",Pinterest:"#c8232c",PlayStation:"#665cbe",Pocket:"#ee4056",Prezi:"#318bff",Pusha:"#0f71b4",Quora:"#a82400","QUOTE.fm":"#66ceff",Rdio:"#008fd5",Readability:"#9c0000","Red Hat":"#cc0000",Resource:"#7eb400",Rockpack:"#0ba6ab",Roon:"#62b0d9",RSS:"#ee802f",Salesforce:"#1798c1",Samsung:"#0c4da2",Shopify:"#96bf48",Skype:"#00aff0",Snagajob:"#f47a20",Softonic:"#008ace",SoundCloud:"#ff7700","Space Box":"#f86960",Spotify:"#81b71a",Sprint:"#fee100",Squarespace:"#121212",StackOverflow:"#ef8236",Staples:"#cc0000","Status Chart":"#d7584f",Stripe:"#008cdd",StudyBlue:"#00afe1",StumbleUpon:"#f74425","T-Mobile":"#ea0a8e",Technorati:"#40a800","The Next Web":"#ef4423",Treehouse:"#5cb868",Trulia:"#5eab1f",Tumblr:"#34526f","Twitch.tv":"#6441a5",Twitter:"#00acee",TYPO3:"#ff8700",Ubuntu:"#dd4814",Ustream:"#3388ff",Verizon:"#ef1d1d",Vimeo:"#86c9ef",Vine:"#00a478",Virb:"#06afd8","Virgin Media":"#cc0000",Wooga:"#5b009c","WordPress (blue)":"#21759b","WordPress (orange)":"#d54e21","WordPress (grey)":"#464646",Wunderlist:"#2b88d9",XBOX:"#9bc848",XING:"#126567","Yahoo!":"#720e9e",Yandex:"#ffcc00",Yelp:"#c41200",YouTube:"#c4302b",Zalongo:"#5498dc",Zendesk:"#78a300",Zerply:"#9dcc7a",Zootool:"#5e8b1d"},brands:function(){var a=[];for(var b in this.brandColors)a.push(b);return a},dataImage:function(a,b){var c="undefined"!=typeof document&&document.createElement("canvas"),d=c&&c.getContext&&c.getContext("2d");if(!c||!d)return"";a||(a=this.pick(this.ad_size)),b=b!==undefined?b:a,a=a.split("x");var e=parseInt(a[0],10),f=parseInt(a[1],10),g=this.brandColors[this.pick(this.brands())],h="#FFF",i=14,j="sans-serif";return c.width=e,c.height=f,d.textAlign="center",d.textBaseline="middle",d.fillStyle=g,d.fillRect(0,0,e,f),d.fillStyle=h,d.font="bold "+i+"px "+j,d.fillText(b,e/2,f/2,e),c.toDataURL("image/png")}}),a.extend({color:function(){var a=Math.floor(16777215*Math.random()).toString(16);return a="#"+("000000"+a).slice(-6)}}),a.extend({capitalize:function(a){return(a+"").charAt(0).toUpperCase()+(a+"").substr(1)},upper:function(a){return(a+"").toUpperCase()},lower:function(a){return(a+"").toLowerCase()},pick:function(a){return a=a||[],a[this.natural(0,a.length-1)]},shuffle:function(a){a=a||[];for(var b=a.slice(0),c=[],d=0,e=b.length,f=0;e>f;f++)d=this.natural(0,b.length-1),c.push(b[d]),b.splice(d,1);return c}}),a.extend({paragraph:function(b,c){var d;0===arguments.length&&(d=a.natural(3,7)),1===arguments.length&&(d=c=b),2===arguments.length&&(b=parseInt(b,10),c=parseInt(c,10),d=a.natural(b,c));for(var e=[],f=0;d>f;f++)e.push(a.sentence());return e.join(" ")},sentence:function(b,c){var d;0===arguments.length&&(d=a.natural(12,18)),1===arguments.length&&(d=c=b),2===arguments.length&&(b=parseInt(b,10),c=parseInt(c,10),d=a.natural(b,c));for(var e=[],f=0;d>f;f++)e.push(a.word());return a.capitalize(e.join(" "))+"."},word:function(b,c){var d;0===arguments.length&&(d=a.natural(3,10)),1===arguments.length&&(d=c=b),2===arguments.length&&(b=parseInt(b,10),c=parseInt(c,10),d=a.natural(b,c));for(var e="",f=0;d>f;f++)e+=a.character("lower");return e},title:function(b,c){var d,e=[];0===arguments.length&&(d=a.natural(3,7)),1===arguments.length&&(d=c=b),2===arguments.length&&(b=parseInt(b,10),c=parseInt(c,10),d=a.natural(b,c));for(var f=0;d>f;f++)e.push(this.capitalize(this.word()));return e.join(" ")}}),a.extend({first:function(){var a=["James","John","Robert","Michael","William","David","Richard","Charles","Joseph","Thomas","Christopher","Daniel","Paul","Mark","Donald","George","Kenneth","Steven","Edward","Brian","Ronald","Anthony","Kevin","Jason","Matthew","Gary","Timothy","Jose","Larry","Jeffrey","Frank","Scott","Eric"].concat(["Mary","Patricia","Linda","Barbara","Elizabeth","Jennifer","Maria","Susan","Margaret","Dorothy","Lisa","Nancy","Karen","Betty","Helen","Sandra","Donna","Carol","Ruth","Sharon","Michelle","Laura","Sarah","Kimberly","Deborah","Jessica","Shirley","Cynthia","Angela","Melissa","Brenda","Amy","Anna"]);return this.pick(a)},last:function(){var a=["Smith","Johnson","Williams","Brown","Jones","Miller","Davis","Garcia","Rodriguez","Wilson","Martinez","Anderson","Taylor","Thomas","Hernandez","Moore","Martin","Jackson","Thompson","White","Lopez","Lee","Gonzalez","Harris","Clark","Lewis","Robinson","Walker","Perez","Hall","Young","Allen"];return this.pick(a)},name:function(a){return this.first()+" "+(a?this.first()+" ":"")+this.last()}}),a.extend({url:function(){return"http://"+this.domain()+"/"+this.word()},domain:function(a){return this.word()+"."+(a||this.tld())},email:function(a){return this.character("lower")+"."+this.last().toLowerCase()+"@"+this.last().toLowerCase()+"."+this.tld()},ip:function(){return this.natural(0,255)+"."+this.natural(0,255)+"."+this.natural(0,255)+"."+this.natural(0,255)},tlds:["com","org","edu","gov","co.uk","net","io"],tld:function(){return this.pick(this.tlds)}}),a.extend({areas:["东北","华北","华东","华中","华南","西南","西北"],area:function(){return this.pick(this.areas)},regions:["110000 北京市","120000 天津市","130000 河北省","140000 山西省","150000 内蒙古自治区","210000 辽宁省","220000 吉林省","230000 黑龙江省","310000 上海市","320000 江苏省","330000 浙江省","340000 安徽省","350000 福建省","360000 江西省","370000 山东省","410000 河南省","420000 湖北省","430000 湖南省","440000 广东省","450000 广西壮族自治区","460000 海南省","500000 重庆市","510000 四川省","520000 贵州省","530000 云南省","540000 西藏自治区","610000 陕西省","620000 甘肃省","630000 青海省","640000 宁夏回族自治区","650000 新疆维吾尔自治区","650000 新疆维吾尔自治区","710000 台湾省","810000 香港特别行政区","820000 澳门特别行政区"],region:function(){return this.pick(this.regions).split(" ")[1]},address:function(){},city:function(){},phone:function(){},areacode:function(){},street:function(){},street_suffixes:function(){},street_suffix:function(){},states:function(){},state:function(){},zip:function(a){for(var b="",c=0;(a||6)>c;c++)b+=this.natural(0,9);return b}}),a.extend({todo:function(){return"todo"}}),a.extend({d4:function(){return this.natural(1,4)},d6:function(){return this.natural(1,6)},d8:function(){return this.natural(1,8)},d12:function(){return this.natural(1,12)},d20:function(){return this.natural(1,20)},d100:function(){return this.natural(1,100)},guid:function(){var a="ABCDEF1234567890",b=this.string(a,8)+"-"+this.string(a,4)+"-"+this.string(a,4)+"-"+this.string(a,4)+"-"+this.string(a,12);return b},id:function(){var a,b=0,c=["7","9","10","5","8","4","2","1","6","3","7","9","10","5","8","4","2"],d=["1","0","X","9","8","7","6","5","4","3","2"];a=this.pick(this.regions).split(" ")[0]+this.date("yyyyMMdd")+this.string("number",3);for(var e=0;e<a.length;e++)b+=a[e]*c[e];return a+=d[b%11]},autoIncrementInteger:0,increment:function(a){return this.autoIncrementInteger+=+a||1},inc:function(a){return this.increment(a)}}),a}(),rkey=/(.+)\|(?:\+(\d+)|(\d+-?\d*)?(?:\.(\d+-?\d*))?)/,rrange=/(\d+)-?(\d+)?/,rplaceholder=/\\*@([^@#%&()\?\s\/\.]+)(?:\((.*?)\))?/g;Mock.extend=Util.extend,Mock.mock=function(a,b,c){return 1===arguments.length?Handle.gen(a):(2===arguments.length&&(c=b,b=undefined),Mock._mocked[a+(b||"")]={rurl:a,rtype:b,template:c},Mock)};var Handle={extend:Util.extend};Handle.rule=function(a){a=(a||"")+"";var b=(a||"").match(rkey),c=b&&b[3]&&b[3].match(rrange),d=c&&parseInt(c[1],10),e=c&&parseInt(c[2],10),f=c?!c[2]&&parseInt(c[1],10)||Random.integer(d,e):1,g=b&&b[4]&&b[4].match(rrange),h=g&&parseInt(g[1],10),i=g&&parseInt(g[2],10),j=g?!g[2]&&parseInt(g[1],10)||Random.integer(h,i):0,k=b&&b[4];return{parameters:b,range:c,min:d,max:e,count:f,decimal:g,dmin:h,dmax:i,dcount:j,point:k}},Handle.gen=function(a,b,c){b=b=(b||"")+"",c=c||{},c={path:c.path||[],templatePath:c.templatePath||[],currentContext:c.currentContext,templateCurrentContext:c.templateCurrentContext||a,root:c.root,templateRoot:c.templateRoot};var d=Handle.rule(b),e=Util.type(a);return Handle[e]?Handle[e]({type:e,template:a,name:b,parsedName:b?b.replace(rkey,"$1"):b,rule:d,context:c}):a},Handle.extend({array:function(a){var b,c,d=[];if(a.rule.parameters)if(1===a.rule.count&&a.template.length>1)a.context.path.push(a.name),d=Random.pick(Handle.gen(a.template,undefined,{currentContext:d,templateCurrentContext:a.template,path:a.context.path})),a.context.path.pop();else for(b=0;b<a.rule.count;b++){c=0;do d.push(Handle.gen(a.template[c++]));while(c<a.template.length)}else for(b=0;b<a.template.length;b++)a.context.path.push(b),d.push(Handle.gen(a.template[b],b,{currentContext:d,templateCurrentContext:a.template,path:a.context.path})),a.context.path.pop();return d},object:function(a){var b,c,d,e,f,g={};if(a.rule.min)for(b=Util.keys(a.template),b=Random.shuffle(b),b=b.slice(0,a.rule.count),f=0;f<b.length;f++)c=b[f],d=c.replace(rkey,"$1"),a.context.path.push(d),g[d]=Handle.gen(a.template[c],c,{currentContext:g,templateCurrentContext:a.template,path:a.context.path}),a.context.path.pop();else for(c in a.template)d=c.replace(rkey,"$1"),a.context.path.push(d),g[d]=Handle.gen(a.template[c],c,{currentContext:g,templateCurrentContext:a.template,path:a.context.path}),a.context.path.pop(),e=c.match(rkey),e&&e[2]&&"number"===Util.type(a.template[c])&&(a.template[c]+=parseInt(e[2],10));return g},number:function(a){var b,c,d;if(a.rule.point){for(a.template+="",c=a.template.split("."),c[0]=a.rule.range?a.rule.count:c[0],c[1]=(c[1]||"").slice(0,a.rule.dcount),d=0;c[1].length<a.rule.dcount;d++)c[1]+=Random.character("number");b=parseFloat(c.join("."),10)}else b=a.rule.range&&!a.rule.parameters[2]?a.rule.count:a.template;return b},"boolean":function(a){var b;return b=a.rule.parameters?Random.bool(a.rule.min,a.rule.max,a.template):a.template},string:function(a){var b,c,d,e,f="";if(a.template.length){for(b=0;b<a.rule.count;b++)f+=a.template;for(c=f.match(rplaceholder)||[],b=0;b<c.length;b++)if(d=c[b],/^\\/.test(d))c.splice(b--,1);else{if(e=Handle.placeholder(d,a.context.currentContext,a.context.templateCurrentContext),1===c.length&&d===f&&typeof e!=typeof f){f=e;break}f=f.replace(d,e)}}else f=a.rule.range?Random.string(a.rule.count):a.template;return f},"function":function(a){return a.template.call(a.context.currentContext)}}),Handle.extend({_all:function(){var a={};for(var b in Random)a[b.toLowerCase()]=b;return a},placeholder:function(placeholder,obj,templateContext){rplaceholder.exec("");var parts=rplaceholder.exec(placeholder),key=parts&&parts[1],lkey=key&&key.toLowerCase(),okey=this._all()[lkey],params=parts&&parts[2]||"";try{eval("!function(){ params = [].splice.call(arguments, 0 ) }("+params+")")}catch(e){params=parts[2].split(/,\s*/)}if(obj&&key in obj)return obj[key];if(templateContext&&"object"==typeof templateContext&&key in templateContext&&placeholder!==templateContext[key])return templateContext[key]=Handle.gen(templateContext[key],key,{currentContext:obj,templateCurrentContext:templateContext}),templateContext[key];if(!(key in Random||lkey in Random||okey in Random))return placeholder;for(var i=0;i<params.length;i++)rplaceholder.exec(""),rplaceholder.test(params[i])&&(params[i]=Handle.placeholder(params[i],obj));var handle=Random[key]||Random[lkey]||Random[okey];switch(Util.type(handle)){case"array":return Random.pick(handle);case"function":var re=handle.apply(Random,params);return re===undefined&&(re=""),re}}}),Mock.mockjax=function(a){function b(){return{open:a.noop,send:a.noop,getAllResponseHeaders:a.noop,readyState:4,status:200}}function c(b,c){return function(){return a.isFunction(b.template)?b.template(c):Mock.mock(b.template)}}function d(d){function e(b,c){return"string"===a.type(b)?b===c:"regexp"===a.type(b)?b.test(c):void 0}for(var f in Mock._mocked){var g=Mock._mocked[f];if(!(g.rurl&&!e(g.rurl,d.url)||g.rtype&&!e(g.rtype,d.type.toLowerCase()))){d.dataFilter=c(g,d),d.converters["text json"]=c(g,d),d.converters["text jsonp"]=c(g,d),d.xhr=b;break}}}return a.ajaxPrefilter("json",d),a.ajaxPrefilter("jsonp",d),Mock},"undefined"!=typeof jQuery&&Mock.mockjax(jQuery),"undefined"!=typeof Zepto&&(Mock.mockjax=function(a){var b=a.ajax,c={readyState:4,responseText:"",responseXML:null,state:2,status:200,statusText:"success",timeoutTimer:null};a.ajax=function(d){for(var e in Mock._mocked){var f=Mock._mocked[e];if(("string"!==a.type(f.rurl)||f.rurl===d.url)&&("regexp"!==a.type(f.rurl)||f.rurl.test(d.url))){console.log("[mock]",d.url,">",f.rurl);var g=Mock.mock(f.template);return console.log("[mock]",g),d.success&&d.success(g,c,d),d.complete&&d.complete(c.status,c,d),c}}return b.call(a,d)}},Mock.mockjax(Zepto)),"undefined"!=typeof KISSY&&KISSY.add&&(Mock.mockjax=function(a){var b=a.io,c={readyState:4,responseText:"",responseXML:null,state:2,status:200,statusText:"success",timeoutTimer:null};a.io=function(d){for(var e in Mock._mocked){var f=Mock._mocked[e];if(("string"!==a.type(f.rurl)||f.rurl===d.url)&&("regexp"!==a.type(f.rurl)||f.rurl.test(d.url))){console.log("[mock]",d.url,">",f.rurl);var g=Mock.mock(f.template);return console.log("[mock]",g),d.success&&d.success(g,"success",c),d.complete&&d.complete(g,"success",c),a}}return b.apply(this,arguments)};for(var d in b)a.io[d]=b[d]}),Mock.Util=Util,Mock.Random=Random,Mock.heredoc=Util.heredoc,"object"==typeof module&&module.exports?module.exports=Mock:"function"==typeof define&&define.amd?define(function(){return Mock}):"function"==typeof define&&define.cmd&&define(function(){return Mock}),this.Mock=Mock,this.Random=Random,"undefined"!=typeof KISSY&&Util.each(["mock","components/mock/index","mock/dist/mock","gallery/Mock/0.1.1/index","gallery/Mock/0.1.2/index"],function(a){KISSY.add(a,function(a){return Mock.mockjax(a),Mock},{requires:["ajax"]})}),function(a){var b={version:"0.0.1"};this.Mock||(module.exports=b),Mock.tpl=function(a,c,d,e){return b.mock(a,c,d,e)},Mock.parse=function(a){return Handlebars.parse(a)},b.mock=function(a,b,d,e){return d=d?Util.extend({},d,Handlebars.helpers):Handlebars.helpers,e=e?Util.extend({},e,Handlebars.partials):Handlebars.partials,c.gen(a,null,b,d,e)};var c={debug:b.debug||!1,extend:Util.extend};c.gen=function(a,d,e,f,g){if(Util.isString(a)){var h=Handlebars.parse(a);e=c.parseOptions(a,e);var i=c.gen(h,d,e,f,g);return i}if(d=d||[{}],e=e||{},this[a.type]!==Util.noop){e.__path=e.__path||[],(b.debug||c.debug)&&(console.log(),console.group("["+a.type+"]",JSON.stringify(a)),console.log("[options]",e.__path.length,JSON.stringify(e)));var j=e.__path.length;return this[a.type](a,d,e,f,g),e.__path.splice(j),(b.debug||c.debug)&&console.groupEnd(),d[d.length-1]}},c.parseOptions=function(a,b){var c,d,e,f=/<!--\s*\n*Mock\s*\n*([\w\W]+?)\s*\n*-->/g,g=a.match(f),h={};for(c=0;g&&c<g.length;c++)f.lastIndex=0,d=f.exec(g[c]),d&&(e=new Function("return "+d[1]),e=e(),Util.extend(h,e));return Util.extend(h,b)},c.val=function(d,e,f,g){if(d!==e.__path[e.__path.length-1])throw new Error(d+"!=="+e.__path);if((b.debug||c.debug)&&console.log("[options]",d,e.__path),g!==a&&(g=Mock.mock(g)),e){var h=Mock.mock(e);if(Util.isString(h))return h;if(d in h)return h[d]}return Util.isArray(f[0])?{}:g!==a?g:d||Random.word()},c.program=function(a,b,c,d,e){for(var f=0;f<a.statements.length;f++)this.gen(a.statements[f],b,c,d,e)},c.mustache=function(a,b,c,d,e){var f,g=b[0],h=b.length;if("array"===Util.type(g)&&(g.push({}),g=g[g.length-1],b.unshift(g)),a.isHelper||d&&d[a.id.string]){if(0===a.params.length);else for(f=0;f<a.params.length;f++)this.gen(a.params[f],b,c,d,e);a.hash&&this.gen(a.hash,b,c,d,e)}else this.gen(a.id,b,c,d,e);b.length>h&&b.splice(0,b.length-h)},c.block=function(a,b,c,e,f){var g,h,i,j,k,l=a.mustache.id.parts,m=b[0],n=b.length;if(a.inverse,a.mustache.isHelper||e&&e[a.mustache.id.string])k=l[0],j=(d[k]||d.custom).apply(this,arguments),m=b[0];else for(g=0;g<l.length;g++)c.__path.push(l[g]),i=l[g],j=this.val(i,c,b,{}),m[i]=Util.isArray(j)&&[]||j,k=Util.type(m[i]),("object"===k||"array"===k)&&(m=m[i],b.unshift(m));if(a.program)if("array"===Util.type(m))for(h=j.length||Random.integer(3,7),g=0;h>g;g++)m.push("undefined"!=typeof j[g]?j[g]:{}),c.__path.push("[]"),b.unshift(m[m.length-1]),this.gen(a.program,b,c,e,f),c.__path.pop(),b.shift();else this.gen(a.program,b,c,e,f);b.length>n&&b.splice(0,b.length-n)},c.hash=function(a,b,c,d,e){var f,g,h,i=a.pairs;for(g=0;g<i.length;g++)for(f=i[g],h=1;h<f.length;h++)this.gen(f[h],b,c,d,e)},c.ID=function(a,b,c){var d,e,f,g,h,i,j,k,l,m=a.parts,n=b[a.depth],o=b.length;if(Util.isArray(n)&&(n=b[a.depth+1]),m.length)for(d=0,e=m.length;e>d;d++)c.__path.push(m[d]),f=m[d],g=m[d-1],l=c[g],h=d===e-1?n[f]:{},i=this.val(f,c,b,h),j=Util.type(n[f]),k=Util.type(i),"undefined"===j?n[f]=e-1>d&&"object"!==k&&"array"!==k?{}:Util.isArray(i)&&[]||i:e-1>d&&"object"!==j&&"array"!==j&&(n[f]=Util.isArray(i)&&[]||{}),j=Util.type(n[f]),("object"===j||"array"===j)&&(n=n[f],b.unshift(n));else;b.length>o&&b.splice(0,b.length-o)},c.partial=function(a,b,d,e,f){var g=a.partialName.name,h=f&&f[g],i=b.length;h&&c.gen(h,b,d,e,f),b.length>i&&b.splice(0,b.length-i)},c.content=Util.noop,c.PARTIAL_NAME=Util.noop,c.DATA=Util.noop,c.STRING=Util.noop,c.INTEGER=Util.noop,c.BOOLEAN=Util.noop,c.comment=Util.noop;var d={};d.each=function(a,b,c){var d,e,f,g,h,i,j,k=b[0];for(h=a.mustache.params[0].parts,d=0,e=h.length;e>d;d++)c.__path.push(h[d]),f=h[d],i=d===e-1?[]:{},g=this.val(f,c,b,i),k[f]=Util.isArray(g)&&[]||g,j=Util.type(k[f]),("object"===j||"array"===j)&&(k=k[f],b.unshift(k));return g},d["if"]=d.unless=function(a,b,c){var d,e,f,g,h,i,j,k=a.mustache.params,l=b[0];for(d=0;d<k.length;d++)for(h=k[d].parts,e=0;e<h.length;e++)0===d&&c.__path.push(h[e]),f=h[e],i=e===h.length-1?"@BOOL(2,1,true)":{},g=this.val(f,c,b,i),e===h.length-1&&(g="true"===g?!0:"false"===g?!1:g),l[f]=Util.isArray(g)?[]:g,j=Util.type(l[f]),("object"===j||"array"===j)&&(l=l[f],b.unshift(l));return g},d["with"]=function(a,b,c){var d,e,f,g,h,i=b[0];for(g=a.mustache.params[0].parts,d=0;d<g.length;d++)c.__path.push(g[d]),e=g[d],h={},f=this.val(e,c,b,h),i=i[e]=f,b.unshift(i);return f},d.log=function(){},d.custom=function(a,b,c){var d,e,f,g,h,i,j,k=b[0];if(0!==a.mustache.params.length){for(h=a.mustache.params[0].parts,d=0,e=h.length;e>d;d++)c.__path.push(h[d]),f=h[d],i=d===e-1?[]:{},g=this.val(f,c,b,i),k[f]=Util.isArray(g)&&[]||g,j=Util.type(k[f]),("object"===j||"array"===j)&&(k=k[f],b.unshift(k));return g}}}.call(this),function(a){if("undefined"!=typeof KISSY){var b,c={debug:!1};KISSY.use("xtemplate",function(a,c){b=c}),this.Mock||(module.exports=c),Mock.xtpl=function(a,b,d,e){return c.mock(a,b,d,e)},Mock.xparse=function(a){return b.compiler.parse(a)},c.mock=function(a,c,d,e){return d=d?Util.extend({},d,b.RunTime.commands):b.RunTime.commands,e=e?Util.extend({},e,b.RunTime.subTpls):b.RunTime.subTpls,this.gen(a,null,c,d,e,{})},c.parse=function(a){return b.compiler.parse(a)},c.gen=function(a,b,d,e,f,g){if("string"==typeof a){c.debug&&console.log("[tpl ]\n",a);var h=this.parse(a);d=this.parseOptions(a,d);var i=this.gen(h,b,d,e,f,g);return i}if(b=b||[{}],d=d||{},a.type=a.type,this[a.type]!==Util.noop){d.__path=d.__path||[],c.debug&&(console.log(),console.group("["+a.type+"]",JSON.stringify(a)),console.log("[context]","[before]",b.length,JSON.stringify(b)),console.log("[options]","[before]",d.__path.length,JSON.stringify(d)),console.log("[other ]","[before]",JSON.stringify(g)));var j=d.__path.length;return this[a.type](a,b,d,e,f,g),c.debug&&console.log("[__path ]","[after ]",d.__path),(!g.hold||"function"==typeof g.hold&&!g.hold(a,d,b))&&d.__path.splice(j),c.debug&&(console.log("[context]","[after ]",b.length,JSON.stringify(b)),console.groupEnd()),b[b.length-1]}},c.parseOptions=function(a,b){var c,d,e,f=/<!--\s*\n*Mock\s*\n*([\w\W]+?)\s*\n*-->/g,g=a.match(f),h={};for(c=0;g&&c<g.length;c++)f.lastIndex=0,d=f.exec(g[c]),d&&(e=new Function("return "+d[1]),e=e(),Util.extend(h,e));return Util.extend(h,b)},c.parseVal=function(a,b){function c(a,b){if("object"==typeof b&&a in b)return[b[a]];for(var c=[],d=0;d<b.length;d++)c.push.apply(c,e(a,[b[d]]));return c}function d(a,b){if("object"==typeof b&&a in b)return[b[a]];var c=[];for(var d in b)c.push.apply(c,e(a,[b[d]]));return c}function e(a,b){for(var e=[],f=0;f<b.length;f++)"object"==typeof b[f]&&(a in b[f]?e.push(b[f][a]):e.push.apply(e,Util.isArray(b[f])?c(a,b[f]):d(a,b[f])));return e}function f(a,b){for(var c="string"==typeof a?a.split("."):a.slice(0),d=[b];c.length;)d=e(c.shift(),d);return d}return f(a,b)},c.val=function(b,d,e,f){if(b!==d.__path[d.__path.length-1])throw new Error(b+"!=="+d.__path);if(f!==a&&(f=Mock.mock(f)),d){var g=Mock.mock(d);if(Util.isString(g))return g;var h=c.parseVal(d.__path,g);if(h.length>0)return h[0];if(b in g)return g[b]}return Util.isArray(e[0])?{}:f!==a?f:b},c.program=function(a,b,c,d,e,f){for(var g=0;g<a.statements.length;g++)this.gen(a.statements[g],b,c,d,e,f);for(var h=0;a.inverse&&h<a.inverse.length;h++)this.gen(a.inverse[h],b,c,d,e,f)},c.block=function(b,c,d,e,f,g){var h=c.length;this.gen(b.tpl,c,d,e,f,Util.extend({},g,{def:{},hold:!0}));var i,j,k,l=c[0];if("array"===Util.type(l))for(i=this.val(d.__path[d.__path.length-1],d,c),k=i&&i.length||Random.integer(3,7),j=0;k>j;j++)l.push(i&&i[j]!==a?i[j]:{}),d.__path.push(j),c.unshift(l[l.length-1]),this.gen(b.program,c,d,e,f,g),d.__path.pop(),c.shift();else this.gen(b.program,c,d,e,f,g);(!g.hold||"function"==typeof g.hold&&!g.hold(b,d,c))&&c.splice(0,c.length-h)},c.tpl=function(a,b,c,d,e,f){if(a.params&&a.params.length){f=Util.extend({},f,{def:{each:[],"if":"@BOOL(2,1,true)",unless:"@BOOL(2,1,false)","with":{}}[a.path.string],hold:{each:!0,"if":function(a,b,c,d,e){return"object"==typeof e},unless:function(a,b,c,d,e){return"object"==typeof e},"with":!0,include:!1}[a.path.string]});for(var g,h=0;h<a.params.length;h++)g="include"===a.path.string?e&&e[a.params[h].value]:a.params[h],g&&this.gen(g,b,c,d,e,f);a.hash&&this.gen(a.hash,b,c,d,e,f)}else this.gen(a.path,b,c,d,e,f)},c.tplExpression=function(a,b,c,d,e,f){this.gen(a.expression,b,c,d,e,f)},c.content=Util.noop,c.unaryExpression=Util.noop,c.multiplicativeExpression=c.additiveExpression=function(b,c,d,e,f,g){this.gen(b.op1,c,d,e,f,Util.extend({},g,{def:function(){return"number"===b.op2.type?b.op2.value.indexOf(".")>-1?Random.float(-Math.pow(10,10),Math.pow(10,10),1,Math.pow(10,6)):Random.integer():a}()})),this.gen(b.op2,c,d,e,f,Util.extend({},g,{def:function(){return"number"===b.op1.type?b.op1.value.indexOf(".")>-1?Random.float(-Math.pow(10,10),Math.pow(10,10),1,Math.pow(10,6)):Random.integer():a}()}))},c.relationalExpression=function(a,b,c,d,e,f){this.gen(a.op1,b,c,d,e,f),this.gen(a.op2,b,c,d,e,f)},c.equalityExpression=Util.noop,c.conditionalAndExpression=Util.noop,c.conditionalOrExpression=Util.noop,c.string=Util.noop,c.number=Util.noop,c.boolean=Util.noop,c.hash=function(a,b,c,d,e,f){var g,h=a.value;for(g in h)this.gen(h[g],b,c,d,e,f)},c.id=function(b,d,e,f,g,h){function i(a,b,c,d,e){var f=Util.type(a[d]),g=Util.type(e);return e="true"===e?!0:"false"===e?!1:e,"undefined"===f?a[d]=c-1>b&&!Util.isObjectOrArray(e)?{}:Util.isArray(e)&&[]||e:c-1>b&&"object"!==f&&"array"!==f?a[d]=Util.isArray(e)&&[]||{}:"object"!==f&&"array"!==f&&"object"!==g&&"array"!==g&&(a[d]=e),a[d]}var j,k,l,m,n,o=d.length,p=b.parts,q=d[b.depth];for(Util.isArray(q)&&(q=d[b.depth+1]),j=0,k=p.length;k>j;j++)(0!==j||"this"!==p[j])&&(/^(xindex|xcount|xkey)$/.test(p[j])||0===j&&1===k&&p[j]in f||(e.__path.push(p[j]),l=p[j],m=j===k-1?h.def!==a?h.def:d[0][l]:{},n=this.val(l,e,d,m),c.debug&&(console.log("[def ]",JSON.stringify(m)),console.log("[val ]",JSON.stringify(n))),n=i(q,j,k,l,n),Util.isObjectOrArray(q[l])&&d.unshift(q=q[l])));(!h.hold||"function"==typeof h.hold&&!h.hold(b,e,d,l,n))&&d.splice(0,d.length-o)}}}.call(this)}).call(this);
//# sourceMappingURL=dist/mock-min.map

@@ -1,5 +0,19 @@

## Mock.js
<!-- ## Mock.js -->
Mock.js 是一款模拟数据生成器,提供以下模拟功能:
<h2 class="hide" href="#">Mock.js</h2>
<img class="hide" src="mockjs.png" wid>
<h1 style="color: #428BCA; margin-bottom: 30px;">
<i class="iconlogo" style="font-size: 80px;">&#x3435;</i>
<span>Mock.js</span>
</h1>
[![Build Status](https://api.travis-ci.org/nuysoft/Mock.png?branch=master)](http://travis-ci.org/nuysoft/Mock)
<!-- [![GitHub version](https://badge.fury.io/gh/nuysoft%2FMock.png)](http://badge.fury.io/gh/nuysoft%2FMock) -->
<!-- [![NPM version](https://badge.fury.io/js/mockjs.png)](http://badge.fury.io/js/mockjs) -->
<!-- [![Bower version](https://badge.fury.io/bo/mockjs.png)](http://badge.fury.io/bo/mockjs) -->
[![Views in the last 24 hours](https://sourcegraph.com/api/repos/github.com/nuysoft/Mock/counters/views-24h.png)](https://github.com/nuysoft/Mock/)
Mock.js 是一款<!-- 有用且好用的 -->模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试。提供了以下模拟功能:
* 根据数据模板生成模拟数据

@@ -12,3 +26,3 @@ * 模拟 Ajax 请求,生成并返回模拟数据

* [Data](./demo/mock.html)
* [数据模板编辑器](./editor.html#help)
* [Handlebars &amp; Mustache](./demo/mock4tpl.html)

@@ -21,9 +35,9 @@ * [KISSY XTemplate](./demo/mock4xtpl.html)

<a href="./dist/mock.js" class="btn btn-success w250">
Development Version (0.1.1)
</a> - <i>65kB, Uncompressed</i>
Development Version (0.1.2)
</a> - <i>71kB, Uncompressed</i>
</p>
<p>
<a href="./dist/mock-min.js" class="btn btn-primary w250">
Production Version (0.1.1)
</a> - <i>27kB, Minified</i>
Production Version (0.1.2)
</a> - <i>31kB, Minified</i>
</p>

@@ -67,3 +81,3 @@ <p>

If you'd like to use [bower](http://bower.io/), it's as easy as:
<!-- If you'd like to use [bower](http://bower.io/), it's as easy as: -->

@@ -86,2 +100,19 @@ npm install -g bower

<iframe width="100%" height="400" src="http://jsfiddle.net/En2sX/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="400" src="http://jsfiddle.net/En2sX/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<!--
Mock.js 已入驻 [KISSY Gallery](https://github.com/kissygalleryteam),阿里同学可以直接加载 `gallery/Mock/0.1.1/index`:
<iframe width="100%" height="400" src="http://jsfiddle.net/8VNQQ/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
-->
### Random CLI
// 安装
npm install mockjs -g
// 执行
$ random url
// => http://rmcpx.org/funzwc
---

@@ -1,5 +0,19 @@

## Mock.js
<!-- ## Mock.js -->
Mock.js 是一款模拟数据生成器,提供以下模拟功能:
<h2 class="hide" href="#">Mock.js</h2>
<img class="hide" src="mockjs.png" wid>
<h1 style="color: #428BCA; margin-bottom: 30px;">
<i class="iconlogo" style="font-size: 80px;">&#x3435;</i>
<span>Mock.js</span>
</h1>
[![Build Status](https://api.travis-ci.org/nuysoft/Mock.png?branch=master)](http://travis-ci.org/nuysoft/Mock)
<!-- [![GitHub version](https://badge.fury.io/gh/nuysoft%2FMock.png)](http://badge.fury.io/gh/nuysoft%2FMock) -->
<!-- [![NPM version](https://badge.fury.io/js/mockjs.png)](http://badge.fury.io/js/mockjs) -->
<!-- [![Bower version](https://badge.fury.io/bo/mockjs.png)](http://badge.fury.io/bo/mockjs) -->
[![Views in the last 24 hours](https://sourcegraph.com/api/repos/github.com/nuysoft/Mock/counters/views-24h.png)](https://github.com/nuysoft/Mock/)
Mock.js 是一款<!-- 有用且好用的 -->模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试。提供了以下模拟功能:
* 根据数据模板生成模拟数据

@@ -12,3 +26,3 @@ * 模拟 Ajax 请求,生成并返回模拟数据

* [Data](./demo/mock.html)
* [数据模板编辑器](./editor.html#help)
* [Handlebars &amp; Mustache](./demo/mock4tpl.html)

@@ -21,9 +35,9 @@ * [KISSY XTemplate](./demo/mock4xtpl.html)

<a href="./dist/mock.js" class="btn btn-success w250">
Development Version (0.1.1)
</a> - <i>65kB, Uncompressed</i>
Development Version (0.1.2)
</a> - <i>71kB, Uncompressed</i>
</p>
<p>
<a href="./dist/mock-min.js" class="btn btn-primary w250">
Production Version (0.1.1)
</a> - <i>27kB, Minified</i>
Production Version (0.1.2)
</a> - <i>31kB, Minified</i>
</p>

@@ -67,3 +81,3 @@ <p>

If you'd like to use [bower](http://bower.io/), it's as easy as:
<!-- If you'd like to use [bower](http://bower.io/), it's as easy as: -->

@@ -88,50 +102,188 @@ npm install -g bower

<!--
Mock.js 已入驻 [KISSY Gallery](https://github.com/kissygalleryteam),阿里同学可以直接加载 `gallery/Mock/0.1.1/index`:
<iframe width="100%" height="400" src="http://jsfiddle.net/8VNQQ/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
-->
### Random CLI
// 安装
npm install mockjs -g
// 执行
$ random url
// => http://rmcpx.org/funzwc
---
## 语法规范
Mock.js 的语法规范包括两部分:
1. 数据模板定义(Data Temaplte Definition,DTD)
2. 数据占位符定义(Data Placeholder Definition,DPD)
### 数据模板定义 DTD
**数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值:**
// 属性名 name
// 生成规则 rule
// 属性值 value
'name|rule': value
**注意:**
* 属性名 和 生成规则 之间用 `|` 分隔。
* 生成规则 是可选的。
* 生成规则 有 7 种格式:
1. `'name|min-max': value`
1. `'name|count': value`
1. `'name|min-max.dmin-dmax': value`
1. `'name|min-max.dcount': value`
1. `'name|count.dmin-dmax': value`
1. `'name|count.dcount': value`
1. `'name|+step': value`
* **生成规则 的 含义 需要依赖 属性值 才能确定。**
* 属性值 中可以含有 `@占位符`。
* 属性值 还指定了最终值的初始值和类型。
<!-- 感谢 @麦少 同学对 Mock.js 语法的整理和分析,才有了这版相对清晰的语法文档。 -->
**生成规则和示例:**
1. 属性值是字符串 **String**
1. `'name|min-max': 'value'` 通过重复 `'value'` 生成一个字符串,重复次数大于等于 `min`,小于等于 `max`。
2. `'name|count': 'value'` 通过重复 `'value'` 生成一个字符串,重复次数等于 `count`。
2. 属性值是数字 **Number**
1. `'name|+1': 100` 属性值自动加 1,初始值为 100
2. `'name|1-100': 100` 生成一个大于等于 1、小于等于 100 的整数,属性值 100 只用来确定类型。
3. `'name|1-100.1-10': 100` 生成一个浮点数,整数部分大于等于 1、小于等于 100,小数部分保留 1 到 10 位。
{
'number1|1-100.1-10': 1,
'number2|123.1-10': 1,
'number3|123.3': 1,
'number4|123.10': 1.123
}
// =>
{
"number1": 12.92,
"number2": 123.51,
"number3": 123.777,
"number4": 123.1231091814
}
3. 属性值是布尔型 **Boolean**
1. `'name|1': value` 随机生成一个布尔值,值为 true 的概率是 1/2,值为 false 的概率是 1/2。
2. `'name|min-max': value` 随机生成一个布尔值,值为 `value` 的概率是 `min / (min + max)`,值为 `!value` 的概率是 `max / (min + max)`。
4. 属性值是对象 **Object**
1. `'name|min-max': {}` 从属性值 `{}` 中随机选取 `min` 到 `max` 个属性。
2. `'name|count': {}` 从属性值 `{}` 中随机选取 `count` 个属性。
5. 属性值是数组 **Array**
1. `'name|1': [{}, {} ...]` 从属性值 `[{}, {} ...]` 中随机选取 1 个元素,作为最终值。
2. `'name|min-max': [{}, {} ...]` 通过重复属性值 `[{}, {} ...]` 生成一个新数组,重复次数大于等于 `min`,小于等于 `max`。
3. `'name|count': [{}, {} ...]` 通过重复属性值 `[{}, {} ...]` 生成一个新数组,重复次数为 `count`。
6. 属性值是数组 **Function**
`'name': function(){}` 执行函数 `function(){}`,取其返回值作为最终的属性值,上下文为 `'name'` 所在的对象。
### 数据占位符定义 DPD
占位符 只是在属性值字符串中占个位置,并不出现在最终的属性值中。占位符 的格式为:
@占位符
@占位符(参数 [, 参数])
**注意:**
1. 用 `@` 来标识其后的字符串是 占位符。
2. 占位符 引用的是 `Mock.Random` 中的方法。
3. 通过 `Mock.Random.extend()` 来扩展自定义占位符。
4. 占位符 也可以引用 数据模板 中的属性。
5. 占位符 会优先引用 数据模板 中的属性。
{
name: {
first: '@FIRST',
middle: '@FIRST',
last: '@LAST',
full: '@first @middle @last'
}
}
// =>
{
"name": {
"first": "Charles",
"middle": "Brenda",
"last": "Lopez",
"full": "Charles Brenda Lopez"
}
}
---
## Mock
### Mock.mock()
### Mock.mock( rurl?, rtype?, template|function(options) )
* Mock.mock(template) <br>根据数据模板生成模拟数据。
* Mock.mock(rurl, template) <br>记录数据模板,当拦截到匹配的 Ajax 请求时,生成并返回模拟数据。
根据数据模板生成模拟数据。
* **Mock.mock( template )**
根据数据模板生成模拟数据。
* **Mock.mock( rurl, template )**
记录数据模板。当拦截到匹配 `rurl` 的 Ajax 请求时,将根据数据模板 `template` 生成模拟数据,并作为响应数据返回。
* **Mock.mock( rurl, function(options) )**
记录用于生成响应数据的函数。当拦截到匹配 `rurl` 的 Ajax 请求时,函数 `function(options)` 将被执行,并把执行结果作为响应数据返回。
* **Mock.mock( rurl, rtype, template )**
记录数据模板。当拦截到匹配 `rurl` 和 `rtype` 的 Ajax 请求时,将根据数据模板 `template` 生成模拟数据,并作为响应数据返回。
* **Mock.mock( rurl, rtype, function(options) )**
记录用于生成响应数据的函数。当拦截到匹配 `rurl` 和 `rtype` 的 Ajax 请求时,函数 `function(options)` 将被执行,并把执行结果作为响应数据返回。
**参数的含义和默认值**如下所示:
* 参数 rurl:可选。表示需要拦截的 URL,可以是 URL 字符串或 URL 正则。例如 `/\/domain\/list\.json/`、`'/domian/list.json'`。
* 参数 template:必须。表示数据模板,可以是对象或字符串。例如 `{ 'data|1-10':[{}] }`、`'@EMAIL'`。
* **参数 rurl**:可选。表示需要拦截的 URL,可以是 URL 字符串或 URL 正则。例如 `/\/domain\/list\.json/`、`'/domian/list.json'`。
* **参数 rtype**:可选。表示需要拦截的 Ajax 请求类型。例如 `GET`、`POST`、`PUT`、`DELETE` 等。
* **参数 template**:可选。表示数据模板,可以是对象或字符串。例如 `{ 'data|1-10':[{}] }`、`'@EMAIL'`。
* **参数 function(options)**:可选。表示用于生成响应数据的函数。
* **参数 options**:指向本次请求的 Ajax 选项集。
**数据模板中的每个属性由 3 部分构成**,以 `'data|1-10':[{}]` 为例:
下面是 Mock.mock() 的 5 种参数格式以及语法规范的使用示例:
* 属性名:例如 `data`。
* 参数:指示生成数据的规则。例如 `|1-10`,指示生成的数组中含有 1 至 10 个元素。
* 属性值:表示初始值、占位符、类型。例如 `[{}]`,表示属性值一个数组,数组中的元素是 `{}`。属性值中含有占位符时,将被替换为对应的随机数据,例如 `'email': '@EMAIL'`,`'@EMAIL'`将被替换为随机生成的邮件地址。
**示例1:**Mock.mock( template )
**参数和属性值部分的语法规范和示例**如下所示:
<iframe width="100%" height="300" src="http://jsfiddle.net/Y3rg6/1/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
* `'data|1-10':[{}]` 构造一个数组,含有 1-10 个元素
* `'data|1':[item, item, item]` 从数组中随机挑选一个元素做为属性值
* `'id|+1': 1` 属性 id 值自动加一,初始值为 1
* `'grade|1-100': 1` 生成一个 1-100 之间的整数
* `'float|1-10.1-10': 1` 生成一个浮点数,整数部分的范围是 1-10,保留小数点后 1-10 位小数
* `'star|1-10': '★'` 生成一个字符串,重复 1-10 次 `'★'`
* `'repeat|10': 'A'` 生成一个字符串,重复 10 次 `'A'`
* `'published|1': false` 随机生成一个布尔值
* `'email': '@EMAIL'` 随即生成一个 Email
* `'date': '@DATE'` 随即生成一段日期字符串,默认格式为 `yyyy-MM-dd`
* `'time': '@TIME'` 随机生成一段时间字符串,默认格式为 `HH:mm:ss`
* `'datetime': '@DATETIME'` 随机生成一段时间字符串,默认格式为 `yyyy-MM-dd HH:mm:ss`
**示例2:**Mock.mock( rurl, template )
Mock.js 的 [在线编辑器](./demo/mock.html) 演示了完整的语法规范和占位符。
<iframe width="100%" height="300" src="http://jsfiddle.net/BeENf/3/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
下面是 Mock.mock() 的两种参数格式以及语法规范的使用示例:
**示例3:**Mock.mock( rurl, function(options) )
**示例1:**Mock.mock(template)
<iframe width="100%" height="300" src="http://jsfiddle.net/2s5t5/3/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="http://jsfiddle.net/Y3rg6/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
**示例4:**Mock.mock( rurl, rtype, template )
**示例2:**Mock.mock(rurl, template)
<iframe width="100%" height="300" src="http://jsfiddle.net/Eq68p/2/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="http://jsfiddle.net/BeENf/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
**示例5:**Mock.mock( rurl, rtype, function(options) )
<iframe width="100%" height="300" src="http://jsfiddle.net/6dpV5/4/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
### Mock.mockjax(library)
覆盖(拦截) Ajax 请求,目前内置支持 jQuery、KISSY。
覆盖(拦截) Ajax 请求,目前内置支持 jQuery、Zepto、KISSY。

@@ -142,9 +294,10 @@ 对 jQuery Ajax 请求的拦截和响应,通过覆盖前置过滤器、选项 dataFilter 以及数据转换器实现,实现代码请问[这里](https://github.com/nuysoft/Mock/blob/master/src/mockjax.js#L5)。

因为第三库 Ajax 的实现方式不尽相同,故目前只内置支持了实际开发中(本人和所服务的阿里) 常用的 jQuery 和 KISSY。如果需要拦截其他第三方库的 Ajax 请求,可参考对 jQuery 和 KISSY 的实现,覆盖 `Mock.mockjax(library)`。
因为第三库 Ajax 的实现方式不尽相同,故目前只内置支持了实际开发中(本人和所服务的阿里) 常用的 jQuery、Zepto 和 KISSY。如果需要拦截其他第三方库的 Ajax 请求,可参考对 jQuery、Zepto 和 KISSY 的实现,覆盖 `Mock.mockjax(library)`。
通过方法 `Mock.mock(rurl, template)` 设置的 URL 和数据模板的映射,均记录在属性 `Mock._mocked` 中,扩展时可从中获取 URL 对应的数据模板,进而生成和响应模拟数据。`Mock._mocked` 的数据结构为:
通过方法 `Mock.mock( rurl, rtype, template|function(options) )` 设置的 URL 和数据模板的映射,均记录在属性 `Mock._mocked` 中,扩展时可从中获取 URL 对应的数据模板,进而生成和响应模拟数据。`Mock._mocked` 的数据结构为:
{
rurl.toString(): {
(rurl + rtype): {
rurl: rurl,
rtype: rtype,
template: template

@@ -155,2 +308,5 @@ },

<!-- 如果业务和场景需要,可以联系 [@墨智]()、[nuysoft](nuysoft@gmail.com) 提供对特定库的内置支持,不过最酷的做法是开发人员能够为 Mock.js 贡献代码。 -->
<!-- 感谢 @麦少 同学对 Mock.mockjax(library) 的重构,并增加了对 Zepto.js 的支持。 -->
### Mock.tpl(input, options, helpers, partials)

@@ -167,6 +323,6 @@

* 参数 input:必选。可以是 HTML 模板,或者经过 Handlebars 解析的语法树(`Handlebars.parse(input)`)。将基于该参数生成模拟数据。
* 参数 options:可选。对象。称为“数据模板”,用于配置生成模拟数据的规则。例如 `{ 'email': '@EMAIL' }`,在生成模拟数据时,所有 `email` 属性对应的值将是一个邮件地址。
* 参数 helpers:可选。对象。表示局部 helper。全局 helper 会自动从 `Handlebars.helpers` 中读取。
* 参数 partials:可选。对象。表示局部子模板。全局子模板会自动从 `Handlebars.partials` 中读取。
* **参数 input**:必选。可以是 HTML 模板,或者经过 Handlebars 解析的语法树(`Handlebars.parse(input)`)。将基于该参数生成模拟数据。
* **参数 options**:可选。对象。称为“数据模板”,用于配置生成模拟数据的规则。例如 `{ 'email': '@EMAIL' }`,在生成模拟数据时,所有 `email` 属性对应的值将是一个邮件地址。
* **参数 helpers**:可选。对象。表示局部 helper。全局 helper 会自动从 `Handlebars.helpers` 中读取。
* **参数 partials**:可选。对象。表示局部子模板。全局子模板会自动从 `Handlebars.partials` 中读取。

@@ -251,6 +407,6 @@ **使用示例**如下所示:

* 参数 input:必选。可以是 HTML 模板,或者经过 KISSY XTempalte 解析的语法树(`XTemplate.compiler.parse(input)`)。将基于该参数生成模拟数据。
* 参数 options:可选。对象。称为“数据模板”,用于配置生成模拟数据的规则。例如 `{ 'email': '@EMAIL' }`,在生成模拟数据时,所有 `email` 属性对应的值将是一个邮件地址。
* 参数 helpers:可选。对象。表示局部命令。全局命令会自动从 `XTemplate.RunTime.commands` 中读取。
* 参数 partials:可选。对象。表示局部子模板。全局子模板会自动从 `XTemplate.RunTime.subTpls` 中读取。
* **参数 input**:必选。可以是 HTML 模板,或者经过 KISSY XTempalte 解析的语法树(`XTemplate.compiler.parse(input)`)。将基于该参数生成模拟数据。
* **参数 options**:可选。对象。称为“数据模板”,用于配置生成模拟数据的规则。例如 `{ 'email': '@EMAIL' }`,在生成模拟数据时,所有 `email` 属性对应的值将是一个邮件地址。
* **参数 helpers**:可选。对象。表示局部命令。全局命令会自动从 `XTemplate.RunTime.commands` 中读取。
* **参数 partials**:可选。对象。表示局部子模板。全局子模板会自动从 `XTemplate.RunTime.subTpls` 中读取。

@@ -365,8 +521,48 @@ **使用示例**如下所示:

可以在上面的例子中看到,直接调用 'Random.email()' 时方法名 `email()` 是小写的,而数据模板中的 `@EMAIL` 却是大写。这并非对数据模板中的占位符做了特殊处理,也非强制的编写方式,事实上在数据模板中使用小写的 `@email` 也可以达到同样的效果。不过,这是建议的编码风格,以便在阅读时从视觉上提高占位符的识别率,快速识别占位符和普通字符。
可以在上面的例子中看到,直接调用 'Random.email()' 时方法名 `email()` 是小写的,而数据模板中的 `@EMAIL` 却是大写。这并非对数据模板中的占位符做了特殊处理,也非强制的编写方式,事实上在数据模板中使用小写的 `@email` 也可以达到同样的效果。不过,这是建议的编码风格,以便在阅读时从视觉上提高占位符的识别度,快速识别占位符和普通字符。
在浏览器中,为了减少需要拼写的字符,Mock.js 把 Mock.Random 暴露给了 window 对象,使之称为全局变量,从而可以直接访问 Random。因此上面例子中的 `var Random = Mock.Random;` 可以省略。在后面的例子中,也将做同样的处理。
在浏览器中,为了减少需要拼写的字符,Mock.js 把 Mock.Random 暴露给了 window 对象,使之成为全局变量,从而可以直接访问 Random。因此上面例子中的 `var Random = Mock.Random;` 可以省略。在后面的例子中,也将做同样的处理。
> 在 Node.js 中,仍然需要通过 `Mock.Random` 访问。
Mock.Random 提供的完整方法(占位符)如下:
| Type | Method
| ------------- | -----------------------------------------------------------------------------
| Basics | boolean natural integer float character string range date time datetime now
| Image | image dataImage
| Color | color
| Text | paragraph sentence word title
| Name | first last name
| Web | url domain email ip tld
| Address | area region
| Helpers | capitalize upper lower pick shuffle
| Miscellaneous | guid id
<script id="fixPlaceholderLink" type="text/javascript">
$('#fixPlaceholderLink').prev('table')
.find('td:nth-child(1)').each(function(index, td) {
$(td).contents().wrapAll(
$('<a>').attr('href', '#' + $(td).text())
)
})
.end()
.find('td:nth-child(2)').each(function(index, td) {
var methods = $(td).text().split(' ')
var links = $()
$(methods).each(function(mindex, m) {
links.push(
$('<a>').attr('href', '#' + m).text(m)[0]
)
if (mindex < methods.length - 1) {
links.push(
$('<span>').text(', ')[0]
)
}
})
$(td).empty().append(links)
})
.end()
</script>
Mock.Random 中的方法与数据模板的 `@占位符` 一一对应,在需要时可以为 Mock.Random 扩展方法,然后在数据模板中通过 `@扩展方法` 引用。例如:

@@ -504,3 +700,3 @@

* 参数 pool:可选。表示字符池,将从中选择一个字符返回。
* 参数 pool:可选。字符串。表示字符池,将从中选择一个字符返回。
* 如果传入 `'lower'` 或 `'upper'`、`'number'`、`'symbol'`,表示从内置的字符池从选取:

@@ -544,3 +740,3 @@

* 参数 pool:可选。表示字符池,将从中选择一个字符返回。
* 参数 pool:可选。字符串。表示字符池,将从中选择一个字符返回。
* 如果传入 `'lower'` 或 `'upper'`、`'number'`、`'symbol'`,表示从内置的字符池从选取:

@@ -629,2 +825,3 @@

| a | Lowercase Ante meridiem and Post meridiem | am or pm
| T | Milliseconds, since 1970-1-1 00:00:00 UTC | 759883437303

@@ -692,2 +889,44 @@ **使用示例**如下所示:

#### Random.now(unit, format)
* Ranndom.now(unit, format)
* Ranndom.now()
* Ranndom.now(format)
* Ranndom.now(unit)
返回当前的日期和时间字符串。
**参数的含义和默认值**如下所示:
* 参数 unit:可选。表示时间单元,用于对当前日期和时间进行格式化。可选值有:`year`、`month`、`week`、`day`、`hour`、`minute`、`second`、`week`,默认不会格式化。
* 参数 format:可选。指示生成的日期和时间字符串的格式。默认值为 `yyyy-MM-dd HH:mm:ss`。可选的占位符参考自 [Ext.Date](http://docs.sencha.com/ext-js/4-1/#!/api/Ext.Date),请参见 [Random.date(format)](#date)。
> Random.now() 的实现参考了 (Moment.js)[http://momentjs.cn/docs/#/manipulating/start-of/]。
**使用示例**如下所示:
Random.now()
// => "2014-04-29 20:08:38 "
Random.now('day', 'yyyy-MM-dd HH:mm:ss SS')
// => "2014-04-29 00:00:00 000"
Random.now('day')
// => "2014-04-29 00:00:00 "
Random.now('yyyy-MM-dd HH:mm:ss SS')
// => "2014-04-29 20:08:38 157"
Random.now('year')
// => "2014-01-01 00:00:00"
Random.now('month')
// => "2014-04-01 00:00:00"
Random.now('week')
// => "2014-04-27 00:00:00"
Random.now('day')
// => "2014-04-29 00:00:00"
Random.now('hour')
// => "2014-04-29 20:00:00"
Random.now('minute')
// => "2014-04-29 20:08:00"
Random.now('second')
// => "2014-04-29 20:08:38"
### Image

@@ -706,3 +945,3 @@

> **Random.image()** 用于生成深度自定义的图片地址,一般情况下,应该使用更简单的 [**Random.dataImage()**](#dataImage)。
> **Random.image()** 用于生成高度自定义的图片地址,一般情况下,应该使用更简单的 [**Random.dataImage()**](#dataImage)。

@@ -758,3 +997,3 @@ **参数的含义和默认值**如下所示:

> 如果需要生成深度自定义的图片,请使用 [**Random.image()**](#image)。
> 如果需要生成高度自定义的图片,请使用 [**Random.image()**](#image)。

@@ -1112,2 +1351,22 @@ **参数的含义和默认值**如下所示:

Random.id()
// => "420000200710091854"
// => "420000200710091854"
#### Random.increment(step)
生成一个全局的自增整数。
* Random.increment(step)
参数的含义和默认值如下所示:
* 参数 step:可选。整数自增的步长。默认值为 1。
使用示例如下所示:
Random.increment()
// => 1
Random.increment(100)
// => 101
Random.increment(1000)
// => 1101
## Mock
### Mock.mock()
### Mock.mock( rurl?, rtype?, template|function(options) )
* Mock.mock(template) <br>根据数据模板生成模拟数据。
* Mock.mock(rurl, template) <br>记录数据模板,当拦截到匹配的 Ajax 请求时,生成并返回模拟数据。
根据数据模板生成模拟数据。
* **Mock.mock( template )**
根据数据模板生成模拟数据。
* **Mock.mock( rurl, template )**
记录数据模板。当拦截到匹配 `rurl` 的 Ajax 请求时,将根据数据模板 `template` 生成模拟数据,并作为响应数据返回。
* **Mock.mock( rurl, function(options) )**
记录用于生成响应数据的函数。当拦截到匹配 `rurl` 的 Ajax 请求时,函数 `function(options)` 将被执行,并把执行结果作为响应数据返回。
* **Mock.mock( rurl, rtype, template )**
记录数据模板。当拦截到匹配 `rurl` 和 `rtype` 的 Ajax 请求时,将根据数据模板 `template` 生成模拟数据,并作为响应数据返回。
* **Mock.mock( rurl, rtype, function(options) )**
记录用于生成响应数据的函数。当拦截到匹配 `rurl` 和 `rtype` 的 Ajax 请求时,函数 `function(options)` 将被执行,并把执行结果作为响应数据返回。
**参数的含义和默认值**如下所示:
* 参数 rurl:可选。表示需要拦截的 URL,可以是 URL 字符串或 URL 正则。例如 `/\/domain\/list\.json/`、`'/domian/list.json'`。
* 参数 template:必须。表示数据模板,可以是对象或字符串。例如 `{ 'data|1-10':[{}] }`、`'@EMAIL'`。
* **参数 rurl**:可选。表示需要拦截的 URL,可以是 URL 字符串或 URL 正则。例如 `/\/domain\/list\.json/`、`'/domian/list.json'`。
* **参数 rtype**:可选。表示需要拦截的 Ajax 请求类型。例如 `GET`、`POST`、`PUT`、`DELETE` 等。
* **参数 template**:可选。表示数据模板,可以是对象或字符串。例如 `{ 'data|1-10':[{}] }`、`'@EMAIL'`。
* **参数 function(options)**:可选。表示用于生成响应数据的函数。
* **参数 options**:指向本次请求的 Ajax 选项集。
**数据模板中的每个属性由 3 部分构成**,以 `'data|1-10':[{}]` 为例:
下面是 Mock.mock() 的 5 种参数格式以及语法规范的使用示例:
* 属性名:例如 `data`。
* 参数:指示生成数据的规则。例如 `|1-10`,指示生成的数组中含有 1 至 10 个元素。
* 属性值:表示初始值、占位符、类型。例如 `[{}]`,表示属性值一个数组,数组中的元素是 `{}`。属性值中含有占位符时,将被替换为对应的随机数据,例如 `'email': '@EMAIL'`,`'@EMAIL'`将被替换为随机生成的邮件地址。
**示例1:**Mock.mock( template )
**参数和属性值部分的语法规范和示例**如下所示:
<iframe width="100%" height="300" src="http://jsfiddle.net/Y3rg6/1/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
* `'data|1-10':[{}]` 构造一个数组,含有 1-10 个元素
* `'data|1':[item, item, item]` 从数组中随机挑选一个元素做为属性值
* `'id|+1': 1` 属性 id 值自动加一,初始值为 1
* `'grade|1-100': 1` 生成一个 1-100 之间的整数
* `'float|1-10.1-10': 1` 生成一个浮点数,整数部分的范围是 1-10,保留小数点后 1-10 位小数
* `'star|1-10': '★'` 生成一个字符串,重复 1-10 次 `'★'`
* `'repeat|10': 'A'` 生成一个字符串,重复 10 次 `'A'`
* `'published|1': false` 随机生成一个布尔值
* `'email': '@EMAIL'` 随即生成一个 Email
* `'date': '@DATE'` 随即生成一段日期字符串,默认格式为 `yyyy-MM-dd`
* `'time': '@TIME'` 随机生成一段时间字符串,默认格式为 `HH:mm:ss`
* `'datetime': '@DATETIME'` 随机生成一段时间字符串,默认格式为 `yyyy-MM-dd HH:mm:ss`
**示例2:**Mock.mock( rurl, template )
Mock.js 的 [在线编辑器](./demo/mock.html) 演示了完整的语法规范和占位符。
<iframe width="100%" height="300" src="http://jsfiddle.net/BeENf/3/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
下面是 Mock.mock() 的两种参数格式以及语法规范的使用示例:
**示例3:**Mock.mock( rurl, function(options) )
**示例1:**Mock.mock(template)
<iframe width="100%" height="300" src="http://jsfiddle.net/2s5t5/3/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="http://jsfiddle.net/Y3rg6/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
**示例4:**Mock.mock( rurl, rtype, template )
**示例2:**Mock.mock(rurl, template)
<iframe width="100%" height="300" src="http://jsfiddle.net/Eq68p/2/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="http://jsfiddle.net/BeENf/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
**示例5:**Mock.mock( rurl, rtype, function(options) )
<iframe width="100%" height="300" src="http://jsfiddle.net/6dpV5/4/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>

@@ -12,6 +12,6 @@ ### Mock.tpl(input, options, helpers, partials)

* 参数 input:必选。可以是 HTML 模板,或者经过 Handlebars 解析的语法树(`Handlebars.parse(input)`)。将基于该参数生成模拟数据。
* 参数 options:可选。对象。称为“数据模板”,用于配置生成模拟数据的规则。例如 `{ 'email': '@EMAIL' }`,在生成模拟数据时,所有 `email` 属性对应的值将是一个邮件地址。
* 参数 helpers:可选。对象。表示局部 helper。全局 helper 会自动从 `Handlebars.helpers` 中读取。
* 参数 partials:可选。对象。表示局部子模板。全局子模板会自动从 `Handlebars.partials` 中读取。
* **参数 input**:必选。可以是 HTML 模板,或者经过 Handlebars 解析的语法树(`Handlebars.parse(input)`)。将基于该参数生成模拟数据。
* **参数 options**:可选。对象。称为“数据模板”,用于配置生成模拟数据的规则。例如 `{ 'email': '@EMAIL' }`,在生成模拟数据时,所有 `email` 属性对应的值将是一个邮件地址。
* **参数 helpers**:可选。对象。表示局部 helper。全局 helper 会自动从 `Handlebars.helpers` 中读取。
* **参数 partials**:可选。对象。表示局部子模板。全局子模板会自动从 `Handlebars.partials` 中读取。

@@ -18,0 +18,0 @@ **使用示例**如下所示:

@@ -12,6 +12,6 @@ ### Mock.xtpl(input, options, helpers, partials)

* 参数 input:必选。可以是 HTML 模板,或者经过 KISSY XTempalte 解析的语法树(`XTemplate.compiler.parse(input)`)。将基于该参数生成模拟数据。
* 参数 options:可选。对象。称为“数据模板”,用于配置生成模拟数据的规则。例如 `{ 'email': '@EMAIL' }`,在生成模拟数据时,所有 `email` 属性对应的值将是一个邮件地址。
* 参数 helpers:可选。对象。表示局部命令。全局命令会自动从 `XTemplate.RunTime.commands` 中读取。
* 参数 partials:可选。对象。表示局部子模板。全局子模板会自动从 `XTemplate.RunTime.subTpls` 中读取。
* **参数 input**:必选。可以是 HTML 模板,或者经过 KISSY XTempalte 解析的语法树(`XTemplate.compiler.parse(input)`)。将基于该参数生成模拟数据。
* **参数 options**:可选。对象。称为“数据模板”,用于配置生成模拟数据的规则。例如 `{ 'email': '@EMAIL' }`,在生成模拟数据时,所有 `email` 属性对应的值将是一个邮件地址。
* **参数 helpers**:可选。对象。表示局部命令。全局命令会自动从 `XTemplate.RunTime.commands` 中读取。
* **参数 partials**:可选。对象。表示局部子模板。全局子模板会自动从 `XTemplate.RunTime.subTpls` 中读取。

@@ -18,0 +18,0 @@ **使用示例**如下所示:

### Mock.mockjax(library)
覆盖(拦截) Ajax 请求,目前内置支持 jQuery、KISSY。
覆盖(拦截) Ajax 请求,目前内置支持 jQuery、Zepto、KISSY。

@@ -9,12 +9,16 @@ 对 jQuery Ajax 请求的拦截和响应,通过覆盖前置过滤器、选项 dataFilter 以及数据转换器实现,实现代码请问[这里](https://github.com/nuysoft/Mock/blob/master/src/mockjax.js#L5)。

因为第三库 Ajax 的实现方式不尽相同,故目前只内置支持了实际开发中(本人和所服务的阿里) 常用的 jQuery 和 KISSY。如果需要拦截其他第三方库的 Ajax 请求,可参考对 jQuery 和 KISSY 的实现,覆盖 `Mock.mockjax(library)`。
因为第三库 Ajax 的实现方式不尽相同,故目前只内置支持了实际开发中(本人和所服务的阿里) 常用的 jQuery、Zepto 和 KISSY。如果需要拦截其他第三方库的 Ajax 请求,可参考对 jQuery、Zepto 和 KISSY 的实现,覆盖 `Mock.mockjax(library)`。
通过方法 `Mock.mock(rurl, template)` 设置的 URL 和数据模板的映射,均记录在属性 `Mock._mocked` 中,扩展时可从中获取 URL 对应的数据模板,进而生成和响应模拟数据。`Mock._mocked` 的数据结构为:
通过方法 `Mock.mock( rurl, rtype, template|function(options) )` 设置的 URL 和数据模板的映射,均记录在属性 `Mock._mocked` 中,扩展时可从中获取 URL 对应的数据模板,进而生成和响应模拟数据。`Mock._mocked` 的数据结构为:
{
rurl.toString(): {
(rurl + rtype): {
rurl: rurl,
rtype: rtype,
template: template
},
...
}
}
<!-- 如果业务和场景需要,可以联系 [@墨智]()、[nuysoft](nuysoft@gmail.com) 提供对特定库的内置支持,不过最酷的做法是开发人员能够为 Mock.js 贡献代码。 -->
<!-- 感谢 @麦少 同学对 Mock.mockjax(library) 的重构,并增加了对 Zepto.js 的支持。 -->

@@ -79,2 +79,24 @@ # Mock - 模拟请求 & 模拟数据

## 2014.5.9
**数据模板中的每个属性由 3 部分构成**,以 `'data|1-10':[{}]` 为例:
* 属性名:例如 `data`。
* 参数:指示生成数据的规则。例如 `|1-10`,指示生成的数组中含有 1 至 10 个元素。
* 属性值:表示初始值、占位符、类型。例如 `[{}]`,表示属性值一个数组,数组中的元素是 `{}`。属性值中含有占位符时,将被替换为对应的随机数据,例如 `'email': '@EMAIL'`,`'@EMAIL'`将被替换为随机生成的邮件地址。
**参数和属性值部分的语法规范和示例**如下所示:
* `'data|1-10':[{}]` 构造一个数组,含有 1-10 个元素
* `'data|1':[item, item, item]` 从数组中随机挑选一个元素做为属性值
* `'id|+1': 1` 属性 id 值自动加一,初始值为 1
* `'grade|1-100': 1` 生成一个 1-100 之间的整数
* `'float|1-10.1-10': 1` 生成一个浮点数,整数部分的范围是 1-10,保留小数点后 1-10 位小数
* `'star|1-10': '★'` 生成一个字符串,重复 1-10 次 `'★'`
* `'repeat|10': 'A'` 生成一个字符串,重复 10 次 `'A'`
* `'published|1-2': false` 随机生成一个布尔值,值为 false 的概率是 1/3,值为 true 的概率是 2/3
* `'email': '@EMAIL'` 随即生成一个 Email
* `'date': '@DATE'` 随即生成一段日期字符串,默认格式为 `yyyy-MM-dd`
* `'time': '@TIME'` 随机生成一段时间字符串,默认格式为 `HH:mm:ss`
* `'datetime': '@DATETIME'` 随机生成一段时间字符串,默认格式为 `yyyy-MM-dd HH:mm:ss`
Mock.js 的 [在线编辑器](./demo/mock.html) 演示了完整的语法规范和占位符。

@@ -13,8 +13,48 @@ ## Mock.Random

可以在上面的例子中看到,直接调用 'Random.email()' 时方法名 `email()` 是小写的,而数据模板中的 `@EMAIL` 却是大写。这并非对数据模板中的占位符做了特殊处理,也非强制的编写方式,事实上在数据模板中使用小写的 `@email` 也可以达到同样的效果。不过,这是建议的编码风格,以便在阅读时从视觉上提高占位符的识别率,快速识别占位符和普通字符。
可以在上面的例子中看到,直接调用 'Random.email()' 时方法名 `email()` 是小写的,而数据模板中的 `@EMAIL` 却是大写。这并非对数据模板中的占位符做了特殊处理,也非强制的编写方式,事实上在数据模板中使用小写的 `@email` 也可以达到同样的效果。不过,这是建议的编码风格,以便在阅读时从视觉上提高占位符的识别度,快速识别占位符和普通字符。
在浏览器中,为了减少需要拼写的字符,Mock.js 把 Mock.Random 暴露给了 window 对象,使之称为全局变量,从而可以直接访问 Random。因此上面例子中的 `var Random = Mock.Random;` 可以省略。在后面的例子中,也将做同样的处理。
在浏览器中,为了减少需要拼写的字符,Mock.js 把 Mock.Random 暴露给了 window 对象,使之成为全局变量,从而可以直接访问 Random。因此上面例子中的 `var Random = Mock.Random;` 可以省略。在后面的例子中,也将做同样的处理。
> 在 Node.js 中,仍然需要通过 `Mock.Random` 访问。
Mock.Random 提供的完整方法(占位符)如下:
| Type | Method
| ------------- | -----------------------------------------------------------------------------
| Basics | boolean natural integer float character string range date time datetime now
| Image | image dataImage
| Color | color
| Text | paragraph sentence word title
| Name | first last name
| Web | url domain email ip tld
| Address | area region
| Helpers | capitalize upper lower pick shuffle
| Miscellaneous | guid id
<script id="fixPlaceholderLink" type="text/javascript">
$('#fixPlaceholderLink').prev('table')
.find('td:nth-child(1)').each(function(index, td) {
$(td).contents().wrapAll(
$('<a>').attr('href', '#' + $(td).text())
)
})
.end()
.find('td:nth-child(2)').each(function(index, td) {
var methods = $(td).text().split(' ')
var links = $()
$(methods).each(function(mindex, m) {
links.push(
$('<a>').attr('href', '#' + m).text(m)[0]
)
if (mindex < methods.length - 1) {
links.push(
$('<span>').text(', ')[0]
)
}
})
$(td).empty().append(links)
})
.end()
</script>
Mock.Random 中的方法与数据模板的 `@占位符` 一一对应,在需要时可以为 Mock.Random 扩展方法,然后在数据模板中通过 `@扩展方法` 引用。例如:

@@ -152,3 +192,3 @@

* 参数 pool:可选。表示字符池,将从中选择一个字符返回。
* 参数 pool:可选。字符串。表示字符池,将从中选择一个字符返回。
* 如果传入 `'lower'` 或 `'upper'`、`'number'`、`'symbol'`,表示从内置的字符池从选取:

@@ -192,3 +232,3 @@

* 参数 pool:可选。表示字符池,将从中选择一个字符返回。
* 参数 pool:可选。字符串。表示字符池,将从中选择一个字符返回。
* 如果传入 `'lower'` 或 `'upper'`、`'number'`、`'symbol'`,表示从内置的字符池从选取:

@@ -277,2 +317,3 @@

| a | Lowercase Ante meridiem and Post meridiem | am or pm
| T | Milliseconds, since 1970-1-1 00:00:00 UTC | 759883437303

@@ -340,2 +381,44 @@ **使用示例**如下所示:

#### Random.now(unit, format)
* Ranndom.now(unit, format)
* Ranndom.now()
* Ranndom.now(format)
* Ranndom.now(unit)
返回当前的日期和时间字符串。
**参数的含义和默认值**如下所示:
* 参数 unit:可选。表示时间单元,用于对当前日期和时间进行格式化。可选值有:`year`、`month`、`week`、`day`、`hour`、`minute`、`second`、`week`,默认不会格式化。
* 参数 format:可选。指示生成的日期和时间字符串的格式。默认值为 `yyyy-MM-dd HH:mm:ss`。可选的占位符参考自 [Ext.Date](http://docs.sencha.com/ext-js/4-1/#!/api/Ext.Date),请参见 [Random.date(format)](#date)。
> Random.now() 的实现参考了 (Moment.js)[http://momentjs.cn/docs/#/manipulating/start-of/]。
**使用示例**如下所示:
Random.now()
// => "2014-04-29 20:08:38 "
Random.now('day', 'yyyy-MM-dd HH:mm:ss SS')
// => "2014-04-29 00:00:00 000"
Random.now('day')
// => "2014-04-29 00:00:00 "
Random.now('yyyy-MM-dd HH:mm:ss SS')
// => "2014-04-29 20:08:38 157"
Random.now('year')
// => "2014-01-01 00:00:00"
Random.now('month')
// => "2014-04-01 00:00:00"
Random.now('week')
// => "2014-04-27 00:00:00"
Random.now('day')
// => "2014-04-29 00:00:00"
Random.now('hour')
// => "2014-04-29 20:00:00"
Random.now('minute')
// => "2014-04-29 20:08:00"
Random.now('second')
// => "2014-04-29 20:08:38"
### Image

@@ -354,3 +437,3 @@

> **Random.image()** 用于生成深度自定义的图片地址,一般情况下,应该使用更简单的 [**Random.dataImage()**](#dataImage)。
> **Random.image()** 用于生成高度自定义的图片地址,一般情况下,应该使用更简单的 [**Random.dataImage()**](#dataImage)。

@@ -406,3 +489,3 @@ **参数的含义和默认值**如下所示:

> 如果需要生成深度自定义的图片,请使用 [**Random.image()**](#image)。
> 如果需要生成高度自定义的图片,请使用 [**Random.image()**](#image)。

@@ -760,2 +843,21 @@ **参数的含义和默认值**如下所示:

Random.id()
// => "420000200710091854"
// => "420000200710091854"
#### Random.increment(step)
生成一个全局的自增整数。
* Random.increment(step)
参数的含义和默认值如下所示:
* 参数 step:可选。整数自增的步长。默认值为 1。
使用示例如下所示:
Random.increment()
// => 1
Random.increment(100)
// => 101
Random.increment(1000)
// => 1101
'use strict';
module.exports = function(grunt) {
// Displays the execution time of grunt tasks. Can help when optimizing build times.
require('time-grunt')(grunt)
grunt.initConfig({

@@ -8,3 +11,3 @@ pkg: grunt.file.readJSON('package.json'),

files: ['Gruntfile.js', 'package.json', 'src/**/*.js', 'test/**/*.js',
'!**/*-prefix.js', '!**/*-suffix.js'
'!**/*-prefix.js', '!**/*-suffix.js'
],

@@ -16,5 +19,8 @@ options: {

qunit: {
files: ['test/mock.html', 'test/mock-*.html',
'test/mock4tpl.html', 'test/mock4tpl-*.html',
'test/**/*.html'
files: [
'test/mock.html', 'test/mock-*.html',
'test/mock4tpl.html', 'test/mock4tpl-*.html',
'test/mock4xtpl.html', 'test/mock4xtpl-*.html',
'test/**/*.html',
'!test/mock4xtpl.html'
]

@@ -54,9 +60,9 @@ },

src: ['src/mock-prefix.js',
'src/util.js', 'src/random.js',
'src/mock.js',
'src/mockjax.js',
'src/expose.js',
'src/mock4tpl.js',
'src/mock4xtpl.js',
'src/mock-suffix.js'
'src/util.js', 'src/random.js',
'src/mock.js',
'src/mockjax.js',
'src/expose.js',
'src/mock4tpl.js',
'src/mock4xtpl.js',
'src/mock-suffix.js'
],

@@ -69,7 +75,11 @@ dest: 'dist/mock.js'

},
src: ['doc/getting-started.md', 'doc/mock.md', 'doc/mockjax.md',
'doc/mock4tpl.md',
'doc/mock4xtpl.md',
'doc/util.md',
'doc/random.md'
src: ['doc/getting-started.md',
'doc/spec.md',
'doc/mock.md',
'doc/mockjax.md',
'doc/mock4tpl.md',
'doc/mock4xtpl.md',
'doc/util.md',
'doc/random.md',
'doc/other.md'
],

@@ -84,3 +94,3 @@ dest: 'doc/index.md'

options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy HH:MM:ss") %> */\n'
},

@@ -95,9 +105,8 @@ dev: {

files: [{
expand: true,
cwd: 'dist/',
src: ['**/*.js', '!**/*-min.js'],
dest: 'dist/',
ext: '.js'
}
]
expand: true,
cwd: 'dist/',
src: ['**/*.js', '!**/*-min.js'],
dest: 'dist/',
ext: '.js'
}]
},

@@ -109,9 +118,8 @@ release: {

files: [{
expand: true,
cwd: 'dist/',
src: ['**/*.js', '!**/*-min.js'],
dest: 'dist/',
ext: '-min.js'
}
]
expand: true,
cwd: 'dist/',
src: ['**/*.js', '!**/*-min.js'],
dest: 'dist/',
ext: '-min.js'
}]
}

@@ -134,28 +142,37 @@ },

files: [{
expand: true,
src: ['dist/**', 'demo/**',
'node_modules/jquery/tmp/**',
'node_modules/codemirror/**',
'node_modules/handlebars/dist/**'
],
dest: '../../nuysoft.github.com/project/mock/'
}
]
expand: true,
src: ['dist/**', 'demo/**',
'node_modules/jquery/tmp/**',
'node_modules/codemirror/**',
'node_modules/handlebars/dist/**'
],
dest: '../../nuysoft.github.com/project/mock/'
}]
},
doc: {
files: [{
expand: true,
src: ['dist/**', 'demo/**',
'node_modules/jquery/tmp/**',
'node_modules/codemirror/**',
'node_modules/handlebars/dist/**'
],
dest: '../mockjs.github.com/'
}, {
expand: true,
cwd: './',
src: ['index.html'],
dest: '../mockjs.github.com/'
}
]
expand: true,
src: ['dist/**', 'demo/**',
'node_modules/jquery/tmp/**',
'node_modules/codemirror/**',
'node_modules/handlebars/dist/**',
'bower_components/**',
'editor/**',
],
dest: '../mockjs.github.com/'
}, {
expand: true,
cwd: './',
src: ['index.html', 'favicon.ico', 'editor.html'],
dest: '../mockjs.github.com/'
}]
},
kissy: {
files: [{
src: ['dist/mock.js'],
dest: '../kissy-gallery/Mock/0.1.1/build/index.js'
}, {
src: ['dist/mock-min.js'],
dest: '../kissy-gallery/Mock/0.1.1/build/index-min.js'
}]
}

@@ -167,2 +184,11 @@ },

}
},
connect: { // grunt connect:server:keepalive
server: {
options: {
port: 5050,
base: '.',
host: '0.0.0.0'
}
}
}

@@ -179,2 +205,3 @@ })

grunt.loadNpmTasks('grunt-contrib-clean')
grunt.loadNpmTasks('grunt-contrib-connect')
grunt.loadNpmTasks('grunt-exec')

@@ -184,12 +211,12 @@ grunt.loadNpmTasks('grunt-markdown');

grunt.registerTask('base', [
'jshint', 'nodeunit', 'concat:mock' /*, 'qunit'*/ ,
'uglify',
'doc-base'
'jshint', 'nodeunit', 'concat:mock', 'qunit',
'uglify',
'doc-base'
]) // 'copy:demo',
grunt.registerTask('travis', ['jshint', 'nodeunit']) // grunt travis --verbose
grunt.registerTask('default', ['base', 'watch:dev'])
grunt.registerTask('doc-base', ['concat:doc', 'markdown:doc', 'copy:doc'])
grunt.registerTask('doc', ['doc-base', 'watch:doc'])
grunt.registerTask('travis', ['jshint', 'nodeunit', 'qunit']) // grunt travis --verbose
grunt.registerTask('default', ['base', 'connect', 'watch:dev'])
grunt.registerTask('doc-base', ['concat:doc', 'markdown:doc', 'copy:doc', 'copy:kissy'])
grunt.registerTask('doc', ['doc-base', 'connect', 'watch:doc'])
grunt.registerTask('build', ['jshint', 'nodeunit', 'concat', 'qunit', 'uglify'])
};

@@ -5,3 +5,3 @@ {

"description": "模拟请求 & 模拟数据",
"version": "0.1.1",
"version": "0.1.2",
"homepage": "http://mockjs.com/",

@@ -15,9 +15,9 @@ "keywords": [

"author": "nuysoft@gmail.com",
"dependencies": {},
"dependencies": {
"commander": "1.3.x"
},
"devDependencies": {
"grunt": "~0.4.1",
"grunt-contrib-jshint": "~0.6.4",
"grunt-contrib-qunit": "~0.2.1",
"grunt-contrib-watch": "~0.5.3",
"grunt-contrib-nodeunit": "~0.1.2",
"grunt-contrib-concat": "~0.3.0",

@@ -27,2 +27,3 @@ "grunt-contrib-copy": "~0.4.1",

"grunt-contrib-uglify": "~0.2.2",
"grunt-contrib-connect": "~0.5.0",
"grunt-markdown": "~0.4.0",

@@ -33,7 +34,11 @@ "grunt-exec": "~0.4.2",

"underscore": "~1.5.1",
"codemirror": "~3.15.0",
"jison": "~0.4.10",
"shelljs": "~0.2.1",
"kissy": "~1.3.1",
"node-print": "~0.0.4"
"node-print": "~0.0.4",
"codemirror": "~3.18.0",
"grunt-contrib-qunit": "~0.3.0",
"grunt-contrib-nodeunit": "~0.2.1",
"zepto": "0.0.4",
"time-grunt": "~0.3.1"
},

@@ -48,2 +53,5 @@ "repository": {

},
"bin": {
"random": "bin/random"
},
"licenses": [

@@ -50,0 +58,0 @@ {

# Mock.js
<!-- 模拟请求 & 模拟数据 -->
[![Build Status](https://api.travis-ci.org/nuysoft/Mock.png?branch=master)](http://travis-ci.org/nuysoft/Mock)
[![GitHub version](https://badge.fury.io/gh/nuysoft%2FMock.png)](http://badge.fury.io/gh/nuysoft%2FMock)
[![NPM version](https://badge.fury.io/js/mockjs.png)](http://badge.fury.io/js/mockjs)
[![Dependency Status](https://gemnasium.com/nuysoft/Mock.png)](https://gemnasium.com/nuysoft/Mock)
[![Bower version](https://badge.fury.io/bo/mockjs.png)](http://badge.fury.io/bo/mockjs)
[![Views in the last 24 hours](https://sourcegraph.com/api/repos/github.com/nuysoft/Mock/counters/views-24h.png)](https://github.com/nuysoft/Mock/)
<!-- [![Coverage Status](https://coveralls.io/repos/nuysoft/Mock/badge.png)](https://coveralls.io/r/nuysoft/Mock) -->

@@ -16,7 +23,2 @@ Mock.js is a simulation data generator to help the front-end to develop and prototype separate from the back-end progress and reduce some monotony particularly while writing automated tests.

[![Build Status](https://api.travis-ci.org/nuysoft/Mock.png?branch=master)](http://travis-ci.org/nuysoft/Mock)
[![NPM version](https://badge.fury.io/js/mockjs.png)](http://badge.fury.io/js/mockjs)
[![Dependency Status](https://gemnasium.com/nuysoft/Mock.png)](https://gemnasium.com/nuysoft/Mock)
<!-- [![Coverage Status](https://coveralls.io/repos/nuysoft/Mock/badge.png)](https://coveralls.io/r/nuysoft/Mock) -->
## Questions?

@@ -31,1 +33,5 @@ If you have any questions, please feel free to ask through [New Issue](https://github.com/nuysoft/Mock/issues/new).

[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/nuysoft/mock/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
/*
Expose Internal API
把 Expose 部分放在代码头部非常直观 <https://github.com/kennethcachia/Background-Check/blob/master/background-check.js>
*/

@@ -42,3 +44,7 @@ Mock.Util = Util

*/
Util.each(['mock', 'components/mock/index', 'mock/dist/mock'], function register(name) {
Util.each([
'mock', 'components/mock/index', 'mock/dist/mock',
'gallery/Mock/0.1.1/index',
'gallery/Mock/0.1.2/index'
], function register(name) {
KISSY.add(name, function(S) {

@@ -45,0 +51,0 @@ Mock.mockjax(S)

@@ -1,2 +0,2 @@

/*
/*!
Mock - 模拟请求 & 模拟数据

@@ -8,4 +8,4 @@ https://github.com/nuysoft/Mock

var Mock = {
version: '0.1.1',
version: '0.1.2',
_mocked: {}
}

@@ -22,8 +22,11 @@ var Random = require('./random'),

1 name, 2 inc, 3 range, 4 decimal
rplaceholder
placeholder(*)
[正则查看工具](http://www.regexper.com/)
*/
var rkey = /(.+)\|(?:\+(\d+)|(\d+-?\d*)?(?:\.(\d+-?\d*))?)/,
rrange = /(\d+)-?(\d+)?/,
rplaceholder = /\\*@([^@#%&()\?\s\/\.]+)(?:\((.+?)\))?/g; // (^(?:.|\r|\n)*?)
rplaceholder = /\\*@([^@#%&()\?\s\/\.]+)(?:\((.*?)\))?/g; // (^(?:.|\r|\n)*?)

@@ -35,44 +38,25 @@ Mock.extend = Util.extend

### Mock.mock()
### Mock.mock( rurl?, rtype?, template|function() )
* Mock.mock(template) 根据数据模板生成模拟数据。
* Mock.mock(rurl, template) 记录数据模板,当拦截到匹配的 Ajax 请求时,生成并返回模拟数据。
根据数据模板生成模拟数据。
参数的含义如下所示:
* 参数 rurl:可选。表示需要拦截的 URL,可以是 URL 字符串或 URL 正则。例如 `/\/domain\/list\.json/`、`'/domian/list.json'`。
* 参数 template:必须。表示数据模板,可以是对象或字符串。例如 `{ 'data|1-10':[{}] }`、`'@EMAIL'`。
数据模板中的每个属性由 3 部分构成,以 `'data|1-10':[{}]` 为例:
* 属性名:例如 `data`。
* 参数:指示生成数据的规则。例如 `|1-10`,指示生成的数组中含有 1 至 10 个元素。
* 属性值:表示初始值、占位符、类型。例如 `[{}]`,表示属性值一个数组,数组中的元素是 `{}`。属性值中含有占位符时,将被替换为对应的随机数据,例如 `'email': '@EMAIL'`,`'@EMAIL'`将被替换为随机生成的邮件地址。
参数和属性值部分的语法规范和示例如下:
* `'data|1-10':[{}]` 构造一个数组,含有 1-10 个元素
* `'data|1':[item, item, item]` 从数组中随机挑选一个元素做为属性值
* `'id|+1': 1` 属性 id 值自动加一,初始值为 1
* `'grade|1-100': 1` 生成一个 1-100 之间的整数
* `'float|1-10.1-10': 1` 生成一个浮点数,整数部分的范围是 1-10,保留小数点后 1-10 位小数
* `'star|1-10': '★'` 重复 1-10 次
* `'repeat|10': 'A'` 重复 10 次
* `'published|0-1': false` 随机生成一个布尔值
* `'email': '@EMAIL'` 随即生成一个 Email
* `'date': '@DATE'` 随即生成一段日期字符串,默认格式为 yyyy-MM-dd
* `'time': '@TIME'` 随机生成一段时间字符串,默认格式为 HH:mm:ss
* `'datetime': '@DATETIME'` 随机生成一段时间字符串,默认格式为 yyyy-MM-dd HH:mm:ss
Mock.js 的 [在线编辑器](http://nuysoft.com/project/mock/demo/mock.html) 演示了完整的语法规范和占位符。
下面是 Mock.mock() 的两种参数格式以及规则的使用示例:
<iframe width="100%" height="300" src="http://jsfiddle.net/VRjgz/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<iframe width="100%" height="300" src="http://jsfiddle.net/n8D6k/embedded/js,html,result" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
* Mock.mock( template )
* Mock.mock( rurl, template )
* Mock.mock( rurl, function() )
* Mock.mock( rurl, rtype, template )
* Mock.mock( rurl, rtype, function() )
*/
Mock.mock = function(rurl, template) {
if (arguments.length === 1) return Handle.gen(rurl)
Mock._mocked[rurl] = {
Mock.mock = function(rurl, rtype, template) {
// Mock.mock(template)
if (arguments.length === 1) {
return Handle.gen(rurl)
}
// Mock.mock(rurl, template)
if (arguments.length === 2) {
template = rtype
rtype = undefined
}
Mock._mocked[rurl + (rtype || '')] = {
rurl: rurl,
rtype: rtype,
template: template

@@ -87,5 +71,7 @@ }

Handle.gen = function(template, name, obj) {
var parameters = (name = name || '').match(rkey),
Handle.rule = function(name) {
name = (name || '') + ''
var parameters = (name || '').match(rkey),
range = parameters && parameters[3] && parameters[3].match(rrange),

@@ -103,25 +89,66 @@ min = range && parseInt(range[1], 10), // || 1

point = parameters && parameters[4],
type = Util.type(template),
result;
point = parameters && parameters[4];
return {
parameters: parameters,
range: range,
min: min,
max: max,
count: count,
decimal: decimal,
dmin: dmin,
dmax: dmax,
dcount: dcount,
point: point
}
}
/*
template 属性值(即数据模板)
name 属性名
context 数据上下文,生成后的数据
templateContext 模板上下文,
Handle.gen(template, name, options)
context
currentContext, templateCurrentContext,
path, templatePath
root, templateRoot
*/
Handle.gen = function(template, name, context) {
name = name = (name || '') + ''
context = context || {}
context = {
// 当前访问路径,只有属性名,不包括生成规则
path: context.path || [],
templatePath: context.templatePath || [],
// 最终属性值的上下文
currentContext: context.currentContext,
// 属性值模板的上下文
templateCurrentContext: context.templateCurrentContext || template,
root: context.root,
templateRoot: context.templateRoot
}
// console.log('path:', path.join('.'), template)
var rule = Handle.rule(name)
var type = Util.type(template)
if (Handle[type]) {
result = Handle[type]({
return Handle[type]({
// 属性值类型
type: type,
// 属性值模板
template: template,
// 属性名 + 生成规则
name: name,
obj: obj,
// 属性名
parsedName: name ? name.replace(rkey, '$1') : name,
parameters: parameters,
range: range,
min: min,
max: max,
count: count,
decimal: decimal,
dmin: dmin,
dmax: dmax,
dcount: dcount,
point: point
// 解析后的生成规则
rule: rule,
// 相关上下文
context: context
})
return result
}

@@ -136,33 +163,32 @@ return template

// 'arr': [{ 'email': '@EMAIL' }, { 'email': '@EMAIL' }]
if (!options.parameters) {
if (!options.rule.parameters) {
for (i = 0; i < options.template.length; i++) {
result.push(Handle.gen(options.template[i]))
options.context.path.push(i)
result.push(
Handle.gen(options.template[i], i, {
currentContext: result,
templateCurrentContext: options.template,
path: options.context.path
})
)
options.context.path.pop()
}
} else {
// 'method|1': ['GET', 'POST', 'HEAD', 'DELETE']
if (options.count === 1 && options.template.length > 1) {
//
/*
对备选元素不再做解析?为什么呢?应该解析!!!
例如下面的数据模板,希望从数组中选取一个元素作为属性值:
{
'opt|1': [{
method: 'GET'
}, {
method: 'POST'
}, {
method: 'HEAD'
}, {
method: 'DELETE'
}
]
}
如果对备选元素不做解析,则返回的是备选元素之一;如果对备选元素进行解析,则会返回备选元素之一的副本,因此需要特别注意。
*/
result = Random.pick(Handle.gen(options.template))
if (options.rule.count === 1 && options.template.length > 1) {
// fix #17
options.context.path.push(options.name)
result = Random.pick(Handle.gen(options.template, undefined, {
currentContext: result,
templateCurrentContext: options.template,
path: options.context.path
}))
options.context.path.pop()
} else {
// 'data|1-10': [{}]
for (i = 0; i < options.count; i++) {
for (i = 0; i < options.rule.count; i++) {
// 'data|1-10': [{}, {}]
j = 0
do {
// 'data|1-10': []
result.push(Handle.gen(options.template[j++]))

@@ -176,10 +202,38 @@ } while (j < options.template.length)

object: function(options) {
var result = {}, key, inc;
for (key in options.template) {
result[key.replace(rkey, '$1')] = Handle.gen(options.template[key], key, result)
// 'id|+1': 1
inc = key.match(rkey)
if (inc && inc[2] && Util.type(options.template[key]) === 'number') {
options.template[key] += parseInt(inc[2], 10)
var result = {}, keys, key, parsedKey, inc, i;
// 'obj|min-max': {}
if (options.rule.min) {
keys = Util.keys(options.template)
keys = Random.shuffle(keys)
keys = keys.slice(0, options.rule.count)
for (i = 0; i < keys.length; i++) {
key = keys[i]
parsedKey = key.replace(rkey, '$1')
options.context.path.push(parsedKey)
result[parsedKey] = Handle.gen(options.template[key], key, {
currentContext: result,
templateCurrentContext: options.template,
path: options.context.path
})
options.context.path.pop()
}
} else {
// 'obj': {}
for (key in options.template) {
parsedKey = key.replace(rkey, '$1')
options.context.path.push(parsedKey)
result[parsedKey] = Handle.gen(options.template[key], key, {
currentContext: result,
templateCurrentContext: options.template,
path: options.context.path
})
options.context.path.pop()
// 'id|+1': 1
inc = key.match(rkey)
if (inc && inc[2] && Util.type(options.template[key]) === 'number') {
options.template[key] += parseInt(inc[2], 10)
}
}
}

@@ -190,3 +244,3 @@ return result

var result, parts, i;
if (options.point) { // float
if (options.rule.point) { // float
options.template += ''

@@ -198,5 +252,5 @@ parts = options.template.split('.')

// 'float4|.3-10': 123.123,
parts[0] = options.range ? options.count : parts[0]
parts[1] = (parts[1] || '').slice(0, options.dcount)
for (i = 0; parts[1].length < options.dcount; i++) {
parts[0] = options.rule.range ? options.rule.count : parts[0]
parts[1] = (parts[1] || '').slice(0, options.rule.dcount)
for (i = 0; parts[1].length < options.rule.dcount; i++) {
parts[1] += Random.character('number')

@@ -207,3 +261,3 @@ }

// 'grade1|1-100': 1,
result = options.range && !options.parameters[2] ? options.count : options.template
result = options.rule.range && !options.rule.parameters[2] ? options.rule.count : options.template
}

@@ -216,3 +270,3 @@ return result

// 'prop|probability-probability': false, 当前值与相反值的概率
result = options.parameters ? Random.bool(options.min, options.max, options.template) : options.template
result = options.rule.parameters ? Random.bool(options.rule.min, options.rule.max, options.template) : options.template
return result

@@ -225,3 +279,3 @@ },

// 'star|1-5': '★',
for (i = 0; i < options.count; i++) {
for (i = 0; i < options.rule.count; i++) {
result += options.template

@@ -238,4 +292,8 @@ }

}
phed = Handle.placeholder(ph, options.obj)
if (placeholders.length === 1 && ph === result) { //
phed = Handle.placeholder(ph, options.context.currentContext, options.context.templateCurrentContext)
// 只有一个占位符,并且没有其他字符
if (placeholders.length === 1 && ph === result && typeof phed !== typeof result) { //
result = phed
break
if (Util.isNumeric(phed)) {

@@ -257,5 +315,8 @@ result = parseFloat(phed, 10)

// 'ASCII': '',
result = options.range ? Random.string(options.count) : options.template
result = options.rule.range ? Random.string(options.rule.count) : options.template
}
return result
},
'function': function(options) {
return options.template.call(options.context.currentContext)
}

@@ -270,3 +331,3 @@ })

},
placeholder: function(placeholder, obj) {
placeholder: function(placeholder, obj, templateContext) {
// 1 key, 2 params

@@ -278,5 +339,25 @@ rplaceholder.exec('')

okey = this._all()[lkey],
params = parts && parts[2] ? parts[2].split(/,\s*/) : []
params = parts && parts[2] || ''
try {
/* jshint -W061 */
eval('!function(){ params = [].splice.call(arguments, 0 ) }(' + params + ')')
} catch (e) {
params = parts[2].split(/,\s*/);
}
if (obj && (key in obj)) return obj[key]
if (templateContext &&
(typeof templateContext === 'object') &&
(key in templateContext) &&
(placeholder !== templateContext[key]) // fix #15 避免自己依赖自己
) {
templateContext[key] = Handle.gen(templateContext[key], key, {
currentContext: obj,
templateCurrentContext: templateContext
})
return templateContext[key]
}
if (!(key in Random) && !(lkey in Random) && !(okey in Random)) return placeholder

@@ -283,0 +364,0 @@

@@ -137,7 +137,7 @@ var Mock = require('./mock'),

/*
name 字符串,属性名
options 字符串或对象,数据模板
context 父节点,任意值
def 默认值
*/
name 字符串,属性名
options 字符串或对象,数据模板
context 父节点,任意值
def 默认值
*/
Handle.val = function(name, options, context, def) {

@@ -160,4 +160,4 @@ if (name !== options.__path[options.__path.length - 1]) throw new Error(name + '!==' + options.__path)

/*
AST
*/
AST
*/

@@ -199,5 +199,5 @@ Handle.program = function(node, context, options, helpers, partials) {

/*
node.id.type === 'DATA'
eg @index,放到 DATA 中处理 TODO
*/
node.id.type === 'DATA'
eg @index,放到 DATA 中处理 TODO
*/
}

@@ -391,3 +391,3 @@ if (context.length > contextLength) context.splice(0, context.length - contextLength)

var params = node.mustache.params,
i, j, cur, val, def, type,
i, j, cur, val, parts, def, type,
currentContext = context[0];

@@ -394,0 +394,0 @@

@@ -68,2 +68,5 @@ var KISSY = require('kissy'),

node.type = node.type
// for (var n in node) node[n] = node[n]
if (this[node.type] === Util.noop) return

@@ -289,21 +292,21 @@

Mock4XTpl.additiveExpression = function(node, context, options, helpers, partials, other) {
// TODO 如果参与运算是数值型,默认为整数或浮点数
this.gen(node.op1, context, options, helpers, partials, Util.extend({}, other, {
def: function() {
return node.op2.type === 'number' ?
node.op2.value.indexOf('.') > -1 ?
Random.float(-Math.pow(10, 10), Math.pow(10, 10), 1, Math.pow(10, 6)) :
Random.integer() :
undefined
}()
}))
this.gen(node.op2, context, options, helpers, partials, Util.extend({}, other, {
def: function() {
return node.op1.type === 'number' ?
node.op1.value.indexOf('.') > -1 ?
Random.float(-Math.pow(10, 10), Math.pow(10, 10), 1, Math.pow(10, 6)) :
Random.integer() :
undefined
}()
}))
// TODO 如果参与运算是数值型,默认为整数或浮点数
this.gen(node.op1, context, options, helpers, partials, Util.extend({}, other, {
def: function() {
return node.op2.type === 'number' ?
node.op2.value.indexOf('.') > -1 ?
Random.float(-Math.pow(10, 10), Math.pow(10, 10), 1, Math.pow(10, 6)) :
Random.integer() :
undefined
}()
}))
this.gen(node.op2, context, options, helpers, partials, Util.extend({}, other, {
def: function() {
return node.op1.type === 'number' ?
node.op1.value.indexOf('.') > -1 ?
Random.float(-Math.pow(10, 10), Math.pow(10, 10), 1, Math.pow(10, 6)) :
Random.integer() :
undefined
}()
}))
}

@@ -310,0 +313,0 @@

@@ -7,24 +7,8 @@ var Mock = require('./mock');

覆盖(拦截) Ajax 请求,目前内置支持 jQuery、KISSY。
覆盖(拦截) Ajax 请求,目前内置支持 jQuery、Zepto、KISSY。
对 jQuery Ajax 请求的拦截和响应,通过覆盖前置过滤器、选项 dataFilter 以及数据转换器实现,实现代码请问[这里]()。
对 KISSY Ajax 请求的拦截和响应,则通过粗鲁地覆盖 KISSY.io(options) 实现,实现代码请问[这里]()。
因为第三库 Ajax 的实现方式不尽相同,故目前只内置支持了实际开发中(本人和本人所服务的阿里) 常用的 jQuery 和 KISSY。如果需要拦截其他第三方库的 Ajax 请求,可参考对 jQuery 和 KISSY 的实现,覆盖 Mock.mockjax(library)。
通过方法 Mock.mock(rurl, template) 设置的 URL 和数据模板的映射,均记录在属性 Mock._mocked 中,扩展时可从中获取 URL 对应的数据模板,进而生成和响应模拟数据。Mock._mocked 的数据结构为:
{
rurl.toString(): {
rurl: rurl,
template: template
},
...
}
如果业务和场景需要,可以联系 [@墨智]()、[nuysoft](nuysoft@gmail.com) 提供对特定库的内置支持,不过最酷的做法是开发人员能够为 Mock.js 贡献代码。
*/
// for jQuery
Mock.mockjax = function mockjax(jQuery) {
function mockxhr() {

@@ -40,27 +24,35 @@ return {

function convert(mock) {
function convert(item, options) {
return function() {
return Mock.mock(mock.template)
return jQuery.isFunction(item.template) ?
item.template(options) : Mock.mock(item.template)
}
}
function prefilter(options) {
for (var surl in Mock._mocked) {
var mock = Mock._mocked[surl]
function prefilter(options, originalOptions, jqXHR) {
if (jQuery.type(mock.rurl) === 'string') {
if (mock.rurl !== options.url) continue
function match(expected, actual) {
if (jQuery.type(expected) === 'string') {
return expected === actual
}
if (jQuery.type(mock.rurl) === 'regexp') {
if (!mock.rurl.test(options.url)) continue
if (jQuery.type(expected) === 'regexp') {
return expected.test(actual)
}
}
options.dataFilter = convert(mock)
options.converters['text json'] = convert(mock)
options.xhr = mockxhr
break
for (var sUrlType in Mock._mocked) {
var item = Mock._mocked[sUrlType]
if (
(!item.rurl || match(item.rurl, options.url)) &&
(!item.rtype || match(item.rtype, options.type.toLowerCase()))
) {
options.dataFilter = convert(item, options)
options.converters['text json'] = convert(item, options)
options.converters['text jsonp'] = convert(item, options)
options.xhr = mockxhr
break
}
}
}
jQuery.ajaxPrefilter("*", prefilter)
jQuery.ajaxPrefilter("json", prefilter)

@@ -74,2 +66,49 @@ jQuery.ajaxPrefilter("jsonp", prefilter)

/*
for Zepto
因为 Zepto 并没有实现类似 jQuery.ajaxPrefilter 等预处理函数,所以将和 KISSY 类似直接粗暴处理。
*/
if (typeof Zepto != 'undefined') {
Mock.mockjax = function(Zepto) {
var __original_ajax = Zepto.ajax
var xhr = {
readyState: 4,
responseText: '',
responseXML: null,
state: 2,
status: 200,
statusText: "success",
timeoutTimer: null
}
/**
* @param options
* return xhr
*/
Zepto.ajax = function(options) {
for (var surl in Mock._mocked) {
var mock = Mock._mocked[surl]
if (Zepto.type(mock.rurl) === 'string') {
if (mock.rurl !== options.url) continue
}
if (Zepto.type(mock.rurl) === 'regexp') {
if (!mock.rurl.test(options.url)) continue
}
console.log('[mock]', options.url, '>', mock.rurl)
var data = Mock.mock(mock.template)
console.log('[mock]', data)
if (options.success) options.success(data, xhr, options)
if (options.complete) options.complete(xhr.status, xhr, options)
return xhr
}
return __original_ajax.call(Zepto, options)
}
}
Mock.mockjax(Zepto)
}
// for KISSY

@@ -112,4 +151,9 @@ if (typeof KISSY != 'undefined' && KISSY.add) {

}
// 还原 KISSY.io 上的属性
for (var name in _original_ajax) {
KISSY.io[name] = _original_ajax[name]
}
}
}
// END(BROWSER)

@@ -356,2 +356,4 @@ var Util = require('./util');

start = +start, stop = +stop, step = +step
var len = Math.max(Math.ceil((stop - start) / step), 0);

@@ -430,3 +432,4 @@ var idx = 0;

return date.getHours() < 12 ? 'am' : 'pm'
}
},
T: 'getTime'
}

@@ -575,2 +578,44 @@ })

return this.format(this.randomDate(), format)
},
/*
Ranndom.now(unit, format)
Ranndom.now()
Ranndom.now(unit)
Ranndom.now(format)
参考自 http://momentjs.cn/docs/#/manipulating/start-of/
*/
now: function(unit, format) {
if (arguments.length === 1) {
if (!/year|month|week|day|hour|minute|second|week/.test(unit)) {
format = unit
unit = ''
}
}
unit = (unit || '').toLowerCase()
format = format || 'yyyy-MM-dd HH:mm:ss'
var date = new Date()
/* jshint -W086 */
switch (unit) {
case 'year':
date.setMonth(0)
case 'month':
date.setDate(1)
case 'week':
case 'day':
date.setHours(0)
case 'hour':
date.setMinutes(0)
case 'minute':
date.setSeconds(0)
case 'second':
date.setMilliseconds(0)
}
switch (unit) {
case 'week':
date.setDate(date.getDate() - date.getDay())
}
return this.format(date, format)
}

@@ -583,11 +628,11 @@ })

ad_size: [
'300x250', '250x250', '240x400', '336x280', '180x150',
'720x300', '468x60', '234x60', '88x31', '120x90',
'120x60', '120x240', '125x125', '728x90', '160x600',
'120x600', '300x600'
'300x250', '250x250', '240x400', '336x280', '180x150',
'720x300', '468x60', '234x60', '88x31', '120x90',
'120x60', '120x240', '125x125', '728x90', '160x600',
'120x600', '300x600'
],
screen_size: [
'320x200', '320x240', '640x480', '800x480', '800x480',
'1024x600', '1024x768', '1280x800', '1440x900', '1920x1200',
'2560x1600'
'320x200', '320x240', '640x480', '800x480', '800x480',
'1024x600', '1024x768', '1280x800', '1440x900', '1920x1200',
'2560x1600'
],

@@ -597,3 +642,3 @@ video_size: ['720x480', '768x576', '1280x720', '1920x1080'],

##### Random.img(size, background, foreground, format, text)
* Random.img()

@@ -844,8 +889,9 @@ * Random.img(size)

},
dataImageHolder: function(size) {
return 'holder.js/' + size
},
/*
https://github.com/imsky/holder
Holder renders image placeholders entirely on the client side.
dataImageHolder: function(size) {
return 'holder.js/' + size
},
*/

@@ -920,3 +966,3 @@ dataImage: function(size, text) {

capitalize: function(word) {
return word.charAt(0).toUpperCase() + word.substr(1)
return (word + '').charAt(0).toUpperCase() + (word + '').substr(1)
},

@@ -936,3 +982,3 @@ /*

upper: function(str) {
return str.toUpperCase()
return (str + '').toUpperCase()
},

@@ -950,3 +996,3 @@ /*

lower: function(str) {
return str.toLowerCase()
return (str + '').toLowerCase()
},

@@ -966,2 +1012,3 @@ /*

pick: function(arr) {
arr = arr || []
return arr[this.natural(0, arr.length - 1)]

@@ -983,2 +1030,3 @@ },

shuffle: function(arr) {
arr = arr || []
var old = arr.slice(0),

@@ -1185,17 +1233,17 @@ result = [],

"James", "John", "Robert", "Michael", "William",
"David", "Richard", "Charles", "Joseph", "Thomas",
"Christopher", "Daniel", "Paul", "Mark", "Donald",
"George", "Kenneth", "Steven", "Edward", "Brian",
"Ronald", "Anthony", "Kevin", "Jason", "Matthew",
"Gary", "Timothy", "Jose", "Larry", "Jeffrey",
"Frank", "Scott", "Eric"
"David", "Richard", "Charles", "Joseph", "Thomas",
"Christopher", "Daniel", "Paul", "Mark", "Donald",
"George", "Kenneth", "Steven", "Edward", "Brian",
"Ronald", "Anthony", "Kevin", "Jason", "Matthew",
"Gary", "Timothy", "Jose", "Larry", "Jeffrey",
"Frank", "Scott", "Eric"
].concat([
// female
"Mary", "Patricia", "Linda", "Barbara", "Elizabeth",
"Jennifer", "Maria", "Susan", "Margaret", "Dorothy",
"Lisa", "Nancy", "Karen", "Betty", "Helen",
"Sandra", "Donna", "Carol", "Ruth", "Sharon",
"Michelle", "Laura", "Sarah", "Kimberly", "Deborah",
"Jessica", "Shirley", "Cynthia", "Angela", "Melissa",
"Brenda", "Amy", "Anna"
"Jennifer", "Maria", "Susan", "Margaret", "Dorothy",
"Lisa", "Nancy", "Karen", "Betty", "Helen",
"Sandra", "Donna", "Carol", "Ruth", "Sharon",
"Michelle", "Laura", "Sarah", "Kimberly", "Deborah",
"Jessica", "Shirley", "Cynthia", "Angela", "Melissa",
"Brenda", "Amy", "Anna"
])

@@ -1219,9 +1267,9 @@ return this.pick(names)

var names = [
"Smith", "Johnson", "Williams", "Brown", "Jones",
"Miller", "Davis", "Garcia", "Rodriguez", "Wilson",
"Martinez", "Anderson", "Taylor", "Thomas", "Hernandez",
"Moore", "Martin", "Jackson", "Thompson", "White",
"Lopez", "Lee", "Gonzalez", "Harris", "Clark",
"Lewis", "Robinson", "Walker", "Perez", "Hall",
"Young", "Allen"
"Smith", "Johnson", "Williams", "Brown", "Jones",
"Miller", "Davis", "Garcia", "Rodriguez", "Wilson",
"Martinez", "Anderson", "Taylor", "Thomas", "Hernandez",
"Moore", "Martin", "Jackson", "Thompson", "White",
"Lopez", "Lee", "Gonzalez", "Harris", "Clark",
"Lewis", "Robinson", "Walker", "Perez", "Hall",
"Young", "Allen"
]

@@ -1372,10 +1420,10 @@ return this.pick(names)

regions: [
'110000 北京市', '120000 天津市', '130000 河北省', '140000 山西省', '150000 内蒙古自治区',
'210000 辽宁省', '220000 吉林省', '230000 黑龙江省',
'310000 上海市', '320000 江苏省', '330000 浙江省', '340000 安徽省', '350000 福建省', '360000 江西省', '370000 山东省',
'410000 河南省', '420000 湖北省', '430000 湖南省', '440000 广东省', '450000 广西壮族自治区', '460000 海南省',
'500000 重庆市', '510000 四川省', '520000 贵州省', '530000 云南省', '540000 西藏自治区',
'610000 陕西省', '620000 甘肃省', '630000 青海省', '640000 宁夏回族自治区', '650000 新疆维吾尔自治区', '650000 新疆维吾尔自治区',
'710000 台湾省',
'810000 香港特别行政区', '820000 澳门特别行政区'
'110000 北京市', '120000 天津市', '130000 河北省', '140000 山西省', '150000 内蒙古自治区',
'210000 辽宁省', '220000 吉林省', '230000 黑龙江省',
'310000 上海市', '320000 江苏省', '330000 浙江省', '340000 安徽省', '350000 福建省', '360000 江西省', '370000 山东省',
'410000 河南省', '420000 湖北省', '430000 湖南省', '440000 广东省', '450000 广西壮族自治区', '460000 海南省',
'500000 重庆市', '510000 四川省', '520000 贵州省', '530000 云南省', '540000 西藏自治区',
'610000 陕西省', '620000 甘肃省', '630000 青海省', '640000 宁夏回族自治区', '650000 新疆维吾尔自治区', '650000 新疆维吾尔自治区',
'710000 台湾省',
'810000 香港特别行政区', '820000 澳门特别行政区'
],

@@ -1508,6 +1556,6 @@ /*

rank = [
"7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"
"7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"
],
last = [
"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"
"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"
];

@@ -1525,2 +1573,32 @@

return id
},
/*
自增主键
auto increment primary key
##### Random.increment()
生成一个全局的自增整数。
* Random.increment(step)
参数的含义和默认值如下所示:
* 参数 step:可选。整数自增的步长。默认值为 1。
使用示例如下所示:
Random.increment()
// => 1
Random.increment(100)
// => 101
Random.increment(1000)
// => 1101
*/
autoIncrementInteger: 0,
increment: function(step) {
return this.autoIncrementInteger += (+step || 1)
},
inc: function(step) {
return this.increment(step)
}

@@ -1527,0 +1605,0 @@ })

@@ -12,3 +12,3 @@ // BEGIN(BROWSER)

length = arguments.length,
options, name, src, copy
options, name, src, copy, clone

@@ -66,3 +66,3 @@ if (length === 1) {

Util.each('String Object Array'.split(' '), function(value) {
Util.each('String Object Array RegExp Function'.split(' '), function(value) {
Util['is' + value] = function(obj) {

@@ -78,5 +78,20 @@ return Util.type(obj) === value.toLowerCase()

Util.isNumeric = function(value) {
return !isNaN(parseFloat(value)) && isFinite(value);
return !isNaN(parseFloat(value)) && isFinite(value)
}
Util.keys = function(obj) {
var keys = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) keys.push(key)
}
return keys;
}
Util.values = function(obj) {
var values = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) values.push(obj[key])
}
return values;
}
/*

@@ -105,2 +120,5 @@ ### Mock.heredoc(fn)

Util.heredoc = function heredoc(fn) {
// 1. 移除起始的 function(){ /*!
// 2. 移除末尾的 */ }
// 3. 移除起始和末尾的空格
return fn.toString()

@@ -107,0 +125,0 @@ .replace(/^[^\/]+\/\*!?/, '')

var Mock = require('../../src/mock'),
Random = require('../../src/random'),
Util = require('../../src/util'),
Print = require('node-print'),
$ = require('jquery'),
util = require('util');
util = require('util'),
_ = require('underscore');

@@ -13,2 +15,16 @@ require('../../src/mockjax')

// http://www.network-science.de/ascii/ doom
console.log(Util.heredoc(function() {
/*
___ ___ _ _
| \/ | | | (_)
| . . | ___ ___ | | __ _ ___
| |\/| | / _ \ / __|| |/ / | |/ __|
| | | || (_) || (__ | < _ | |\__ \
\_| |_/ \___/ \___||_|\_\(_)| ||___/
_/ |
|__/
*/
}));
function range(input, min, max) {

@@ -97,5 +113,5 @@ return input >= min && input <= max

exports.testPickObject = function(test) {
exports.testPickObjectFromArray = function(test) {
var tpl = {
'opt|1': [{ // 对备选元素不再做解析
'opt|1': [{ // 对备选元素会再次做解析
method: 'GET'

@@ -113,3 +129,3 @@ }, {

for (var i = 0; i < tpl['opt|1'].length; i++) {
if(data.opt.method === tpl['opt|1'][i].method){
if (data.opt.method === tpl['opt|1'][i].method) {
test.done();

@@ -121,2 +137,24 @@ break;

exports.testPickFromObject = function(test) {
var tpl = {
'pick1|1': {
get: '@URL',
post: '@URL',
head: '@URL',
put: '@URL',
'delete': '@URL'
}
}
tpl['pick2|2'] = tpl['pick1|1']
tpl['pick3|3'] = tpl['pick1|1']
tpl['pick6|6'] = tpl['pick1|1']
var data = Mock.mock(tpl)
test.equal(1, _.keys(data.pick1).length)
test.equal(2, _.keys(data.pick2).length)
test.equal(3, _.keys(data.pick3).length)
test.equal(5, _.keys(data.pick6).length)
test.done()
}
exports.testFloat = function(test) {

@@ -215,2 +253,13 @@ function target(tpl, min, max, dmin, dmax) {

}
exports.testFunction = function(test) {
var tpl = {
prop: 'hello',
fn: function(root, path) {
return this.prop
}
}
var data = Mock.mock(tpl)
test.equal('hello', data.fn)
test.done()
}
exports.testHolder = function(test) {

@@ -288,12 +337,4 @@ test.ok(rEmail.test(Mock.mock('@EMAIL')))

exports.testRequest = function(test) {
var count = 0,
i, jqxhr;
var count = 0;
Mock.mock(/\.json/, {
'list|1-10': [{
'id|+1': 1,
'email': '@EMAIL'
}]
})
function validator(data) {

@@ -307,6 +348,2 @@ test.ok(data.list)

}
if (false) {
console.log();
Print.pt(data.list)
}
}

@@ -323,12 +360,152 @@

// 拦截所有 .json 请求
Mock.mock(/hello.json/, {
'list|1-10': [{
'id|+1': 1,
'email': '@EMAIL'
}]
})
for (i = 0; i < 1000; i++) {
jqxhr = $.ajax({
url: 'data.json',
$.ajax({
url: 'hello.json',
dataType: 'json'
})
jqxhr.done(success)
.complete(complete)
}).done(success).complete(complete)
}
}
exports.testRequestType = function(test) {
var count = 0;
function success(data) {
count++
}
function complete() {
if (count === 2) test.done()
}
Mock.mock(/type.json/, 'get', {
'list|1-10': [{
'id|+1': 1,
'email': '@EMAIL',
type: 'get'
}]
})
Mock.mock(/type.json/, 'post', {
'list|1-10': [{
'id|+1': 1,
'email': '@EMAIL',
type: 'post'
}]
})
$.ajax({
url: 'type.json',
type: 'get',
dataType: 'json'
}).done(function(data) {
success(data)
test.equal(data.list[0].type, 'get')
}).complete(complete)
$.ajax({
url: 'type.json',
type: 'post',
dataType: 'json'
}).done(function(data) {
success(data)
test.equal(data.list[0].type, 'post')
}).complete(complete)
}
exports.testRequestFunction = function(test) {
var count = 0;
function success(data) {
count++
}
function complete() {
if (count === 2) test.done()
}
Mock.mock(/fn\.json/, function() {
return {
type: 'fn'
}
})
$.ajax({
url: 'fn.json',
dataType: 'json'
}).done(function(data) {
success(data)
test.equal(data.type, 'fn')
}).complete(complete)
$.ajax({
url: 'fn.json',
dataType: 'json'
}).done(function(data) {
success(data)
test.equal(data.type, 'fn')
}).complete(complete)
}
exports.testRequestTypeFunction = function(test) {
Mock._mocked = {}
var count = 0;
function success(data) {
count++
}
function complete() {
if (count === 3) test.done()
}
Mock.mock(/fn\.json/, /get/, function() {
return {
type: 'get'
}
})
Mock.mock(/fn\.json/, /post|put/, function(options) {
return {
type: options.type.toLowerCase()
}
})
$.ajax({
url: 'fn.json',
type: 'get',
dataType: 'json'
}).done(function(data) {
success(data)
test.equal(data.type, 'get')
}).complete(complete)
$.ajax({
url: 'fn.json',
type: 'post',
dataType: 'json'
}).done(function(data) {
success(data)
test.equal(data.type, 'post')
}).complete(complete)
$.ajax({
url: 'fn.json',
type: 'put',
dataType: 'json'
}).done(function(data) {
success(data)
test.equal(data.type, 'put')
}).complete(complete)
}
exports.testRandom = function(test) {

@@ -377,2 +554,30 @@ function t(name, result, validator) {

t('datetime("y-M-d H:m:s")', Random.datetime("y-M-d H:m:s"))
// yyyy-MM-dd HH:mm:ss
t('now("year")', Random.now('year'), function(result) {
return Random.format(new Date(), 'yyyy-01-01 00:00:00') === result
})
t('now("month")', Random.now('month'), function(result) {
return Random.format(new Date(), 'yyyy-MM-01 00:00:00') === result
})
t('now("day")', Random.now('day'), function(result) {
return Random.format(new Date(), 'yyyy-MM-dd 00:00:00') === result
})
t('now("hour")', Random.now('hour'), function(result) {
return Random.format(new Date(), 'yyyy-MM-dd HH:00:00') === result
})
t('now("minute")', Random.now('minute'), function(result) {
return Random.format(new Date(), 'yyyy-MM-dd HH:mm:00') === result
})
t('now("second")', Random.now('second', 'yyyy-MM-dd HH:mm:ss SS'), function(result) {
return Random.format(new Date(), 'yyyy-MM-dd HH:mm:ss 000') === result
})
t('now("week")', Random.now('week', 'yyyy-MM-dd HH:mm:ss SS'), function(result) {
var date = new Date()
date.setDate(date.getDate() - date.getDay())
return Random.format(date, 'yyyy-MM-dd 00:00:00 000') === result
})
t('now("yyyy-MM-dd HH:mm:ss SS")', Random.now("yyyy-MM-dd HH:mm:ss SS"), function(result) {
test.equal(Random.format(new Date(), 'yyyy-MM-dd HH:mm:ss SS'), result)
return true
})

@@ -469,2 +674,20 @@ // Image

test.done()
}
exports.test_increment = function(test) {
test.equal(Random.increment(1), 1)
test.equal(Random.increment(2), 3)
test.equal(Random.increment(3), 6)
test.done()
}
exports.test_reference = function(test) {
var tpl = {
name: '@first @last',
first: 'fffff',
last: 'lllll'
}
var data = Mock.mock(tpl)
test.equal(data.name, 'fffff lllll')
test.done()
}

@@ -65,10 +65,18 @@ var Mock4XTpl = require('../../src/mock4xtpl'),

tpl = 'this is {{title}}!'
// Mock4XTpl._.debug = true
tpl = 'this is {{title}} {{a.b.c}}!'
// Mock4XTpl.debug = true
ast = XTemplate.compiler.parse(tpl)
data = Mock4XTpl.mock(tpl)
// Mock4XTpl._.debug = false
data = Mock4XTpl.mock(ast || tpl)
// Mock4XTpl.debug = false
// console.log(JSON.stringify(ast, null, 4));
// console.log(JSON.stringify(data, null, 4))
// XTemplate.compiler._parse = XTemplate.compiler.parse
// XTemplate.compiler.parse = function(){
// return ast
// }
// console.log(new XTemplate(tpl).render(data))
// XTemplate.compiler.parse = XTemplate.compiler._parse
// delete XTemplate.compiler._parse
test.equal(data.title, 'title')

@@ -982,3 +990,3 @@ test.done()

data.data.forEach(function(item){
data.data.forEach(function(item) {
test.equal(item.name, 'name')

@@ -985,0 +993,0 @@ })

@@ -5,7 +5,7 @@ # TODO

1. √ 占位符:支持转义 `@`
1. 50% 在测试用例增加期望的断言个数
1. √ 在测试用例增加期望的断言个数
1. {{#}} {{^}} 的冲突
1. 嵌套占位符:支持设置参数
1. √ 嵌套占位符:支持设置参数
1. √ 嵌套占位符:支持为不同路径设置不同的占位符
1. 增加对 URL 中参数 mock 的判断
1. √ 文档:如何扩展占位符

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc