vite-plugin-vue-devtools 1.0.0-beta.3 → 1.0.0-beta.5

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 (42) hide show
  1. package/README.md +6 -0
  2. package/dist/client/assets/{Icon.vue_vue_type_script_setup_true_lang-bf37ec60.js → Icon.vue_vue_type_script_setup_true_lang-d08cd842.js} +1 -1
  3. package/dist/client/assets/{IconButton.vue_vue_type_script_setup_true_lang-9417e3da.js → IconButton.vue_vue_type_script_setup_true_lang-4cfd93a4.js} +2 -2
  4. package/dist/client/assets/{IconTitle.vue_vue_type_script_setup_true_lang-a710fbe0.js → IconTitle.vue_vue_type_script_setup_true_lang-49104706.js} +1 -1
  5. package/dist/client/assets/{IframeView.vue_vue_type_script_setup_true_lang-f1ea8625.js → IframeView.vue_vue_type_script_setup_true_lang-44366dc8.js} +1 -1
  6. package/dist/client/assets/{PanelGrids-09fbe816.js → PanelGrids-ed6a1457.js} +1 -1
  7. package/dist/client/assets/{SectionBlock-740d82f0.js → SectionBlock-13c3495f.js} +3 -3
  8. package/dist/client/assets/{StateFields.vue_vue_type_script_setup_true_lang-ed4f449a.js → StateFields.vue_vue_type_script_setup_true_lang-26d7d382.js} +4 -4
  9. package/dist/client/assets/{Switch.vue_vue_type_script_setup_true_lang-86be5e4b.js → Switch.vue_vue_type_script_setup_true_lang-32354ae4.js} +2 -2
  10. package/dist/client/assets/{TextInput.vue_vue_type_script_setup_true_lang-217531ea.js → TextInput.vue_vue_type_script_setup_true_lang-d100073c.js} +2 -2
  11. package/dist/client/assets/{__eyedropper-3339cbcc.js → __eyedropper-7b934b64.js} +3 -3
  12. package/dist/client/assets/{assets-8fd9db77.js → assets-0f9235a3.js} +7 -7
  13. package/dist/client/assets/{component-docs-94c9d80e.js → component-docs-516f2bde.js} +4 -4
  14. package/dist/client/assets/{components-133974b2.js → components-e048284d.js} +8 -8
  15. package/dist/client/assets/{data-1a736865.js → data-37773a62.js} +2 -2
  16. package/dist/client/assets/{documentations-bb1c038c.js → documentations-6fd78b0c.js} +2 -2
  17. package/dist/client/assets/{graph-7e8bbdd3.js → graph-23026554.js} +3 -3
  18. package/dist/client/assets/{index-57b0b18f.js → index-b327a261.js} +1 -1
  19. package/dist/client/assets/{index-056bb29c.js → index-c2b0ba3e.js} +19 -15
  20. package/dist/client/assets/{index-c3d74b48.css → index-f4f0a93b.css} +1 -1
  21. package/dist/client/assets/{inspect-d8a11fe1.js → inspect-9bd11a46.js} +2 -2
  22. package/dist/client/assets/{npm-3ad72929.js → npm-c03c6e14.js} +37 -38
  23. package/dist/client/assets/{overview-f7d1a936.js → overview-dfa4c675.js} +4 -4
  24. package/dist/client/assets/{pages-26acd942.js → pages-09d83e7f.js} +5 -5
  25. package/dist/client/assets/{pinia-f75a2b94.js → pinia-84d8d62d.js} +6 -6
  26. package/dist/client/assets/rerender-trace-0675adcd.css +14 -0
  27. package/dist/client/assets/{rerender-trace-a3fe7edb.js → rerender-trace-ce322913.js} +101 -35
  28. package/dist/client/assets/{routes-f320ef35.js → routes-a1298ce3.js} +7 -7
  29. package/dist/client/assets/{settings-b70ac3bb.js → settings-2ebfa83e.js} +6 -6
  30. package/dist/client/assets/{splitpanes.es-166029e0.js → splitpanes.es-695b5d63.js} +1 -1
  31. package/dist/client/assets/{timeline-92a66364.js → timeline-052b0db1.js} +7 -7
  32. package/dist/client/index.html +2 -2
  33. package/dist/vite.cjs +5 -2
  34. package/dist/vite.d.ts +5 -0
  35. package/dist/vite.mjs +5 -2
  36. package/package.json +3 -3
  37. package/src/views/ComponentInspector.vue +1 -0
  38. package/src/views/Main.vue +7 -1
  39. package/src/views/RerenderIndicator.vue +37 -0
  40. package/src/views/composables.ts +43 -1
  41. package/src/views/utils.ts +13 -0
  42. package/dist/client/assets/rerender-trace-6c5229c1.css +0 -14
package/dist/vite.cjs CHANGED
@@ -13757,7 +13757,8 @@ function getVueDevtoolsPath() {
13757
13757
  }
13758
13758
  const defaultOptions = {
13759
13759
  appendTo: "",
13760
- analyze: compiler.analyzeOptionsDefault
13760
+ analyze: compiler.analyzeOptionsDefault,
13761
+ openInEditorHost: false
13761
13762
  };
13762
13763
  function mergeOptions(options) {
13763
13764
  return Object.assign({}, defaultOptions, options);
@@ -13868,7 +13869,9 @@ import 'virtual:vue-devtools-path:app.js'`;
13868
13869
  inspect,
13869
13870
  VueInspector__default({
13870
13871
  toggleComboKey: "",
13871
- toggleButtonVisibility: "never"
13872
+ toggleButtonVisibility: "never",
13873
+ openInEditorHost: pluginOptions.openInEditorHost,
13874
+ ...pluginOptions.appendTo ? { appendTo: pluginOptions.appendTo } : {}
13872
13875
  })
13873
13876
  ];
13874
13877
  }
package/dist/vite.d.ts CHANGED
@@ -18,6 +18,11 @@ interface VitePluginVueDevToolsOptions {
18
18
  * }
19
19
  */
20
20
  analyze?: Partial<AnalyzeOptions>;
21
+ /**
22
+ * Customize openInEditor host (e.g. http://localhost:3000)
23
+ * @default false
24
+ */
25
+ openInEditorHost?: string | false;
21
26
  }
22
27
  declare function VitePluginVueDevTools(options?: VitePluginVueDevToolsOptions): PluginOption;
23
28
 
package/dist/vite.mjs CHANGED
@@ -13731,7 +13731,8 @@ function getVueDevtoolsPath() {
13731
13731
  }
13732
13732
  const defaultOptions = {
13733
13733
  appendTo: "",
13734
- analyze: analyzeOptionsDefault
13734
+ analyze: analyzeOptionsDefault,
13735
+ openInEditorHost: false
13735
13736
  };
13736
13737
  function mergeOptions(options) {
13737
13738
  return Object.assign({}, defaultOptions, options);
@@ -13842,7 +13843,9 @@ import 'virtual:vue-devtools-path:app.js'`;
13842
13843
  inspect,
13843
13844
  VueInspector({
13844
13845
  toggleComboKey: "",
13845
- toggleButtonVisibility: "never"
13846
+ toggleButtonVisibility: "never",
13847
+ openInEditorHost: pluginOptions.openInEditorHost,
13848
+ ...pluginOptions.appendTo ? { appendTo: pluginOptions.appendTo } : {}
13846
13849
  })
13847
13850
  ];
13848
13851
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vite-plugin-vue-devtools",
3
3
  "type": "module",
4
- "version": "1.0.0-beta.3",
4
+ "version": "1.0.0-beta.5",
5
5
  "description": "A vite plugin for Vue DevTools",
6
6
  "author": "webfansplz",
7
7
  "license": "MIT",
@@ -52,8 +52,8 @@
52
52
  "execa": "^7.1.1",
53
53
  "sirv": "^2.0.3",
54
54
  "vite-plugin-inspect": "^0.7.33",
55
- "vite-plugin-vue-inspector": "^3.4.2",
56
- "@vite-plugin-vue-devtools/core": "1.0.0-beta.3"
55
+ "vite-plugin-vue-inspector": "^3.5.0",
56
+ "@vite-plugin-vue-devtools/core": "1.0.0-beta.5"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@types/node": "^20.4.4",
@@ -28,6 +28,7 @@ const inspectorCardStyle = computed(() => ({ top: props.bounds.top < 35 ? 0 : '-
28
28
  <span class="vue-devtools-component-inspector-card" :style="inspectorCardStyle">
29
29
  &lt;{{ name }}&gt;
30
30
  <i>{{ Math.round(bounds.width * 100) / 100 }} x {{ Math.round(bounds.height * 100) / 100 }}</i>
31
+ <slot name="header-extra" />
31
32
  </span>
32
33
  </div>
33
34
  </template>
@@ -6,8 +6,9 @@ import vueDevToolsOptions from 'virtual:vue-devtools-options'
6
6
  import { DevToolsHooks, collectDevToolsHookBuffer } from '@vite-plugin-vue-devtools/core'
7
7
  import Frame from './FrameBox.vue'
8
8
  import ComponentInspector from './ComponentInspector.vue'
9
- import { useHighlightComponent, useIframe, useInspector, usePanelVisible, usePiPMode, usePosition } from './composables'
9
+ import { useHighlightComponent, useIframe, useInspector, usePanelVisible, usePiPMode, usePosition, useRerenderHighlight } from './composables'
10
10
  import { checkIsSafari, useColorScheme, usePreferredColorScheme, warn } from './utils'
11
+ import RerenderIndicator from './RerenderIndicator.vue'
11
12
 
12
13
  const props = defineProps({
13
14
  hook: {
@@ -79,6 +80,7 @@ const { iframe, getIframe } = useIframe(clientUrl, async () => {
79
80
  // Picture-in-Picture mode
80
81
  const { popup } = usePiPMode(getIframe, hook)
81
82
  const { overlayVisible, name: componentName, bounds, highlight, unHighlight } = useHighlightComponent()
83
+ const { updateRerenderHighlightInfo } = useRerenderHighlight()
82
84
 
83
85
  async function setupClient(iframe: HTMLIFrameElement) {
84
86
  const injection: any = iframe?.contentWindow?.__VUE_DEVTOOLS_VIEW__
@@ -124,6 +126,9 @@ async function setupClient(iframe: HTMLIFrameElement) {
124
126
  }, 2000)
125
127
  },
126
128
  },
129
+ rerenderHighlight: {
130
+ updateInfo: updateRerenderHighlightInfo,
131
+ },
127
132
  })
128
133
  }
129
134
 
@@ -284,6 +289,7 @@ collectHookBuffer()
284
289
  </div>
285
290
  <!-- component inspector -->
286
291
  <ComponentInspector v-if="overlayVisible" :bounds="bounds" :name="componentName" />
292
+ <RerenderIndicator />
287
293
  </template>
288
294
 
289
295
  <style scoped>
@@ -0,0 +1,37 @@
1
+ <script setup lang="ts">
2
+ import ComponentInspector from './ComponentInspector.vue'
3
+ import { useRerenderHighlight } from './composables'
4
+
5
+ const { rerenderHighlightMap } = useRerenderHighlight()
6
+
7
+ const colors = [
8
+ ['#ff5555', 50],
9
+ ['#fff888', 20],
10
+ ] as const
11
+
12
+ function getColors(times: number) {
13
+ const [color] = colors.find(([_, t]) => times >= t) || '#fff'
14
+ return color as string
15
+ }
16
+ </script>
17
+
18
+ <template>
19
+ <template v-for="[uid, { bound, rerenderCount, name }] in rerenderHighlightMap.entries()" :key="uid">
20
+ <ComponentInspector
21
+ :bounds="bound"
22
+ :name="name"
23
+ >
24
+ <template #header-extra>
25
+ <span
26
+ v-if="rerenderCount"
27
+ >
28
+ (Rerender Count: <span
29
+ :style="{
30
+ color: getColors(rerenderCount),
31
+ }"
32
+ >{{ rerenderCount + 1 }})</span>
33
+ </span>
34
+ </template>
35
+ </ComponentInspector>
36
+ </template>
37
+ </template>
@@ -1,6 +1,6 @@
1
1
  import { computed, onMounted, reactive, ref, shallowRef, watchEffect } from 'vue'
2
2
  import type { CSSProperties, Ref } from 'vue'
3
- import { clamp, useObjectStorage, useScreenSafeArea, useWindowEventListener, warn } from './utils'
3
+ import { clamp, createDebounceFn, useObjectStorage, useScreenSafeArea, useWindowEventListener, warn } from './utils'
4
4
 
5
5
  interface DevToolsFrameState {
6
6
  width: number
@@ -474,3 +474,45 @@ export function useHighlightComponent() {
474
474
  unHighlight,
475
475
  }
476
476
  }
477
+
478
+ // use rerender highlight
479
+
480
+ interface RerenderHighlightData {
481
+ name: string
482
+ rerenderCount: number
483
+ bound: {
484
+ width: number
485
+ height: number
486
+ left: number
487
+ top: number
488
+ }
489
+ debounceFn: () => void
490
+ }
491
+
492
+ const rerenderHighlightMap = ref<Map</* component instance uid */string, RerenderHighlightData>>(new Map())
493
+
494
+ function updateRerenderHighlightInfo(uid: string, name: string, bound: RerenderHighlightData['bound']) {
495
+ const data = rerenderHighlightMap.value.get(uid)
496
+ if (!data) {
497
+ const debounceFn = createDebounceFn(() => {
498
+ rerenderHighlightMap.value.delete(uid)
499
+ }, 3000)
500
+ rerenderHighlightMap.value.set(uid, {
501
+ rerenderCount: 0,
502
+ bound,
503
+ debounceFn,
504
+ name,
505
+ })
506
+ debounceFn()
507
+ return
508
+ }
509
+ data.rerenderCount += 1
510
+ data.debounceFn()
511
+ }
512
+
513
+ export function useRerenderHighlight() {
514
+ return {
515
+ rerenderHighlightMap,
516
+ updateRerenderHighlightInfo,
517
+ }
518
+ }
@@ -226,3 +226,16 @@ export function usePreferredColorScheme() {
226
226
 
227
227
  return computed(() => isDark.value ? 'dark' : 'light')
228
228
  }
229
+
230
+ export function createDebounceFn<const P, T>(fn: (this: T, ...args: P[]) => void, delay = 100) {
231
+ let timer: any | null = null
232
+ return function (this: T, ...args: P[]) {
233
+ if (timer)
234
+ clearTimeout(timer)
235
+
236
+ timer = setTimeout(() => {
237
+ fn.apply(this, args)
238
+ timer = null
239
+ }, delay)
240
+ }
241
+ }
@@ -1,14 +0,0 @@
1
-
2
- @keyframes loading-c4e9e7b3 {
3
- 0%,
4
- 100% {
5
- opacity: 1;
6
- transform: scale(1);
7
- }
8
- 50% {
9
- opacity: 0.3;
10
- }
11
- }
12
- .loading-animation[data-v-c4e9e7b3] {
13
- animation: loading-c4e9e7b3 1.5s infinite;
14
- }