vite-uni-dev-tool 0.0.48 → 1.0.0

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 (292) hide show
  1. package/README.md +20 -0
  2. package/dist/const.cjs +1 -0
  3. package/dist/const.d.ts +78 -161
  4. package/dist/const.d.ts.map +1 -1
  5. package/dist/const.js +1 -47
  6. package/dist/core-shared.d.ts +44 -0
  7. package/dist/core-shared.d.ts.map +1 -0
  8. package/dist/core-shared.js +1 -0
  9. package/dist/core.d.ts +2 -40
  10. package/dist/core.d.ts.map +1 -1
  11. package/dist/core.js +4 -159
  12. package/dist/i18n/index.cjs +1 -0
  13. package/dist/i18n/index.d.ts +9 -0
  14. package/dist/i18n/index.d.ts.map +1 -0
  15. package/dist/i18n/index.js +1 -0
  16. package/dist/i18n/instance.cjs +1 -0
  17. package/dist/i18n/instance.d.ts +15 -0
  18. package/dist/i18n/instance.d.ts.map +1 -0
  19. package/dist/i18n/instance.js +1 -0
  20. package/dist/i18n/locales/en.cjs +1 -0
  21. package/dist/i18n/locales/en.d.ts +470 -0
  22. package/dist/i18n/locales/en.d.ts.map +1 -0
  23. package/dist/i18n/locales/en.js +1 -0
  24. package/dist/i18n/locales/zh-Hans.cjs +1 -0
  25. package/dist/i18n/locales/zh-Hans.d.ts +476 -0
  26. package/dist/i18n/locales/zh-Hans.d.ts.map +1 -0
  27. package/dist/i18n/locales/zh-Hans.js +1 -0
  28. package/dist/index.cjs +1 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +1 -1
  31. package/dist/modules/devConsole/index.cjs +4 -0
  32. package/dist/{devConsole → modules/devConsole}/index.d.ts +1 -1
  33. package/dist/modules/devConsole/index.d.ts.map +1 -0
  34. package/dist/modules/devConsole/index.js +4 -0
  35. package/dist/modules/devEvent/index.cjs +5 -0
  36. package/dist/modules/devEvent/index.d.ts +115 -0
  37. package/dist/modules/devEvent/index.d.ts.map +1 -0
  38. package/dist/modules/devEvent/index.js +5 -0
  39. package/dist/modules/devIntercept/index.cjs +13 -0
  40. package/dist/modules/devIntercept/index.d.ts +71 -0
  41. package/dist/modules/devIntercept/index.d.ts.map +1 -0
  42. package/dist/modules/devIntercept/index.js +13 -0
  43. package/dist/modules/devStore/index.cjs +1 -0
  44. package/dist/modules/devStore/index.d.ts +159 -0
  45. package/dist/modules/devStore/index.d.ts.map +1 -0
  46. package/dist/modules/devStore/index.js +1 -0
  47. package/dist/modules/devToolInfo/index.cjs +1 -0
  48. package/dist/modules/devToolInfo/index.d.ts +27 -0
  49. package/dist/modules/devToolInfo/index.d.ts.map +1 -0
  50. package/dist/modules/devToolInfo/index.js +1 -0
  51. package/dist/plugins/uniDevTool/transform/transformApp.cjs +44 -0
  52. package/dist/plugins/uniDevTool/transform/transformApp.d.ts.map +1 -1
  53. package/dist/plugins/uniDevTool/transform/transformApp.js +17 -17
  54. package/dist/plugins/uniDevTool/transform/transformMain.cjs +3 -0
  55. package/dist/plugins/uniDevTool/transform/transformMain.d.ts.map +1 -1
  56. package/dist/plugins/uniDevTool/transform/transformMain.js +3 -3
  57. package/dist/plugins/uniDevTool/transform/transformVue.cjs +41 -0
  58. package/dist/plugins/uniDevTool/transform/transformVue.d.ts +1 -2
  59. package/dist/plugins/uniDevTool/transform/transformVue.d.ts.map +1 -1
  60. package/dist/plugins/uniDevTool/transform/transformVue.js +32 -19
  61. package/dist/plugins/uniDevTool/uniDevTool.cjs +5 -0
  62. package/dist/plugins/uniDevTool/uniDevTool.d.ts +3 -11
  63. package/dist/plugins/uniDevTool/uniDevTool.d.ts.map +1 -1
  64. package/dist/plugins/uniDevTool/uniDevTool.js +3 -3
  65. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.cjs +19 -0
  66. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts.map +1 -1
  67. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.js +11 -19
  68. package/dist/plugins/uniParseStock/index.d.ts +10 -0
  69. package/dist/plugins/uniParseStock/index.d.ts.map +1 -0
  70. package/dist/plugins/utils/index.cjs +2 -0
  71. package/dist/plugins/utils/index.d.ts +1 -3
  72. package/dist/plugins/utils/index.d.ts.map +1 -1
  73. package/dist/plugins/utils/index.js +2 -2
  74. package/dist/shims-uni.d.ts +140 -0
  75. package/dist/type.d.ts +174 -16
  76. package/dist/type.d.ts.map +1 -1
  77. package/dist/utils/array.cjs +1 -0
  78. package/dist/utils/array.d.ts.map +1 -1
  79. package/dist/utils/array.js +1 -12
  80. package/dist/utils/date.cjs +1 -0
  81. package/dist/utils/date.d.ts.map +1 -1
  82. package/dist/utils/date.js +1 -59
  83. package/dist/utils/file.cjs +1 -0
  84. package/dist/utils/file.d.ts.map +1 -1
  85. package/dist/utils/file.js +1 -85
  86. package/dist/utils/function.cjs +1 -0
  87. package/dist/utils/function.d.ts +13 -0
  88. package/dist/utils/function.d.ts.map +1 -1
  89. package/dist/utils/function.js +1 -68
  90. package/dist/utils/index.cjs +1 -0
  91. package/dist/utils/index.d.ts.map +1 -1
  92. package/dist/utils/index.js +1 -63
  93. package/dist/utils/ip.cjs +1 -0
  94. package/dist/utils/ip.d.ts +1 -1
  95. package/dist/utils/ip.d.ts.map +1 -1
  96. package/dist/utils/ip.js +1 -45
  97. package/dist/utils/language.cjs +1 -0
  98. package/dist/utils/language.d.ts +2 -1
  99. package/dist/utils/language.d.ts.map +1 -1
  100. package/dist/utils/language.js +1 -63
  101. package/dist/utils/object.cjs +1 -0
  102. package/dist/utils/object.d.ts +4 -5
  103. package/dist/utils/object.d.ts.map +1 -1
  104. package/dist/utils/object.js +1 -136
  105. package/dist/utils/openLink.cjs +1 -0
  106. package/dist/utils/openLink.d.ts.map +1 -1
  107. package/dist/utils/openLink.js +1 -28
  108. package/dist/utils/page.cjs +1 -0
  109. package/dist/utils/page.d.ts.map +1 -1
  110. package/dist/utils/page.js +1 -7
  111. package/dist/utils/platform.cjs +1 -0
  112. package/dist/utils/platform.d.ts.map +1 -1
  113. package/dist/utils/platform.js +1 -17
  114. package/dist/utils/string.cjs +1 -0
  115. package/dist/utils/string.d.ts.map +1 -1
  116. package/dist/utils/string.js +1 -114
  117. package/dist/utils/utils.cjs +1 -0
  118. package/dist/utils/utils.d.ts +1 -1
  119. package/dist/utils/utils.d.ts.map +1 -1
  120. package/dist/utils/utils.js +1 -126
  121. package/dist/v3/AppTransition/index.vue +170 -0
  122. package/dist/v3/AutoSizer/index.vue +4 -5
  123. package/dist/v3/AutoSizer/index1.vue +4 -6
  124. package/dist/v3/AutoSizer/utils.ts +1 -1
  125. package/dist/v3/CaptureScreen/index.vue +19 -8
  126. package/dist/v3/CircularButton/index.vue +64 -13
  127. package/dist/v3/ConsoleList/ConsoleItem.vue +56 -5
  128. package/dist/v3/ConsoleList/RunJSInput.vue +10 -6
  129. package/dist/v3/ConsoleList/index.vue +51 -35
  130. package/dist/v3/CustomSwiper/CustomSwiperItem.vue +49 -0
  131. package/dist/v3/CustomSwiper/index.vue +104 -0
  132. package/dist/v3/DevTool/fps-collector.render.ts +148 -0
  133. package/dist/v3/DevTool/index.vue +209 -102
  134. package/dist/v3/DevToolButton/index.vue +40 -59
  135. package/dist/v3/DevToolTitle/index.vue +4 -1
  136. package/dist/v3/DevToolWindow/DevToolOverlay.vue +182 -0
  137. package/dist/v3/DevToolWindow/const.ts +47 -69
  138. package/dist/v3/DevToolWindow/hooks/dataUtils.ts +48 -0
  139. package/dist/v3/DevToolWindow/hooks/useDevToolData.ts +338 -0
  140. package/dist/v3/DevToolWindow/hooks/useDevToolHandlers.ts +549 -0
  141. package/dist/v3/DevToolWindow/hooks/useDevToolOverlay.ts +184 -0
  142. package/dist/v3/DevToolWindow/index.css +89 -0
  143. package/dist/v3/DevToolWindow/index.vue +800 -1450
  144. package/dist/v3/DraggableContainer/index.vue +456 -0
  145. package/dist/v3/ElEvent/ElEventItem.vue +4 -3
  146. package/dist/v3/ElEvent/index.vue +26 -9
  147. package/dist/v3/Empty/index.vue +1 -0
  148. package/dist/v3/FilterInput/index.vue +8 -22
  149. package/dist/v3/FilterSelect/index.vue +37 -24
  150. package/dist/v3/Instance/components/InstanceTreeNode.vue +265 -0
  151. package/dist/v3/Instance/flatten.ts +226 -0
  152. package/dist/v3/Instance/index.vue +94 -0
  153. package/dist/v3/Instance/registry.ts +49 -0
  154. package/dist/v3/Instance/transformTree.ts +375 -0
  155. package/dist/v3/Instance/transformTreeCtx.ts +268 -0
  156. package/dist/v3/{InstanceTree → Instance}/typing.d.ts +15 -2
  157. package/dist/v3/InstanceDetail/index.vue +433 -44
  158. package/dist/v3/JsonDetail/index.vue +12 -8
  159. package/dist/v3/JsonPretty/components/Brackets/index.vue +1 -0
  160. package/dist/v3/JsonPretty/components/Carets/index.vue +2 -1
  161. package/dist/v3/JsonPretty/components/CheckController/index.vue +26 -15
  162. package/dist/v3/JsonPretty/components/TreeNode/index.vue +42 -20
  163. package/dist/v3/JsonPretty/index.vue +60 -37
  164. package/dist/v3/JsonPretty/utils/index.ts +41 -44
  165. package/dist/v3/MovableContainer/index.vue +89 -0
  166. package/dist/v3/NFCList/NFCItem.vue +14 -14
  167. package/dist/v3/NFCList/NFCTool.vue +99 -81
  168. package/dist/v3/NFCList/index.vue +14 -10
  169. package/dist/v3/NetworkList/InterceptConfig.vue +154 -364
  170. package/dist/v3/NetworkList/InterceptItem.vue +14 -6
  171. package/dist/v3/NetworkList/NetworkDetail.vue +34 -29
  172. package/dist/v3/NetworkList/NetworkIntercept.vue +11 -8
  173. package/dist/v3/NetworkList/NetworkItem.vue +27 -11
  174. package/dist/v3/NetworkList/NetworkSend.vue +132 -290
  175. package/dist/v3/NetworkList/hooks/useNetworkForm.ts +86 -0
  176. package/dist/v3/NetworkList/index.vue +32 -24
  177. package/dist/v3/NetworkList/utils.ts +101 -0
  178. package/dist/v3/Performance/index.vue +495 -0
  179. package/dist/v3/Performance/modules/PerformanceMetrics.vue +153 -0
  180. package/dist/v3/Performance/modules/PerformanceWidget.vue +249 -0
  181. package/dist/v3/Performance/modules/usePerformanceChart.ts +460 -0
  182. package/dist/v3/Performance/modules/usePerformanceData.ts +258 -0
  183. package/dist/v3/Pick/index.vue +322 -0
  184. package/dist/v3/PiniaList/index.vue +38 -17
  185. package/dist/v3/RouteList/index.vue +32 -15
  186. package/dist/v3/RunJS/index.vue +30 -10
  187. package/dist/v3/ScanCodeList/ScanCodeItem.vue +2 -9
  188. package/dist/v3/ScanCodeList/index.vue +12 -9
  189. package/dist/v3/SettingButton/index.vue +45 -0
  190. package/dist/v3/SettingList/index.css +120 -0
  191. package/dist/v3/SettingList/index.vue +96 -537
  192. package/dist/v3/SettingList/modules/SettingDevTool.vue +208 -0
  193. package/dist/v3/SettingList/modules/SettingInfo.vue +119 -0
  194. package/dist/v3/SettingList/modules/SettingLanguage.vue +74 -0
  195. package/dist/v3/SettingList/modules/SettingLog.vue +230 -0
  196. package/dist/v3/SettingList/modules/SettingNetwork.vue +120 -0
  197. package/dist/v3/SettingList/modules/SettingTheme.vue +312 -0
  198. package/dist/v3/SourceCode/Line.vue +15 -2
  199. package/dist/v3/SourceCode/index.vue +25 -24
  200. package/dist/v3/SourceCode/parseCode.ts +114 -56
  201. package/dist/v3/StorageList/index.vue +33 -33
  202. package/dist/v3/Tabs/index.vue +31 -28
  203. package/dist/v3/Tag/index.vue +39 -20
  204. package/dist/v3/TransferList/TransferDetail.vue +268 -0
  205. package/dist/v3/TransferList/TransferItem.vue +125 -0
  206. package/dist/v3/TransferList/index.vue +181 -0
  207. package/dist/v3/UniEvent/UniEventItem.vue +1 -0
  208. package/dist/v3/UniEvent/index.vue +28 -29
  209. package/dist/v3/{VirtualListPro → VirtualList}/AutoSize.vue +1 -1
  210. package/dist/v3/VirtualList/index.vue +382 -82
  211. package/dist/v3/VuexList/index.vue +38 -17
  212. package/dist/v3/WebSocket/WebSocketDetail.vue +142 -80
  213. package/dist/v3/WebSocket/WebSocketItem.vue +10 -4
  214. package/dist/v3/WebSocket/index.vue +44 -30
  215. package/dist/v3/hooks/useNFC/index.ts +6 -6
  216. package/dist/v3/hooks/useNFC/typing.d.ts +2 -2
  217. package/dist/v3/hooks/useNFC/useNFCAndroid.ts +215 -626
  218. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.ts +54 -85
  219. package/dist/v3/hooks/useNFC/utils.ts +3 -3
  220. package/dist/v3/hooks/useRequest/index.ts +2 -2
  221. package/dist/v3/hooks/useScanCode/index.ts +10 -8
  222. package/dist/v3/styles/theme.css +290 -0
  223. package/dist/v3/styles/theme.ts +12 -0
  224. package/package.json +25 -5
  225. package/dist/devConsole/index.d.ts.map +0 -1
  226. package/dist/devConsole/index.js +0 -273
  227. package/dist/devEvent/index.d.ts +0 -328
  228. package/dist/devEvent/index.d.ts.map +0 -1
  229. package/dist/devEvent/index.js +0 -697
  230. package/dist/devEventBus/index.d.ts +0 -42
  231. package/dist/devEventBus/index.d.ts.map +0 -1
  232. package/dist/devEventBus/index.js +0 -70
  233. package/dist/devIntercept/index.d.ts +0 -281
  234. package/dist/devIntercept/index.d.ts.map +0 -1
  235. package/dist/devIntercept/index.js +0 -949
  236. package/dist/devRunJS/index.d.ts +0 -67
  237. package/dist/devRunJS/index.d.ts.map +0 -1
  238. package/dist/devStore/index.d.ts +0 -199
  239. package/dist/devStore/index.d.ts.map +0 -1
  240. package/dist/devStore/index.js +0 -562
  241. package/dist/devToolInfo/index.d.ts +0 -17
  242. package/dist/devToolInfo/index.d.ts.map +0 -1
  243. package/dist/devToolInfo/index.js +0 -15
  244. package/dist/v3/AutoSizer/utils.d.ts +0 -5
  245. package/dist/v3/AutoSizer/utils.d.ts.map +0 -1
  246. package/dist/v3/ConsoleList/staticTips.d.ts +0 -13
  247. package/dist/v3/ConsoleList/staticTips.d.ts.map +0 -1
  248. package/dist/v3/DevToolWindow/const.d.ts +0 -46
  249. package/dist/v3/DevToolWindow/const.d.ts.map +0 -1
  250. package/dist/v3/InstanceTree/components/InstanceTreeNode.vue +0 -81
  251. package/dist/v3/InstanceTree/flatten.d.ts +0 -10
  252. package/dist/v3/InstanceTree/flatten.d.ts.map +0 -1
  253. package/dist/v3/InstanceTree/flatten.ts +0 -75
  254. package/dist/v3/InstanceTree/index.vue +0 -51
  255. package/dist/v3/InstanceTree/transformTree.d.ts +0 -17
  256. package/dist/v3/InstanceTree/transformTree.d.ts.map +0 -1
  257. package/dist/v3/InstanceTree/transformTree.ts +0 -237
  258. package/dist/v3/JsonPretty/hooks/useClipboard.d.ts +0 -4
  259. package/dist/v3/JsonPretty/hooks/useClipboard.d.ts.map +0 -1
  260. package/dist/v3/JsonPretty/hooks/useError.d.ts +0 -8
  261. package/dist/v3/JsonPretty/hooks/useError.d.ts.map +0 -1
  262. package/dist/v3/JsonPretty/type.d.ts +0 -94
  263. package/dist/v3/JsonPretty/type.d.ts.map +0 -1
  264. package/dist/v3/JsonPretty/utils/index.d.ts +0 -10
  265. package/dist/v3/JsonPretty/utils/index.d.ts.map +0 -1
  266. package/dist/v3/NFCList/const.d.ts +0 -13
  267. package/dist/v3/NFCList/const.d.ts.map +0 -1
  268. package/dist/v3/NetworkList/const.d.ts +0 -5
  269. package/dist/v3/NetworkList/const.d.ts.map +0 -1
  270. package/dist/v3/SourceCode/parseCode.d.ts +0 -27
  271. package/dist/v3/SourceCode/parseCode.d.ts.map +0 -1
  272. package/dist/v3/UploadList/UploadDetail.vue +0 -255
  273. package/dist/v3/UploadList/UploadItem.vue +0 -122
  274. package/dist/v3/UploadList/index.vue +0 -125
  275. package/dist/v3/VirtualListPro/index.vue +0 -229
  276. package/dist/v3/hooks/useContainerStyle.d.ts +0 -15
  277. package/dist/v3/hooks/useContainerStyle.d.ts.map +0 -1
  278. package/dist/v3/hooks/useNFC/index.d.ts +0 -5
  279. package/dist/v3/hooks/useNFC/index.d.ts.map +0 -1
  280. package/dist/v3/hooks/useNFC/useNFCAndroid.d.ts +0 -2
  281. package/dist/v3/hooks/useNFC/useNFCAndroid.d.ts.map +0 -1
  282. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.d.ts +0 -2
  283. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.d.ts.map +0 -1
  284. package/dist/v3/hooks/useNFC/utils.d.ts +0 -95
  285. package/dist/v3/hooks/useNFC/utils.d.ts.map +0 -1
  286. package/dist/v3/hooks/useRequest/index.d.ts +0 -126
  287. package/dist/v3/hooks/useRequest/index.d.ts.map +0 -1
  288. package/dist/v3/hooks/useRequest/utils.d.ts +0 -35
  289. package/dist/v3/hooks/useRequest/utils.d.ts.map +0 -1
  290. package/dist/v3/hooks/useScanCode/index.d.ts +0 -36
  291. package/dist/v3/hooks/useScanCode/index.d.ts.map +0 -1
  292. /package/dist/v3/{VirtualListPro → VirtualList}/readme.md +0 -0
@@ -0,0 +1,94 @@
1
+ <template>
2
+ <VirtualList
3
+ :data="flatData"
4
+ :pageSize="pageSize"
5
+ :height="height"
6
+ :itemHeight="itemHeight"
7
+ scroll-with-animation
8
+ showBackTop
9
+ :dataChangeScrollToTop="false"
10
+ scrollX>
11
+ <template v-slot="{ list, start }">
12
+ <InstanceTreeNode
13
+ v-for="(item, index) in list"
14
+ :key="start + index"
15
+ :style="{ height: '20px' }"
16
+ :showLine="showLine"
17
+ :node="item"
18
+ :isActive="selectedUid === item.uid"
19
+ @toggle="onToggle"
20
+ @select="handleSelect" />
21
+ </template>
22
+ </VirtualList>
23
+ </template>
24
+ <script lang="ts" setup>
25
+ import VirtualList from '../VirtualList/index.vue';
26
+ import InstanceTreeNode from './components/InstanceTreeNode.vue';
27
+ import { computed, ref, markRaw, shallowRef, watch } from 'vue';
28
+ import { simpleTreeCtx, resetUidCount } from './transformTreeCtx';
29
+ import { flattenTreeWithEndMarkers } from './flatten';
30
+
31
+ const props = withDefaults(
32
+ defineProps<{
33
+ data: any;
34
+ pageSize?: number;
35
+ height?: number | string;
36
+ showLine?: boolean;
37
+ itemHeight?: number;
38
+ }>(),
39
+ {
40
+ pageSize: 30,
41
+ height: 400,
42
+ showLine: false,
43
+ itemHeight: 20,
44
+ },
45
+ );
46
+
47
+ const emit = defineEmits<{
48
+ (e: 'select', node: any): void;
49
+ }>();
50
+
51
+ const expandedIds = ref<Set<string | number>>(new Set());
52
+ const selectedUid = ref<string | number | undefined>(undefined);
53
+
54
+ const handleSelect = (node: any) => {
55
+ selectedUid.value = node.uid;
56
+ emit('select', node);
57
+ };
58
+
59
+ const onToggle = (uid: string | number) => {
60
+ if (expandedIds.value.has(uid)) {
61
+ expandedIds.value.delete(uid);
62
+ } else {
63
+ expandedIds.value.add(uid);
64
+ }
65
+ expandedIds.value = new Set(expandedIds.value); // 触发响应式更新
66
+ };
67
+
68
+ const treeData = shallowRef<InstanceTree.TreeNode | null>(null);
69
+
70
+ watch(
71
+ () => props.data,
72
+ (val) => {
73
+ resetUidCount();
74
+ const tree = simpleTreeCtx(val) as any;
75
+
76
+ // 默认展开第一层
77
+ if (tree && tree.uid && expandedIds.value.size === 0) {
78
+ expandedIds.value.add(tree.uid);
79
+ expandedIds.value = new Set(expandedIds.value);
80
+ }
81
+
82
+ treeData.value = tree ? markRaw(tree) : null;
83
+ },
84
+ { immediate: true },
85
+ );
86
+
87
+ const flatData = computed(() => {
88
+ if (!treeData.value) return [];
89
+ const result: InstanceTree.FlattenedNodeWithEnd[] = [];
90
+ flattenTreeWithEndMarkers(treeData.value, expandedIds.value, result);
91
+ return markRaw(result);
92
+ });
93
+ </script>
94
+ <style scoped></style>
@@ -0,0 +1,49 @@
1
+ import type { ComponentInternalInstance } from 'vue';
2
+
3
+ // 存储所有已注册的实例
4
+ const instanceMap = new Map<number, ComponentInternalInstance>();
5
+ // 存储父子关系 pUid -> [cUids]
6
+ const childrenMap = new Map<number, Set<number>>();
7
+
8
+ /**
9
+ * 记录组件实例及其父子关系
10
+ */
11
+ export function recordInstance(instance: ComponentInternalInstance) {
12
+ if (!instance) return;
13
+
14
+ const uid = instance.uid;
15
+ instanceMap.set(uid, instance);
16
+
17
+ if (instance.parent) {
18
+ const pUid = instance.parent.uid;
19
+ if (!childrenMap.has(pUid)) {
20
+ childrenMap.set(pUid, new Set());
21
+ }
22
+ childrenMap.get(pUid)!.add(uid);
23
+ }
24
+ }
25
+
26
+ /**
27
+ * 获取某个实例记录的子组件实例
28
+ */
29
+ export function getRecordedChildren(uid: number): ComponentInternalInstance[] {
30
+ const cUids = childrenMap.get(uid);
31
+ if (!cUids) return [];
32
+
33
+ const result: ComponentInternalInstance[] = [];
34
+ Array.from(cUids).forEach((id) => {
35
+ const inst = instanceMap.get(id);
36
+ if (inst) {
37
+ result.push(inst);
38
+ }
39
+ });
40
+ return result;
41
+ }
42
+
43
+ /**
44
+ * 清除记录(热更新或切换页面时可能需要)
45
+ */
46
+ export function clearRegistry() {
47
+ instanceMap.clear();
48
+ childrenMap.clear();
49
+ }
@@ -0,0 +1,375 @@
1
+ import { isArray, isObject, isString } from '../../utils';
2
+ import {
3
+ type ComponentInternalInstance,
4
+ type VNode,
5
+ isRef,
6
+ isReactive,
7
+ } from 'vue';
8
+ import { getRecordedChildren } from './registry';
9
+
10
+ // 类型守卫函数,检查是否为VNode类型
11
+ function isVNode(child: any): child is VNode {
12
+ return child != null && typeof child === 'object' && 'type' in child;
13
+ }
14
+
15
+ // 类型守卫函数,检查是否为包含component属性的对象
16
+ function hasComponentProperty(
17
+ child: any,
18
+ ): child is VNode & { component?: ComponentInternalInstance } {
19
+ return isVNode(child) && 'component' in child;
20
+ }
21
+
22
+ // 类型守卫函数,检查是否为Symbol类型且具有description属性
23
+ function isSymbolWithDescription(
24
+ value: any,
25
+ ): value is symbol & { description?: string } {
26
+ return typeof value === 'symbol';
27
+ }
28
+
29
+ interface SimpleTreeNode {
30
+ type: string;
31
+ uid: string | number;
32
+ children?: SimpleTreeNode[];
33
+ content?: string;
34
+ hasChildren?: boolean;
35
+ // 分类存储属性
36
+ props?: Record<string, any>;
37
+ styles?: Record<string, any>;
38
+ other?: Record<string, any>;
39
+ provides?: Record<string, any>;
40
+ data?: Record<string, any>;
41
+ functions?: Record<string, any>;
42
+ emits?: Record<string, any>;
43
+ }
44
+
45
+ /**
46
+ * 分类提取属性
47
+ */
48
+ function extractCategorizedData(vnode: any): {
49
+ props: Record<string, any>;
50
+ styles: Record<string, any>;
51
+ other: Record<string, any>;
52
+ provides: Record<string, any>;
53
+ data: Record<string, any>;
54
+ functions: Record<string, any>;
55
+ emits: Record<string, any>;
56
+ } {
57
+ const styles: any = {};
58
+ const props: any = {};
59
+ const other: any = {};
60
+ const provides: any = {};
61
+ const data: any = {};
62
+ const emits: any = {};
63
+
64
+ const vnodeProps = vnode.props || {};
65
+
66
+ // 1. 提取样式相关 (id, style)
67
+ const styleKeys = ['id', 'style'];
68
+
69
+ // 处理样式属性
70
+ styleKeys.forEach((key) => {
71
+ let val = vnodeProps[key];
72
+ if (val !== undefined && val !== null && val !== '') {
73
+ if (key === 'style' && isObject(val)) {
74
+ val = Object.entries(val)
75
+ .filter(([_, v]) => v !== undefined && v !== null && v !== '')
76
+ .map(([k, v]) => `${k}: ${v}`)
77
+ .join('; ');
78
+ }
79
+ if (val !== '') {
80
+ styles[key] = val;
81
+ }
82
+ }
83
+ });
84
+
85
+ // 处理 Props 属性 (包括 class, data- 以及其他)
86
+ Object.keys(vnodeProps).forEach((key) => {
87
+ // 排除已处理的样式属性
88
+ if (!styleKeys.includes(key)) {
89
+ // 统一处理 className -> class
90
+ const finalKey = key === 'className' ? 'class' : key;
91
+ props[finalKey] = vnodeProps[key];
92
+ }
93
+ });
94
+
95
+ // 3. 提取其他元数据
96
+ other.uid = vnode.uid;
97
+ if (vnode.type) {
98
+ other.type = isString(vnode.type)
99
+ ? vnode.type
100
+ : isObject(vnode.type)
101
+ ? (vnode.type as any).name || (vnode.type as any).__name || 'Component'
102
+ : String(vnode.type);
103
+
104
+ if (isObject(vnode.type) && (vnode.type as any).__file) {
105
+ other.file = (vnode.type as any).__file;
106
+ }
107
+ }
108
+
109
+ // 如果有 slots
110
+ if (vnode.children && !isArray(vnode.children) && isObject(vnode.children)) {
111
+ other.slots = Object.keys(vnode.children);
112
+ }
113
+
114
+ // 4. 提取 provides
115
+ const currentProvides = vnode.provides;
116
+
117
+ if (currentProvides) {
118
+ Reflect.ownKeys(currentProvides).forEach((key) => {
119
+ // 排除 Vue 内部属性
120
+ if (typeof key === 'string' && key.startsWith('__v')) return;
121
+
122
+ const value = currentProvides[key];
123
+ const keyStr = typeof key === 'symbol' ? String(key) : key;
124
+ provides[keyStr] = value;
125
+ });
126
+ }
127
+
128
+ // 5. 提取 data (仅当 vnode.component 存在时)
129
+ const functions: any = {};
130
+ if (vnode.setupState || vnode.data) {
131
+ // 优先取 setupState (Script Setup / Composition API), 其次取 data (Options API)
132
+ // 注意:setupState 包含了响应式引用的解包值
133
+ const allData: any = {};
134
+
135
+ // 处理 setupState
136
+ if (isObject(vnode.setupState)) {
137
+ Object.assign(allData, vnode.setupState);
138
+ }
139
+
140
+ // 处理 Options API data
141
+ if (isObject(vnode.data)) {
142
+ Object.assign(allData, vnode.data);
143
+ }
144
+
145
+ if (isObject(allData)) {
146
+ Reflect.ownKeys(allData).forEach((key) => {
147
+ // 排除 Vue 内部属性
148
+ if (
149
+ typeof key === 'string' &&
150
+ (key.startsWith('__v') || key.startsWith('$') || key.startsWith('_'))
151
+ )
152
+ return;
153
+
154
+ const value = (allData as any)[key];
155
+ let keyStr = typeof key === 'symbol' ? String(key) : key;
156
+
157
+ // 标记 Ref 和 Reactive
158
+ // 优先检查 devtoolsRawSetupState 获取原始 Ref
159
+ const rawSetupState = (vnode as any).devtoolsRawSetupState || {};
160
+ const rawValue = rawSetupState[key];
161
+
162
+ if (rawValue && isRef(rawValue)) {
163
+ keyStr += ' (Ref)';
164
+ } else if (isReactive(value)) {
165
+ keyStr += ' (Reactive)';
166
+ }
167
+
168
+ if (typeof value === 'function') {
169
+ functions[keyStr] = value;
170
+ } else {
171
+ // 尝试区分类型(Ref, Reactive, Computed 等在 setupState 中通常已被解包,难以直接判断原始类型,
172
+ // 除非使用 devtools 专用钩子。这里暂只做基础值存储)
173
+ data[keyStr] = value;
174
+ }
175
+ });
176
+ }
177
+ }
178
+
179
+ // 6. 提取 emits
180
+ // 优先从组件实例获取归一化的 emitsOptions, 其次从类型定义获取
181
+ const emitsOptions = vnode?.emitsOptions || vnode.type?.emits;
182
+ if (emitsOptions) {
183
+ if (isArray(emitsOptions)) {
184
+ emitsOptions.forEach((emit: string) => {
185
+ emits[emit] = 'function(...args) {...}'; // 简单标记存在
186
+ });
187
+ } else if (isObject(emitsOptions)) {
188
+ Reflect.ownKeys(emitsOptions).forEach((key) => {
189
+ if (typeof key === 'string') {
190
+ emits[key] = 'function(...args) {...}';
191
+ }
192
+ });
193
+ }
194
+ }
195
+
196
+ return { props, styles, other, provides, data, functions, emits };
197
+ }
198
+
199
+ let uidCount = 0;
200
+ // 导出重置函数,供外部调用
201
+ export function resetUidCount() {
202
+ uidCount = 0;
203
+ }
204
+
205
+ function getNextUid() {
206
+ return `manual-${++uidCount}`;
207
+ }
208
+
209
+ function extractNameFromFile(file: string): string | undefined {
210
+ if (!file) return undefined;
211
+ const match = file.match(/([^/|\\]+)\.[^.]+$/);
212
+ return match ? match[1] : undefined;
213
+ }
214
+
215
+ function getComponentName(type: any): string {
216
+ if (!type) return 'Anonymous';
217
+ if (typeof type === 'string') return type;
218
+ if (typeof type === 'object') {
219
+ return (
220
+ type.name ||
221
+ type.__name ||
222
+ (type.__file ? extractNameFromFile(type.__file) : undefined) ||
223
+ 'Anonymous'
224
+ );
225
+ }
226
+ if (typeof type === 'function') {
227
+ return type.name || type.__name || 'Anonymous';
228
+ }
229
+ return 'Anonymous';
230
+ }
231
+
232
+ // ... existing code ...
233
+
234
+ // ... types ...
235
+
236
+ export function simpleTree(vNode?: any, depth = 0): SimpleTreeNode | null {
237
+ // ... check valid ...
238
+ if (vNode === null || typeof vNode !== 'object' || depth > 40) {
239
+ return null;
240
+ }
241
+ // ... rest of simpleTree func ...
242
+
243
+ // 确保只使用必需的属性
244
+ const simplifiedInstance: InstanceTree.SimplifiedComponentInternalInstance = {
245
+ type: vNode.type,
246
+ subTree: vNode.subTree,
247
+ uid: vNode.uid,
248
+ ...(vNode.component && { component: vNode.component }),
249
+ ...(vNode.children && { children: vNode.children }),
250
+ };
251
+
252
+ const children: SimpleTreeNode[] = [];
253
+
254
+ // 获取子节点
255
+ if (simplifiedInstance.subTree) {
256
+ if ('data-dev-tool' in (simplifiedInstance.subTree.props ?? {})) {
257
+ return null;
258
+ } else {
259
+ children.push(
260
+ ...getSimpleChildrenFromVNode(simplifiedInstance.subTree, depth),
261
+ );
262
+ }
263
+ }
264
+
265
+ // 插槽 fallback
266
+ if (children.length === 0 && simplifiedInstance.children) {
267
+ if (isArray(simplifiedInstance.children)) {
268
+ const slotChildren = getSimpleChildrenFromVNode(
269
+ {
270
+ children: simplifiedInstance.children,
271
+ },
272
+ depth,
273
+ );
274
+ children.push(...slotChildren);
275
+ }
276
+ }
277
+
278
+ // GLOBAL fallback
279
+ if (children.length === 0 && vNode.uid !== undefined) {
280
+ const recordedChildren = getRecordedChildren(vNode.uid);
281
+ recordedChildren.forEach((childInst) => {
282
+ const childTree = simpleTree(childInst, depth + 1);
283
+ if (childTree) {
284
+ children.push(childTree);
285
+ }
286
+ });
287
+ }
288
+
289
+ const hasChildrenFlag = children.length > 0;
290
+ const uid = vNode.uid !== undefined ? vNode.uid : getNextUid();
291
+ const typeName = getComponentName(simplifiedInstance.type);
292
+
293
+ const nodeInfo: SimpleTreeNode = {
294
+ type: typeName,
295
+ uid,
296
+ children,
297
+ hasChildren: hasChildrenFlag,
298
+ ...extractCategorizedData(vNode),
299
+ };
300
+
301
+ return nodeInfo;
302
+ }
303
+
304
+ /**
305
+ * 从 VNode 获取简化的子节点 (仅保留组件节点)
306
+ */
307
+ function getSimpleChildrenFromVNode(
308
+ vnode: any,
309
+ depth: number = 0,
310
+ ): SimpleTreeNode[] {
311
+ const children: SimpleTreeNode[] = [];
312
+ if (vnode.children) {
313
+ // 统一转为数组处理,兼容单节点和多节点
314
+ const rawChildren = isArray(vnode.children)
315
+ ? vnode.children
316
+ : isObject(vnode.children)
317
+ ? [vnode.children]
318
+ : isString(vnode.children)
319
+ ? [vnode.children]
320
+ : [];
321
+
322
+ for (const child of rawChildren) {
323
+ if (
324
+ child &&
325
+ typeof child === 'object' &&
326
+ 'props' in child &&
327
+ child.props &&
328
+ 'data-dev-tool' in child.props
329
+ ) {
330
+ continue;
331
+ }
332
+
333
+ // 1. 如果是组件实例,直接处理
334
+ if (hasComponentProperty(child) && child?.component) {
335
+ const childTree = simpleTree(child.component, depth + 1);
336
+ if (childTree) {
337
+ children.push(childTree);
338
+ }
339
+ }
340
+ // 2. 如果是函数式组件
341
+ else if (isVNode(child) && typeof child.type === 'function') {
342
+ const uid =
343
+ (child as any).uid !== undefined ? (child as any).uid : getNextUid();
344
+ const typeName = getComponentName(child.type);
345
+ children.push({
346
+ type: typeName,
347
+ uid,
348
+ children: [],
349
+ hasChildren: false,
350
+ ...extractCategorizedData(child),
351
+ });
352
+ }
353
+ // 3. 如果是 VNode 且是 Fragmentation/Block (带 children 的非组件节点),需要深入查找内部的组件
354
+ else if (isVNode(child)) {
355
+ // 如果是 Fragment,递归查找子节点
356
+ if (child.type && isSymbolWithDescription(child.type)) {
357
+ const desc = child.type.description;
358
+ const isFragment = desc === 'v-fgt' || desc === 'Fragment';
359
+ if (isFragment) {
360
+ const fragmentChildren = getSimpleChildrenFromVNode(child, depth);
361
+ children.push(...fragmentChildren);
362
+ }
363
+ }
364
+ // 如果是普通 HTML 元素或其他容器,也需要递归查找其 children 中的组件
365
+ // 例如 <view><MyComponent /></view>,我们需要找到 MyComponent
366
+ else if (isString(child.type) || isObject(child.type)) {
367
+ // 递归查找子节点中的组件,但不把当前节点加入树中(因为我们只关心组件)
368
+ const subChildren = getSimpleChildrenFromVNode(child, depth);
369
+ children.push(...subChildren);
370
+ }
371
+ }
372
+ }
373
+ }
374
+ return children;
375
+ }