From 7a22ca24bbac57913cd1e65a8fb245c4a01d7272 Mon Sep 17 00:00:00 2001 From: alexzhang1030 <1642114555@qq.com> Date: Wed, 2 Aug 2023 16:51:10 +0800 Subject: [PATCH 01/11] feat: add state analyze init --- packages/core/build.config.ts | 1 + packages/core/package.json | 1 + .../src/compiler/__test__/analyze.test.ts | 9 +++--- .../core/src/compiler/__test__/common.test.ts | 15 ---------- packages/core/src/compiler/common/analyze.ts | 14 ++++++---- packages/core/src/compiler/common/parse.ts | 11 ++++---- packages/core/src/compiler/index.ts | 28 +++++++++++++++---- packages/core/src/compiler/state-analyze.ts | 16 +++++++++++ packages/node/src/vite.ts | 24 +++++++++++----- pnpm-lock.yaml | 23 +++++++++++++-- tsconfig.json | 2 +- 11 files changed, 97 insertions(+), 47 deletions(-) create mode 100644 packages/core/src/compiler/state-analyze.ts diff --git a/packages/core/build.config.ts b/packages/core/build.config.ts index 268b6001..40d41421 100644 --- a/packages/core/build.config.ts +++ b/packages/core/build.config.ts @@ -11,6 +11,7 @@ export default defineBuildConfig({ '@babel/parser', 'estree-walker', 'magic-string', + 'esm-analyzer', ], declaration: true, rollup: { diff --git a/packages/core/package.json b/packages/core/package.json index 903c04b0..844cf7af 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -38,6 +38,7 @@ "dependencies": { "@babel/parser": "^7.22.7", "birpc": "^0.2.12", + "esm-analyzer": "^0.2.6", "estree-walker": "^2.0.2", "magic-string": "^0.30.2", "vite-hot-client": "^0.2.1" diff --git a/packages/core/src/compiler/__test__/analyze.test.ts b/packages/core/src/compiler/__test__/analyze.test.ts index e2a0031e..f00bac96 100644 --- a/packages/core/src/compiler/__test__/analyze.test.ts +++ b/packages/core/src/compiler/__test__/analyze.test.ts @@ -3,17 +3,18 @@ import { analyzeCode } from '..' const baseConfig: AnalyzeOptions = { rerenderTrace: true, + stateAnalyze: true, } describe('analyzeCode - exclude', () => { test('not acceptable lang', () => { - expect(analyzeCode('', 'test.txt', baseConfig)).toBe('') + expect(analyzeCode('', 'test.txt', baseConfig)).toBeNull() }) test('excluded path', () => { - expect(analyzeCode('', 'node_modules/test.js', baseConfig)).toBe('') + expect(analyzeCode('', 'node_modules/test.js', baseConfig)).toBeNull() }) test('not enabled', () => { - expect(analyzeCode('', 'test.js', { rerenderTrace: false })).toBe('') + expect(analyzeCode('', 'test.js', { rerenderTrace: false, stateAnalyze: false })).toBeNull() }) test('should execute', () => { expect(analyzeCode(` @@ -39,7 +40,7 @@ describe('analyzeCode - rerender - sfc', () => {
` - const result = analyzeCode(code, 'test.vue', baseConfig) + const result = analyzeCode(code, 'test.vue', baseConfig) as { code: string } | undefined expect(result?.code).toMatchSnapshot() }) test('script setup with script', () => { diff --git a/packages/core/src/compiler/__test__/common.test.ts b/packages/core/src/compiler/__test__/common.test.ts index 5e7d7480..c787f952 100644 --- a/packages/core/src/compiler/__test__/common.test.ts +++ b/packages/core/src/compiler/__test__/common.test.ts @@ -25,19 +25,4 @@ describe('compiler:common:parseSFC', () => { parseSFC(code, 'test.vue') }).not.toThrow() }) - test('should throw if - - - ` - expect(() => { - parseSFC(code, 'test.vue') - }).toThrow() - }) }) diff --git a/packages/core/src/compiler/common/analyze.ts b/packages/core/src/compiler/common/analyze.ts index 998849c5..0b148f45 100644 --- a/packages/core/src/compiler/common/analyze.ts +++ b/packages/core/src/compiler/common/analyze.ts @@ -8,9 +8,6 @@ function isSetupFn(node: Node): node is ObjectMethod | ObjectProperty { return isObjectFn(node) && (node.key as Identifier).name === SETUP_FN } -/** - * @returns insert code location - */ export function analyzeVueSFC(code: string, filename: string) { const { scriptSetup, @@ -18,6 +15,7 @@ export function analyzeVueSFC(code: string, filename: string) { script, scriptLocation, getScriptAST, + lang, } = parseSFC(code, filename) if (!scriptSetup && !script) @@ -27,10 +25,11 @@ export function analyzeVueSFC(code: string, filename: string) { // script only: start: after
diff --git a/packages/client/types.ts b/packages/client/types.ts index b12f0914..d14e0a22 100644 --- a/packages/client/types.ts +++ b/packages/client/types.ts @@ -1,4 +1,5 @@ import type { Router } from 'vue-router' +import type { getAnalyzeResultByPath, prepareStateAnalyze } from '@vite-plugin-vue-devtools/core/compiler' type WithOptional = Omit & Partial> @@ -32,6 +33,10 @@ export interface VueDevtoolsHostClient { rerenderHighlight: { updateInfo: (uid: string, name: string, _bounds: ComponentInspectorBounds) => void } + stateAnalyze?: { + prepareState: typeof prepareStateAnalyze + getAnalyzeResultByPath: typeof getAnalyzeResultByPath + } } export type BuiltinTabGroup = 'app' | 'modules' | 'advanced' diff --git a/packages/core/package.json b/packages/core/package.json index 844cf7af..6c97ce78 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -38,7 +38,7 @@ "dependencies": { "@babel/parser": "^7.22.7", "birpc": "^0.2.12", - "esm-analyzer": "^0.2.6", + "esm-analyzer": "^0.3.2", "estree-walker": "^2.0.2", "magic-string": "^0.30.2", "vite-hot-client": "^0.2.1" diff --git a/packages/node/client.d.ts b/packages/node/client.d.ts index 1a00b9d1..f6025cb7 100644 --- a/packages/node/client.d.ts +++ b/packages/node/client.d.ts @@ -1,3 +1,5 @@ +import { getAnalyzeResultByPath } from "@vite-plugin-vue-devtools/core/compiler" + declare type AssetType = 'image' | 'font' | 'video' | 'audio' | 'text' | 'json' | 'other' declare interface AssetInfo { @@ -45,6 +47,8 @@ declare interface RPCFunctions { installPackage(packages: string[], options?: ExecNpmScriptOptions): Promise uninstallPackage(packages: string[], options?: ExecNpmScriptOptions): Promise root(): string + stateAnalyzePrepare: (callback: () => void) => Promise + stateAnalyzeGetResultByPath(path: string): Promise> } diff --git a/packages/node/src/vite.ts b/packages/node/src/vite.ts index 2f911a3f..f3819382 100644 --- a/packages/node/src/vite.ts +++ b/packages/node/src/vite.ts @@ -7,7 +7,8 @@ import Inspect from 'vite-plugin-inspect' import VueInspector from 'vite-plugin-vue-inspector' import { PLUGIN_NAME, createRPCServer } from '@vite-plugin-vue-devtools/core' import type { AnalyzeOptions, DeepRequired } from '@vite-plugin-vue-devtools/core/compiler' -import { analyzeCode, analyzeOptionsDefault } from '@vite-plugin-vue-devtools/core/compiler' +import { analyzeCode, analyzeOptionsDefault, getAnalyzeResultByPath, prepareStateAnalyze } from '@vite-plugin-vue-devtools/core/compiler' +import type { ExecNpmScriptOptions, RPCFunctions } from '../client' import { DIR_CLIENT } from './dir' import { execNpmScript, @@ -121,6 +122,12 @@ export default function VitePluginVueDevTools(options?: VitePluginVueDevToolsOpt rpc.onTerminalExit({ data }) }, }), + stateAnalyzePrepare: async () => { + await prepareStateAnalyze() + }, + stateAnalyzeGetResultByPath: (path: string) => { + return getAnalyzeResultByPath(path) + }, }) } const plugin = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index acb0d918..b569f1f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -199,8 +199,8 @@ importers: specifier: ^0.2.12 version: 0.2.12 esm-analyzer: - specifier: ^0.2.6 - version: 0.2.6 + specifier: ^0.3.2 + version: 0.3.2 estree-walker: specifier: ^2.0.2 version: 2.0.2 @@ -3871,8 +3871,8 @@ packages: - supports-color dev: true - /esm-analyzer@0.2.6: - resolution: {integrity: sha512-rOc7+O4Z2WxjDK2MEuPtMtUyZCa+QeZt0m+apVInuqf26EHHhEZVH4BZiwlLactfLMk1PBccDb2soTmiCrm4jg==} + /esm-analyzer@0.3.2: + resolution: {integrity: sha512-FbuRZZTkdtYfnf1FDw/CM7dyONFp0OkczDYDCKwhOEFD+FNUpqigUE+NQkM2zLus0tfK4at1Pb88jiLuKR09BQ==} dependencies: '@babel/parser': 7.22.7 estree-walker: 2.0.2 From 04ab57a252f9bae8f7066326489a0354c55067e3 Mon Sep 17 00:00:00 2001 From: alexzhang1030 <1642114555@qq.com> Date: Thu, 3 Aug 2023 11:52:03 +0800 Subject: [PATCH 03/11] feat: ui init --- packages/client/components/SearchBox.vue | 4 +-- packages/client/logic/graph.ts | 9 ----- packages/client/logic/rpc.ts | 1 - packages/client/logic/state-graph.ts | 38 +++++++++++++++++++++ packages/client/package.json | 1 + packages/client/pages/graph.vue | 24 +++++++------ packages/core/package.json | 1 - packages/core/src/compiler/index.ts | 2 +- packages/core/src/compiler/state-analyze.ts | 23 +++++++------ packages/node/client.d.ts | 5 +-- packages/node/src/vite.ts | 10 ++---- packages/ui-kit/src/components/Loading.vue | 21 ++++++++++++ pnpm-lock.yaml | 10 +++--- 13 files changed, 98 insertions(+), 51 deletions(-) create mode 100644 packages/client/logic/state-graph.ts create mode 100644 packages/ui-kit/src/components/Loading.vue diff --git a/packages/client/components/SearchBox.vue b/packages/client/components/SearchBox.vue index a3941126..8083e74f 100644 --- a/packages/client/components/SearchBox.vue +++ b/packages/client/components/SearchBox.vue @@ -5,7 +5,7 @@ const { graphSettings } = useGraphSettings()