@windwalker-io/core 4.0.7 → 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 (94) 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 +25 -15
  44. package/package.json +11 -5
  45. package/scss/_variables.scss +8 -0
  46. package/scss/base/_typography.scss +9 -0
  47. package/scss/debugger.scss +46 -17
  48. package/scss/layout/_layout.scss +1 -2
  49. package/scss/layout/_sidebar.scss +7 -2
  50. package/src/debugger/App.vue +74 -38
  51. package/src/debugger/Store.vue +1 -1
  52. package/src/debugger/components/BsModal.vue +128 -0
  53. package/src/debugger/components/KeyValueTable.vue +51 -0
  54. package/src/debugger/components/db/{query-info.vue → QueryInfo.vue} +87 -55
  55. package/src/debugger/components/events/EventListenersTable.vue +75 -0
  56. package/src/debugger/components/timeline/TimelineTable.vue +107 -0
  57. package/src/debugger/debugger.js +4 -1
  58. package/src/debugger/font-awesome.js +23 -0
  59. package/src/debugger/layouts/DefaultLayout.vue +19 -4
  60. package/src/debugger/routes.js +9 -6
  61. package/src/debugger/services/utilities.js +18 -0
  62. package/src/debugger/views/Dashboard.vue +20 -10
  63. package/src/debugger/views/Database.vue +113 -26
  64. package/src/debugger/views/Events.vue +113 -0
  65. package/src/debugger/views/Request.vue +133 -1
  66. package/src/debugger/views/Routing.vue +210 -0
  67. package/src/debugger/views/System.vue +37 -8
  68. package/src/debugger/views/Timeline.vue +92 -0
  69. package/src/{webpack.config.js → debugger/webpack.config.js} +1 -1
  70. package/src/index.mjs +9 -9
  71. package/src/install-vendors.mjs +10 -3
  72. package/src/utils.mjs +1 -2
  73. package/dist/debugger/1.js +0 -2
  74. package/dist/debugger/1.js.map +0 -1
  75. package/dist/debugger/144.js +0 -2
  76. package/dist/debugger/144.js.map +0 -1
  77. package/dist/debugger/2.js +0 -8
  78. package/dist/debugger/2.js.map +0 -1
  79. package/dist/debugger/3.js +0 -2
  80. package/dist/debugger/3.js.map +0 -1
  81. package/dist/debugger/4.js +0 -2
  82. package/dist/debugger/4.js.map +0 -1
  83. package/dist/debugger/5.js +0 -2
  84. package/dist/debugger/5.js.map +0 -1
  85. package/dist/debugger/523.js +0 -2
  86. package/dist/debugger/523.js.map +0 -1
  87. package/dist/debugger/689.js +0 -2
  88. package/dist/debugger/689.js.map +0 -1
  89. package/dist/debugger/715.js +0 -2
  90. package/dist/debugger/715.js.map +0 -1
  91. package/dist/debugger/727.js +0 -3
  92. package/dist/debugger/727.js.LICENSE.txt +0 -6
  93. package/dist/debugger/727.js.map +0 -1
  94. package/tailwind/debugger.tailwind.config.cjs +0 -30
package/fusionfile.mjs CHANGED
@@ -5,33 +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';
12
- import WebpackDynamicPublicPathPlugin from 'webpack-dynamic-public-path';
13
+ import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
13
14
 
14
15
  export async function debuggers() {
15
16
  // Watch start
16
17
  watch(['src/debugger/**/*.{js,vue}', 'scss/**/*.scss']);
17
18
  // Watch end
18
19
 
19
- fusion.vue(
20
- 'src/debugger/debugger.js',
21
- 'dist/debugger/',
22
- {
23
- override: (config) => {
24
- config.output.publicPath = "publicPathPlaceholder";
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";
25
32
 
26
- config.plugins.push(
27
- new WebpackDynamicPublicPathPlugin({
28
- externalPublicPath: "window.externalPublicPath"
29
- })
30
- );
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
+ }
31
41
  }
32
- }
42
+ ),
43
+ fusion.copy('images/**/*', 'dist/images/')
33
44
  );
34
- fusion.copy('images/**/*', 'dist/images/');
35
45
  }
36
46
 
37
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.7",
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
+ "@fortawesome/fontawesome-svg-core": "^6.2.0",
19
+ "@fortawesome/free-solid-svg-icons": "^6.2.0",
20
+ "@fortawesome/vue-fontawesome": "^3.0.1",
18
21
  "axios": "^0.21.1",
19
- "webpack-dynamic-public-path": "^1.0.7"
22
+ "dayjs": "^1.11.5"
20
23
  },
21
24
  "devDependencies": {
22
- "@windwalker-io/fusion": "^1.0",
23
25
  "@tailwindcss/custom-forms": "^0.2.1",
24
26
  "@tailwindcss/ui": "^0.7.2",
27
+ "@windwalker-io/fusion": "^1.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": "^4.0"
42
+ "webpack": "^5.0",
43
+ "webpack-bundle-analyzer": "^4.6.1"
38
44
  },
39
45
  "windwalker": {
40
46
  "vendors": [
@@ -0,0 +1,8 @@
1
+ // Part of earth file.
2
+
3
+ // Custom
4
+
5
+ @import "bootstrap/scss/functions";
6
+ @import "bootstrap/scss/variables";
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,24 +1,53 @@
1
1
  // Part of starter file.
2
2
 
3
- @tailwind base;
3
+ @import "variables";
4
4
 
5
- @layer base {
6
- h1 {
7
- @apply text-2xl;
8
- }
9
- h2 {
10
- @apply text-xl;
11
- }
12
- h3 {
13
- @apply text-lg;
14
- }
15
- a {
16
- @apply text-blue-600 underline;
17
- }
18
- }
5
+ // scss-docs-start import-stack
6
+ // Configuration
7
+ @import "bootstrap/scss/mixins";
8
+ @import "bootstrap/scss/utilities";
19
9
 
20
- @tailwind components;
21
- @tailwind utilities;
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";
22
51
 
23
52
  @import "layout/layout";
24
53
  @import "layout/sidebar";
@@ -1,6 +1,5 @@
1
1
  // Part of starter file.
2
2
 
3
3
  .h-w-sidebar {
4
- width: 250px;
5
- min-width: 250px;
4
+ //
6
5
  }
@@ -1,6 +1,11 @@
1
1
  // Part of starter file.
2
2
 
3
3
  .c-sidebar-menu-item {
4
- @apply px-4 py-3 no-underline text-gray-800 hover:text-gray-600 block border-b border-gray-300
5
- hover:bg-gray-300;
4
+ color: $dark;
5
+ padding-top: .75rem;
6
+ padding-bottom: .75rem;
7
+ }
8
+
9
+ .c-sidebar-menu-item.active {
10
+ background-color: $gray-300;
6
11
  }
@@ -1,51 +1,81 @@
1
1
  <template>
2
- <div class="c-main-wrapper min-h-screen flex flex-col">
3
- <div class="flex items-center bg-gray-800 p-3 text-white"
2
+ <div class="c-main-wrapper">
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="flex flex-grow">
20
+ <div class="d-flex flex-column flex-md-row" style="margin-top: 60px;">
19
21
  <!-- Sidebar -->
20
- <div class="h-w-sidebar bg-gray-200">
21
- <div class="">
22
- <router-link to="/"
23
- class="c-sidebar-menu-item">
24
- Dashboard
25
- </router-link>
26
- </div>
27
- <div>
28
- <router-link to="/system"
29
- class="c-sidebar-menu-item">
30
- System
31
- </router-link>
32
- </div>
33
- <div>
34
- <router-link to="/request"
35
- class="c-sidebar-menu-item">
36
- Request
37
- </router-link>
38
- </div>
39
- <div>
40
- <router-link to="/db"
41
- class="c-sidebar-menu-item">
42
- Database
43
- </router-link>
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">
26
+ <router-link to="/"
27
+ class="c-sidebar-menu-item nav-link"
28
+ :class="{ active: currentRoute === 'dashboard' }">
29
+ Dashboard
30
+ </router-link>
31
+ </div>
32
+ <div class="nav-item nav-item--system">
33
+ <router-link to="/system"
34
+ class="c-sidebar-menu-item nav-link"
35
+ :class="{ active: currentRoute === 'system' }">
36
+ System
37
+ </router-link>
38
+ </div>
39
+ <div class="nav-item nav-item--request">
40
+ <router-link to="/request"
41
+ class="c-sidebar-menu-item nav-link"
42
+ :class="{ active: currentRoute === 'request' }">
43
+ Request
44
+ </router-link>
45
+ </div>
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">
68
+ <router-link to="/db"
69
+ class="c-sidebar-menu-item nav-link"
70
+ :class="{ active: currentRoute === 'db' }">
71
+ Database
72
+ </router-link>
73
+ </div>
44
74
  </div>
45
75
  </div>
46
76
 
47
77
  <!-- Content Body -->
48
- <div class="bg-gray-100 flex-grow">
78
+ <div class="flex-grow-1">
49
79
  <router-view></router-view>
50
80
  </div>
51
81
  </div>
@@ -55,7 +85,8 @@
55
85
  </template>
56
86
 
57
87
  <script>
58
- import { RouterLink, RouterView } from 'vue-router';
88
+ import { computed } from 'vue';
89
+ import { RouterLink, RouterView, useRoute } from 'vue-router';
59
90
  import Store from './Store.vue';
60
91
 
61
92
  export default {
@@ -66,13 +97,18 @@ export default {
66
97
  RouterView
67
98
  },
68
99
  setup() {
100
+ const route = useRoute();
101
+ const currentRoute = computed(() => route.name);
102
+
69
103
  return {
70
-
104
+ currentRoute
71
105
  };
72
106
  }
73
107
  };
74
108
  </script>
75
109
 
76
- <style scoped>
110
+ <style scoped lang="scss">
111
+ .c-sidebar-menu-item.active {
77
112
 
113
+ }
78
114
  </style>
@@ -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>