mirror of
https://github.com/liriliri/eruda.git
synced 2026-03-20 09:38:37 +08:00
Support lazy evaluation
This commit is contained in:
@@ -15,6 +15,7 @@ Display console logs. Implementation detail follows the [console api spec](https
|
|||||||
|displayExtraInfo |boolean|Display extra information |
|
|displayExtraInfo |boolean|Display extra information |
|
||||||
|displayUnenumerable|boolean|Display unenumerable properties|
|
|displayUnenumerable|boolean|Display unenumerable properties|
|
||||||
|displayGetterVal |boolean|Access getter value |
|
|displayGetterVal |boolean|Access getter value |
|
||||||
|
|lazyEvaluation |boolean|Stringify object when clicked |
|
||||||
|viewLogInSources |boolean|View log in sources panel |
|
|viewLogInSources |boolean|View log in sources panel |
|
||||||
|displayIfErr |boolean|Auto display if error occurs |
|
|displayIfErr |boolean|Auto display if error occurs |
|
||||||
|useWorker |boolean|Use web worker |
|
|useWorker |boolean|Use web worker |
|
||||||
|
|||||||
@@ -210,6 +210,7 @@ export default class Console extends Tool {
|
|||||||
displayExtraInfo: false,
|
displayExtraInfo: false,
|
||||||
displayUnenumerable: true,
|
displayUnenumerable: true,
|
||||||
displayGetterVal: false,
|
displayGetterVal: false,
|
||||||
|
lazyEvaluation: true,
|
||||||
viewLogInSources: false,
|
viewLogInSources: false,
|
||||||
displayIfErr: false,
|
displayIfErr: false,
|
||||||
useWorker: true,
|
useWorker: true,
|
||||||
@@ -227,6 +228,7 @@ export default class Console extends Tool {
|
|||||||
logger.displayHeader(cfg.get('displayExtraInfo'))
|
logger.displayHeader(cfg.get('displayExtraInfo'))
|
||||||
logger.displayUnenumerable(cfg.get('displayUnenumerable'))
|
logger.displayUnenumerable(cfg.get('displayUnenumerable'))
|
||||||
logger.displayGetterVal(cfg.get('displayGetterVal'))
|
logger.displayGetterVal(cfg.get('displayGetterVal'))
|
||||||
|
logger.lazyEvaluation(cfg.get('lazyEvaluation'))
|
||||||
if (sources) logger.viewLogInSources(cfg.get('viewLogInSources'))
|
if (sources) logger.viewLogInSources(cfg.get('viewLogInSources'))
|
||||||
logger.maxNum(maxLogNum)
|
logger.maxNum(maxLogNum)
|
||||||
|
|
||||||
@@ -244,6 +246,8 @@ export default class Console extends Tool {
|
|||||||
return logger.displayUnenumerable(val)
|
return logger.displayUnenumerable(val)
|
||||||
case 'displayGetterVal':
|
case 'displayGetterVal':
|
||||||
return logger.displayGetterVal(val)
|
return logger.displayGetterVal(val)
|
||||||
|
case 'lazyEvaluation':
|
||||||
|
return logger.lazyEvaluation(val)
|
||||||
case 'viewLogInSources':
|
case 'viewLogInSources':
|
||||||
return logger.viewLogInSources(val)
|
return logger.viewLogInSources(val)
|
||||||
case 'useWorker':
|
case 'useWorker':
|
||||||
@@ -262,6 +266,7 @@ export default class Console extends Tool {
|
|||||||
.switch(cfg, 'displayExtraInfo', 'Display Extra Information')
|
.switch(cfg, 'displayExtraInfo', 'Display Extra Information')
|
||||||
.switch(cfg, 'displayUnenumerable', 'Display Unenumerable Properties')
|
.switch(cfg, 'displayUnenumerable', 'Display Unenumerable Properties')
|
||||||
.switch(cfg, 'displayGetterVal', 'Access Getter Value')
|
.switch(cfg, 'displayGetterVal', 'Access Getter Value')
|
||||||
|
.switch(cfg, 'lazyEvaluation', 'Lazy Evaluation')
|
||||||
|
|
||||||
if (isWorkerSupported) settings.switch(cfg, 'useWorker', 'Use Web Worker')
|
if (isWorkerSupported) settings.switch(cfg, 'useWorker', 'Use Web Worker')
|
||||||
if (sources)
|
if (sources)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<li>
|
<li class="eruda-log-container">
|
||||||
{{#if displayHeader}}
|
{{#if displayHeader}}
|
||||||
<div class="eruda-header">
|
<div class="eruda-header">
|
||||||
<span data-mark="time">{{time}}</span> <span>{{from}}</span>
|
<span data-mark="time">{{time}}</span> <span>{{from}}</span>
|
||||||
|
|||||||
@@ -23,7 +23,9 @@ import {
|
|||||||
isArr,
|
isArr,
|
||||||
unique,
|
unique,
|
||||||
contain,
|
contain,
|
||||||
isEmpty
|
isEmpty,
|
||||||
|
clone,
|
||||||
|
noop
|
||||||
} from '../lib/util'
|
} from '../lib/util'
|
||||||
|
|
||||||
export default class Log {
|
export default class Log {
|
||||||
@@ -82,25 +84,36 @@ export default class Log {
|
|||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
extractObj(cb = noop) {
|
||||||
|
let { args, type } = this
|
||||||
|
|
||||||
|
let setSrc = result => {
|
||||||
|
this.src = result
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
if (type === 'table') {
|
||||||
|
extractObj(args[0], {}, setSrc)
|
||||||
|
} else {
|
||||||
|
extractObj(
|
||||||
|
args.length === 1 && isObj(args[0]) ? args[0] : args,
|
||||||
|
{},
|
||||||
|
setSrc
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
_formatMsg() {
|
_formatMsg() {
|
||||||
let { type, id, displayHeader, time, from, args } = this
|
let { type, id, displayHeader, time, from, args } = this
|
||||||
|
|
||||||
if (this._needSrc()) {
|
// Don't change original args for lazy evaluation.
|
||||||
let setSrc = result => (this.src = result)
|
args = clone(args)
|
||||||
if (type === 'table') {
|
|
||||||
extractObj(args[0], {}, setSrc)
|
if (this._needSrc() && !Log.lazyEvaluation) {
|
||||||
} else {
|
this.extractObj()
|
||||||
extractObj(
|
|
||||||
args.length === 1 && isObj(args[0]) ? args[0] : args,
|
|
||||||
{},
|
|
||||||
setSrc
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let msg = '',
|
let msg = ''
|
||||||
icon,
|
let icon
|
||||||
err
|
let err
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'log':
|
case 'log':
|
||||||
@@ -148,7 +161,9 @@ export default class Log {
|
|||||||
this.value = msg
|
this.value = msg
|
||||||
msg = render({ msg, type, icon, id, displayHeader, time, from })
|
msg = render({ msg, type, icon, id, displayHeader, time, from })
|
||||||
|
|
||||||
delete this.args
|
if (!this._needSrc() || !Log.lazyEvaluation) {
|
||||||
|
delete this.args
|
||||||
|
}
|
||||||
this.formattedMsg = msg
|
this.formattedMsg = msg
|
||||||
}
|
}
|
||||||
static click(type, log, $el) {
|
static click(type, log, $el) {
|
||||||
@@ -172,6 +187,11 @@ export default class Log {
|
|||||||
} else {
|
} else {
|
||||||
$json.addClass('eruda-hidden')
|
$json.addClass('eruda-hidden')
|
||||||
}
|
}
|
||||||
|
} else if (log.args) {
|
||||||
|
log.extractObj(function() {
|
||||||
|
Log.click(type, log, $el)
|
||||||
|
delete log.args
|
||||||
|
})
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 'error':
|
case 'error':
|
||||||
@@ -187,6 +207,7 @@ export default class Log {
|
|||||||
Log.showGetterVal = false
|
Log.showGetterVal = false
|
||||||
Log.showUnenumerable = true
|
Log.showUnenumerable = true
|
||||||
Log.showSrcInSources = false
|
Log.showSrcInSources = false
|
||||||
|
Log.lazyEvaluation = true
|
||||||
|
|
||||||
let getAbstract = wrap(origGetAbstract, function(fn, obj) {
|
let getAbstract = wrap(origGetAbstract, function(fn, obj) {
|
||||||
return fn(obj, {
|
return fn(obj, {
|
||||||
@@ -241,12 +262,12 @@ function formatTable(args) {
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
let regJsUrl = /https?:\/\/([0-9.\-A-Za-z]+)(?::(\d+))?\/[A-Z.a-z0-9/]*\.js/g,
|
let regJsUrl = /https?:\/\/([0-9.\-A-Za-z]+)(?::(\d+))?\/[A-Z.a-z0-9/]*\.js/g
|
||||||
regErudaJs = /eruda(\.min)?\.js/
|
let regErudaJs = /eruda(\.min)?\.js/
|
||||||
|
|
||||||
function formatErr(err) {
|
function formatErr(err) {
|
||||||
let lines = err.stack ? err.stack.split('\n') : [],
|
let lines = err.stack ? err.stack.split('\n') : []
|
||||||
msg = `${err.message || lines[0]}<br/>`
|
let msg = `${err.message || lines[0]}<br/>`
|
||||||
|
|
||||||
lines = lines.filter(val => !regErudaJs.test(val)).map(val => escape(val))
|
lines = lines.filter(val => !regErudaJs.test(val)).map(val => escape(val))
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,9 @@ export default class Logger extends Emitter {
|
|||||||
displayGetterVal(flag) {
|
displayGetterVal(flag) {
|
||||||
Log.showGetterVal = flag
|
Log.showGetterVal = flag
|
||||||
}
|
}
|
||||||
|
lazyEvaluation(flag) {
|
||||||
|
Log.lazyEvaluation = flag
|
||||||
|
}
|
||||||
viewLogInSources(flag) {
|
viewLogInSources(flag) {
|
||||||
Log.showSrcInSources = flag
|
Log.showSrcInSources = flag
|
||||||
}
|
}
|
||||||
@@ -191,9 +194,9 @@ export default class Logger extends Emitter {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
insert(type, args) {
|
insert(type, args) {
|
||||||
let logs = this._logs,
|
let logs = this._logs
|
||||||
$el = this._$el,
|
let $el = this._$el
|
||||||
el = $el.get(0)
|
let el = $el.get(0)
|
||||||
|
|
||||||
let isAtBottom = el.scrollTop === el.scrollHeight - el.offsetHeight
|
let isAtBottom = el.scrollTop === el.scrollHeight - el.offsetHeight
|
||||||
|
|
||||||
@@ -214,7 +217,7 @@ export default class Logger extends Emitter {
|
|||||||
lastLog.addCount()
|
lastLog.addCount()
|
||||||
if (log.time) lastLog.updateTime(log.time)
|
if (log.time) lastLog.updateTime(log.time)
|
||||||
$el
|
$el
|
||||||
.find('li')
|
.find('.eruda-log-container')
|
||||||
.last()
|
.last()
|
||||||
.remove()
|
.remove()
|
||||||
log = lastLog
|
log = lastLog
|
||||||
@@ -225,14 +228,15 @@ export default class Logger extends Emitter {
|
|||||||
|
|
||||||
if (this._maxNum !== 'infinite' && logs.length > this._maxNum) {
|
if (this._maxNum !== 'infinite' && logs.length > this._maxNum) {
|
||||||
$el
|
$el
|
||||||
.find('li')
|
.find('.eruda-log-container')
|
||||||
.first()
|
.first()
|
||||||
.remove()
|
.remove()
|
||||||
logs.shift()
|
logs.shift()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._filterLog(log) && this._container.active)
|
if (this._filterLog(log) && this._container.active) {
|
||||||
$el.append(log.formattedMsg)
|
$el.append(log.formattedMsg)
|
||||||
|
}
|
||||||
|
|
||||||
this.emit('insert', log)
|
this.emit('insert', log)
|
||||||
|
|
||||||
@@ -250,8 +254,8 @@ export default class Logger extends Emitter {
|
|||||||
|
|
||||||
if (filter === 'all') return logs
|
if (filter === 'all') return logs
|
||||||
|
|
||||||
let isFilterRegExp = isRegExp(filter),
|
let isFilterRegExp = isRegExp(filter)
|
||||||
isFilterFn = isFn(filter)
|
let isFilterFn = isFn(filter)
|
||||||
|
|
||||||
return logs.filter(log => {
|
return logs.filter(log => {
|
||||||
if (log.ignoreFilter) return true
|
if (log.ignoreFilter) return true
|
||||||
@@ -295,11 +299,11 @@ export default class Logger extends Emitter {
|
|||||||
let self = this
|
let self = this
|
||||||
|
|
||||||
this._$el.on('click', '.eruda-log-item', function() {
|
this._$el.on('click', '.eruda-log-item', function() {
|
||||||
let $el = $(this),
|
let $el = $(this)
|
||||||
id = $el.data('id'),
|
let id = $el.data('id')
|
||||||
type = $el.data('type'),
|
let type = $el.data('type')
|
||||||
logs = self._logs,
|
let logs = self._logs
|
||||||
log
|
let log
|
||||||
|
|
||||||
for (let i = 0, len = logs.length; i < len; i++) {
|
for (let i = 0, len = logs.length; i < len; i++) {
|
||||||
log = logs[i]
|
log = logs[i]
|
||||||
|
|||||||
Reference in New Issue
Block a user