@windwalker-io/core 4.0.8 → 4.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gulp.json +7 -7
- package/LICENSE +19 -19
- package/dist/debugger/114.js.map +1 -0
- package/dist/debugger/338.js.map +1 -0
- package/dist/debugger/358.js.map +1 -0
- package/dist/debugger/500.js.map +1 -0
- package/dist/debugger/548.js.map +1 -0
- package/dist/debugger/694.js.map +1 -0
- package/dist/debugger/798.js.map +1 -0
- package/dist/debugger/851.js.map +1 -0
- package/dist/debugger/864.js.map +1 -0
- package/dist/debugger/chunk-vendor-114.js +3 -0
- package/dist/debugger/chunk-vendor-114.js.LICENSE.txt +8 -0
- package/dist/debugger/chunk-vendor-338.js +3 -0
- package/dist/debugger/chunk-vendor-338.js.LICENSE.txt +15 -0
- package/dist/debugger/chunk-vendor-358.js +2 -0
- package/dist/debugger/chunk-vendor-500.js +3 -0
- package/dist/debugger/chunk-vendor-500.js.LICENSE.txt +8 -0
- package/dist/debugger/chunk-vendor-548.js +3 -0
- package/dist/debugger/chunk-vendor-548.js.LICENSE.txt +15 -0
- package/dist/debugger/chunk-vendor-694.js +3 -0
- package/dist/debugger/chunk-vendor-694.js.LICENSE.txt +1 -0
- package/dist/debugger/chunk-vendor-798.js +3 -0
- package/dist/debugger/chunk-vendor-798.js.LICENSE.txt +1 -0
- package/dist/debugger/chunk-vendor-851.js +3 -0
- package/dist/debugger/chunk-vendor-851.js.LICENSE.txt +8 -0
- package/dist/debugger/chunk-vendor-864.js +3 -0
- package/dist/debugger/chunk-vendor-864.js.LICENSE.txt +1 -0
- package/dist/debugger/debugger.js +1 -1
- package/dist/debugger/debugger.js.LICENSE.txt +11 -2
- package/dist/debugger/debugger.js.map +1 -1
- package/dist/debugger/dev/chunk-vendor-scss_debugger_scss.js +219 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_layouts_DefaultLayout_vue.js +77 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_Dashboard_vue.js +81 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_Database_vue.js +187 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_Events_vue.js +122 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_Request_vue.js +122 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_Routing_vue.js +122 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_System_vue.js +67 -0
- package/dist/debugger/dev/chunk-vendor-src_debugger_views_Timeline_vue.js +132 -0
- package/dist/debugger/dev/chunk-vendor-vendors-node_modules_bootstrap_js_src_modal_js-node_modules_sql-formatter_lib_index_js.js +923 -0
- package/dist/debugger/dev/chunk-vendor-vendors-node_modules_sql-formatter_lib_index_js-node_modules_bootstrap_js_src_modal_js.js +923 -0
- package/fusionfile.mjs +26 -10
- package/package.json +11 -5
- package/scss/_variables.scss +1 -0
- package/scss/base/_typography.scss +9 -0
- package/scss/debugger.scss +47 -1
- package/src/debugger/App.vue +40 -16
- package/src/debugger/Store.vue +1 -1
- package/src/debugger/components/BsModal.vue +128 -0
- package/src/debugger/components/KeyValueTable.vue +51 -0
- package/src/debugger/components/db/{query-info.vue → QueryInfo.vue} +55 -27
- package/src/debugger/components/events/EventListenersTable.vue +75 -0
- package/src/debugger/components/timeline/TimelineTable.vue +107 -0
- package/src/debugger/debugger.js +4 -1
- package/src/debugger/font-awesome.js +23 -0
- package/src/debugger/layouts/DefaultLayout.vue +17 -2
- package/src/debugger/routes.js +5 -2
- package/src/debugger/services/utilities.js +18 -0
- package/src/debugger/views/Dashboard.vue +20 -10
- package/src/debugger/views/Database.vue +113 -26
- package/src/debugger/views/Events.vue +113 -0
- package/src/debugger/views/Request.vue +133 -1
- package/src/debugger/views/Routing.vue +210 -0
- package/src/debugger/views/System.vue +37 -8
- package/src/debugger/views/Timeline.vue +92 -0
- package/src/{webpack.config.js → debugger/webpack.config.js} +1 -1
- package/src/index.mjs +9 -9
- package/src/install-vendors.mjs +10 -3
- package/src/utils.mjs +1 -2
- package/dist/debugger/1.js +0 -2
- package/dist/debugger/1.js.map +0 -1
- package/dist/debugger/144.js +0 -2
- package/dist/debugger/144.js.map +0 -1
- package/dist/debugger/2.js +0 -8
- package/dist/debugger/2.js.map +0 -1
- package/dist/debugger/3.js +0 -2
- package/dist/debugger/3.js.map +0 -1
- package/dist/debugger/4.js +0 -2
- package/dist/debugger/4.js.map +0 -1
- package/dist/debugger/5.js +0 -2
- package/dist/debugger/5.js.map +0 -1
- package/dist/debugger/523.js +0 -2
- package/dist/debugger/523.js.map +0 -1
- package/dist/debugger/659.js +0 -3
- package/dist/debugger/659.js.LICENSE.txt +0 -6
- package/dist/debugger/659.js.map +0 -1
- package/dist/debugger/689.js +0 -2
- package/dist/debugger/689.js.map +0 -1
- package/dist/debugger/715.js +0 -2
- package/dist/debugger/715.js.map +0 -1
- package/dist/debugger/727.js +0 -3
- package/dist/debugger/727.js.LICENSE.txt +0 -6
- package/dist/debugger/727.js.map +0 -1
- package/dist/debugger/src_debugger_views_Dashboard_vue.js +0 -67
- package/dist/debugger/src_debugger_views_Database_vue.js +0 -187
- package/dist/debugger/src_debugger_views_Request_vue.js +0 -67
- package/dist/debugger/src_debugger_views_System_vue.js +0 -122
- package/dist/debugger/vendors-node_modules_sql-formatter_lib_sqlFormatter_js.js +0 -212
package/fusionfile.mjs
CHANGED
|
@@ -5,27 +5,43 @@
|
|
|
5
5
|
* @license MIT
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import fusion, { watch, parallel, src, dest } from '@windwalker-io/fusion';
|
|
8
|
+
import fusion, { watch, parallel, src, dest, wait } from '@windwalker-io/fusion';
|
|
9
9
|
import { babelBasicOptions } from '@windwalker-io/fusion/src/utilities/babel.js';
|
|
10
10
|
import postcss from 'gulp-postcss';
|
|
11
|
+
import path from 'path';
|
|
11
12
|
import tailwindcss from 'tailwindcss';
|
|
13
|
+
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
|
|
12
14
|
|
|
13
15
|
export async function debuggers() {
|
|
14
16
|
// Watch start
|
|
15
17
|
watch(['src/debugger/**/*.{js,vue}', 'scss/**/*.scss']);
|
|
16
18
|
// Watch end
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
return wait(
|
|
21
|
+
fusion.vue(
|
|
22
|
+
'src/debugger/debugger.js',
|
|
23
|
+
'dist/debugger/',
|
|
24
|
+
{
|
|
25
|
+
override: (config) => {
|
|
26
|
+
config.resolve.alias = {
|
|
27
|
+
'@': path.resolve(path.resolve(), './src/debugger/') // Will be overwrite when compile
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// @see https://webpack.js.org/guides/public-path/#automatic-publicpath
|
|
31
|
+
config.output.publicPath = "auto";
|
|
32
|
+
|
|
33
|
+
config.output.chunkFilename = process.env.NODE_ENV === 'production'
|
|
34
|
+
? 'chunk-vendor-[id].js'
|
|
35
|
+
: 'dev/chunk-vendor-[id].js';
|
|
36
|
+
|
|
37
|
+
// config.plugins.push(
|
|
38
|
+
// new BundleAnalyzerPlugin()
|
|
39
|
+
// );
|
|
40
|
+
}
|
|
25
41
|
}
|
|
26
|
-
|
|
42
|
+
),
|
|
43
|
+
fusion.copy('images/**/*', 'dist/images/')
|
|
27
44
|
);
|
|
28
|
-
fusion.copy('images/**/*', 'dist/images/');
|
|
29
45
|
}
|
|
30
46
|
|
|
31
47
|
export async function console() {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@windwalker-io/core",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.9",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Windwalker Core JS package",
|
|
6
6
|
"scripts": {
|
|
@@ -15,26 +15,32 @@
|
|
|
15
15
|
"author": "Simon Asika",
|
|
16
16
|
"license": "MIT",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"
|
|
18
|
+
"@fortawesome/fontawesome-svg-core": "^6.2.0",
|
|
19
|
+
"@fortawesome/free-solid-svg-icons": "^6.2.0",
|
|
20
|
+
"@fortawesome/vue-fontawesome": "^3.0.1",
|
|
21
|
+
"axios": "^0.21.1",
|
|
22
|
+
"dayjs": "^1.11.5"
|
|
19
23
|
},
|
|
20
24
|
"devDependencies": {
|
|
21
25
|
"@tailwindcss/custom-forms": "^0.2.1",
|
|
22
26
|
"@tailwindcss/ui": "^0.7.2",
|
|
23
27
|
"@windwalker-io/fusion": "^1.0",
|
|
24
|
-
"bootstrap": "^5.0",
|
|
25
28
|
"autoprefixer": "^10.2.6",
|
|
26
29
|
"axios": "^0.21.1",
|
|
30
|
+
"bootstrap": "^5.0",
|
|
27
31
|
"gulp": "^4.0.2",
|
|
28
32
|
"gulp-postcss": "^9.0.0",
|
|
29
33
|
"postcss-import": "^14.0.2",
|
|
30
34
|
"postcss-loader": "^4.0.0",
|
|
31
35
|
"postcss-nested": "^5.0.5",
|
|
32
36
|
"regenerator-runtime": "^0.13.7",
|
|
33
|
-
"sql-formatter": "^
|
|
37
|
+
"sql-formatter": "^10.6.0",
|
|
34
38
|
"tailwindcss": "^2.1.4",
|
|
35
39
|
"vue": "^3.0.11",
|
|
40
|
+
"vuedraggable": "^3.0||^4.0.3",
|
|
36
41
|
"vue-router": "^4.0.8",
|
|
37
|
-
"webpack": "^5.0"
|
|
42
|
+
"webpack": "^5.0",
|
|
43
|
+
"webpack-bundle-analyzer": "^4.6.1"
|
|
38
44
|
},
|
|
39
45
|
"windwalker": {
|
|
40
46
|
"vendors": [
|
package/scss/_variables.scss
CHANGED
package/scss/debugger.scss
CHANGED
|
@@ -1,7 +1,53 @@
|
|
|
1
1
|
// Part of starter file.
|
|
2
2
|
|
|
3
3
|
@import "variables";
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
// scss-docs-start import-stack
|
|
6
|
+
// Configuration
|
|
7
|
+
@import "bootstrap/scss/mixins";
|
|
8
|
+
@import "bootstrap/scss/utilities";
|
|
9
|
+
|
|
10
|
+
// Layout & components
|
|
11
|
+
@import "bootstrap/scss/root";
|
|
12
|
+
@import "bootstrap/scss/reboot";
|
|
13
|
+
@import "bootstrap/scss/type";
|
|
14
|
+
@import "bootstrap/scss/images";
|
|
15
|
+
@import "bootstrap/scss/containers";
|
|
16
|
+
@import "bootstrap/scss/grid";
|
|
17
|
+
@import "bootstrap/scss/tables";
|
|
18
|
+
//@import "bootstrap/scss/forms";
|
|
19
|
+
@import "bootstrap/scss/buttons";
|
|
20
|
+
@import "bootstrap/scss/transitions";
|
|
21
|
+
//@import "bootstrap/scss/dropdown";
|
|
22
|
+
@import "bootstrap/scss/button-group";
|
|
23
|
+
@import "bootstrap/scss/nav";
|
|
24
|
+
@import "bootstrap/scss/navbar";
|
|
25
|
+
@import "bootstrap/scss/card";
|
|
26
|
+
//@import "bootstrap/scss/accordion";
|
|
27
|
+
//@import "bootstrap/scss/breadcrumb";
|
|
28
|
+
//@import "bootstrap/scss/pagination";
|
|
29
|
+
@import "bootstrap/scss/badge";
|
|
30
|
+
@import "bootstrap/scss/alert";
|
|
31
|
+
//@import "bootstrap/scss/progress";
|
|
32
|
+
@import "bootstrap/scss/list-group";
|
|
33
|
+
@import "bootstrap/scss/close";
|
|
34
|
+
//@import "bootstrap/scss/toasts";
|
|
35
|
+
@import "bootstrap/scss/modal";
|
|
36
|
+
@import "bootstrap/scss/tooltip";
|
|
37
|
+
//@import "bootstrap/scss/popover";
|
|
38
|
+
//@import "bootstrap/scss/carousel";
|
|
39
|
+
//@import "bootstrap/scss/spinners";
|
|
40
|
+
//@import "bootstrap/scss/offcanvas";
|
|
41
|
+
//@import "bootstrap/scss/placeholders";
|
|
42
|
+
|
|
43
|
+
// Helpers
|
|
44
|
+
@import "bootstrap/scss/helpers";
|
|
45
|
+
|
|
46
|
+
// Utilities
|
|
47
|
+
@import "bootstrap/scss/utilities/api";
|
|
48
|
+
// scss-docs-end import-stack
|
|
49
|
+
|
|
50
|
+
@import "base/typography";
|
|
5
51
|
|
|
6
52
|
@import "layout/layout";
|
|
7
53
|
@import "layout/sidebar";
|
package/src/debugger/App.vue
CHANGED
|
@@ -1,46 +1,70 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="c-main-wrapper">
|
|
3
|
-
<div class="navbar navbar-expand-lg navbar-dark bg-dark"
|
|
3
|
+
<div class="navbar navbar-expand-lg fixed-top navbar-dark bg-dark"
|
|
4
4
|
style="height: 60px">
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
<div class="container-fluid">
|
|
6
|
+
<!-- Logo -->
|
|
7
|
+
<div class="navbar-brand">
|
|
8
|
+
<img src="assets/vendor/@windwalker-io/core/dist/images/windwalker-logo-h-w.svg" alt="logo"
|
|
9
|
+
style="height: 30px">
|
|
10
|
+
</div>
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
<!-- Header -->
|
|
13
|
+
<div class="">
|
|
13
14
|
|
|
15
|
+
</div>
|
|
14
16
|
</div>
|
|
15
17
|
</div>
|
|
16
18
|
|
|
17
19
|
<!-- Body -->
|
|
18
|
-
<div class="
|
|
20
|
+
<div class="d-flex flex-column flex-md-row" style="margin-top: 60px;">
|
|
19
21
|
<!-- Sidebar -->
|
|
20
|
-
<div class="h-w-sidebar
|
|
21
|
-
<div class="nav flex-column bg-light
|
|
22
|
-
|
|
22
|
+
<div class="h-w-sidebar bg-light">
|
|
23
|
+
<div class="nav flex-column bg-light position-sticky"
|
|
24
|
+
style="min-width: 200px; top: 60px">
|
|
25
|
+
<div class="nav-item nav-item--dashboard">
|
|
23
26
|
<router-link to="/"
|
|
24
27
|
class="c-sidebar-menu-item nav-link"
|
|
25
28
|
:class="{ active: currentRoute === 'dashboard' }">
|
|
26
29
|
Dashboard
|
|
27
30
|
</router-link>
|
|
28
31
|
</div>
|
|
29
|
-
<div class="nav-item">
|
|
32
|
+
<div class="nav-item nav-item--system">
|
|
30
33
|
<router-link to="/system"
|
|
31
34
|
class="c-sidebar-menu-item nav-link"
|
|
32
35
|
:class="{ active: currentRoute === 'system' }">
|
|
33
36
|
System
|
|
34
37
|
</router-link>
|
|
35
38
|
</div>
|
|
36
|
-
<div class="nav-item">
|
|
39
|
+
<div class="nav-item nav-item--request">
|
|
37
40
|
<router-link to="/request"
|
|
38
41
|
class="c-sidebar-menu-item nav-link"
|
|
39
42
|
:class="{ active: currentRoute === 'request' }">
|
|
40
43
|
Request
|
|
41
44
|
</router-link>
|
|
42
45
|
</div>
|
|
43
|
-
<div class="nav-item">
|
|
46
|
+
<div class="nav-item nav-item--routing">
|
|
47
|
+
<router-link to="/routing"
|
|
48
|
+
class="c-sidebar-menu-item nav-link"
|
|
49
|
+
:class="{ active: currentRoute === 'routing' }">
|
|
50
|
+
Routing
|
|
51
|
+
</router-link>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="nav-item nav-item--timeline">
|
|
54
|
+
<router-link to="/timeline"
|
|
55
|
+
class="c-sidebar-menu-item nav-link"
|
|
56
|
+
:class="{ active: currentRoute === 'timeline' }">
|
|
57
|
+
Timeline
|
|
58
|
+
</router-link>
|
|
59
|
+
</div>
|
|
60
|
+
<div class="nav-item nav-item--timeline">
|
|
61
|
+
<router-link to="/events"
|
|
62
|
+
class="c-sidebar-menu-item nav-link"
|
|
63
|
+
:class="{ active: currentRoute === 'events' }">
|
|
64
|
+
Events
|
|
65
|
+
</router-link>
|
|
66
|
+
</div>
|
|
67
|
+
<div class="nav-item nav-item--db">
|
|
44
68
|
<router-link to="/db"
|
|
45
69
|
class="c-sidebar-menu-item nav-link"
|
|
46
70
|
:class="{ active: currentRoute === 'db' }">
|
|
@@ -51,7 +75,7 @@
|
|
|
51
75
|
</div>
|
|
52
76
|
|
|
53
77
|
<!-- Content Body -->
|
|
54
|
-
<div class="
|
|
78
|
+
<div class="flex-grow-1">
|
|
55
79
|
<router-view></router-view>
|
|
56
80
|
</div>
|
|
57
81
|
</div>
|
package/src/debugger/Store.vue
CHANGED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<teleport to="body">
|
|
3
|
+
<div ref="modal" class="modal fade" :id="idName"
|
|
4
|
+
v-bind="$attrs"
|
|
5
|
+
tabindex="-1"
|
|
6
|
+
role="dialog"
|
|
7
|
+
:aria-labelledby="idName + '-label'"
|
|
8
|
+
:aria-hidden="visible ? 'true' : 'false'"
|
|
9
|
+
:data-bs-backdrop="backdrop"
|
|
10
|
+
>
|
|
11
|
+
<div class="modal-dialog"
|
|
12
|
+
role="document"
|
|
13
|
+
:class="size ? 'modal-' + size : null">
|
|
14
|
+
<div class="modal-content">
|
|
15
|
+
<template v-if="visible">
|
|
16
|
+
<template v-if="hasSlots('header-element')">
|
|
17
|
+
<slot name="header-element"></slot>
|
|
18
|
+
</template>
|
|
19
|
+
<div v-else class="modal-header">
|
|
20
|
+
<slot name="header">
|
|
21
|
+
<div class="modal-title" :id="idName + '-label'">
|
|
22
|
+
<h4>{{ title }}</h4>
|
|
23
|
+
</div>
|
|
24
|
+
</slot>
|
|
25
|
+
<button type="button" class="close btn-close" data-bs-dismiss="modal" data-dismiss="modal" aria-label="Close">
|
|
26
|
+
<span aria-hidden="true" class="visually-hidden">×</span>
|
|
27
|
+
</button>
|
|
28
|
+
</div>
|
|
29
|
+
</template>
|
|
30
|
+
<div v-if="visible" class="modal-body">
|
|
31
|
+
<slot></slot>
|
|
32
|
+
</div>
|
|
33
|
+
<div v-if="visible && hasSlots('footer')" class="modal-footer">
|
|
34
|
+
<slot name="footer"></slot>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</teleport>
|
|
40
|
+
</template>
|
|
41
|
+
|
|
42
|
+
<script>
|
|
43
|
+
import Modal from 'bootstrap/js/src/modal.js';
|
|
44
|
+
import { onMounted, reactive, ref, toRefs, watch } from 'vue';
|
|
45
|
+
|
|
46
|
+
export default {
|
|
47
|
+
name: 'BsModal',
|
|
48
|
+
inheritAttrs: false,
|
|
49
|
+
props: {
|
|
50
|
+
id: String,
|
|
51
|
+
open: {
|
|
52
|
+
type: Boolean,
|
|
53
|
+
default: false
|
|
54
|
+
},
|
|
55
|
+
size: String,
|
|
56
|
+
title: String,
|
|
57
|
+
backdrop: {
|
|
58
|
+
type: [ String, Boolean ],
|
|
59
|
+
default: true
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
emits: [
|
|
63
|
+
'show',
|
|
64
|
+
'shown',
|
|
65
|
+
'hide',
|
|
66
|
+
'hidden'
|
|
67
|
+
],
|
|
68
|
+
setup(props, { emit, slots }) {
|
|
69
|
+
const modal = ref(null);
|
|
70
|
+
const state = reactive({
|
|
71
|
+
idName: props.id || 'modal-' + (Math.random() + 1).toString(36).substring(7),
|
|
72
|
+
visible: props.open,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
watch(() => state.visible, (v, oldV) => {
|
|
76
|
+
if (!oldV && v) {
|
|
77
|
+
getModalInstance().show();
|
|
78
|
+
}
|
|
79
|
+
if (oldV && !v) {
|
|
80
|
+
getModalInstance().hide();
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
watch(() => props.open, (v) => {
|
|
85
|
+
state.visible = v
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
watch(() => props.id, (idName) => {
|
|
89
|
+
state.idName = idName;
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
onMounted(() => {
|
|
93
|
+
modal.value.addEventListener('show.bs.modal', (e) => {
|
|
94
|
+
emit('show', e);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
modal.value.addEventListener('shown.bs.modal', (e) => {
|
|
98
|
+
emit('shown', e);
|
|
99
|
+
});
|
|
100
|
+
modal.value.addEventListener('hide.bs.modal', (e) => {
|
|
101
|
+
emit('hide', e);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
modal.value.addEventListener('hidden.bs.modal', (e) => {
|
|
105
|
+
emit('hidden', e);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
function getModalInstance() {
|
|
110
|
+
return Modal.getOrCreateInstance(modal.value);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function hasSlots(name) {
|
|
114
|
+
return slots[name] !== undefined;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return {
|
|
118
|
+
...toRefs(state),
|
|
119
|
+
modal,
|
|
120
|
+
hasSlots
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
</script>
|
|
125
|
+
|
|
126
|
+
<style scoped>
|
|
127
|
+
|
|
128
|
+
</style>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<table class="table table-bordered">
|
|
3
|
+
<thead>
|
|
4
|
+
<tr>
|
|
5
|
+
<th class="" style="width: 20%; min-width: 150px;" >
|
|
6
|
+
Key
|
|
7
|
+
</th>
|
|
8
|
+
<th>
|
|
9
|
+
Value
|
|
10
|
+
</th>
|
|
11
|
+
</tr>
|
|
12
|
+
</thead>
|
|
13
|
+
|
|
14
|
+
<tbody>
|
|
15
|
+
<tr v-for="(value, key) of data" :key="key">
|
|
16
|
+
<td style="width: 20%; word-break: break-all">
|
|
17
|
+
{{ key }}
|
|
18
|
+
</td>
|
|
19
|
+
<td style="width: 80%; max-width: 800px">
|
|
20
|
+
<pre style="word-break: break-all" class="m-0">{{ displayData(value) }}</pre>
|
|
21
|
+
</td>
|
|
22
|
+
</tr>
|
|
23
|
+
</tbody>
|
|
24
|
+
</table>
|
|
25
|
+
</template>
|
|
26
|
+
|
|
27
|
+
<script>
|
|
28
|
+
export default {
|
|
29
|
+
name: 'KeyValueTable',
|
|
30
|
+
props: {
|
|
31
|
+
data: Object
|
|
32
|
+
},
|
|
33
|
+
setup() {
|
|
34
|
+
function displayData(v) {
|
|
35
|
+
if (typeof v === 'object' || Array.isArray(v)) {
|
|
36
|
+
return JSON.stringify(v, null, 2);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return v;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
displayData
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
</script>
|
|
48
|
+
|
|
49
|
+
<style scoped>
|
|
50
|
+
|
|
51
|
+
</style>
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
</h2>
|
|
10
|
-
</div>
|
|
2
|
+
<div :id="`query-${i}`" class="card rounded-3 border border-1 border-primary">
|
|
3
|
+
<div class="card-header d-flex justify-content-between">
|
|
4
|
+
<h4 class="m-0">
|
|
5
|
+
Query: {{ i }}
|
|
6
|
+
</h4>
|
|
7
|
+
|
|
8
|
+
<div class="d-flex align-items-center justify-content-between">
|
|
11
9
|
<div class="text-muted">
|
|
12
10
|
<button
|
|
13
11
|
type="button"
|
|
@@ -32,25 +30,37 @@
|
|
|
32
30
|
</button>
|
|
33
31
|
</div>
|
|
34
32
|
</div>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="card-body">
|
|
35
|
+
|
|
35
36
|
<div class="">
|
|
36
37
|
<pre style="word-break: break-all; white-space: pre-wrap;"
|
|
37
38
|
class="bg-light p-4"
|
|
38
|
-
v-html="item.debug_query"
|
|
39
|
+
v-html="formatQuery(item.debug_query)"
|
|
39
40
|
></pre>
|
|
40
41
|
</div>
|
|
41
|
-
<div class="py-4">
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
{
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
{
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
42
|
+
<div class="py-4 d-flex justify-content-between">
|
|
43
|
+
<div>
|
|
44
|
+
Query Time:
|
|
45
|
+
<span class="badge" :class="`bg-${stateColor(item.time * 1000, 15)}`">
|
|
46
|
+
{{ round(item.time * 1000) }}ms
|
|
47
|
+
</span>
|
|
48
|
+
Memory:
|
|
49
|
+
<span class="badge" :class="`bg-${stateColor(item.memory / 1024 / 1024, 0.05)}`">
|
|
50
|
+
{{ round(item.memory / 1024 / 1024) }}MB
|
|
51
|
+
</span>
|
|
52
|
+
Return Rows
|
|
53
|
+
<span class="badge bg-info rounded-pill">
|
|
54
|
+
{{ item.count }}
|
|
55
|
+
</span>
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<div>
|
|
59
|
+
<button class="btn btn-primary" @click="openBacktrace(item.backtrace, i)">
|
|
60
|
+
<svg style="height: 14px; fill: white;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M40 48C26.7 48 16 58.7 16 72v48c0 13.3 10.7 24 24 24H88c13.3 0 24-10.7 24-24V72c0-13.3-10.7-24-24-24H40zM192 64c-17.7 0-32 14.3-32 32s14.3 32 32 32H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H192zm0 160c-17.7 0-32 14.3-32 32s14.3 32 32 32H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H192zm0 160c-17.7 0-32 14.3-32 32s14.3 32 32 32H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H192zM16 232v48c0 13.3 10.7 24 24 24H88c13.3 0 24-10.7 24-24V232c0-13.3-10.7-24-24-24H40c-13.3 0-24 10.7-24 24zM40 368c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24H88c13.3 0 24-10.7 24-24V392c0-13.3-10.7-24-24-24H40z"/></svg>
|
|
61
|
+
Backtrace
|
|
62
|
+
</button>
|
|
63
|
+
</div>
|
|
54
64
|
</div>
|
|
55
65
|
</div>
|
|
56
66
|
|
|
@@ -133,30 +143,48 @@
|
|
|
133
143
|
|
|
134
144
|
<script>
|
|
135
145
|
import { format } from 'sql-formatter';
|
|
146
|
+
import { stateColor } from '../../services/utilities.js';
|
|
136
147
|
import { goToLast } from '../../services/nav.js';
|
|
137
148
|
|
|
138
149
|
export default {
|
|
139
150
|
name: 'query-info',
|
|
140
151
|
props: {
|
|
141
152
|
i: Number,
|
|
142
|
-
item: Object
|
|
153
|
+
item: Object,
|
|
154
|
+
totalCount: Number,
|
|
155
|
+
totalTime: Number,
|
|
156
|
+
totalMemory: Number,
|
|
143
157
|
},
|
|
144
|
-
setup(props) {
|
|
158
|
+
setup(props, { emit }) {
|
|
145
159
|
function copy() {
|
|
146
160
|
navigator.clipboard.writeText(props.item.debug_query);
|
|
147
161
|
}
|
|
148
162
|
|
|
163
|
+
function openBacktrace(backtrace) {
|
|
164
|
+
emit('open-backtrace', backtrace, props.i);
|
|
165
|
+
}
|
|
166
|
+
|
|
149
167
|
return {
|
|
150
168
|
formatQuery,
|
|
151
169
|
round,
|
|
152
170
|
goToLast,
|
|
153
|
-
copy
|
|
171
|
+
copy,
|
|
172
|
+
stateColor,
|
|
173
|
+
openBacktrace
|
|
154
174
|
};
|
|
155
175
|
}
|
|
156
176
|
};
|
|
157
177
|
|
|
158
178
|
function formatQuery(query) {
|
|
159
|
-
|
|
179
|
+
try {
|
|
180
|
+
return format(query, {
|
|
181
|
+
keywordCase: 'upper',
|
|
182
|
+
|
|
183
|
+
}).replace(/\n/, '<br>');
|
|
184
|
+
} catch (e) {
|
|
185
|
+
console.error(e);
|
|
186
|
+
return query;
|
|
187
|
+
}
|
|
160
188
|
}
|
|
161
189
|
|
|
162
190
|
function round(num) {
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<table class="table table-bordered">
|
|
3
|
+
<thead>
|
|
4
|
+
<tr>
|
|
5
|
+
<th>
|
|
6
|
+
Event Name
|
|
7
|
+
</th>
|
|
8
|
+
<th>
|
|
9
|
+
Times
|
|
10
|
+
</th>
|
|
11
|
+
<th>
|
|
12
|
+
Listener
|
|
13
|
+
</th>
|
|
14
|
+
</tr>
|
|
15
|
+
</thead>
|
|
16
|
+
<tbody>
|
|
17
|
+
<template v-for="(listeners, event) of events" :key="event">
|
|
18
|
+
<template v-if="Object.keys(listeners).length > 0">
|
|
19
|
+
<tr v-for="(count, listener) of listeners">
|
|
20
|
+
<td v-if="isFirstRow(event)" :rowspan="Object.keys(listeners).length">
|
|
21
|
+
<pre>{{ event }}</pre>
|
|
22
|
+
</td>
|
|
23
|
+
<td>
|
|
24
|
+
{{ count }}
|
|
25
|
+
</td>
|
|
26
|
+
<td>
|
|
27
|
+
<pre>{{ listener }}</pre>
|
|
28
|
+
</td>
|
|
29
|
+
</tr>
|
|
30
|
+
</template>
|
|
31
|
+
<template v-else>
|
|
32
|
+
<tr>
|
|
33
|
+
<td>
|
|
34
|
+
<pre>{{ event }}</pre>
|
|
35
|
+
</td>
|
|
36
|
+
<td>
|
|
37
|
+
-
|
|
38
|
+
</td>
|
|
39
|
+
<td>
|
|
40
|
+
-
|
|
41
|
+
</td>
|
|
42
|
+
</tr>
|
|
43
|
+
</template>
|
|
44
|
+
</template>
|
|
45
|
+
</tbody>
|
|
46
|
+
</table>
|
|
47
|
+
</template>
|
|
48
|
+
|
|
49
|
+
<script>
|
|
50
|
+
export default {
|
|
51
|
+
name: 'EventListenersTable',
|
|
52
|
+
props: {
|
|
53
|
+
events: Object,
|
|
54
|
+
},
|
|
55
|
+
setup() {
|
|
56
|
+
let lastEvent = null;
|
|
57
|
+
|
|
58
|
+
function isFirstRow(event) {
|
|
59
|
+
const isFirst = event !== lastEvent;
|
|
60
|
+
|
|
61
|
+
lastEvent = event;
|
|
62
|
+
|
|
63
|
+
return isFirst;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
isFirstRow,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
<style scoped>
|
|
74
|
+
|
|
75
|
+
</style>
|