@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.
Files changed (99) hide show
  1. package/.gulp.json +7 -7
  2. package/LICENSE +19 -19
  3. package/dist/debugger/114.js.map +1 -0
  4. package/dist/debugger/338.js.map +1 -0
  5. package/dist/debugger/358.js.map +1 -0
  6. package/dist/debugger/500.js.map +1 -0
  7. package/dist/debugger/548.js.map +1 -0
  8. package/dist/debugger/694.js.map +1 -0
  9. package/dist/debugger/798.js.map +1 -0
  10. package/dist/debugger/851.js.map +1 -0
  11. package/dist/debugger/864.js.map +1 -0
  12. package/dist/debugger/chunk-vendor-114.js +3 -0
  13. package/dist/debugger/chunk-vendor-114.js.LICENSE.txt +8 -0
  14. package/dist/debugger/chunk-vendor-338.js +3 -0
  15. package/dist/debugger/chunk-vendor-338.js.LICENSE.txt +15 -0
  16. package/dist/debugger/chunk-vendor-358.js +2 -0
  17. package/dist/debugger/chunk-vendor-500.js +3 -0
  18. package/dist/debugger/chunk-vendor-500.js.LICENSE.txt +8 -0
  19. package/dist/debugger/chunk-vendor-548.js +3 -0
  20. package/dist/debugger/chunk-vendor-548.js.LICENSE.txt +15 -0
  21. package/dist/debugger/chunk-vendor-694.js +3 -0
  22. package/dist/debugger/chunk-vendor-694.js.LICENSE.txt +1 -0
  23. package/dist/debugger/chunk-vendor-798.js +3 -0
  24. package/dist/debugger/chunk-vendor-798.js.LICENSE.txt +1 -0
  25. package/dist/debugger/chunk-vendor-851.js +3 -0
  26. package/dist/debugger/chunk-vendor-851.js.LICENSE.txt +8 -0
  27. package/dist/debugger/chunk-vendor-864.js +3 -0
  28. package/dist/debugger/chunk-vendor-864.js.LICENSE.txt +1 -0
  29. package/dist/debugger/debugger.js +1 -1
  30. package/dist/debugger/debugger.js.LICENSE.txt +11 -2
  31. package/dist/debugger/debugger.js.map +1 -1
  32. package/dist/debugger/dev/chunk-vendor-scss_debugger_scss.js +219 -0
  33. package/dist/debugger/dev/chunk-vendor-src_debugger_layouts_DefaultLayout_vue.js +77 -0
  34. package/dist/debugger/dev/chunk-vendor-src_debugger_views_Dashboard_vue.js +81 -0
  35. package/dist/debugger/dev/chunk-vendor-src_debugger_views_Database_vue.js +187 -0
  36. package/dist/debugger/dev/chunk-vendor-src_debugger_views_Events_vue.js +122 -0
  37. package/dist/debugger/dev/chunk-vendor-src_debugger_views_Request_vue.js +122 -0
  38. package/dist/debugger/dev/chunk-vendor-src_debugger_views_Routing_vue.js +122 -0
  39. package/dist/debugger/dev/chunk-vendor-src_debugger_views_System_vue.js +67 -0
  40. package/dist/debugger/dev/chunk-vendor-src_debugger_views_Timeline_vue.js +132 -0
  41. package/dist/debugger/dev/chunk-vendor-vendors-node_modules_bootstrap_js_src_modal_js-node_modules_sql-formatter_lib_index_js.js +923 -0
  42. package/dist/debugger/dev/chunk-vendor-vendors-node_modules_sql-formatter_lib_index_js-node_modules_bootstrap_js_src_modal_js.js +923 -0
  43. package/fusionfile.mjs +26 -10
  44. package/package.json +11 -5
  45. package/scss/_variables.scss +1 -0
  46. package/scss/base/_typography.scss +9 -0
  47. package/scss/debugger.scss +47 -1
  48. package/src/debugger/App.vue +40 -16
  49. package/src/debugger/Store.vue +1 -1
  50. package/src/debugger/components/BsModal.vue +128 -0
  51. package/src/debugger/components/KeyValueTable.vue +51 -0
  52. package/src/debugger/components/db/{query-info.vue → QueryInfo.vue} +55 -27
  53. package/src/debugger/components/events/EventListenersTable.vue +75 -0
  54. package/src/debugger/components/timeline/TimelineTable.vue +107 -0
  55. package/src/debugger/debugger.js +4 -1
  56. package/src/debugger/font-awesome.js +23 -0
  57. package/src/debugger/layouts/DefaultLayout.vue +17 -2
  58. package/src/debugger/routes.js +5 -2
  59. package/src/debugger/services/utilities.js +18 -0
  60. package/src/debugger/views/Dashboard.vue +20 -10
  61. package/src/debugger/views/Database.vue +113 -26
  62. package/src/debugger/views/Events.vue +113 -0
  63. package/src/debugger/views/Request.vue +133 -1
  64. package/src/debugger/views/Routing.vue +210 -0
  65. package/src/debugger/views/System.vue +37 -8
  66. package/src/debugger/views/Timeline.vue +92 -0
  67. package/src/{webpack.config.js → debugger/webpack.config.js} +1 -1
  68. package/src/index.mjs +9 -9
  69. package/src/install-vendors.mjs +10 -3
  70. package/src/utils.mjs +1 -2
  71. package/dist/debugger/1.js +0 -2
  72. package/dist/debugger/1.js.map +0 -1
  73. package/dist/debugger/144.js +0 -2
  74. package/dist/debugger/144.js.map +0 -1
  75. package/dist/debugger/2.js +0 -8
  76. package/dist/debugger/2.js.map +0 -1
  77. package/dist/debugger/3.js +0 -2
  78. package/dist/debugger/3.js.map +0 -1
  79. package/dist/debugger/4.js +0 -2
  80. package/dist/debugger/4.js.map +0 -1
  81. package/dist/debugger/5.js +0 -2
  82. package/dist/debugger/5.js.map +0 -1
  83. package/dist/debugger/523.js +0 -2
  84. package/dist/debugger/523.js.map +0 -1
  85. package/dist/debugger/659.js +0 -3
  86. package/dist/debugger/659.js.LICENSE.txt +0 -6
  87. package/dist/debugger/659.js.map +0 -1
  88. package/dist/debugger/689.js +0 -2
  89. package/dist/debugger/689.js.map +0 -1
  90. package/dist/debugger/715.js +0 -2
  91. package/dist/debugger/715.js.map +0 -1
  92. package/dist/debugger/727.js +0 -3
  93. package/dist/debugger/727.js.LICENSE.txt +0 -6
  94. package/dist/debugger/727.js.map +0 -1
  95. package/dist/debugger/src_debugger_views_Dashboard_vue.js +0 -67
  96. package/dist/debugger/src_debugger_views_Database_vue.js +0 -187
  97. package/dist/debugger/src_debugger_views_Request_vue.js +0 -67
  98. package/dist/debugger/src_debugger_views_System_vue.js +0 -122
  99. 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
- fusion.vue(
19
- 'src/debugger/debugger.js',
20
- 'dist/debugger/',
21
- {
22
- override: (config) => {
23
- // @see https://webpack.js.org/guides/public-path/#automatic-publicpath
24
- config.output.publicPath = "auto";
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.8",
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
- "axios": "^0.21.1"
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": "^4.0.2",
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": [
@@ -5,3 +5,4 @@
5
5
  @import "bootstrap/scss/functions";
6
6
  @import "bootstrap/scss/variables";
7
7
  @import "bootstrap/scss/mixins";
8
+ @import "bootstrap/scss/maps";
@@ -0,0 +1,9 @@
1
+ // Part of earth file.
2
+
3
+ pre {
4
+ margin-bottom: 0;
5
+ }
6
+
7
+ code {
8
+ color: $dark;
9
+ }
@@ -1,7 +1,53 @@
1
1
  // Part of starter file.
2
2
 
3
3
  @import "variables";
4
- @import "bootstrap/scss/bootstrap";
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";
@@ -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
- <!-- Logo -->
6
- <div class="h-w-sidebar">
7
- <img src="assets/vendor/@windwalker-io/core/dist/images/windwalker-logo-h-w.svg" alt="logo"
8
- style="height: 30px">
9
- </div>
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
- <!-- Header -->
12
- <div class="">
12
+ <!-- Header -->
13
+ <div class="">
13
14
 
15
+ </div>
14
16
  </div>
15
17
  </div>
16
18
 
17
19
  <!-- Body -->
18
- <div class="row gx-0 flex-wrap flex-md-nowrap">
20
+ <div class="d-flex flex-column flex-md-row" style="margin-top: 60px;">
19
21
  <!-- Sidebar -->
20
- <div class="h-w-sidebar col-md-2">
21
- <div class="nav flex-column bg-light h-100">
22
- <div class="nav-item">
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="col-md-10">
78
+ <div class="flex-grow-1">
55
79
  <router-view></router-view>
56
80
  </div>
57
81
  </div>
@@ -3,7 +3,7 @@
3
3
  </template>
4
4
 
5
5
  <script>
6
- import { currentId } from './services/store.js';
6
+ import { currentId } from '@/services/store.js';
7
7
 
8
8
  export default {
9
9
  name: 'Store',
@@ -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">&times;</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
- <!-- component -->
3
- <div :id="`query-${i}`" class="card rounded-3 border-0 shadow overflow-hidden mx-auto">
4
- <div class="card-body">
5
- <div class="d-flex align-items-center justify-content-between mb-4">
6
- <div>
7
- <h2 class="text-gray-700 font-semibold text-2xl tracking-wide mb-2">
8
- Query: {{ i }}
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
- Query Time:
43
- <span class="badge bg-secondary">
44
- {{ round(item.time * 1000) }}ms
45
- </span>
46
- Memory:
47
- <span class="badge bg-secondary">
48
- {{ round(item.memory / 1024 / 1024) }}MB
49
- </span>
50
- Return Rows
51
- <span class="badge bg-secondary rounded-pill">
52
- {{ item.count }}
53
- </span>
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
- return format(query).replace(/\n/, '<br>');
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>