Comparing version 1.3.0 to 2.0.0
[English](./CHANGELOG.md) | 简体中文 | ||
#### v2.0.0 (2016-06-05) | ||
- 【特性】完全重构,支持自定义插件,请查阅[插件:入门](./doc/plugin_getting_started_CN.md)。 | ||
- 【特性】支持手动输入、执行命令行 | ||
- 【特性】支持打印循环引用的对象 | ||
- 【特性】支持在 Network 面板查看请求的 headers 和 response | ||
- 【优化】开关按钮不会再被拖出屏幕外部 | ||
- 【优化】自动在 System 面板打印 User Agent | ||
- 【优化】打印 log 时会显示时间 | ||
- 【修复】修复 getDate() 返回错误时间的问题 | ||
- 【修复】修复同步 AJAX 变异步 AJAX 的问题 | ||
# v1.x.x | ||
#### v1.3.0 (2016-05-20) | ||
@@ -5,0 +21,0 @@ |
English | [简体中文](./CHANGELOG_CN.md) | ||
#### v2.0.0 (2016-06-05) | ||
- [FEATURE] Rebuild completely, support custom plugin, see [Plugin: Getting Started](./doc/plugin_getting_started.md). | ||
- [FEATURE] Support execute JS command line in Log tab | ||
- [FEATURE] Support circular structure object in Log and System tab | ||
- [FEATURE] Support viewing request headers and response in Network tab | ||
- [IMPROVE] Switch button will not be dragged out of screen | ||
- [IMPROVE] Auto print User Agent in System tab | ||
- [IMPROVE] Show log's time in Log and System tab | ||
- [FIX] Fix issue that getDate() returns a wrong date | ||
- [FIX] Fix issue that sync AJAX becomes async AJAX | ||
# v1.x.x | ||
#### v1.3.0 (2016-05-20) | ||
@@ -5,0 +21,0 @@ |
/*! | ||
* vconsole v1.3.0 (https://github.com/WechatFE/vConsole) | ||
* vconsole v2.0.0 (https://github.com/WechatFE/vConsole) | ||
* Copyright 2016, WechatFE Team | ||
* MIT license | ||
*/ | ||
!function(o,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.vConsole=t():o.vConsole=t()}(this,function(){return function(o){function t(n){if(e[n])return e[n].exports;var i=e[n]={exports:{},id:n,loaded:!1};return o[n].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var e={};return t.m=o,t.c=e,t.p="",t(0)}([function(o,t,e){"use strict";function n(o){return o&&o.__esModule?o:{"default":o}}function i(){var o=this;this.html=k["default"],this.$dom=null,this.activedTab="default",this.tabList=["default","system","network"],this.console={},this.logList=[],this.isReady=!1,this.switchPos={x:10,y:10,startX:0,startY:0,endX:0,endY:0},o._mokeConsole(),o._mokeAjax();var t=function(){o._render(),o._bindEvent(),o._autoRun()};"complete"==document.readyState?t():d(window,"load",t)}function r(o,t){return t?t.querySelector(o):document.querySelector(o)}function c(o,t){var e,n=[];return e=t?t.querySelectorAll(o):document.querySelectorAll(o),e&&e.length>0&&(n=Array.prototype.slice.call(e)),n}function s(o,t){if(o){h(o)||(o=[o]);for(var e=0;e<o.length;e++)o[e].className+=" "+t}}function l(o,t){if(o){h(o)||(o=[o]);for(var e=0;e<o.length;e++){for(var n=o[e].className.split(" "),i=0;i<n.length;i++)n[i]==t&&(n[i]="");o[e].className=n.join(" ")}}}function a(o,t){if(!o)return!1;for(var e=o.className.split(" "),n=0;n<e.length;n++)if(e[n]==t)return!0;return!1}function d(o,t,e,n){if(o){void 0===n&&(n=!1),h(o)||(o=[o]);for(var i=0;i<o.length;i++)o[i].addEventListener(t,e,n)}}function v(o){var t=o>0?new Date(o):new Date,e=t.getDay()<10?"0"+t.getDay():t.getDay(),n=t.getMonth()<9?"0"+(t.getMonth()+1):t.getMonth()+1,i=t.getFullYear(),r=t.getHours()<10?"0"+t.getHours():t.getHours(),c=t.getMinutes()<10?"0"+t.getMinutes():t.getMinutes(),s=t.getSeconds()<10?"0"+t.getSeconds():t.getSeconds(),l=t.getMilliseconds()<10?"0"+t.getMilliseconds():t.getMilliseconds();return 100>l&&(l="0"+l),{time:+t,year:i,month:n,day:e,hour:r,minute:c,second:s,millisecond:l}}function f(o){return document.createElement("a").appendChild(document.createTextNode(o)).parentNode.innerHTML}function p(o,t){var e=o;for(var n in t)e=e.replace("{"+n+"}",t[n]);return e}function u(o){return"[object Number]"==Object.prototype.toString.call(o)}function g(o){return"[object String]"==Object.prototype.toString.call(o)}function h(o){return"[object Array]"==Object.prototype.toString.call(o)}function b(o){return"[object Object]"==Object.prototype.toString.call(o)}function m(o){return"[object Function]"==Object.prototype.toString.call(o)}function _(o,t){o="vConsole_"+o,localStorage.setItem(o,t)}function y(o){return o="vConsole_"+o,localStorage.getItem(o)}Object.defineProperty(t,"__esModule",{value:!0});var w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol?"symbol":typeof o};e(1);var x=e(5),k=n(x),L=e(6),S=n(L);i.prototype._render=function(){var o="#__vconsole";if(!r(o)){var t=document.createElement("div");t.innerHTML=this.html,document.body.appendChild(t.children[0])}this.$dom=r(o);var e=y("switch_x"),n=y("switch_y");e&&n&&(this.switchPos.x=e,this.switchPos.y=n,r(".vc-switch").style.right=e+"px",r(".vc-switch").style.bottom=n+"px")},i.prototype._bindEvent=function(){var o=this,t=r(".vc-switch");d(t,"touchstart",function(t){o.switchPos.startX=t.touches[0].pageX,o.switchPos.startY=t.touches[0].pageY}),d(t,"touchend",function(t){0==o.switchPos.endX&&0==o.switchPos.endY||(o.switchPos.x=o.switchPos.endX,o.switchPos.y=o.switchPos.endY,o.switchPos.startX=0,o.switchPos.startY=0,o.switchPos.endX=0,o.switchPos.endY=0,_("switch_x",o.switchPos.x),_("switch_y",o.switchPos.y))}),d(t,"touchmove",function(e){if(e.touches.length>0){var n=e.touches[0].pageX-o.switchPos.startX,i=e.touches[0].pageY-o.switchPos.startY,r=o.switchPos.x-n,c=o.switchPos.y-i;t.style.right=r+"px",t.style.bottom=c+"px",o.switchPos.endX=r,o.switchPos.endY=c,e.preventDefault()}}),d(r(".vc-switch"),"click",function(){o.show()}),d(r(".vc-hide"),"click",function(){o.hide()}),d(r(".vc-mask"),"click",function(t){return t.target!=r(".vc-mask")?!1:void o.hide()}),d(r(".vc-clear"),"click",function(){o.clearLog(o.activedTab)}),d(c(".vc-tab"),"click",function(t){var e=t.target.dataset.tab;e!=o.activedTab&&o.showTab(e)}),d(c(".vc-log"),"click",function(o){var t=o.target;a(t,"vc-fold-outer")&&(a(t.parentElement,"vc-toggle")?l(t.parentElement,"vc-toggle"):s(t.parentElement,"vc-toggle"),o.preventDefault())})},i.prototype._mokeConsole=function(){if(window.console){var o=this;this.console.log=window.console.log,this.console.info=window.console.info,this.console.warn=window.console.warn,this.console.debug=window.console.debug,this.console.error=window.console.error,window.console.log=function(){o._printLog("auto","log",arguments)},window.console.info=function(){o._printLog("auto","info",arguments)},window.console.warn=function(){o._printLog("auto","warn",arguments)},window.console.debug=function(){o._printLog("auto","debug",arguments)},window.console.error=function(){o._printLog("auto","error",arguments)},window.onerror=function(o,t,e,n,i){var r=i.stack.split("at");r=r[0]+" "+r[1],r=r.replace(location.origin,""),console.error(r)}}},i.prototype._mokeAjax=function(){var o=window.XMLHttpRequest;if(o){var t=window.XMLHttpRequest.prototype.open,e=window.XMLHttpRequest.prototype.send;window.XMLHttpRequest.prototype.open=function(){var o=this,e=arguments;return setTimeout(function(){var t=o.onreadystatechange||function(){};o.onreadystatechange=function(){if(4==o.readyState){o._endTime=+new Date;var n=e[1]||"unknow URL",i=o._endTime-(o._startTime||o._endTime),r="[network]["+o.status+"] ["+i+"ms] "+n;o.status>=200&&o.status<400?console.log(r):console.error(r)}return t.apply(o,arguments)}},0),t.apply(o,e)},window.XMLHttpRequest.prototype.send=function(){var o=this,t=arguments;o._startTime=+new Date,setTimeout(function(){e.apply(o,t)},1)}}},i.prototype._autoRun=function(){for(this.isReady=!0;this.logList.length>0;){var o=this.logList.shift();this._printLog(o.tabName,o.logType,o.logs)}var t=navigator.userAgent,e=[],n=v();this._printLog("system","info",["日志时间:",n.year+"-"+n.month+"-"+n.day+" "+n.hour+":"+n.minute+":"+n.second+" "+n.millisecond]),e=["系统版本:","不明"];var i=t.match(/(ipod).*\s([\d_]+)/i),r=t.match(/(ipad).*\s([\d_]+)/i),c=t.match(/(iphone)\sos\s([\d_]+)/i),s=t.match(/(android)\s([\d\.]+)/i);s?e[1]="Android "+s[2]:c?e[1]="iPhone, iOS "+c[2].replace(/_/g,"."):r?e[1]="iPad, iOS "+r[2].replace(/_/g,"."):i&&(e[1]="iPod, iOS "+i[2].replace(/_/g,".")),this._printLog("system","info",e);var l=t.match(/MicroMessenger\/([\d\.]+)/i);e=["微信版本:","不明"],l&&l[1]&&(e[1]=l[1],this._printLog("system","info",e));var a=t.toLowerCase().match(/ nettype\/([^ ]+)/g);e=["网络类型:","不明"],a&&a[0]&&(a=a[0].split("/"),e[1]=a[1],this._printLog("system","info",e)),e=["网址协议:","不明"],"https:"==location.protocol?e[1]="HTTPS":"http:"==location.protocol?e[1]="HTTP":e[1]=location.protocol.replace(":",""),this._printLog("system","info",e),window.addEventListener("load",function(o){var t=window.performance||window.msPerformance||window.webkitPerformance;if(t&&t.timing){var e=t.timing,n=e.navigationStart;this._printLog("system","info",["连接结束点:",e.connectEnd-n+"ms"]),this._printLog("system","info",["回包结束点:",e.responseEnd-n+"ms"]),e.secureConnectionStart>0&&this._printLog("system","info",["ssl耗时:",e.connectEnd-e.secureConnectionStart+"ms"]),this._printLog("system","info",["dom渲染耗时:",e.domComplete-e.domLoading+"ms"])}})},i.prototype._printLog=function(o,t,e){if(e.length){if(!this.isReady)return void this.logList.push({tabName:o,logType:t,logs:e});for(var n="",i=0;i<e.length;i++)try{n+=m(e[i])?" "+e[i].toString():b(e[i])||h(e[i])?" "+this._getFoldedLine(e[i]):" "+f(e[i]).replace(/\n/g,"<br/>")}catch(c){n+=" ["+w(e[i])+"]"}if("auto"==o){var s=/^ \[(\w+)\]/i,l=n.match(s);null!==l&&l.length>0&&this.tabList.indexOf(l[1])>-1&&(o=l[1],n=n.replace(s,""))}"auto"==o&&(o="default");var a=r("#__vc_log_"+o),d=document.createElement("p");d.className="vc-item vc-item-"+t,d.innerHTML=n,r(".vc-log",a).appendChild(d),r(".vc-content").scrollTop=r(".vc-content").scrollHeight,this.console[t].apply(window.console,e)}},i.prototype._getFoldedLine=function(o,t){function e(o){if(b(o)){var t=Object.keys(o);r+="{\n",s++;for(var n=0;n<t.length;n++){var i=t[n];o.hasOwnProperty(i)&&(r+=Array(s+1).join(l)+'<i class="vc-code-key">'+i+"</i>: ",e(o[i]),n<t.length-1&&(r+=",\n"))}s--,r+="\n"+Array(s+1).join(l)+"}"}else if(h(o)){r+="[\n",s++;for(var n=0;n<o.length;n++)r+=Array(s+1).join(l)+'<i class="vc-code-key">'+n+"</i>: ",e(o[n]),n<o.length-1&&(r+=",\n");s--,r+="\n"+Array(s+1).join(l)+"]"}else r+=g(o)?'<i class="vc-code-string">"'+o+'"</i>':u(o)?'<i class="vc-code-number">'+o+"</i>":JSON.stringify(o)}var n=JSON.stringify(o),i="",r="",c="",s=0,l=" ";c=n.substr(0,30),n.length>30&&(c+="..."),i=Object.prototype.toString.call(o).replace("[object ","").replace("]",""),i+=" "+c,e(o);var a=p(S["default"],{outer:i,inner:r});return a},i.prototype.showTab=function(o){var t=r("#__vc_log_"+o);l(c(".vc-tab",this.$dom),"vc-actived"),s(r("#__vc_tab_"+o),"vc-actived"),l(c(".vc-logbox"),"vc-actived"),s(t,"vc-actived"),r(".vc-content").scrollTop=r(".vc-content").scrollHeight,this.activedTab=o},i.prototype.clearLog=function(o){var t=r("#__vc_log_"+o);r(".vc-log",t).innerHTML=""},i.prototype.show=function(){s(this.$dom,"vc-toggle")},i.prototype.hide=function(){l(this.$dom,"vc-toggle")},i.prototype.ready=function(o){console.warn("vConsole.ready() is deprecated, console.log() can be called at anytime without waiting for ready. This method will be removed at v2.0.0 and later"),o&&o.call(this)},t["default"]=new i,o.exports=t["default"]},function(o,t,e){var n=e(2);"string"==typeof n&&(n=[[o.id,n,""]]);e(4)(n,{});n.locals&&(o.exports=n.locals)},function(o,t,e){t=o.exports=e(3)(),t.push([o.id,'#__vconsole{font-size:13px}#__vconsole .vc-switch{display:block;position:fixed;right:10px;bottom:10px;color:#fff;background-color:#04be02;line-height:1;font-size:14px;padding:8px 16px;z-index:10000;border-radius:4px;box-shadow:0 0 8px rgba(0,0,0,.4)}#__vconsole .vc-mask{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background-color:transparent;z-index:10001;transition:background .3s;-webkit-tap-highlight-color:transparent}#__vconsole .vc-panel{position:fixed;min-height:80%;left:0;right:0;bottom:0;z-index:10002;background-color:#efeff4;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:translateY(100%);transform:translateY(100%)}#__vconsole .vc-tabbar{border-bottom:1px solid #d9d9d9;overflow:hidden}#__vconsole .vc-tabbar .vc-tab{float:left;line-height:39px;padding:0 15px;border-right:1px solid #d9d9d9;text-decoration:none;color:#000;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}#__vconsole .vc-tabbar .vc-tab:active{background-color:rgba(0,0,0,.15)}#__vconsole .vc-tabbar .vc-tab.vc-actived{background-color:#fff}#__vconsole .vc-content{background-color:#fff;overflow-x:hidden;overflow-y:scroll;position:absolute;top:40px;left:0;right:0;bottom:40px;-webkit-overflow-scrolling:touch}#__vconsole .vc-logbox{display:none;position:relative;height:100%}#__vconsole .vc-logbox i{font-style:normal}#__vconsole .vc-logbox .vc-log{-webkit-tap-highlight-color:transparent}#__vconsole .vc-logbox .vc-log:empty:before{content:"No log";color:#999;position:absolute;top:45%;left:0;right:0;bottom:0;font-size:15px;text-align:center}#__vconsole .vc-logbox .vc-item{margin:0;padding:6px 8px;line-height:1.3;border-bottom:1px solid #eee;word-break:break-word}#__vconsole .vc-logbox .vc-item-info{color:#6a5acd}#__vconsole .vc-logbox .vc-item-debug{color:#daa520}#__vconsole .vc-logbox .vc-item-warn{color:orange;border-color:#ffb930;background-color:#fffacd}#__vconsole .vc-logbox .vc-item-error{color:#dc143c;border-color:#f4a0ab;background-color:#ffe4e1}#__vconsole .vc-logbox .vc-item .vc-fold{display:block;max-height:300px;overflow:scroll;-webkit-overflow-scrolling:touch}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer{display:block;font-style:italic}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer:active{background-color:rgba(0,0,0,.15)}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer{padding-left:10px;position:relative}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer:before{content:"";position:absolute;top:4px;left:2px;width:0;height:0;border:4px solid transparent;border-left-color:#000}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-inner{display:none}#__vconsole .vc-logbox .vc-item .vc-fold.vc-toggle .vc-fold-outer:before{top:6px;left:0;border-top-color:#000;border-left-color:transparent}#__vconsole .vc-logbox .vc-item .vc-fold.vc-toggle .vc-fold-inner{display:block}#__vconsole .vc-logbox .vc-code-key{color:#905}#__vconsole .vc-logbox .vc-code-number{color:#0086b3}#__vconsole .vc-logbox .vc-code-string{color:#183691}#__vconsole .vc-logbox.vc-actived{display:block}#__vconsole .vc-toolbar{border-top:1px solid #d9d9d9;line-height:39px;position:absolute;left:0;right:0;bottom:0;overflow:hidden}#__vconsole .vc-toolbar .vc-tool{text-decoration:none;color:#000;width:50%;float:left;text-align:center;position:relative;-webkit-touch-callout:none}#__vconsole .vc-toolbar .vc-tool:after{content:" ";position:absolute;top:7px;bottom:7px;right:0;border-left:1px solid #d9d9d9}#__vconsole .vc-toolbar .vc-tool-last:after{border:none}#__vconsole.vc-toggle .vc-switch{display:none}#__vconsole.vc-toggle .vc-mask{background:rgba(0,0,0,.6);display:block}#__vconsole.vc-toggle .vc-panel{-webkit-transform:translate(0);transform:translate(0)}',""])},function(o,t){"use strict";o.exports=function(){var o=[];return o.toString=function(){for(var o=[],t=0;t<this.length;t++){var e=this[t];e[2]?o.push("@media "+e[2]+"{"+e[1]+"}"):o.push(e[1])}return o.join("")},o.i=function(t,e){"string"==typeof t&&(t=[[null,t,""]]);for(var n={},i=0;i<this.length;i++){var r=this[i][0];"number"==typeof r&&(n[r]=!0)}for(i=0;i<t.length;i++){var c=t[i];"number"==typeof c[0]&&n[c[0]]||(e&&!c[2]?c[2]=e:e&&(c[2]="("+c[2]+") and ("+e+")"),o.push(c))}},o}},function(o,t,e){function n(o,t){for(var e=0;e<o.length;e++){var n=o[e],i=p[n.id];if(i){i.refs++;for(var r=0;r<i.parts.length;r++)i.parts[r](n.parts[r]);for(;r<n.parts.length;r++)i.parts.push(a(n.parts[r],t))}else{for(var c=[],r=0;r<n.parts.length;r++)c.push(a(n.parts[r],t));p[n.id]={id:n.id,refs:1,parts:c}}}}function i(o){for(var t=[],e={},n=0;n<o.length;n++){var i=o[n],r=i[0],c=i[1],s=i[2],l=i[3],a={css:c,media:s,sourceMap:l};e[r]?e[r].parts.push(a):t.push(e[r]={id:r,parts:[a]})}return t}function r(o,t){var e=h(),n=_[_.length-1];if("top"===o.insertAt)n?n.nextSibling?e.insertBefore(t,n.nextSibling):e.appendChild(t):e.insertBefore(t,e.firstChild),_.push(t);else{if("bottom"!==o.insertAt)throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");e.appendChild(t)}}function c(o){o.parentNode.removeChild(o);var t=_.indexOf(o);t>=0&&_.splice(t,1)}function s(o){var t=document.createElement("style");return t.type="text/css",r(o,t),t}function l(o){var t=document.createElement("link");return t.rel="stylesheet",r(o,t),t}function a(o,t){var e,n,i;if(t.singleton){var r=m++;e=b||(b=s(t)),n=d.bind(null,e,r,!1),i=d.bind(null,e,r,!0)}else o.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(e=l(t),n=f.bind(null,e),i=function(){c(e),e.href&&URL.revokeObjectURL(e.href)}):(e=s(t),n=v.bind(null,e),i=function(){c(e)});return n(o),function(t){if(t){if(t.css===o.css&&t.media===o.media&&t.sourceMap===o.sourceMap)return;n(o=t)}else i()}}function d(o,t,e,n){var i=e?"":n.css;if(o.styleSheet)o.styleSheet.cssText=y(t,i);else{var r=document.createTextNode(i),c=o.childNodes;c[t]&&o.removeChild(c[t]),c.length?o.insertBefore(r,c[t]):o.appendChild(r)}}function v(o,t){var e=t.css,n=t.media;if(n&&o.setAttribute("media",n),o.styleSheet)o.styleSheet.cssText=e;else{for(;o.firstChild;)o.removeChild(o.firstChild);o.appendChild(document.createTextNode(e))}}function f(o,t){var e=t.css,n=t.sourceMap;n&&(e+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */");var i=new Blob([e],{type:"text/css"}),r=o.href;o.href=URL.createObjectURL(i),r&&URL.revokeObjectURL(r)}var p={},u=function(o){var t;return function(){return"undefined"==typeof t&&(t=o.apply(this,arguments)),t}},g=u(function(){return/msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase())}),h=u(function(){return document.head||document.getElementsByTagName("head")[0]}),b=null,m=0,_=[];o.exports=function(o,t){t=t||{},"undefined"==typeof t.singleton&&(t.singleton=g()),"undefined"==typeof t.insertAt&&(t.insertAt="bottom");var e=i(o);return n(e,t),function(o){for(var r=[],c=0;c<e.length;c++){var s=e[c],l=p[s.id];l.refs--,r.push(l)}if(o){var a=i(o);n(a,t)}for(var c=0;c<r.length;c++){var l=r[c];if(0===l.refs){for(var d=0;d<l.parts.length;d++)l.parts[d]();delete p[l.id]}}}};var y=function(){var o=[];return function(t,e){return o[t]=e,o.filter(Boolean).join("\n")}}()},function(o,t){o.exports='<div id=__vconsole class=""> <div class=vc-switch>vConsole</div> <div class=vc-mask> </div> <div class=vc-panel> <div class=vc-tabbar> <a class="vc-tab vc-actived" data-tab=default id=__vc_tab_default>Log</a> <a class=vc-tab data-tab=system id=__vc_tab_system>System</a> <a class=vc-tab data-tab=network id=__vc_tab_network>Network</a> </div> <div class=vc-content> <div class="vc-logbox vc-actived" id=__vc_log_default> <div class=vc-log></div> </div> <div class=vc-logbox id=__vc_log_system> <div class=vc-log></div> </div> <div class=vc-logbox id=__vc_log_network> <div class=vc-log></div> </div> </div> <div class=vc-toolbar> <a class="vc-tool vc-clear">Clear</a> <a class="vc-tool vc-tool-last vc-hide">Hide</a> </div> </div> </div>'},function(o,t){o.exports="<span class=vc-fold> <i class=vc-fold-outer>{outer}</i> <pre class=vc-fold-inner>{inner}</pre> </span>"}])}); | ||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.vConsole=t():e.vConsole=t()}(this,function(){return function(e){function t(n){if(o[n])return o[n].exports;var r=o[n]={exports:{},id:n,loaded:!1};return e[n].call(r.exports,r,r.exports,t),r.loaded=!0,r.exports}var o={};return t.m=e,t.c=o,t.p="",t(0)}([function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=o(1),i=n(r),l=o(13),c=n(l),a=o(14),s=n(a),d=o(21),u=n(d),f=o(23),v=n(f),p=new i["default"];p.addPlugin(s["default"]),p.addPlugin(u["default"]),p.addPlugin(v["default"]),p.VConsolePlugin=c["default"],t["default"]=p,e.exports=t["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t["default"]=e,t}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var l=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),c=o(2),a=r(c),s=o(3),d=n(s);o(5);var u=o(9),f=n(u),v=o(10),p=n(v),b=o(11),h=n(b),g=o(12),y=n(g),m=function(){function e(){i(this,e);var t=this;this.html=f["default"],this.$dom=null,this.activedTab="",this.tabList=[],this.pluginList={},this.console={},this.logList=[],this.isReady=!1,this.switchPos={x:10,y:10,startX:0,startY:0,endX:0,endY:0},this.bodyOverflowCSS="";var o=function(){t._render(),t._bindEvent(),t._autoRun()};"complete"==document.readyState?o():d["default"].bind(window,"load",o)}return l(e,[{key:"_render",value:function(){var e="#__vconsole";if(!d["default"].one(e)){var t=document.createElement("div");t.innerHTML=this.html,document.body.appendChild(t.children[0])}this.$dom=d["default"].one(e);var o=a.getStorage("switch_x"),n=a.getStorage("switch_y");o&&n&&(this.switchPos.x=o,this.switchPos.y=n,d["default"].one(".vc-switch").style.right=o+"px",d["default"].one(".vc-switch").style.bottom=n+"px")}},{key:"_bindEvent",value:function(){var e=this,t=d["default"].one(".vc-switch",e.$dom);d["default"].bind(t,"touchstart",function(t){e.switchPos.startX=t.touches[0].pageX,e.switchPos.startY=t.touches[0].pageY}),d["default"].bind(t,"touchend",function(t){0==e.switchPos.endX&&0==e.switchPos.endY||(e.switchPos.x=e.switchPos.endX,e.switchPos.y=e.switchPos.endY,e.switchPos.startX=0,e.switchPos.startY=0,e.switchPos.endX=0,e.switchPos.endY=0,a.setStorage("switch_x",e.switchPos.x),a.setStorage("switch_y",e.switchPos.y))}),d["default"].bind(t,"touchmove",function(o){if(o.touches.length>0){var n=o.touches[0].pageX-e.switchPos.startX,r=o.touches[0].pageY-e.switchPos.startY,i=e.switchPos.x-n,l=e.switchPos.y-r;0>i&&(i=0),0>l&&(l=0),i+t.offsetWidth>document.body.offsetWidth&&(i=document.body.offsetWidth-t.offsetWidth),l+t.offsetHeight>document.body.offsetHeight&&(l=document.body.offsetHeight-t.offsetHeight),t.style.right=i+"px",t.style.bottom=l+"px",e.switchPos.endX=i,e.switchPos.endY=l,o.preventDefault()}}),d["default"].bind(d["default"].one(".vc-switch",e.$dom),"click",function(){e.show()}),d["default"].bind(d["default"].one(".vc-hide",e.$dom),"click",function(){e.hide()}),d["default"].bind(d["default"].one(".vc-mask",e.$dom),"click",function(t){return t.target!=d["default"].one(".vc-mask")?!1:void e.hide()}),d["default"].delegate(d["default"].one(".vc-tabbar",e.$dom),"click",".vc-tab",function(t){var o=this.dataset.tab;o!=e.activedTab&&e.showTab(o)})}},{key:"_autoRun",value:function(){this.isReady=!0;for(var e in this.pluginList)this._initPlugin(this.pluginList[e]);this.showTab(this.tabList[0])}},{key:"_initPlugin",value:function(e){var t=this;e.trigger("init"),e.trigger("renderTab",function(o){t.tabList.push(e.id);var n=d["default"].render(p["default"],{id:e.id,name:e.name});d["default"].one(".vc-tabbar",t.$dom).appendChild(n);var r=d["default"].render(h["default"],{id:e.id});o&&(a.isString(o)?r.innerHTML+=o:a.isFunction(o.appendTo)?o.appendTo(r):a.isElement(o)&&r.appendChild(o)),d["default"].one(".vc-content",t.$dom).appendChild(r)}),e.trigger("addTool",function(t){if(t){var o=d["default"].one(".vc-tool-last"),n=!0,r=!1,i=void 0;try{for(var l,c=t[Symbol.iterator]();!(n=(l=c.next()).done);n=!0){var s=l.value,u=d["default"].render(y["default"],{name:s.name||"Undefined",pluginID:e.id});1==s.global&&d["default"].addClass(u,"vc-global-tool"),a.isFunction(s.onClick)&&d["default"].bind(u,"click",s.onClick),o.parentNode.insertBefore(u,o)}}catch(f){r=!0,i=f}finally{try{!n&&c["return"]&&c["return"]()}finally{if(r)throw i}}}}),e.trigger("ready")}},{key:"_triggerPluginsEvent",value:function(e){for(var t in this.pluginList)this.pluginList[t].trigger(e)}},{key:"_triggerPluginEvent",value:function(e,t){var o=this.pluginList[e];o&&o.trigger(t)}},{key:"addPlugin",value:function(e){return void 0!==this.pluginList[e.id]?(console.warn("Plugin "+e.id+" has already been added."),!1):(this.pluginList[e.id]=e,this.isReady&&this._initPlugin(e),!0)}},{key:"show",value:function(){d["default"].addClass(this.$dom,"vc-toggle"),this._triggerPluginsEvent("showConsole"),this.bodyOverflowCSS=document.body.style.overflow,document.body.style.overflow="hidden"}},{key:"hide",value:function(){document.body.style.overflow=this.bodyOverflowCSS,d["default"].removeClass(this.$dom,"vc-toggle"),this._triggerPluginsEvent("hideConsole")}},{key:"showTab",value:function(e){var t=d["default"].one("#__vc_log_"+e);d["default"].removeClass(d["default"].all(".vc-tab",this.$dom),"vc-actived"),d["default"].addClass(d["default"].one("#__vc_tab_"+e),"vc-actived"),d["default"].removeClass(d["default"].all(".vc-logbox",this.$dom),"vc-actived"),d["default"].addClass(t,"vc-actived"),d["default"].one(".vc-content",this.$dom).scrollTop=d["default"].one(".vc-content",this.$dom).scrollHeight,d["default"].removeClass(d["default"].all(".vc-tool",this.$dom),"vc-actived"),d["default"].addClass(d["default"].all(".vc-tool-"+e,this.$dom),"vc-actived"),this._triggerPluginEvent(this.activedTab,"hide"),this.activedTab=e,this._triggerPluginEvent(this.activedTab,"show")}}]),e}();t["default"]=m,e.exports=t["default"]},function(e,t){"use strict";function o(e){var t=e>0?new Date(e):new Date,o=t.getDate()<10?"0"+t.getDate():t.getDate(),n=t.getMonth()<9?"0"+(t.getMonth()+1):t.getMonth()+1,r=t.getFullYear(),i=t.getHours()<10?"0"+t.getHours():t.getHours(),l=t.getMinutes()<10?"0"+t.getMinutes():t.getMinutes(),c=t.getSeconds()<10?"0"+t.getSeconds():t.getSeconds(),a=t.getMilliseconds()<10?"0"+t.getMilliseconds():t.getMilliseconds();return 100>a&&(a="0"+a),{time:+t,year:r,month:n,day:o,hour:i,minute:l,second:c,millisecond:a}}function n(e){return"[object Number]"==Object.prototype.toString.call(e)}function r(e){return"[object String]"==Object.prototype.toString.call(e)}function i(e){return"[object Array]"==Object.prototype.toString.call(e)}function l(e){return"[object Boolean]"==Object.prototype.toString.call(e)}function c(e){return"[object Undefined]"==Object.prototype.toString.call(e)}function a(e){return"[object Null]"==Object.prototype.toString.call(e)}function s(e){return"[object Symbol]"==Object.prototype.toString.call(e)}function d(e){return!("[object Object]"!=Object.prototype.toString.call(e)&&(n(e)||r(e)||i(e)||a(e)||u(e)||c(e)||s(e)))}function u(e){return"[object Function]"==Object.prototype.toString.call(e)}function f(e){return"object"===("undefined"==typeof HTMLElement?"undefined":g(HTMLElement))?e instanceof HTMLElement:e&&"object"===("undefined"==typeof e?"undefined":g(e))&&null!==e&&1===e.nodeType&&"string"==typeof e.nodeName}function v(e){return document.createElement("a").appendChild(document.createTextNode(e)).parentNode.innerHTML}function p(e){function t(e){for(var t=p.length-1;t>=0;t--)if(p[t].child==e)return!0;return!1}function o(e){if(d(e)){if(t(e))return void(f+="CircularObject");p.push({parent:parent,child:e});var b=Object.keys(e);f+="{",v++;for(var h=0;h<b.length;h++){var g=b[h];e.hasOwnProperty(g)&&(f+=g+": ",o(e[g],e),h<b.length-1&&(f+=", "))}v--,f+="}",p.pop()}else if(i(e)){if(t(e))return void(f+="CircularArray");p.push({parent:parent,child:e}),f+="[",v++;for(var y=0;y<e.length;y++)o(e[y],e),y<e.length-1&&(f+=", ");v--,f+="]",p.pop()}else f+=r(e)?'"'+e+'"':n(e)?e:l(e)?e:a(e)?"null":c(e)?"undefined":u(e)?"function()":s(e)?"symbol":"unknown"}var f="",v=0,p=[];return o(e,null),f}function b(e,t){e="vConsole_"+e,localStorage.setItem(e,t)}function h(e){return e="vConsole_"+e,localStorage.getItem(e)}Object.defineProperty(t,"__esModule",{value:!0});var g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e};t.getDate=o,t.isNumber=n,t.isString=r,t.isArray=i,t.isBoolean=l,t.isUndefined=c,t.isNull=a,t.isSymbol=s,t.isObject=d,t.isFunction=u,t.isElement=f,t.htmlEncode=v,t.JSONStringify=p,t.setStorage=b,t.getStorage=h},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var r=o(2),i=o(4),l=n(i),c={};c.one=function(e,t){return t?t.querySelector(e):document.querySelector(e)},c.all=function(e,t){var o=void 0,n=[];return o=t?t.querySelectorAll(e):document.querySelectorAll(e),o&&o.length>0&&(n=Array.prototype.slice.call(o)),n},c.addClass=function(e,t){if(e){(0,r.isArray)(e)||(e=[e]);var o=!0,n=!1,i=void 0;try{for(var l,c=e[Symbol.iterator]();!(o=(l=c.next()).done);o=!0){var a=l.value;a.className+=" "+t}}catch(s){n=!0,i=s}finally{try{!o&&c["return"]&&c["return"]()}finally{if(n)throw i}}}},c.removeClass=function(e,t){if(e){(0,r.isArray)(e)||(e=[e]);var o=!0,n=!1,i=void 0;try{for(var l,c=e[Symbol.iterator]();!(o=(l=c.next()).done);o=!0){for(var a=l.value,s=a.className.split(" "),d=0;d<s.length;d++)s[d]==t&&(s[d]="");a.className=s.join(" ").trim()}}catch(u){n=!0,i=u}finally{try{!o&&c["return"]&&c["return"]()}finally{if(n)throw i}}}},c.hasClass=function(e,t){if(!e)return!1;var o=e.className.split(" "),n=!0,r=!1,i=void 0;try{for(var l,c=o[Symbol.iterator]();!(n=(l=c.next()).done);n=!0){var a=l.value;if(a==t)return!0}}catch(s){r=!0,i=s}finally{try{!n&&c["return"]&&c["return"]()}finally{if(r)throw i}}return!1},c.bind=function(e,t,o,n){if(e){void 0===n&&(n=!1),(0,r.isArray)(e)||(e=[e]);var i=!0,l=!1,c=void 0;try{for(var a,s=e[Symbol.iterator]();!(i=(a=s.next()).done);i=!0){var d=a.value;d.addEventListener(t,o,n)}}catch(u){l=!0,c=u}finally{try{!i&&s["return"]&&s["return"]()}finally{if(l)throw c}}}},c.delegate=function(e,t,o,n){e&&e.addEventListener(t,function(t){var r=c.all(o,e);if(r){var i=!0,l=!1,a=void 0;try{e:for(var s,d=r[Symbol.iterator]();!(i=(s=d.next()).done);i=!0)for(var u=s.value,f=t.target;f;){if(f==u){n.call(f,t);break e}if(f=f.parentNode,f==e)break}}catch(v){l=!0,a=v}finally{try{!i&&d["return"]&&d["return"]()}finally{if(l)throw a}}}},!1)},c.render=l["default"],t["default"]=c,e.exports=t["default"]},function(e,t){"use strict";function o(e,t,o){var n=/\{\{([^\}]+)\}\}/g,r="var arr = [];\n",i=0,l=[],c=function(e,t){""!==e&&(r+=t?e.match(/^ ?else/g)?"} "+e+" {\n":e.match(/\/(if|for|switch)/g)?"}\n":e.match(/^ ?if|for|switch/g)?e+" {\n":e.match(/^ ?(break|continue) ?$/g)?e+";\n":e.match(/^ ?(case|default)/g)?e+":\n":"arr.push("+e+");\n":'arr.push("'+e.replace(/"/g,'\\"')+'");\n')};for(e=e.replace(/(\{\{ ?switch(.+?)\}\})[\r\n\t ]+\{\{/g,"$1{{"),e=e.replace(/^\n/,"").replace(/\n/g,"\\\n");l=n.exec(e);)c(e.slice(i,l.index),!1),c(l[1],!0),i=l.index+l[0].length;c(e.substr(i,e.length-i),!1),r+='return arr.join("");',r="with (this) {\n"+r+"\n}";var a=new Function(r).apply(t);if(!o){var s=document.createElement("div");s.innerHTML=a,a=s.children[0]}return a}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o,e.exports=t["default"]},function(e,t,o){var n=o(6);"string"==typeof n&&(n=[[e.id,n,""]]);o(8)(n,{});n.locals&&(e.exports=n.locals)},function(e,t,o){t=e.exports=o(7)(),t.push([e.id,'#__vconsole{font-size:13px}#__vconsole .vc-max-height{max-height:250px}#__vconsole .vc-max-height-line{max-height:44px}#__vconsole .vc-min-height{min-height:40px}#__vconsole .vc-switch{display:block;position:fixed;right:10px;bottom:10px;color:#fff;background-color:#04be02;line-height:1;font-size:14px;padding:8px 16px;z-index:10000;border-radius:4px;box-shadow:0 0 8px rgba(0,0,0,.4)}#__vconsole .vc-mask{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background-color:transparent;z-index:10001;transition:background .3s;-webkit-tap-highlight-color:transparent}#__vconsole .vc-panel{position:fixed;min-height:80%;left:0;right:0;bottom:0;z-index:10002;background-color:#efeff4;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:translateY(100%);transform:translateY(100%)}#__vconsole .vc-tabbar{border-bottom:1px solid #d9d9d9;overflow:scroll;height:39px;width:auto;white-space:nowrap}#__vconsole .vc-tabbar .vc-tab{display:inline-block;line-height:39px;padding:0 15px;border-right:1px solid #d9d9d9;text-decoration:none;color:#000;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}#__vconsole .vc-tabbar .vc-tab:active{background-color:rgba(0,0,0,.15)}#__vconsole .vc-tabbar .vc-tab.vc-actived{background-color:#fff}#__vconsole .vc-content{background-color:#fff;overflow-x:hidden;overflow-y:scroll;position:absolute;top:40px;left:0;right:0;bottom:40px;-webkit-overflow-scrolling:touch}#__vconsole .vc-logbox{display:none;position:relative;min-height:100%}#__vconsole .vc-logbox i{font-style:normal}#__vconsole .vc-logbox .vc-log{-webkit-tap-highlight-color:transparent}#__vconsole .vc-logbox .vc-log:empty:before{content:"Empty";color:#999;position:absolute;top:45%;left:0;right:0;bottom:0;font-size:15px;text-align:center}#__vconsole .vc-logbox .vc-item{margin:0;padding:6px 8px;overflow:hidden;line-height:1.3;border-bottom:1px solid #eee;word-break:break-word}#__vconsole .vc-logbox .vc-item-info{color:#6a5acd}#__vconsole .vc-logbox .vc-item-debug{color:#daa520}#__vconsole .vc-logbox .vc-item-warn{color:orange;border-color:#ffb930;background-color:#fffacd}#__vconsole .vc-logbox .vc-item-error{color:#dc143c;border-color:#f4a0ab;background-color:#ffe4e1}#__vconsole .vc-logbox .vc-item .vc-item-content{margin-right:60px;display:block}#__vconsole .vc-logbox .vc-item .vc-item-meta{color:#888;float:right;width:60px;text-align:right}#__vconsole .vc-logbox .vc-item.vc-item-nometa .vc-item-content{margin-right:0}#__vconsole .vc-logbox .vc-item.vc-item-nometa .vc-item-meta{display:none}#__vconsole .vc-logbox .vc-item .vc-item-code{display:block;white-space:pre-wrap;overflow:scroll;position:relative}#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-input,#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-output{padding-left:12px}#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-input:before,#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-output:before{content:"\\203A";position:absolute;top:-3px;left:0;font-size:16px;color:#6a5acd}#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-output:before{content:"\\2039"}#__vconsole .vc-logbox .vc-item .vc-fold{display:block;overflow:scroll;-webkit-overflow-scrolling:touch}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer{display:block;font-style:italic}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer:active{background-color:#e6e6e6}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer{padding-left:10px;position:relative}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer:before{content:"";position:absolute;top:4px;left:2px;width:0;height:0;border:4px solid transparent;border-left-color:#000}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-inner{display:none;white-space:pre-wrap}#__vconsole .vc-logbox .vc-item .vc-fold.vc-toggle .vc-fold-outer:before{top:6px;left:0;border-top-color:#000;border-left-color:transparent}#__vconsole .vc-logbox .vc-item .vc-fold.vc-toggle .vc-fold-inner{display:block}#__vconsole .vc-logbox .vc-code-key{color:#905}#__vconsole .vc-logbox .vc-code-function{color:#905;font-style:italic}#__vconsole .vc-logbox .vc-code-boolean,#__vconsole .vc-logbox .vc-code-number{color:#0086b3}#__vconsole .vc-logbox .vc-code-string{color:#183691}#__vconsole .vc-logbox .vc-code-null,#__vconsole .vc-logbox .vc-code-undefined{color:#666}#__vconsole .vc-logbox .vc-cmd{position:absolute;height:40px;left:0;right:0;bottom:0;border-top:1px solid #d9d9d9}#__vconsole .vc-logbox .vc-cmd .vc-cmd-input-wrap{display:block;height:28px;margin-right:40px;padding:6px 8px}#__vconsole .vc-logbox .vc-cmd .vc-cmd-input{width:100%;border:none;resize:none;outline:none;padding:0;font-size:12px}#__vconsole .vc-logbox .vc-cmd .vc-cmd-input::-webkit-input-placeholder{line-height:28px}#__vconsole .vc-logbox .vc-cmd .vc-cmd-btn{position:absolute;top:0;right:0;bottom:0;width:40px;border:none;background-color:#efeff4;outline:none;-webkit-touch-callout:none}#__vconsole .vc-logbox .vc-cmd .vc-cmd-btn:active{background-color:rgba(0,0,0,.15)}#__vconsole .vc-logbox .vc-group .vc-group-preview{-webkit-touch-callout:none}#__vconsole .vc-logbox .vc-group .vc-group-preview:active{background-color:#e6e6e6}#__vconsole .vc-logbox .vc-group .vc-group-detail{display:none;padding:0 0 10px 20px;border-bottom:1px solid #eee}#__vconsole .vc-logbox .vc-group.vc-actived .vc-group-detail{display:block}#__vconsole .vc-logbox .vc-table .vc-table-row{display:flex;flex-direction:row;flex-wrap:wrap;overflow:hidden;border-bottom:1px solid #eee}#__vconsole .vc-logbox .vc-table .vc-table-row.vc-left-border{border-left:1px solid #eee}#__vconsole .vc-logbox .vc-table .vc-table-col{flex:1;padding:3px 4px;border-left:1px solid #eee;overflow:scroll;white-space:pre-wrap;word-break:break-word;-webkit-overflow-scrolling:touch}#__vconsole .vc-logbox .vc-table .vc-table-col:first-child{border:none}#__vconsole .vc-logbox .vc-table .vc-small .vc-table-col{padding:0 4px;font-size:12px}#__vconsole .vc-logbox .vc-table .vc-table-col-2{flex:2}#__vconsole .vc-logbox .vc-table .vc-table-col-3{flex:3}#__vconsole .vc-logbox .vc-table .vc-table-col-4{flex:4}#__vconsole .vc-logbox .vc-table .vc-table-col-5{flex:5}#__vconsole .vc-logbox .vc-table .vc-table-col-6{flex:6}#__vconsole .vc-logbox .vc-table .vc-table-row-error{border-color:#f4a0ab;background-color:#ffe4e1}#__vconsole .vc-logbox .vc-table .vc-table-row-error .vc-table-col{color:#dc143c;border-color:#f4a0ab}#__vconsole .vc-logbox .vc-table .vc-table-col-title{font-weight:700}#__vconsole .vc-logbox.vc-actived{display:block}#__vconsole .vc-toolbar{border-top:1px solid #d9d9d9;line-height:39px;position:absolute;left:0;right:0;bottom:0;display:flex;flex-direction:row}#__vconsole .vc-toolbar .vc-tool{display:none;text-decoration:none;color:#000;width:50%;flex:1;text-align:center;position:relative;-webkit-touch-callout:none}#__vconsole .vc-toolbar .vc-tool.vc-actived,#__vconsole .vc-toolbar .vc-tool.vc-global-tool{display:block}#__vconsole .vc-toolbar .vc-tool:active{background-color:rgba(0,0,0,.15)}#__vconsole .vc-toolbar .vc-tool:after{content:" ";position:absolute;top:7px;bottom:7px;right:0;border-left:1px solid #d9d9d9}#__vconsole .vc-toolbar .vc-tool-last:after{border:none}#__vconsole.vc-toggle .vc-switch{display:none}#__vconsole.vc-toggle .vc-mask{background:rgba(0,0,0,.6);display:block}#__vconsole.vc-toggle .vc-panel{-webkit-transform:translate(0);transform:translate(0)}',""])},function(e,t){"use strict";e.exports=function(){var e=[];return e.toString=function(){for(var e=[],t=0;t<this.length;t++){var o=this[t];o[2]?e.push("@media "+o[2]+"{"+o[1]+"}"):e.push(o[1])}return e.join("")},e.i=function(t,o){"string"==typeof t&&(t=[[null,t,""]]);for(var n={},r=0;r<this.length;r++){var i=this[r][0];"number"==typeof i&&(n[i]=!0)}for(r=0;r<t.length;r++){var l=t[r];"number"==typeof l[0]&&n[l[0]]||(o&&!l[2]?l[2]=o:o&&(l[2]="("+l[2]+") and ("+o+")"),e.push(l))}},e}},function(e,t,o){function n(e,t){for(var o=0;o<e.length;o++){var n=e[o],r=v[n.id];if(r){r.refs++;for(var i=0;i<r.parts.length;i++)r.parts[i](n.parts[i]);for(;i<n.parts.length;i++)r.parts.push(s(n.parts[i],t))}else{for(var l=[],i=0;i<n.parts.length;i++)l.push(s(n.parts[i],t));v[n.id]={id:n.id,refs:1,parts:l}}}}function r(e){for(var t=[],o={},n=0;n<e.length;n++){var r=e[n],i=r[0],l=r[1],c=r[2],a=r[3],s={css:l,media:c,sourceMap:a};o[i]?o[i].parts.push(s):t.push(o[i]={id:i,parts:[s]})}return t}function i(e,t){var o=h(),n=m[m.length-1];if("top"===e.insertAt)n?n.nextSibling?o.insertBefore(t,n.nextSibling):o.appendChild(t):o.insertBefore(t,o.firstChild),m.push(t);else{if("bottom"!==e.insertAt)throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");o.appendChild(t)}}function l(e){e.parentNode.removeChild(e);var t=m.indexOf(e);t>=0&&m.splice(t,1)}function c(e){var t=document.createElement("style");return t.type="text/css",i(e,t),t}function a(e){var t=document.createElement("link");return t.rel="stylesheet",i(e,t),t}function s(e,t){var o,n,r;if(t.singleton){var i=y++;o=g||(g=c(t)),n=d.bind(null,o,i,!1),r=d.bind(null,o,i,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(o=a(t),n=f.bind(null,o),r=function(){l(o),o.href&&URL.revokeObjectURL(o.href)}):(o=c(t),n=u.bind(null,o),r=function(){l(o)});return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else r()}}function d(e,t,o,n){var r=o?"":n.css;if(e.styleSheet)e.styleSheet.cssText=_(t,r);else{var i=document.createTextNode(r),l=e.childNodes;l[t]&&e.removeChild(l[t]),l.length?e.insertBefore(i,l[t]):e.appendChild(i)}}function u(e,t){var o=t.css,n=t.media;if(n&&e.setAttribute("media",n),e.styleSheet)e.styleSheet.cssText=o;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(o))}}function f(e,t){var o=t.css,n=t.sourceMap;n&&(o+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */");var r=new Blob([o],{type:"text/css"}),i=e.href;e.href=URL.createObjectURL(r),i&&URL.revokeObjectURL(i)}var v={},p=function(e){var t;return function(){return"undefined"==typeof t&&(t=e.apply(this,arguments)),t}},b=p(function(){return/msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase())}),h=p(function(){return document.head||document.getElementsByTagName("head")[0]}),g=null,y=0,m=[];e.exports=function(e,t){t=t||{},"undefined"==typeof t.singleton&&(t.singleton=b()),"undefined"==typeof t.insertAt&&(t.insertAt="bottom");var o=r(e);return n(o,t),function(e){for(var i=[],l=0;l<o.length;l++){var c=o[l],a=v[c.id];a.refs--,i.push(a)}if(e){var s=r(e);n(s,t)}for(var l=0;l<i.length;l++){var a=i[l];if(0===a.refs){for(var d=0;d<a.parts.length;d++)a.parts[d]();delete v[a.id]}}}};var _=function(){var e=[];return function(t,o){return e[t]=o,e.filter(Boolean).join("\n")}}()},function(e,t){e.exports='<div id=__vconsole class=""> <div class=vc-switch>vConsole</div> <div class=vc-mask> </div> <div class=vc-panel> <div class=vc-tabbar> </div> <div class=vc-content> </div> <div class=vc-toolbar> <a class="vc-tool vc-global-tool vc-tool-last vc-hide">Hide</a> </div> </div> </div>'},function(e,t){e.exports="<a class=vc-tab data-tab={{id}} id=__vc_tab_{{id}}>{{name}}</a>"},function(e,t){e.exports="<div class=vc-logbox id=__vc_log_{{id}}> </div>"},function(e,t){e.exports='<a class="vc-tool vc-tool-{{pluginID}}">{{name}}</a>'},function(e,t){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),r=function(){function e(t){var n=arguments.length<=1||void 0===arguments[1]?"newPlugin":arguments[1];o(this,e),this.id=t,this.name=n,this.eventList={}}return n(e,[{key:"on",value:function(e,t){return this.eventList[e]=t,this}},{key:"trigger",value:function(e,t){if("function"==typeof this.eventList[e])this.eventList[e].call(this,t);else{var o="on"+e.charAt(0).toUpperCase()+e.slice(1);"function"==typeof this[o]&&this[o].call(this,t)}return this}},{key:"id",get:function(){return this._id},set:function(e){if(!e)throw"Plugin ID cannot be empty";this._id=e.toLowerCase()}},{key:"name",get:function(){return this._name},set:function(e){if(!e)throw"Plugin name cannot be empty";this._name=e}}]),e}();t["default"]=r,e.exports=t["default"]},function(module,exports,__webpack_require__){"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t["default"]=e,t}function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),_get=function e(t,o,n){null===t&&(t=Function.prototype);var r=Object.getOwnPropertyDescriptor(t,o);if(void 0===r){var i=Object.getPrototypeOf(t);return null===i?void 0:e(i,o,n)}if("value"in r)return r.value;var l=r.get;if(void 0!==l)return l.call(n)},_query=__webpack_require__(3),_query2=_interopRequireDefault(_query),_tool=__webpack_require__(2),tool=_interopRequireWildcard(_tool),_log=__webpack_require__(15),_log2=_interopRequireDefault(_log),_tabbox_default=__webpack_require__(19),_tabbox_default2=_interopRequireDefault(_tabbox_default),_item_code=__webpack_require__(20),_item_code2=_interopRequireDefault(_item_code),VConsoleDefaultTab=function(_VConsoleLogTab){function VConsoleDefaultTab(){var e;_classCallCheck(this,VConsoleDefaultTab);for(var t=arguments.length,o=Array(t),n=0;t>n;n++)o[n]=arguments[n];var r=_possibleConstructorReturn(this,(e=Object.getPrototypeOf(VConsoleDefaultTab)).call.apply(e,[this].concat(o)));return r.tplTabbox=_tabbox_default2["default"],r}return _inherits(VConsoleDefaultTab,_VConsoleLogTab),_createClass(VConsoleDefaultTab,[{key:"onReady",value:function(){var e=this;_get(Object.getPrototypeOf(VConsoleDefaultTab.prototype),"onReady",this).call(this),_query2["default"].bind(_query2["default"].one(".vc-cmd",this.$tabbox),"submit",function(t){t.preventDefault();var o=_query2["default"].one(".vc-cmd-input",t.target),n=o.value;o.value="",""!==n&&e.evalCommand(n)})}},{key:"evalCommand",value:function evalCommand(cmd){var date=tool.getDate(+new Date);this.renderLog({logType:"log",meta:date.hour+":"+date.minute+":"+date.second,content:_query2["default"].render(_item_code2["default"],{content:cmd,type:"input"},!0),style:""});var result=eval(cmd),content="";content=tool.isArray(result)||tool.isObject(result)?this.getFoldedLine(result):_query2["default"].render(_item_code2["default"],{content:result,type:"output"},!0),this.renderLog({logType:"log",meta:"",content:content,style:"vc-item-nometa"})}}]),VConsoleDefaultTab}(_log2["default"]),tab=new VConsoleDefaultTab("default","Log");exports["default"]=tab,module.exports=exports["default"]},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t["default"]=e,t}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},s=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),d=o(2),u=r(d),f=o(3),v=n(f),p=o(13),b=n(p),h=o(16),g=n(h),y=o(17),m=n(y),_=o(18),x=n(_),w=function(e){function t(){var e;i(this,t);for(var o=arguments.length,n=Array(o),r=0;o>r;r++)n[r]=arguments[r];var c=l(this,(e=Object.getPrototypeOf(t)).call.apply(e,[this].concat(n)));return c.tplTabbox="",c.allowUnformattedLog=!0,c.isReady=!1,c.$tabbox=null,c.console={},c.logList=[],c.mockConsole(),c}return c(t,e),s(t,[{key:"onInit",value:function(){this.isReady=!0,this.$tabbox=v["default"].render(this.tplTabbox,{});var e=!0,t=!1,o=void 0;try{for(var n,r=this.logList[Symbol.iterator]();!(e=(n=r.next()).done);e=!0){var i=n.value;this.printLog(i)}}catch(l){t=!0,o=l}finally{try{!e&&r["return"]&&r["return"]()}finally{if(t)throw o}}this.logList=[]}},{key:"onRenderTab",value:function(e){e(this.$tabbox)}},{key:"onAddTool",value:function(e){var t=this,o=[{name:"Clear",global:!1,onClick:function(e){t.clearLog()}}];e(o)}},{key:"onReady",value:function(){v["default"].bind(v["default"].one(".vc-log",this.$tabbox),"click",function(e){var t=e.target;v["default"].hasClass(t,"vc-fold-outer")&&(v["default"].hasClass(t.parentElement,"vc-toggle")?v["default"].removeClass(t.parentElement,"vc-toggle"):v["default"].addClass(t.parentElement,"vc-toggle"),e.preventDefault())})}},{key:"mockConsole",value:function(){var e=this;window.console?(this.console.log=window.console.log,this.console.info=window.console.info,this.console.warn=window.console.warn,this.console.debug=window.console.debug,this.console.error=window.console.error):window.console={},window.console.log=function(){e.printLog({logType:"log",logs:arguments})},window.console.info=function(){e.printLog({logType:"info",logs:arguments})},window.console.warn=function(){e.printLog({logType:"warn",logs:arguments})},window.console.debug=function(){e.printLog({logType:"debug",logs:arguments})},window.console.error=function(){e.printLog({logType:"error",logs:arguments})},window.onerror=function(e,t,o,n,r){var i=r.stack.split("at");i=i[0]+" "+i[1],i=i.replace(location.origin,""),console.error(i)}}},{key:"clearLog",value:function(){v["default"].one(".vc-log",this.$tabbox).innerHTML=""}},{key:"printOriginLog",value:function(e){"function"==typeof this.console[e.logType]&&this.console[e.logType].apply(window.console,e.logs)}},{key:"printLog",value:function(e){var t=e.logs;if(t.length){t=[].slice.call(t);var o=!0,n=/^\[(\w+)\] ?/i,r="";if(u.isString(t[0])){var i=t[0].match(n); | ||
null!==i&&i.length>0&&(r=i[1].toLowerCase())}if(r?o=r==this.id:0==this.allowUnformattedLog&&(o=!1),!o)return void this.printOriginLog(e);if(e.date||(e.date=+new Date),!this.isReady)return void this.logList.push(e);u.isString(t[0])&&(t[0]=t[0].replace(n,""),""===t[0]&&t.shift());for(var l="",c=0;c<t.length;c++)try{if(""===t[c])continue;l+=u.isFunction(t[c])?" "+t[c].toString():u.isObject(t[c])||u.isArray(t[c])?" "+this.getFoldedLine(t[c]):" "+u.htmlEncode(t[c]).replace(/\n/g,"<br/>")}catch(s){l+=" ["+a(t[c])+"]"}var d=u.getDate(e.date);this.renderLog({logType:e.logType,content:l,meta:d.hour+":"+d.minute+":"+d.second,style:""}),this.printOriginLog(e)}}},{key:"renderLog",value:function(e){var t=v["default"].render(g["default"],e);v["default"].one(".vc-log",this.$tabbox).appendChild(t),v["default"].one(".vc-content").scrollTop=v["default"].one(".vc-content").scrollHeight}},{key:"getFoldedLine",value:function(e){function t(e){for(var t=s.length-1;t>=0;t--)if(s[t].child==e)return!0;return!1}function o(e,n){if(u.isObject(e)){if(t(e))return void(i+="{Circular Object}");s.push({parent:n,child:e});var r=Object.keys(e);i+="{\n",c++;for(var l=0;l<r.length;l++){var d=r[l];e.hasOwnProperty(d)&&(i+=Array(c+1).join(a)+v["default"].render(x["default"],{type:"key",code:d},!0)+": ",o(e[d],e),l<r.length-1&&(i+=",\n"))}c--,i+="\n"+Array(c+1).join(a)+"}",s.pop()}else if(u.isArray(e)){if(t(e))return void(i+="[Circular Array]");s.push({parent:n,child:e}),i+="[\n",c++;for(var f=0;f<e.length;f++)i+=Array(c+1).join(a)+v["default"].render(x["default"],{type:"key",code:f},!0)+": ",o(e[f],e),f<e.length-1&&(i+=",\n");c--,i+="\n"+Array(c+1).join(a)+"]",s.pop()}else i+=u.isString(e)?v["default"].render(x["default"],{type:"string",code:'"'+u.htmlEncode(e)+'"'},!0):u.isNumber(e)?v["default"].render(x["default"],{type:"number",code:e},!0):u.isBoolean(e)?v["default"].render(x["default"],{type:"boolean",code:e},!0):u.isNull(e)?v["default"].render(x["default"],{type:"null",code:"null"},!0):u.isUndefined(e)?v["default"].render(x["default"],{type:"undefined",code:"undefined"},!0):u.isFunction(e)?v["default"].render(x["default"],{type:"function",code:"function()"},!0):JSON.stringify(e)}var n=u.JSONStringify(e),r="",i="",l="",c=0,a=" ";l=n.substr(0,26),n.length>26&&(l+="..."),r=Object.prototype.toString.call(e).replace("[object ","").replace("]",""),r+=" "+l;var s=[];o(e,null);var d=v["default"].render(m["default"],{outer:r,inner:i},!0);return d}}]),t}(b["default"]);t["default"]=w,e.exports=t["default"]},function(e,t){e.exports='<div class="vc-item vc-item-{{logType}} {{style}}"> <span class=vc-item-meta>{{meta}}</span> <div class=vc-item-content>{{content}}</div> </div>'},function(e,t){e.exports='<div class=vc-fold> <i class=vc-fold-outer>{{outer}}</i> <pre class="vc-fold-inner vc-max-height">{{inner}}</pre> </div>'},function(e,t){e.exports="<i class=vc-code-{{type}}>{{code}}</i>"},function(e,t){e.exports="<div> <div class=vc-log style=padding-bottom:40px></div> <form class=vc-cmd> <button class=vc-cmd-btn type=submit>OK</button> <div class=vc-cmd-input-wrap> <textarea class=vc-cmd-input placeholder=command...></textarea> </div> </form> </div>"},function(e,t){e.exports='<pre class="vc-item-code vc-item-code-{{type}}">{{content}}</pre>'},function(e,t,o){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t["default"]=e,t}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),s=function y(e,t,o){null===e&&(e=Function.prototype);var n=Object.getOwnPropertyDescriptor(e,t);if(void 0===n){var r=Object.getPrototypeOf(e);return null===r?void 0:y(r,t,o)}if("value"in n)return n.value;var i=n.get;if(void 0!==i)return i.call(o)},d=o(2),u=r(d),f=o(15),v=n(f),p=o(22),b=n(p),h=function(e){function t(){var e;i(this,t);for(var o=arguments.length,n=Array(o),r=0;o>r;r++)n[r]=arguments[r];var c=l(this,(e=Object.getPrototypeOf(t)).call.apply(e,[this].concat(n)));return c.tplTabbox=b["default"],c.allowUnformattedLog=!1,c}return c(t,e),a(t,[{key:"onInit",value:function(){s(Object.getPrototypeOf(t.prototype),"onInit",this).call(this),this.printSystemInfo()}},{key:"printSystemInfo",value:function(){var e=navigator.userAgent,t="",o=u.getDate();console.info("[system]","Now:",o.year+"-"+o.month+"-"+o.day+" "+o.hour+":"+o.minute+":"+o.second+"."+o.millisecond),t="Unknown";var n=e.match(/(ipod).*\s([\d_]+)/i),r=e.match(/(ipad).*\s([\d_]+)/i),i=e.match(/(iphone)\sos\s([\d_]+)/i),l=e.match(/(android)\s([\d\.]+)/i);l?t="Android "+l[2]:i?t="iPhone, iOS "+i[2].replace(/_/g,"."):r?t="iPad, iOS "+r[2].replace(/_/g,"."):n&&(t="iPod, iOS "+n[2].replace(/_/g,".")),console.info("[system]","System:",t);var c=e.match(/MicroMessenger\/([\d\.]+)/i);t="Unknown",c&&c[1]&&(t=c[1],console.info("[system]","WeChat:",t));var a=e.toLowerCase().match(/ nettype\/([^ ]+)/g);t="Unknown",a&&a[0]&&(a=a[0].split("/"),t=a[1],console.info("[system]","Network:",t)),t="Unknown",t="https:"==location.protocol?"HTTPS":"http:"==location.protocol?"HTTP":location.protocol.replace(":",""),console.info("[system]","Protocol:",t);var s=window.performance||window.msPerformance||window.webkitPerformance;if(s&&s.timing){var d=s.timing,f=d.navigationStart;console.info("[system]","connectEndTime:",d.connectEnd-f+"ms"),console.info("[system]","responseEndTime:",d.responseEnd-f+"ms"),d.secureConnectionStart>0&&console.info("[system]","SSL Cost:",d.connectEnd-d.secureConnectionStart+"ms"),console.info("[system]","DomRenderCost:",d.domComplete-d.domLoading+"ms")}console.info("[system]","UA:",e)}}]),t}(v["default"]),g=new h("system","System");t["default"]=g,e.exports=t["default"]},function(e,t){e.exports="<div> <div class=vc-log></div> </div>"},function(e,t,o){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t["default"]=e,t}function r(e){return e&&e.__esModule?e:{"default":e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),s=o(3),d=r(s),u=o(2),f=n(u),v=o(13),p=r(v),b=o(24),h=r(b),g=o(25),y=r(g),m=o(26),_=r(m),x=function(e){function t(){var e;i(this,t);for(var o=arguments.length,n=Array(o),r=0;o>r;r++)n[r]=arguments[r];var c=l(this,(e=Object.getPrototypeOf(t)).call.apply(e,[this].concat(n)));return c.$tabbox=d["default"].render(h["default"],{}),c.$header=null,c.reqList={},c.domList={},c.mockAjax(),c}return c(t,e),a(t,[{key:"onRenderTab",value:function(e){e(this.$tabbox)}},{key:"onAddTool",value:function(e){var t=this,o=[{name:"Clear",global:!1,onClick:function(e){t.clearLog()}}];e(o)}},{key:"onReady",value:function(){this.renderHeader(),d["default"].delegate(d["default"].one(".vc-log",this.$tabbox),"click",".vc-group-preview",function(e){var t=this.parentNode;d["default"].hasClass(t,"vc-actived")?d["default"].removeClass(t,"vc-actived"):d["default"].addClass(t,"vc-actived"),e.preventDefault()})}},{key:"clearLog",value:function(){this.reqList={};for(var e in this.domList)this.domList[e].remove(),this.domList[e]=void 0;this.domList={},this.renderHeader()}},{key:"renderHeader",value:function(){var e=Object.keys(this.reqList).length,t=d["default"].render(y["default"],{count:e}),o=d["default"].one(".vc-log",this.$tabbox);this.$header?this.$header.parentNode.replaceChild(t,this.$header):o.parentNode.insertBefore(t,o),this.$header=t}},{key:"updateRequest",value:function(e,t){var o=Object.keys(this.reqList).length,n=this.reqList[e]||{};for(var r in t)n[r]=t[r];this.reqList[e]=n;var i={url:n.url,status:n.status,type:"-",costTime:n.costTime>0?n.costTime+"ms":"-",header:n.header,response:f.htmlEncode(n.response)};n.readyState<=1?i.status="Pending":n.readyState<4&&(i.status="Loading");var l=d["default"].render(_["default"],i),c=this.domList[e];n.status>=400&&d["default"].addClass(d["default"].one(".vc-group-preview",l),"vc-table-row-error"),c?c.parentNode.replaceChild(l,c):d["default"].one(".vc-log",this.$tabbox).appendChild(l),this.domList[e]=l;var a=Object.keys(this.reqList).length;a!=o&&this.renderHeader()}},{key:"mockAjax",value:function(){var e=window.XMLHttpRequest;if(e){var t=this,o=window.XMLHttpRequest.prototype.open;window.XMLHttpRequest.prototype.send;window.XMLHttpRequest.prototype.open=function(){var e=this,n=[].slice.call(arguments),r=n[1],i=t.getUniqueID();e._requestID=i;var l=e.onreadystatechange||function(){};return e.onreadystatechange=function(){var o=t.reqList[i]||{};if(o.url=r,o.readyState=e.readyState,o.status=e.status,0==e.readyState)o.startTime=+new Date;else if(1==e.readyState)o.startTime=+new Date;else if(2==e.readyState){o.header={};var n=e.getAllResponseHeaders()||"",c=n.split("\n"),a=!0,s=!1,d=void 0;try{for(var u,f=c[Symbol.iterator]();!(a=(u=f.next()).done);a=!0){var v=u.value;if(v){var p=v.split(": "),b=p[0],h=p.slice(1).join(": ");o.header[b]=h}}}catch(g){s=!0,d=g}finally{try{!a&&f["return"]&&f["return"]()}finally{if(s)throw d}}}else 3==e.readyState||4==e.readyState&&(o.endTime=+new Date,o.costTime=o.endTime-(o.startTime||o.endTime),o.response=e.response);return t.updateRequest(i,o),l.apply(e,arguments)},o.apply(e,n)}}}},{key:"getUniqueID",value:function(){var e="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0,o="x"==e?t:3&t|8;return o.toString(16)});return e}}]),t}(p["default"]),w=new x("network","Network");t["default"]=w,e.exports=t["default"]},function(e,t){e.exports="<div class=vc-table> <div class=vc-log></div> </div>"},function(e,t){e.exports='<dl class=vc-table-row> <dd class="vc-table-col vc-table-col-4">Name {{if (count > 0)}}({{count}}){{/if}}</dd> <dd class=vc-table-col>Status</dd> <dd class=vc-table-col>Time</dd> </dl>'},function(e,t){e.exports='<div class=vc-group> <dl class="vc-table-row vc-group-preview"> <dd class="vc-table-col vc-table-col-4">{{url}}</dd> <dd class=vc-table-col>{{status}}</dd> <dd class=vc-table-col>{{costTime}}</dd> </dl> <div class=vc-group-detail> <div> <dl class="vc-table-row vc-left-border"> <dt class="vc-table-col vc-table-col-title">Headers</dt> </dl> {{for (var key in header)}} <div class="vc-table-row vc-left-border vc-small"> <div class="vc-table-col vc-table-col-2">{{key}}</div> <div class="vc-table-col vc-table-col-4 vc-max-height-line">{{header[key]}}</div> </div> {{/for}} </div> <div> <dl class="vc-table-row vc-left-border"> <dt class="vc-table-col vc-table-col-title">Response</dt> </dl> <div class="vc-table-row vc-left-border vc-small"> <pre class="vc-table-col vc-max-height vc-min-height">{{response}}</pre> </div> </div> </div> </div>'}])}); |
{ | ||
"name": "vconsole", | ||
"version": "1.3.0", | ||
"description": "A virtual console panel for mobile page", | ||
"version": "2.0.0", | ||
"description": "A lightweight, extendable front-end developer tool for mobile web page.", | ||
"homepage": "https://github.com/WechatFE/vConsole", | ||
@@ -6,0 +6,0 @@ "main": "dist/vconsole.min.js", |
115
README_CN.md
@@ -7,116 +7,45 @@ [English](./README.md) | 简体中文 | ||
一个针对手机网页的前端 console 调试面板。 | ||
一个轻量、可拓展、针对手机网页的前端开发者调试面板。 | ||
## 简介 | ||
## 特性 | ||
vConsole 是一个网页前端调试面板,专为手机 web 页面量身设计,帮助开发者更为便捷地进行开发调试工作。 | ||
- 查看 console 日志 | ||
- 查看网络请求 | ||
- 手动执行 JS 命令行 | ||
- 自定义插件 | ||
## 手机预览 | ||
## 上手 | ||
![](./example/snapshot/qrcode.png) | ||
[http://wechatfe.github.io/vconsole/demo.html](http://wechatfe.github.io/vconsole/demo.html) | ||
![](./example/snapshot/log_panel.png) | ||
## 安装 | ||
### 1.下载模块 | ||
下载文件 `dist/vconsole.min.js` 到本地。 | ||
或者使用 `npm` 安装: | ||
``` | ||
npm install vconsole | ||
``` | ||
### 2.引入模块 | ||
(1) 如果未使用 AMD/CMD 规范,可直接在 HTML 中引入 vConsole 模块。为了便于后续扩展,建议在 `<head>` 中引入: | ||
```html | ||
<head> | ||
<script src="path/to/vconsole.min.js"></script> | ||
</head> | ||
<script src="path/to/vconsole.min.js"></script> | ||
<script> | ||
console.log('Hello world'); | ||
// 然后点击右下角 vConsole 按钮即可查看到 log | ||
</script> | ||
``` | ||
(2) 如果使用了 AMD/CMD 规范,可在 module 内使用 `require()` 引入模块: | ||
详细使用方法请参阅[使用教程](./doc/tutorial_CN.md)。 | ||
```javascript | ||
var vConsole = require('path/to/vconsole.min.js'); | ||
``` | ||
## 手机预览 | ||
## 使用方法 | ||
![](./example/snapshot/qrcode.png) | ||
(1) 与 PC 端打印 log 一致,可直接使用 `console.log()` 等方法直接打印日志: | ||
[http://wechatfe.github.io/vconsole/demo.html](http://wechatfe.github.io/vconsole/demo.html) | ||
```javascript | ||
console.log('Hello World'); | ||
``` | ||
![](./example/snapshot/log_panel.png) | ||
未加载 vConsole 模块时,`console.log()` 会直接打印到原生控制台中;加载 vConsole 后,日志会打印到页面前端+原生控制台。 | ||
(2) 支持 5 种不同类型的日志,会以不同的颜色输出到前端面板: | ||
```javascript | ||
console.log('foo'); // 白底黑字 | ||
console.info('bar'); // 白底紫字 | ||
console.debug('oh'); // 白底黄字 | ||
console.warn('foo'); // 黄底黄字 | ||
console.error('bar'); // 红底红字 | ||
``` | ||
## 文档 | ||
(3) 支持打印 Object 或 Array 变量,会以结构化 JSON 形式输出(并折叠): | ||
- [使用教程](./doc/tutorial_CN.md) | ||
- [插件:入门](./doc/plugin_getting_started_CN.md) | ||
- [插件:编写插件](./doc/plugin_building_a_plugin_CN.md) | ||
- [插件:Event 事件列表](./doc/plugin_event_list_CN.md) | ||
```javascript | ||
var obj = {}; | ||
obj.foo = 'bar'; | ||
console.log(obj); | ||
/* | ||
Object | ||
{ | ||
foo: "bar" | ||
} | ||
*/ | ||
``` | ||
(4) 支持传入多个参数,会以空格隔开: | ||
```javascript | ||
var uid = 233; | ||
console.log('UserID:', uid); // 打印出 UserID: 233 | ||
``` | ||
(5) 支持使用 `[default|system|...]` 的格式将 log 输出到指定面板: | ||
```javascript | ||
// [xxx] 须写在 log 的最开始 | ||
console.log('[system]', 'foo'); | ||
console.log('[system] bar'); | ||
// 系统面板将打印出两行,分别为 foo 和 bar | ||
``` | ||
目前支持的面板有: | ||
``` | ||
[default] Log 日志(默认) | ||
[system] System 系统 | ||
[network] Network 网络 | ||
``` | ||
## 注意事项 | ||
(1) 引入 vConsole 模块后,页面前端将会在右下角出现 vConsole 的悬停按钮,可展开/收起面板。 | ||
若不希望普通用户看到面板,请不要在生产环境中引入 vConsole 模块。动态引入模块的方法可参考 `example/demo2.php` 示例。 | ||
(2) 从 v1.2.0 开始,弃用 `vConsole.ready()` 接口。引入 vConsole 后,无须等待即可立即使用 `console.log()` 等方法输出日志。 | ||
## 更新记录 | ||
@@ -123,0 +52,0 @@ |
121
README.md
@@ -7,120 +7,43 @@ English | [简体中文](./README_CN.md) | ||
A front-end developer tool for mobile web page. | ||
A lightweight, extendable front-end developer tool for mobile web page. | ||
## Introduction | ||
## Features | ||
vConsole is a mobile front-end developer tool which can be very helpful for debug and development. | ||
- View console logs | ||
- View network requests | ||
- Execute JS command manually | ||
- Custom plugin | ||
## Preview | ||
## Usage | ||
![](./example/snapshot/qrcode.png) | ||
[http://wechatfe.github.io/vconsole/demo.html](http://wechatfe.github.io/vconsole/demo.html) | ||
![](./example/snapshot/log_panel.png) | ||
## Installation | ||
### 1. Download | ||
Download file `dist/vconsole.min.js` to your project's directory. | ||
Or, install via `npm` : | ||
``` | ||
npm install vconsole | ||
``` | ||
### 2. Import | ||
(1) Under non-AMD/CMD rule, insert vConsole into `<head>`. To support further features, insert vConsole into `<head>` rather than `</body>` is a better choice. | ||
```html | ||
<head> | ||
<script src="path/to/vconsole.min.js"></script> | ||
</head> | ||
<script src="path/to/vconsole.min.js"></script> | ||
<script> | ||
console.log('Hello world'); | ||
// then tap vConsole button to see the log | ||
</script> | ||
``` | ||
(2) Under AMD/CMD rule, use `require()` to import vConsole. | ||
See [Tutorial](./doc/tutorial.md) for more details. | ||
```javascript | ||
var vConsole = require('path/to/vconsole.min.js'); | ||
``` | ||
## Preview | ||
## Usage | ||
![](./example/snapshot/qrcode.png) | ||
(1) Use the methods of `console` to print logs, just like what you do at desktop browsers: | ||
[http://wechatfe.github.io/vconsole/demo.html](http://wechatfe.github.io/vconsole/demo.html) | ||
```javascript | ||
console.log('Hello World'); | ||
``` | ||
![](./example/snapshot/log_panel.png) | ||
When vConsole is not loaded, logs will be printed to native console. After importing vConsole, logs will be printed to both front-end console and native console. | ||
## Documentation | ||
(2) 5 types of log method are supported, with different styles: | ||
- [Tutorial](./doc/tutorial.md) | ||
- [Plugin: Getting Started](./doc/plugin_getting_started.md) | ||
- [Plugin: Building a Plugin](./doc/plugin_building_a_plugin.md) | ||
- [Plugin: Event List](./doc/plugin_event_list.md) | ||
```javascript | ||
console.log('foo'); // black word, white bakcground | ||
console.info('bar'); // purple word, white background | ||
console.debug('oh'); // orange word, white background | ||
console.warn('foo'); // orange word, yellow background | ||
console.error('bar'); // red word, pink background | ||
``` | ||
(3) Object or Array variable will be printed as formatted JSON: | ||
```javascript | ||
var obj = {}; | ||
obj.foo = 'bar'; | ||
console.log(obj); | ||
/* | ||
Object | ||
{ | ||
foo: "bar" | ||
} | ||
*/ | ||
``` | ||
(4) Multiple arguments are supported, each variable will be divided by a space: | ||
```javascript | ||
var uid = 233; | ||
console.log('UserID:', uid); // UserID: 233 | ||
``` | ||
(5) Use `[default|system|...]` string to print logs to specific panel: | ||
```javascript | ||
// [xxx] must be at the beginning of a log | ||
console.log('[system]', 'foo'); | ||
console.log('[system] bar'); | ||
// foo & bar will be printed to system panel | ||
``` | ||
Supported panels: | ||
``` | ||
[default] Log panel (default) | ||
[system] System panel | ||
[network] Network panel | ||
``` | ||
## Notice | ||
(1) After importing vConsole, a button, which can show/hide panel, will be displayed at the right bottom of the page. | ||
Under production environment, DO NOT import vConsole to your page, unless you want to let your users help you to debug. Demo `example/demo2.php` shows how to import vConsole dynamicly. | ||
(2) After v1.2.0, `vConsole.ready()` is deprecated. You can directly use `console.log()` after importing vConsole without waiting for its ready. This method will be removed at v2.0.0 and later. | ||
## Changelog | ||
@@ -127,0 +50,0 @@ |
@@ -7,695 +7,18 @@ /** | ||
import './vconsole.less'; | ||
import tpl from './tpl.html'; | ||
import tplFold from './tpl_fold.html'; | ||
// classes | ||
import VConsole from './core/core.js'; | ||
import VConsolePlugin from './lib/plugin.js'; | ||
// default tabs | ||
import defaultTab from './log/default.js'; | ||
import systemTab from './log/system.js'; | ||
import networkTab from './network/network.js'; | ||
/** | ||
* initial | ||
* @constructor | ||
*/ | ||
function vConsole() { | ||
var that = this; | ||
// here we go | ||
const vConsole = new VConsole(); | ||
vConsole.addPlugin(defaultTab); | ||
vConsole.addPlugin(systemTab); | ||
vConsole.addPlugin(networkTab); | ||
this.html = tpl; | ||
this.$dom = null; | ||
this.activedTab = 'default'; | ||
this.tabList = ['default', 'system', 'network']; | ||
this.console = {}; // store native console methods | ||
this.logList = []; // store logs when vConsole is not ready | ||
this.isReady = false; | ||
this.switchPos = { | ||
x: 10, // right | ||
y: 10, // bottom | ||
startX: 0, | ||
startY: 0, | ||
endX: 0, | ||
endY: 0 | ||
}; | ||
that._mokeConsole(); | ||
that._mokeAjax(); | ||
var _onload = function() { | ||
that._render(); | ||
that._bindEvent(); | ||
that._autoRun(); | ||
}; | ||
if (document.readyState == 'complete') { | ||
_onload(); | ||
} else { | ||
bind(window, 'load', _onload); | ||
} | ||
} | ||
/** | ||
* render panel DOM | ||
* @private | ||
*/ | ||
vConsole.prototype._render = function() { | ||
var id = '#__vconsole'; | ||
if (! $(id)) { | ||
var e = document.createElement('div'); | ||
e.innerHTML = this.html; | ||
document.body.appendChild(e.children[0]); | ||
} | ||
this.$dom = $(id); | ||
// reposition switch button | ||
var switchX = getStorage('switch_x'), | ||
switchY = getStorage('switch_y'); | ||
if (switchX && switchY) { | ||
this.switchPos.x = switchX; | ||
this.switchPos.y = switchY; | ||
$('.vc-switch').style.right = switchX + 'px'; | ||
$('.vc-switch').style.bottom = switchY + 'px'; | ||
} | ||
}; | ||
/** | ||
* bind DOM events | ||
* @private | ||
*/ | ||
vConsole.prototype._bindEvent = function() { | ||
var that = this; | ||
// drag & drop switch button | ||
var $switch = $('.vc-switch'); | ||
bind($switch, 'touchstart', function(e) { | ||
that.switchPos.startX = e.touches[0].pageX; | ||
that.switchPos.startY = e.touches[0].pageY; | ||
}); | ||
bind($switch, 'touchend', function(e) { | ||
if (that.switchPos.endX != 0 || that.switchPos.endY != 0) { | ||
that.switchPos.x = that.switchPos.endX; | ||
that.switchPos.y = that.switchPos.endY; | ||
that.switchPos.startX = 0; | ||
that.switchPos.startY = 0; | ||
that.switchPos.endX = 0; | ||
that.switchPos.endY = 0; | ||
setStorage('switch_x', that.switchPos.x); | ||
setStorage('switch_y', that.switchPos.y); | ||
} | ||
}); | ||
bind($switch, 'touchmove', function(e) { | ||
if (e.touches.length > 0) { | ||
var offsetX = e.touches[0].pageX - that.switchPos.startX, | ||
offsetY = e.touches[0].pageY - that.switchPos.startY; | ||
var x = that.switchPos.x - offsetX, | ||
y = that.switchPos.y - offsetY; | ||
$switch.style.right = x + 'px'; | ||
$switch.style.bottom = y + 'px'; | ||
that.switchPos.endX = x; | ||
that.switchPos.endY = y; | ||
e.preventDefault(); | ||
} | ||
}); | ||
// show console panel | ||
bind($('.vc-switch'), 'click', function() { | ||
that.show(); | ||
}) | ||
// hide console panel | ||
bind($('.vc-hide'), 'click', function() { | ||
that.hide(); | ||
}); | ||
// hide console panel when tap background mask | ||
bind($('.vc-mask'), 'click', function(e) { | ||
if (e.target != $('.vc-mask')) { | ||
return false; | ||
} | ||
that.hide(); | ||
}); | ||
// clear a log box | ||
bind($('.vc-clear'), 'click', function() { | ||
that.clearLog(that.activedTab); | ||
}); | ||
// show a log box | ||
bind($$('.vc-tab'), 'click', function(e) { | ||
var tabName = e.target.dataset.tab; | ||
if (tabName == that.activedTab) { | ||
return; | ||
} | ||
that.showTab(tabName); | ||
}); | ||
// log-related actions | ||
bind($$('.vc-log'), 'click', function(e) { | ||
var target = e.target; | ||
// expand a line | ||
if (hasClass(target, 'vc-fold-outer')) { | ||
if (hasClass(target.parentElement, 'vc-toggle')) { | ||
removeClass(target.parentElement, 'vc-toggle'); | ||
} else { | ||
addClass(target.parentElement, 'vc-toggle'); | ||
} | ||
e.preventDefault(); | ||
} | ||
}); | ||
}; | ||
/** | ||
* replace window.console & window.onerror with vConsole method | ||
* @private | ||
*/ | ||
vConsole.prototype._mokeConsole = function() { | ||
if (!window.console) { | ||
return; | ||
} | ||
var that = this; | ||
this.console.log = window.console.log; | ||
this.console.info = window.console.info; | ||
this.console.warn = window.console.warn; | ||
this.console.debug = window.console.debug; | ||
this.console.error = window.console.error; | ||
window.console.log = function() { that._printLog('auto', 'log', arguments); }; | ||
window.console.info = function() { that._printLog('auto', 'info', arguments); }; | ||
window.console.warn = function() { that._printLog('auto', 'warn', arguments); }; | ||
window.console.debug = function() { that._printLog('auto', 'debug', arguments); }; | ||
window.console.error = function() { that._printLog('auto', 'error', arguments); }; | ||
window.onerror = function(message, source, lineno, colno, error) { | ||
var stack = error.stack.split('at'); | ||
stack = stack[0] + ' ' + stack[1]; | ||
stack = stack.replace(location.origin, ''); | ||
console.error(stack); | ||
}; | ||
}; | ||
/** | ||
* moke ajax requst | ||
* @private | ||
*/ | ||
vConsole.prototype._mokeAjax = function() { | ||
var _XMLHttpRequest = window.XMLHttpRequest; | ||
if (!_XMLHttpRequest) { return; } | ||
var _open = window.XMLHttpRequest.prototype.open; | ||
var _send = window.XMLHttpRequest.prototype.send; | ||
window.XMLHttpRequest.prototype.open = function() { | ||
var that = this; | ||
var _arguments = arguments; | ||
// lazy assign onreadystatechange | ||
setTimeout(function() { | ||
var _onreadystatechange = that.onreadystatechange || function(){}; | ||
that.onreadystatechange = function() { | ||
if (that.readyState == 4) { | ||
that._endTime = +new Date(); | ||
var url = _arguments[1] || 'unknow URL', | ||
costTime = that._endTime - (that._startTime || that._endTime); | ||
var log = '[network][' + that.status + '] [' + costTime + 'ms] ' + url; | ||
if (that.status >= 200 && that.status < 400) { | ||
console.log(log); | ||
} else { | ||
console.error(log); | ||
} | ||
} | ||
return _onreadystatechange.apply(that, arguments); | ||
}; | ||
}, 0); | ||
return _open.apply(that, _arguments); | ||
}; | ||
window.XMLHttpRequest.prototype.send = function() { | ||
var that = this; | ||
var _arguments = arguments; | ||
that._startTime = +new Date(); | ||
setTimeout(function() { | ||
_send.apply(that, _arguments); | ||
}, 1); | ||
}; | ||
}; | ||
/** | ||
* auto run after initialization | ||
* @private | ||
*/ | ||
vConsole.prototype._autoRun = function() { | ||
this.isReady = true; | ||
// print logList | ||
while (this.logList.length > 0) { | ||
var log = this.logList.shift(); | ||
this._printLog(log.tabName, log.logType, log.logs); | ||
} | ||
// print system info | ||
var ua = navigator.userAgent, | ||
logMsg = []; | ||
// current time | ||
var d = getDate(); | ||
this._printLog('system', 'info', ['日志时间:', d.year+'-'+d.month+'-'+d.day+' '+d.hour+':'+d.minute+':'+d.second+' '+d.millisecond]); | ||
// device & system | ||
logMsg = ['系统版本:', '不明']; | ||
var ipod = ua.match(/(ipod).*\s([\d_]+)/i), | ||
ipad = ua.match(/(ipad).*\s([\d_]+)/i), | ||
iphone = ua.match(/(iphone)\sos\s([\d_]+)/i), | ||
android = ua.match(/(android)\s([\d\.]+)/i); | ||
if (android) { | ||
logMsg[1] = 'Android ' + android[2]; | ||
} else if (iphone) { | ||
logMsg[1] = 'iPhone, iOS ' + iphone[2].replace(/_/g,'.'); | ||
} else if (ipad) { | ||
logMsg[1] = 'iPad, iOS ' + ipad[2].replace(/_/g, '.'); | ||
} else if (ipod) { | ||
logMsg[1] = 'iPod, iOS ' + ipod[2].replace(/_/g, '.'); | ||
} | ||
this._printLog('system', 'info', logMsg); | ||
// wechat app version | ||
var version = ua.match(/MicroMessenger\/([\d\.]+)/i); | ||
logMsg = ['微信版本:', '不明']; | ||
if (version && version[1]) { | ||
logMsg[1] = version[1]; | ||
this._printLog('system', 'info', logMsg); | ||
} | ||
// network type | ||
var network = ua.toLowerCase().match(/ nettype\/([^ ]+)/g); | ||
logMsg = ['网络类型:', '不明']; | ||
if (network && network[0]) { | ||
network = network[0].split('/'); | ||
logMsg[1] = network[1]; | ||
this._printLog('system', 'info', logMsg); | ||
} | ||
// HTTP protocol | ||
logMsg = ['网址协议:', '不明']; | ||
if (location.protocol == 'https:') { | ||
logMsg[1] = 'HTTPS'; | ||
} else if (location.protocol == 'http:') { | ||
logMsg[1] = 'HTTP'; | ||
} else { | ||
logMsg[1] = location.protocol.replace(':', ''); | ||
} | ||
this._printLog('system', 'info', logMsg); | ||
// performance related | ||
window.addEventListener('load', function(e) { | ||
var performance = window.performance || window.msPerformance || window.webkitPerformance; | ||
// timing | ||
if (performance && performance.timing) { | ||
var t = performance.timing, | ||
start = t.navigationStart; | ||
// this._printLog('system', 'debug', ['domainLookupEnd:', (t.domainLookupEnd - start)+'ms']); | ||
this._printLog('system', 'info', ['连接结束点:', (t.connectEnd - start)+'ms']); | ||
this._printLog('system', 'info', ['回包结束点:', (t.responseEnd - start)+'ms']); | ||
// this._printLog('system', 'debug', ['domComplete:', (t.domComplete - start)+'ms']); | ||
// this._printLog('system', 'info', ['beforeReqTime:', (t.requestStart - start)+'ms']); | ||
if (t.secureConnectionStart > 0) { | ||
this._printLog('system', 'info', ['ssl耗时:', (t.connectEnd - t.secureConnectionStart)+'ms']); | ||
} | ||
// this._printLog('system', 'info', ['req&RespTime:', (t.responseEnd - t.requestStart)+'ms']); | ||
this._printLog('system', 'info', ['dom渲染耗时:', (t.domComplete - t.domLoading)+'ms']); | ||
} | ||
}); | ||
}; | ||
/** | ||
* print a log to log box | ||
* @private | ||
* @param string tabName auto|default|system | ||
* @param string logType log|info|debug|error|warn | ||
* @param array logs | ||
*/ | ||
vConsole.prototype._printLog = function(tabName, logType, logs) { | ||
if (!logs.length) { | ||
return; | ||
} | ||
// if vConsole is not ready, save current log to logList | ||
if (!this.isReady) { | ||
this.logList.push({ | ||
tabName: tabName, | ||
logType: logType, | ||
logs: logs | ||
}); | ||
return; | ||
} | ||
// generate plain text for a line | ||
var line = ''; | ||
for (var i=0; i<logs.length; i++) { | ||
try { | ||
if (isFunction(logs[i])) { | ||
line += ' ' + logs[i].toString(); | ||
} else if (isObject(logs[i]) || isArray(logs[i])) { | ||
line += ' ' + this._getFoldedLine(logs[i]); | ||
} else { | ||
line += ' ' + htmlEncode(logs[i]).replace(/\n/g, '<br/>'); | ||
} | ||
} catch (e) { | ||
line += ' [' + (typeof logs[i]) + ']'; | ||
} | ||
} | ||
// auto select tab | ||
if (tabName == 'auto') { | ||
var pattern = /^ \[(\w+)\]/i; | ||
var match = line.match(pattern); | ||
if (match !== null && match.length > 0 && this.tabList.indexOf(match[1]) > -1) { | ||
tabName = match[1]; | ||
line = line.replace(pattern, ''); | ||
} | ||
} | ||
if (tabName == 'auto') { | ||
tabName = 'default'; | ||
} | ||
var $logbox = $('#__vc_log_' + tabName); | ||
var p = document.createElement('p'); | ||
p.className = 'vc-item vc-item-' + logType; | ||
p.innerHTML = line; | ||
$('.vc-log', $logbox).appendChild(p); | ||
$('.vc-content').scrollTop = $('.vc-content').scrollHeight; | ||
// print to traditional console | ||
this.console[logType].apply(window.console, logs); | ||
}; | ||
/** | ||
* generate the HTML of a folded line | ||
* @private | ||
*/ | ||
vConsole.prototype._getFoldedLine = function(obj, outerText) { | ||
var json = JSON.stringify(obj); | ||
var outer = '', | ||
inner = '', | ||
preview = ''; | ||
var lv = 0, | ||
p = ' '; | ||
preview = json.substr(0, 30); | ||
if (json.length > 30) { | ||
preview += '...'; | ||
} | ||
outer = Object.prototype.toString.call(obj).replace('[object ', '').replace(']', ''); | ||
outer += ' ' + preview; | ||
function _iterateObj(val) { | ||
if (isObject(val)) { | ||
var keys = Object.keys(val); | ||
inner += "{\n"; | ||
lv++; | ||
for (var i=0; i<keys.length; i++) { | ||
var k = keys[i]; | ||
if (!val.hasOwnProperty(k)) { continue; } | ||
inner += Array(lv+1).join(p) + '<i class="vc-code-key">' + k + "</i>: "; | ||
_iterateObj(val[k]); | ||
if (i < keys.length - 1) { | ||
inner += ",\n"; | ||
} | ||
} | ||
lv--; | ||
inner += "\n" + Array(lv+1).join(p) + "}"; | ||
} else if (isArray(val)) { | ||
inner += "[\n"; | ||
lv++; | ||
for (var i=0; i<val.length; i++) { | ||
inner += Array(lv+1).join(p) + '<i class="vc-code-key">' + i + "</i>: "; | ||
_iterateObj(val[i]); | ||
if (i < val.length - 1) { | ||
inner += ",\n"; | ||
} | ||
} | ||
lv--; | ||
inner += "\n" + Array(lv+1).join(p) + "]"; | ||
} else { | ||
if (isString(val)) { | ||
inner += '<i class="vc-code-string">"' + val + '"</i>'; | ||
} else if (isNumber(val)) { | ||
inner += '<i class="vc-code-number">' + val + "</i>"; | ||
} else { | ||
inner += JSON.stringify(val); | ||
} | ||
} | ||
} | ||
_iterateObj(obj); | ||
var line = render(tplFold, {outer: outer, inner: inner}); | ||
return line; | ||
}; | ||
/** | ||
* show a log box by tab name | ||
* @public | ||
*/ | ||
vConsole.prototype.showTab = function(tabName) { | ||
var $logbox = $('#__vc_log_' + tabName); | ||
// set actived status | ||
removeClass($$('.vc-tab', this.$dom), 'vc-actived'); | ||
addClass($('#__vc_tab_' + tabName), 'vc-actived'); | ||
removeClass($$('.vc-logbox'), 'vc-actived'); | ||
addClass($logbox, 'vc-actived'); | ||
// scroll to bottom | ||
$('.vc-content').scrollTop = $('.vc-content').scrollHeight; | ||
this.activedTab = tabName; | ||
}; | ||
/** | ||
* clear a log box by tab name | ||
* @public | ||
*/ | ||
vConsole.prototype.clearLog = function(tabName) { | ||
var $logbox = $('#__vc_log_' + tabName); | ||
$('.vc-log', $logbox).innerHTML = ''; | ||
}; | ||
/** | ||
* show console panel | ||
* @public | ||
*/ | ||
vConsole.prototype.show = function() { | ||
addClass(this.$dom, 'vc-toggle'); | ||
}; | ||
/** | ||
* hide console panel | ||
* @public | ||
*/ | ||
vConsole.prototype.hide = function() { | ||
removeClass(this.$dom, 'vc-toggle'); | ||
}; | ||
/** | ||
* !!! this method is deprecated, callback will always be called !!! | ||
* @deprecated | ||
* @public | ||
* @param function callback | ||
*/ | ||
vConsole.prototype.ready = function(callback) { | ||
console.warn('vConsole.ready() is deprecated, console.log() can be called at anytime without waiting for ready. This method will be removed at v2.0.0 and later'); | ||
callback && callback.call(this); | ||
}; | ||
/**************************************************************** | ||
Utility Functions | ||
****************************************************************/ | ||
/** | ||
* get single element | ||
* @private | ||
*/ | ||
function $(selector, contextElement) { | ||
if (contextElement) { | ||
return contextElement.querySelector(selector); | ||
} | ||
return document.querySelector(selector); | ||
} | ||
/** | ||
* get multiple elements | ||
* @private | ||
*/ | ||
function $$(selector, contextElement) { | ||
var nodeList, | ||
list = []; | ||
if (contextElement) { | ||
nodeList = contextElement.querySelectorAll(selector); | ||
} else { | ||
nodeList = document.querySelectorAll(selector); | ||
} | ||
if (nodeList && nodeList.length > 0) { | ||
list = Array.prototype.slice.call(nodeList); | ||
} | ||
return list; | ||
} | ||
/** | ||
* add className to an element | ||
* @private | ||
*/ | ||
function addClass($el, className) { | ||
if (!$el) { | ||
return; | ||
} | ||
if (!isArray($el)) { | ||
$el = [$el]; | ||
} | ||
for (var i=0; i<$el.length; i++) { | ||
$el[i].className += ' ' + className; | ||
} | ||
} | ||
/** | ||
* remove className from an element | ||
* @private | ||
*/ | ||
function removeClass($el, className) { | ||
if (!$el) { | ||
return; | ||
} | ||
if (!isArray($el)) { | ||
$el = [$el]; | ||
} | ||
for (var i=0; i<$el.length; i++) { | ||
var arr = $el[i].className.split(' '); | ||
for (var j=0; j<arr.length; j++) { | ||
if (arr[j] == className) { | ||
arr[j] = ''; | ||
} | ||
} | ||
$el[i].className = arr.join(' '); | ||
} | ||
} | ||
/** | ||
* see whether an element contains a className | ||
* @private | ||
*/ | ||
function hasClass($el, className) { | ||
if (!$el) { | ||
return false; | ||
} | ||
var arr = $el.className.split(' '); | ||
for (var i=0; i<arr.length; i++) { | ||
if (arr[i] == className) { | ||
return true; | ||
} | ||
} | ||
return false; | ||
} | ||
/** | ||
* bind an event to element(s) | ||
* @private | ||
* @param array $el element object or array | ||
* @param string eventType name of the event | ||
* @param function fn | ||
* @param boolean useCapture | ||
*/ | ||
function bind($el, eventType, fn, useCapture) { | ||
if (!$el) { | ||
return; | ||
} | ||
if (useCapture === undefined) { | ||
useCapture = false; | ||
} | ||
if (!isArray($el)) { | ||
$el = [$el]; | ||
} | ||
for (var i=0; i<$el.length; i++) { | ||
$el[i].addEventListener(eventType, fn, useCapture); | ||
} | ||
} | ||
/** | ||
* get formatted date by timestamp | ||
* @param int time | ||
* @return object | ||
*/ | ||
function getDate(time) { | ||
var d = time>0 ? new Date(time) : new Date(); | ||
var day = d.getDay()<10 ? '0'+d.getDay() : d.getDay(), | ||
month = d.getMonth()<9 ? '0'+(d.getMonth()+1) : (d.getMonth()+1), | ||
year = d.getFullYear(), | ||
hour = d.getHours()<10 ? '0'+d.getHours() : d.getHours(), | ||
minute = d.getMinutes()<10 ? '0'+d.getMinutes() : d.getMinutes(), | ||
second = d.getSeconds()<10 ? '0'+d.getSeconds() : d.getSeconds(), | ||
millisecond = d.getMilliseconds()<10 ? '0'+d.getMilliseconds() : d.getMilliseconds(); | ||
if (millisecond<100) { millisecond = '0' + millisecond; } | ||
return { | ||
time: (+d), | ||
year: year, | ||
month: month, | ||
day: day, | ||
hour: hour, | ||
minute: minute, | ||
second: second, | ||
millisecond: millisecond | ||
}; | ||
} | ||
/** | ||
* HTML encode a string | ||
* @param string text | ||
* @return string | ||
*/ | ||
function htmlEncode(text) { | ||
return document.createElement('a').appendChild( document.createTextNode(text) ).parentNode.innerHTML; | ||
}; | ||
/** | ||
* simply render a HTML template | ||
* @param string tpl | ||
* @param object key-value data | ||
* @return string | ||
*/ | ||
function render(tpl, data) { | ||
var html = tpl; | ||
for (var k in data) { | ||
html = html.replace('{' + k + '}', data[k]); | ||
} | ||
return html; | ||
} | ||
/** | ||
* determines whether the passed value is a specific type | ||
* @param mixed value | ||
* @return boolean | ||
*/ | ||
function isNumber(value) { | ||
return Object.prototype.toString.call(value) == '[object Number]'; | ||
} | ||
function isString(value) { | ||
return Object.prototype.toString.call(value) == '[object String]'; | ||
} | ||
function isArray(value) { | ||
return Object.prototype.toString.call(value) == '[object Array]'; | ||
} | ||
function isObject(value) { | ||
return Object.prototype.toString.call(value) == '[object Object]'; | ||
} | ||
function isFunction(value) { | ||
return Object.prototype.toString.call(value) == '[object Function]'; | ||
} | ||
/** | ||
* localStorage methods | ||
*/ | ||
function setStorage(key, value) { | ||
key = 'vConsole_' + key; | ||
localStorage.setItem(key, value); | ||
} | ||
function getStorage(key) { | ||
key = 'vConsole_' + key; | ||
return localStorage.getItem(key); | ||
} | ||
/** | ||
* export | ||
*/ | ||
export default new vConsole(); | ||
// export | ||
vConsole.VConsolePlugin = VConsolePlugin; | ||
export default vConsole; |
@@ -33,3 +33,8 @@ var pkg = require('./package.json'); | ||
plugins: [ | ||
new webpack.optimize.UglifyJsPlugin({ | ||
new webpack.BannerPlugin([ | ||
pkg.name + ' v' + pkg.version + ' (' + pkg.homepage + ')', | ||
'Copyright ' + new Date().getFullYear() + ', ' + pkg.author, | ||
pkg.license +' license' | ||
].join('\n')) | ||
,new webpack.optimize.UglifyJsPlugin({ | ||
compress: { | ||
@@ -39,7 +44,2 @@ warnings: false | ||
}) | ||
,new webpack.BannerPlugin([ | ||
pkg.name + ' v' + pkg.version + ' (' + pkg.homepage + ')', | ||
'Copyright ' + new Date().getFullYear() + ', ' + pkg.author, | ||
pkg.license +' license' | ||
].join('\n')) | ||
// ,new ExtractTextPlugin('[name].min.css') // 将css独立打包 | ||
@@ -46,0 +46,0 @@ ] |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
295398
57
1598
56
2