1
0
mirror of synced 2025-12-13 02:11:25 +08:00

feat(network): copy response

This commit is contained in:
redhoodsu
2022-12-17 23:06:25 +08:00
parent 1d71c60e47
commit 4baa3305bd
6 changed files with 96 additions and 44 deletions

View File

@@ -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",

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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'))
} }
} }

View File

@@ -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);