feat(network): copy response
This commit is contained in:
@@ -65,7 +65,7 @@
|
|||||||
"karma-webpack": "^5.0.0",
|
"karma-webpack": "^5.0.0",
|
||||||
"licia": "^1.37.0",
|
"licia": "^1.37.0",
|
||||||
"luna-console": "^1.2.0",
|
"luna-console": "^1.2.0",
|
||||||
"luna-data-grid": "^0.3.1",
|
"luna-data-grid": "^0.3.2",
|
||||||
"luna-dom-viewer": "^1.1.1",
|
"luna-dom-viewer": "^1.1.1",
|
||||||
"luna-modal": "^1.0.0",
|
"luna-modal": "^1.0.0",
|
||||||
"luna-notification": "^0.1.4",
|
"luna-notification": "^0.1.4",
|
||||||
|
|||||||
@@ -249,10 +249,8 @@ export default class Console extends Tool {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
.on('click', c('.copy'), () => {
|
.on('click', c('.copy'), () => {
|
||||||
if (this._selectedLog) {
|
this._selectedLog.copy()
|
||||||
this._selectedLog.copy()
|
container.notify('Copied')
|
||||||
container.notify('Copied')
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
$inputBtns
|
$inputBtns
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ export default class Elements extends Tool {
|
|||||||
$el.html(
|
$el.html(
|
||||||
c(`<div class="control">
|
c(`<div class="control">
|
||||||
<span class="icon icon-select select"></span>
|
<span class="icon icon-select select"></span>
|
||||||
<span class="icon icon-eye show"></span>
|
<span class="icon icon-eye show-detail"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="dom-viewer-container">
|
<div class="dom-viewer-container">
|
||||||
<div class="dom-viewer"></div>
|
<div class="dom-viewer"></div>
|
||||||
@@ -130,7 +130,7 @@ export default class Elements extends Tool {
|
|||||||
|
|
||||||
this._$control
|
this._$control
|
||||||
.on('click', c('.select'), () => this._toggleSelect())
|
.on('click', c('.select'), () => this._toggleSelect())
|
||||||
.on('click', c('.show'), () => this._detail.show(this._curNode))
|
.on('click', c('.show-detail'), () => this._detail.show(this._curNode))
|
||||||
|
|
||||||
this._domViewer.on('select', this._setNode)
|
this._domViewer.on('select', this._setNode)
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
import trim from 'licia/trim'
|
import trim from 'licia/trim'
|
||||||
import isEmpty from 'licia/isEmpty'
|
import isEmpty from 'licia/isEmpty'
|
||||||
import map from 'licia/map'
|
import map from 'licia/map'
|
||||||
|
import each from 'licia/each'
|
||||||
import escape from 'licia/escape'
|
import escape from 'licia/escape'
|
||||||
import copy from 'licia/copy'
|
import copy from 'licia/copy'
|
||||||
import extend from 'licia/extend'
|
|
||||||
import isJson from 'licia/isJson'
|
import isJson from 'licia/isJson'
|
||||||
import { classPrefix as c } from '../lib/util'
|
import { classPrefix as c } from '../lib/util'
|
||||||
import { curlStr } from './util'
|
|
||||||
|
|
||||||
export default class Detail {
|
export default class Detail {
|
||||||
constructor($container, devtools) {
|
constructor($container, devtools) {
|
||||||
@@ -60,7 +59,7 @@ export default class Detail {
|
|||||||
const html = `<div class="${c('control')}">
|
const html = `<div class="${c('control')}">
|
||||||
<span class="${c('icon-arrow-left back')}"></span>
|
<span class="${c('icon-arrow-left back')}"></span>
|
||||||
<span class="${c('url')}">${escape(data.url)}</span>
|
<span class="${c('url')}">${escape(data.url)}</span>
|
||||||
<span class="${c('icon-copy copy-curl')}"></span>
|
<span class="${c('icon-copy copy-res')}"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="${c('http')}">
|
<div class="${c('http')}">
|
||||||
${postData}
|
${postData}
|
||||||
@@ -89,35 +88,23 @@ export default class Detail {
|
|||||||
hide() {
|
hide() {
|
||||||
this._$container.hide()
|
this._$container.hide()
|
||||||
}
|
}
|
||||||
_copyCurl = () => {
|
_copyRes = () => {
|
||||||
const detailData = this._detailData
|
const detailData = this._detailData
|
||||||
|
|
||||||
copy(
|
let data = `${detailData.method} ${detailData.url} ${detailData.status}\n`
|
||||||
curlStr({
|
if (!isEmpty(detailData.reqHeaders)) {
|
||||||
requestMethod: detailData.method,
|
data += '\nRequest Headers\n\n'
|
||||||
url() {
|
each(detailData.reqHeaders, (val, key) => (data += `${key}: ${val}\n`))
|
||||||
return detailData.url
|
}
|
||||||
},
|
if (!isEmpty(detailData.resHeaders)) {
|
||||||
requestFormData() {
|
data += '\nResponse Headers\n\n'
|
||||||
return detailData.data
|
each(detailData.resHeaders, (val, key) => (data += `${key}: ${val}\n`))
|
||||||
},
|
}
|
||||||
requestHeaders() {
|
if (detailData.resTxt) {
|
||||||
const reqHeaders = detailData.reqHeaders || {}
|
data += `\n${detailData.resTxt}\n`
|
||||||
extend(reqHeaders, {
|
}
|
||||||
'User-Agent': navigator.userAgent,
|
|
||||||
Referer: location.href,
|
|
||||||
})
|
|
||||||
|
|
||||||
return map(reqHeaders, (value, name) => {
|
|
||||||
return {
|
|
||||||
name,
|
|
||||||
value,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
})
|
|
||||||
)
|
|
||||||
|
|
||||||
|
copy(data)
|
||||||
this._devtools.notify('Copied')
|
this._devtools.notify('Copied')
|
||||||
}
|
}
|
||||||
_bindEvent() {
|
_bindEvent() {
|
||||||
@@ -125,7 +112,7 @@ export default class Detail {
|
|||||||
|
|
||||||
this._$container
|
this._$container
|
||||||
.on('click', c('.back'), () => this.hide())
|
.on('click', c('.back'), () => this.hide())
|
||||||
.on('click', c('.copy-curl'), this._copyCurl)
|
.on('click', c('.copy-res'), this._copyRes)
|
||||||
.on('click', c('.http .response'), () => {
|
.on('click', c('.http .response'), () => {
|
||||||
const data = this._detailData
|
const data = this._detailData
|
||||||
const resTxt = data.resTxt
|
const resTxt = data.resTxt
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import Tool from '../DevTools/Tool'
|
|||||||
import $ from 'licia/$'
|
import $ from 'licia/$'
|
||||||
import ms from 'licia/ms'
|
import ms from 'licia/ms'
|
||||||
import each from 'licia/each'
|
import each from 'licia/each'
|
||||||
|
import map from 'licia/map'
|
||||||
import Detail from './Detail'
|
import Detail from './Detail'
|
||||||
import throttle from 'licia/throttle'
|
import throttle from 'licia/throttle'
|
||||||
import { getFileName, classPrefix as c } from '../lib/util'
|
import { getFileName, classPrefix as c } from '../lib/util'
|
||||||
@@ -10,6 +11,9 @@ import chobitsu from '../lib/chobitsu'
|
|||||||
import LunaDataGrid from 'luna-data-grid'
|
import LunaDataGrid from 'luna-data-grid'
|
||||||
import ResizeSensor from 'licia/ResizeSensor'
|
import ResizeSensor from 'licia/ResizeSensor'
|
||||||
import { getType } from './util'
|
import { getType } from './util'
|
||||||
|
import copy from 'licia/copy'
|
||||||
|
import extend from 'licia/extend'
|
||||||
|
import { curlStr } from './util'
|
||||||
|
|
||||||
export default class Network extends Tool {
|
export default class Network extends Tool {
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -19,6 +23,7 @@ export default class Network extends Tool {
|
|||||||
|
|
||||||
this.name = 'network'
|
this.name = 'network'
|
||||||
this._requests = {}
|
this._requests = {}
|
||||||
|
this._selectedRequest = null
|
||||||
}
|
}
|
||||||
init($el, container) {
|
init($el, container) {
|
||||||
super.init($el)
|
super.init($el)
|
||||||
@@ -184,20 +189,73 @@ export default class Network extends Tool {
|
|||||||
|
|
||||||
request.render()
|
request.render()
|
||||||
}
|
}
|
||||||
|
_copyCurl = () => {
|
||||||
|
const request = this._selectedRequest
|
||||||
|
|
||||||
|
copy(
|
||||||
|
curlStr({
|
||||||
|
requestMethod: request.method,
|
||||||
|
url() {
|
||||||
|
return request.url
|
||||||
|
},
|
||||||
|
requestFormData() {
|
||||||
|
return request.data
|
||||||
|
},
|
||||||
|
requestHeaders() {
|
||||||
|
const reqHeaders = request.reqHeaders || {}
|
||||||
|
extend(reqHeaders, {
|
||||||
|
'User-Agent': navigator.userAgent,
|
||||||
|
Referer: location.href,
|
||||||
|
})
|
||||||
|
|
||||||
|
return map(reqHeaders, (value, name) => {
|
||||||
|
return {
|
||||||
|
name,
|
||||||
|
value,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
this._container.notify('Copied')
|
||||||
|
}
|
||||||
|
_updateButtons() {
|
||||||
|
const $control = this._$control
|
||||||
|
const $showDetail = $control.find(c('.show-detail'))
|
||||||
|
const $copyCurl = $control.find(c('.copy-curl'))
|
||||||
|
|
||||||
|
$showDetail.addClass(c('icon-disabled'))
|
||||||
|
$copyCurl.addClass(c('icon-disabled'))
|
||||||
|
|
||||||
|
if (this._selectedRequest) {
|
||||||
|
$showDetail.rmClass(c('icon-disabled'))
|
||||||
|
$copyCurl.rmClass(c('icon-disabled'))
|
||||||
|
}
|
||||||
|
}
|
||||||
_bindEvent() {
|
_bindEvent() {
|
||||||
const $el = this._$el
|
const $control = this._$control
|
||||||
|
const requestDataGrid = this._requestDataGrid
|
||||||
|
|
||||||
const self = this
|
const self = this
|
||||||
|
|
||||||
$el.on('click', c('.clear-request'), () => this.clear())
|
$control
|
||||||
|
.on('click', c('.clear-request'), () => this.clear())
|
||||||
|
.on('click', c('.show-detail'), () =>
|
||||||
|
this._detail.show(this._selectedRequest)
|
||||||
|
)
|
||||||
|
.on('click', c('.copy-curl'), this._copyCurl)
|
||||||
|
|
||||||
this._requestDataGrid.on('select', (node) => {
|
requestDataGrid.on('select', (node) => {
|
||||||
const id = $(node.container).data('id')
|
const id = $(node.container).data('id')
|
||||||
const request = self._requests[id]
|
const request = self._requests[id]
|
||||||
if (!request.done) {
|
this._selectedRequest = request
|
||||||
return
|
this._updateButtons()
|
||||||
}
|
})
|
||||||
self._detail.show(request)
|
|
||||||
|
requestDataGrid.on('deselect', () => {
|
||||||
|
this._selectedRequest = null
|
||||||
|
this._updateButtons()
|
||||||
})
|
})
|
||||||
|
|
||||||
this._resizeSensor.addListener(
|
this._resizeSensor.addListener(
|
||||||
@@ -230,11 +288,14 @@ export default class Network extends Tool {
|
|||||||
c(`<div class="control">
|
c(`<div class="control">
|
||||||
<span class="title">Request</span>
|
<span class="title">Request</span>
|
||||||
<span class="icon-clear clear-request"></span>
|
<span class="icon-clear clear-request"></span>
|
||||||
|
<span class="icon-eye icon-disabled show-detail"></span>
|
||||||
|
<span class="icon-copy icon-disabled copy-curl"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="requests"></div>
|
<div class="requests"></div>
|
||||||
<div class="detail"></div>`)
|
<div class="detail"></div>`)
|
||||||
)
|
)
|
||||||
this._$detail = $el.find(c('.detail'))
|
this._$detail = $el.find(c('.detail'))
|
||||||
this._$requests = $el.find(c('.requests'))
|
this._$requests = $el.find(c('.requests'))
|
||||||
|
this._$control = $el.find(c('.control'))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,14 @@
|
|||||||
font-size: $font-size;
|
font-size: $font-size;
|
||||||
}
|
}
|
||||||
.icon-clear {
|
.icon-clear {
|
||||||
|
right: 46px;
|
||||||
|
}
|
||||||
|
.icon-eye {
|
||||||
right: 0;
|
right: 0;
|
||||||
}
|
}
|
||||||
|
.icon-copy {
|
||||||
|
right: 23px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.request-error {
|
.request-error {
|
||||||
color: var(--console-error-foreground);
|
color: var(--console-error-foreground);
|
||||||
|
|||||||
Reference in New Issue
Block a user