@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
@@ -0,0 +1,107 @@
1
+ <template>
2
+ <div>
3
+ <table class="table table-bordered">
4
+ <thead>
5
+ <tr>
6
+ <th>Label</th>
7
+ <th class="text-end">Total Time</th>
8
+ <th class="text-end">Time</th>
9
+ <th class="text-end">Total Memory</th>
10
+ <th class="text-end">Memory</th>
11
+ </tr>
12
+ </thead>
13
+
14
+ <tbody>
15
+ <tr v-for="item of items">
16
+ <td>
17
+ {{ item.label }}
18
+ </td>
19
+ <td class="text-end">
20
+ <span class="badge bg-secondary">
21
+ {{ round(item.endTime) }}ms
22
+ </span>
23
+ </td>
24
+ <td class="text-end" v-if="getTimeOffset(item.endTime) || true">
25
+ <span class="badge" :class="'bg-' + stateColor(getCurrentTimeOffset(), 50)">
26
+ {{ round(getCurrentTimeOffset()) }}ms
27
+ </span>
28
+ </td>
29
+ <td class="text-end">
30
+ <span class="badge bg-secondary">
31
+ {{ round(bytesToMB(item.memory)) }}MB
32
+ </span>
33
+ </td>
34
+ <td class="text-end" v-if="getMemoryOffset(item.memory) || true">
35
+ <span class="badge" :class="'bg-' + stateColor(bytesToMB(getCurrentMemoryOffset()), 2)">
36
+ {{ round(bytesToMB(getCurrentMemoryOffset())) }}MB
37
+ </span>
38
+ </td>
39
+ </tr>
40
+ </tbody>
41
+ </table>
42
+ </div>
43
+ </template>
44
+
45
+ <script>
46
+ import { stateColor } from '../../services/utilities.js';
47
+
48
+ export default {
49
+ name: 'TimelineTable',
50
+ props: {
51
+ items: Array
52
+ },
53
+ setup() {
54
+ let lastTime = 0;
55
+ let timeOffset = 0;
56
+
57
+ function getTimeOffset(time) {
58
+ timeOffset = time - lastTime;
59
+
60
+ lastTime = time;
61
+
62
+ return timeOffset;
63
+ }
64
+
65
+ function getCurrentTimeOffset() {
66
+ return timeOffset;
67
+ }
68
+
69
+ let lastMemory = 0;
70
+ let memoryOffset = 0;
71
+
72
+ function getMemoryOffset(memory) {
73
+ memoryOffset = memory - lastMemory;
74
+
75
+ lastMemory = memory;
76
+
77
+ return memoryOffset;
78
+ }
79
+
80
+ function getCurrentMemoryOffset() {
81
+ return memoryOffset;
82
+ }
83
+
84
+ function bytesToMB(value) {
85
+ return value / 1024 / 1024;
86
+ }
87
+
88
+ function round(num) {
89
+ return Math.round(num * 10000) / 10000;
90
+ }
91
+
92
+ return {
93
+ getTimeOffset,
94
+ getCurrentTimeOffset,
95
+ getMemoryOffset,
96
+ getCurrentMemoryOffset,
97
+ stateColor,
98
+ bytesToMB,
99
+ round
100
+ };
101
+ }
102
+ };
103
+ </script>
104
+
105
+ <style scoped>
106
+
107
+ </style>
@@ -9,10 +9,13 @@ import 'regenerator-runtime';
9
9
  import App from '@/App.vue';
10
10
  import { createApp } from 'vue';
11
11
  import router from './routes.js';
12
+ import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
13
+ import './font-awesome.js';
12
14
 
13
15
  import '../../scss/debugger.scss';
14
16
 
15
17
  const app = createApp(App)
16
- .use(router);
18
+ .use(router)
19
+ .component('fa-icon', FontAwesomeIcon);
17
20
 
18
21
  app.mount('app');
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Part of earth project.
3
+ *
4
+ * @copyright Copyright (C) 2022 __ORGANIZATION__.
5
+ * @license __LICENSE__
6
+ */
7
+
8
+ /* import the fontawesome core */
9
+ import { library } from '@fortawesome/fontawesome-svg-core'
10
+
11
+ /* import specific icons */
12
+ import { faList } from '@fortawesome/free-solid-svg-icons/faList'
13
+ import { faArrowsRotate } from '@fortawesome/free-solid-svg-icons/faArrowsRotate'
14
+ import { faEye } from '@fortawesome/free-solid-svg-icons/faEye'
15
+ import { faExternalLink } from '@fortawesome/free-solid-svg-icons/faExternalLink'
16
+
17
+ /* add icons to the library */
18
+ library.add(
19
+ faEye,
20
+ faExternalLink,
21
+ faList,
22
+ faArrowsRotate,
23
+ );
@@ -5,7 +5,15 @@
5
5
  <slot name="title"></slot>
6
6
  </h1>
7
7
  <div class="text-muted">
8
- {{ currentId }} / <a target="_blank" class="text-gray-600" :href="currentData.url">{{ currentData.url }}</a>
8
+ <router-link to="/" class="btn btn-sm btn-primary">
9
+ <fa-icon icon="fa-solid fa-list"></fa-icon>
10
+ </router-link>
11
+ <button type="button" @click="goToLast('/' + route.name)" class="btn btn-sm btn-success">
12
+ <fa-icon icon="fa-solid fa-arrows-rotate"></fa-icon>
13
+ </button>
14
+ /
15
+ {{ currentId }}
16
+ / <a target="_blank" class="text-gray-600" :href="currentData.url">{{ currentData.url }}</a>
9
17
  </div>
10
18
  </div>
11
19
 
@@ -14,14 +22,21 @@
14
22
  </template>
15
23
 
16
24
  <script>
25
+ import { useRoute } from 'vue-router';
26
+ import { goToLast } from '../services/nav.js';
17
27
  import { currentData, currentId } from '../services/store.js';
18
28
 
19
29
  export default {
20
30
  name: 'DefaultLayout',
21
31
  setup() {
32
+ const route = useRoute();
33
+
22
34
  return {
23
35
  currentId,
24
- currentData
36
+ currentData,
37
+ route,
38
+
39
+ goToLast
25
40
  };
26
41
  }
27
42
  };
@@ -13,6 +13,9 @@ const routes = [
13
13
  { name: 'dashboard', path: '/', component: () => import('./views/Dashboard.vue') },
14
14
  { name: 'system', path: '/system/:id?', component: () => import('./views/System.vue') },
15
15
  { name: 'request', path: '/request/:id?', component: () => import('./views/Request.vue') },
16
+ { name: 'routing', path: '/routing/:id?', component: () => import('./views/Routing.vue') },
17
+ { name: 'timeline', path: '/timeline/:id?', component: () => import('./views/Timeline.vue') },
18
+ { name: 'events', path: '/events/:id?', component: () => import('./views/Events.vue') },
16
19
  { name: 'db', path: '/db/:id?', component: () => import('./views/Database.vue') },
17
20
  ];
18
21
 
@@ -36,8 +39,8 @@ router.beforeEach(async (to, from) => {
36
39
  currentId.value = to.params.id;
37
40
 
38
41
  const params = new URLSearchParams({
39
- 'path[url]': 'http.systemUri.full',
40
- 'path[status]': 'http.response.status',
42
+ 'path[url]': 'http::systemUri.full',
43
+ 'path[status]': 'http::response.status',
41
44
  });
42
45
  const res = await $http.get('ajax/data?' + params.toString());
43
46
 
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Part of earth project.
3
+ *
4
+ * @copyright Copyright (C) 2022 __ORGANIZATION__.
5
+ * @license __LICENSE__
6
+ */
7
+
8
+ export function stateColor(value, avg) {
9
+ if (value > (avg * 2)) {
10
+ return 'danger';
11
+ } else if (value > (avg * 1.5)) {
12
+ return 'warning';
13
+ } else if (value < (avg / 2)) {
14
+ return 'success';
15
+ } else {
16
+ return 'info';
17
+ }
18
+ }
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <div class="p-4">
3
- <table class="table table-auto">
4
- <thead>
3
+ <table class="table table-striped table-bordered">
4
+ <thead class="table-dark">
5
5
  <tr>
6
6
  <th>
7
7
  ID
@@ -30,13 +30,15 @@
30
30
  <tbody>
31
31
  <tr v-for="item of items">
32
32
  <td>
33
- {{ item.id }}
33
+ <a href="#" @click.prevent="selectId(item.id)" class="link-secondary">
34
+ {{ item.id }}
35
+ </a>
34
36
  </td>
35
37
  <td>
36
- <button class="bg-blue-400 rounded-sm px-3 py-2 text-white hover:bg-blue-500"
38
+ <button class="btn btn-primary btn-sm"
37
39
  type="button"
38
40
  @click="selectId(item.id)">
39
- <svg style="height: 16px" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="eye" class="svg-inline--fa fa-eye fa-w-18" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="currentColor" d="M572.5 238.1C518.3 115.5 410.9 32 288 32S57.69 115.6 3.469 238.1C1.563 243.4 0 251 0 256c0 4.977 1.562 12.6 3.469 17.03C57.72 396.5 165.1 480 288 480s230.3-83.58 284.5-206.1C574.4 268.6 576 260.1 576 256C576 251 574.4 243.4 572.5 238.1zM432 256c0 79.45-64.47 144-143.9 144C208.6 400 144 335.5 144 256S208.5 112 288 112S432 176.5 432 256zM288 160C285.7 160 282.4 160.4 279.5 160.8C284.8 170 288 180.6 288 192c0 35.35-28.65 64-64 64C212.6 256 201.1 252.7 192.7 247.5C192.4 250.5 192 253.6 192 256c0 52.1 43 96 96 96s96-42.99 96-95.99S340.1 160 288 160z"></path></svg>
41
+ <fa-icon icon="fa-solid fa-eye"></fa-icon>
40
42
  </button>
41
43
  </td>
42
44
  <td>
@@ -46,16 +48,18 @@
46
48
  {{ item.method }}
47
49
  </td>
48
50
  <td>
49
- <a href="#"
50
- class="text-gray-400">
51
+ <a :href="item.url"
52
+ target="_blank"
53
+ class="link-secondary">
51
54
  {{ item.url }}
55
+ <fa-icon class="small" icon="fa-solid fa-external-link"></fa-icon>
52
56
  </a>
53
57
  </td>
54
58
  <td>
55
- {{ item.time }}
59
+ {{ dateFormat(item.time) }}
56
60
  </td>
57
61
  <td>
58
- {{ item.status }}
62
+ {{ item.response?.status }}
59
63
  </td>
60
64
  </tr>
61
65
  </tbody>
@@ -64,6 +68,7 @@
64
68
  </template>
65
69
 
66
70
  <script>
71
+ import * as dayjs from 'dayjs';
67
72
  import { onMounted, reactive, toRefs } from 'vue';
68
73
  import router from '@/routes.js';
69
74
  import $http from '@/services/http.js';
@@ -88,9 +93,14 @@ export default {
88
93
  router.push('/system/' + id);
89
94
  }
90
95
 
96
+ function dateFormat(ts) {
97
+ return dayjs.unix(ts).format('YYYY-MM-DD HH:mm:ssZ');
98
+ }
99
+
91
100
  return {
92
101
  ...toRefs(state),
93
- selectId
102
+ selectId,
103
+ dateFormat,
94
104
  };
95
105
  }
96
106
  };
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <default-layout>
2
+ <defaultLayout>
3
3
  <template #title>
4
4
  Database
5
5
  </template>
@@ -7,37 +7,91 @@
7
7
  <div v-if="data" class="p-4">
8
8
  <!-- DB info -->
9
9
 
10
- <div>
11
- <h4>Queries</h4>
10
+ <ul class="nav nav-pills" id="profilers-tab" role="tablist">
11
+ <li class="nav-item" role="presentation"
12
+ v-for="(instance, i) of instances">
13
+ <button class="nav-link active" id="home-tab" data-bs-toggle="tab"
14
+ :data-bs-target="`tab-${instance}`"
15
+ type="button"
16
+ role="tab"
17
+ aria-selected="true">
18
+ {{ instance }}
19
+ </button>
20
+ </li>
21
+ </ul>
12
22
 
13
- <div class="my-3">
14
- Count: <span class="bg-blue-300 text-blue-600 px-2 py-1 rounded-sm text-sm">{{ data?.queries?.length }}</span>
15
- -
16
- Time: <span class="bg-blue-300 text-blue-600 px-2 py-1 rounded-sm text-sm">{{ round(totalTime) }}ms</span>
17
- -
18
- Memory: <span class="bg-blue-300 text-blue-600 px-2 py-1 rounded-sm text-sm">{{ round(totalMemory) }}MB</span>
19
- </div>
20
- </div>
23
+ <div class="tab-content mt-4" id="myTabContent">
24
+ <div class="tab-pane fade "
25
+ v-for="(instance, i) of instances"
26
+ :class="[ i === 0 ? 'show active' : '' ]"
27
+ :id="`tab-${instance}`"
28
+ role="tabpanel"
29
+ tabindex="0">
30
+
31
+ <div>
32
+ <h4>Queries</h4>
33
+
34
+ <div class="my-3">
35
+ Count: <span class="badge bg-info">{{ data?.queries[instance]?.length || 0 }}</span>
36
+ -
37
+ Time:
38
+ <span class="badge" :class="`bg-${stateColor(totalTime(instance), 15 * (data?.queries[instance]?.length || 0))}`">
39
+ {{ round(totalTime(instance)) }}ms
40
+ </span>
41
+ -
42
+ Memory:
43
+ <span class="badge" :class="`bg-${stateColor(totalMemory(instance), 0.05 * (data?.queries[instance]?.length || 0))}`">
44
+ {{ round(totalMemory(instance)) }}MB
45
+ </span>
46
+ </div>
47
+ </div>
48
+
49
+ <div class="mt-5">
50
+ <div class="mb-4" v-for="(query, i) of data.queries[instance]">
51
+ <QueryInfo :item="query" :i="i + 1"
52
+ :total-count="data?.queries[instance]?.length || 0"
53
+ :total-time="totalTime(instance)"
54
+ :total-memory="totalMemory(instance)"
55
+ @open-backtrace="openBacktrace"
56
+ />
57
+ </div>
58
+ </div>
21
59
 
22
- <div class="mt-5">
23
- <div class="mb-4" v-for="(query, i) of data.queries">
24
- <query-info :item="query" :i="i + 1" />
25
60
  </div>
26
61
  </div>
27
62
 
63
+ <BsModal :open="showBacktraceModal" @hidden="showBacktraceModal = false"
64
+ :title="`Query ${backtraceIndex}: Backtrace`" size="xl">
65
+ <table class="table table-striped table-bordered">
66
+ <tbody>
67
+ <tr v-for="traceItem of backtrace" style="font-family: monospace; font-size: 13px; word-break: break-all;">
68
+ <td>
69
+ {{ traceItem.function }}
70
+ </td>
71
+ <td>
72
+ <a :href="getEditorLink(traceItem)">
73
+ {{ replaceRoot(traceItem.pathname) }}
74
+ </a>
75
+ </td>
76
+ </tr>
77
+ </tbody>
78
+ </table>
79
+ </BsModal>
28
80
  </div>
29
- </default-layout>
81
+ </defaultLayout>
30
82
  </template>
31
83
 
32
84
  <script>
33
85
  import { computed, ref } from 'vue';
34
- import QueryInfo from '../components/db/query-info.vue';
35
- import DefaultLayout from '../layouts/DefaultLayout.vue';
36
- import $http from '../services/http.js';
86
+ import BsModal from '@/components/BsModal.vue';
87
+ import QueryInfo from '@/components/db/QueryInfo.vue';
88
+ import DefaultLayout from '@/layouts/DefaultLayout.vue';
89
+ import $http from '@/services/http.js';
90
+ import { stateColor } from '../services/utilities.js';
37
91
 
38
92
  export default {
39
93
  name: 'Database',
40
- components: { DefaultLayout, QueryInfo },
94
+ components: { BsModal, QueryInfo, DefaultLayout },
41
95
  async beforeRouteEnter(to, from ,next) {
42
96
  next(async (vm) => {
43
97
  const res = await $http.get('ajax/data?path=db');
@@ -51,23 +105,56 @@ export default {
51
105
  setup() {
52
106
  const data = ref(null);
53
107
 
54
- const totalTime = computed(() => {
55
- return data.value?.queries?.reduce((sum, query) => {
108
+ function totalTime(instance) {
109
+ return data.value?.queries[instance]?.reduce((sum, query) => {
56
110
  return sum + query.time;
57
111
  }, 0) * 1000;
58
- });
112
+ }
59
113
 
60
- const totalMemory = computed(() => {
61
- return data.value?.queries?.reduce((sum, query) => {
114
+ function totalMemory(instance) {
115
+ return data.value?.queries[instance]?.reduce((sum, query) => {
62
116
  return sum + query.memory;
63
117
  }, 0) / 1024 / 1024;
64
- });
118
+ }
119
+
120
+ const showBacktraceModal = ref(false);
121
+ const backtrace = ref([]);
122
+ const backtraceIndex = ref(0);
123
+
124
+ function openBacktrace(trace, i) {
125
+ backtrace.value = trace;
126
+ backtraceIndex.value = i;
127
+ showBacktraceModal.value = true;
128
+ }
129
+
130
+ const editor = document.__data.editor;
131
+ const sysPath = document.__data.systemPath;
132
+
133
+ function getEditorLink(trace) {
134
+ return `${editor}://open?file=${trace.pathname}&line=${trace.line}`;
135
+ }
136
+
137
+ function replaceRoot(path) {
138
+ return path.replace(sysPath, 'ROOT');
139
+ }
140
+
141
+ const instances = computed(() => data.value.connections.map((conn) => conn.name));
65
142
 
66
143
  return {
67
144
  data,
68
145
  totalTime,
69
146
  totalMemory,
70
- round
147
+ showBacktraceModal,
148
+ backtrace,
149
+ backtraceIndex,
150
+ instances,
151
+
152
+ openBacktrace,
153
+ getEditorLink,
154
+
155
+ stateColor,
156
+ round,
157
+ replaceRoot,
71
158
  }
72
159
  }
73
160
  };
@@ -0,0 +1,113 @@
1
+ <template>
2
+ <DefaultLayout>
3
+ <template #title>
4
+ Events
5
+ </template>
6
+
7
+ <div class="p-4" v-if="data">
8
+
9
+ <section class="l-section l-section--triggered">
10
+ <h3>Event Triggered</h3>
11
+
12
+ <EventListenersTable :events="data.invoked" />
13
+ </section>
14
+
15
+ <section class="l-section l-section--untriggered mt-5">
16
+ <h3>Event Not Triggered (But has Listeners)</h3>
17
+
18
+ <EventListenersTable :events="data.uninvoked" />
19
+ </section>
20
+
21
+ </div>
22
+ </DefaultLayout>
23
+ </template>
24
+
25
+ <script>
26
+ import { computed, ref } from 'vue';
27
+ import EventListenersTable from '../components/events/EventListenersTable.vue';
28
+ import DefaultLayout from '../layouts/DefaultLayout.vue';
29
+ import $http from '../services/http.js';
30
+ export default {
31
+ name: 'Events',
32
+ components: { EventListenersTable, DefaultLayout },
33
+ async beforeRouteEnter(to, from ,next) {
34
+ next(async (vm) => {
35
+ const res = await $http.get('ajax/data?path=events');
36
+ vm.data = res.data.data;
37
+ });
38
+ },
39
+ async beforeRouteUpdate(to, from ,next) {
40
+ const res = await $http.get('ajax/data?path=events');
41
+ this.data = res.data.data;
42
+ },
43
+ setup() {
44
+ const data = ref(null);
45
+
46
+ // const events = computed(() => {
47
+ // const items = [];
48
+ //
49
+ // for (const eventName in data.value) {
50
+ // const listeners = data.value[eventName] || {};
51
+ //
52
+ // for (const listenerName in listeners) {
53
+ // const count = listeners[listenerName] || 0;
54
+ //
55
+ // items.push({
56
+ // event: eventName,
57
+ // listener: listenerName,
58
+ // count
59
+ // });
60
+ // }
61
+ // }
62
+ //
63
+ // return items;
64
+ // });
65
+
66
+ // const triggeredEvents = computed(() => {
67
+ // const items = {};
68
+ //
69
+ // for (const eventName in data.value) {
70
+ // const listeners = data.value[eventName] || {};
71
+ //
72
+ // for (const listenerName in listeners) {
73
+ // const count = listeners[listenerName] || 0;
74
+ //
75
+ // if (count > 0) {
76
+ // items[eventName] = items[eventName] || {};
77
+ // items[eventName][listenerName] = count;
78
+ // }
79
+ // }
80
+ // }
81
+ //
82
+ // return items;
83
+ // });
84
+ //
85
+ // const untriggeredEvents = computed(() => {
86
+ // const items = {};
87
+ //
88
+ // for (const eventName in data.value) {
89
+ // const listeners = data.value[eventName] || {};
90
+ //
91
+ // for (const listenerName in listeners) {
92
+ // const count = listeners[listenerName] || 0;
93
+ //
94
+ // if (count <= 0) {
95
+ // items[eventName] = items[eventName] || {};
96
+ // items[eventName][listenerName] = count;
97
+ // }
98
+ // }
99
+ // }
100
+ //
101
+ // return items;
102
+ // });
103
+
104
+ return {
105
+ data,
106
+ };
107
+ }
108
+ };
109
+ </script>
110
+
111
+ <style scoped>
112
+
113
+ </style>