Files
code_visualize/self-report.json
T

5190 lines
183 KiB
JSON

{
"schemaVersion": "0.1.0",
"project": {
"name": "code-visualize",
"root": "E:/code-visualize",
"languages": [
"tsx",
"typescript"
],
"generatedAt": "2026-07-22T03:03:33.188Z",
"generator": "code-visualize-cli@0.1.0"
},
"stats": {
"fileCount": 21,
"containerCount": 2,
"functionCount": 94,
"edgeCount": 110,
"loc": 2212
},
"modules": [
{
"id": "module:src",
"kind": "module",
"name": "src",
"provenance": "ast",
"path": "src",
"childModuleIds": [],
"fileIds": [
"file:src/scanner.ts",
"file:src/types.ts",
"file:src/externals.ts",
"file:src/flows.ts",
"file:src/analyzer.ts",
"file:src/cli.ts"
],
"parentId": "module:."
},
{
"id": "module:.",
"kind": "module",
"name": "code-visualize",
"provenance": "ast",
"path": ".",
"childModuleIds": [
"module:src",
"module:web"
],
"fileIds": []
},
{
"id": "module:web/src/model",
"kind": "module",
"name": "model",
"provenance": "ast",
"path": "web/src/model",
"childModuleIds": [],
"fileIds": [
"file:web/src/model/report.ts",
"file:web/src/model/reportRepository.ts",
"file:web/src/model/graphModel.ts"
],
"parentId": "module:web/src"
},
{
"id": "module:web/src",
"kind": "module",
"name": "src",
"provenance": "ast",
"path": "web/src",
"childModuleIds": [
"module:web/src/model",
"module:web/src/services",
"module:web/src/viewmodel",
"module:web/src/view"
],
"fileIds": [
"file:web/src/main.tsx"
],
"parentId": "module:web"
},
{
"id": "module:web",
"kind": "module",
"name": "web",
"provenance": "ast",
"path": "web",
"childModuleIds": [
"module:web/src"
],
"fileIds": [
"file:web/vite.config.ts"
],
"parentId": "module:."
},
{
"id": "module:web/src/services",
"kind": "module",
"name": "services",
"provenance": "ast",
"path": "web/src/services",
"childModuleIds": [],
"fileIds": [
"file:web/src/services/dagreLayout.ts"
],
"parentId": "module:web/src"
},
{
"id": "module:web/src/viewmodel",
"kind": "module",
"name": "viewmodel",
"provenance": "ast",
"path": "web/src/viewmodel",
"childModuleIds": [],
"fileIds": [
"file:web/src/viewmodel/GraphViewModel.ts"
],
"parentId": "module:web/src"
},
{
"id": "module:web/src/view",
"kind": "module",
"name": "view",
"provenance": "ast",
"path": "web/src/view",
"childModuleIds": [
"module:web/src/view/components"
],
"fileIds": [
"file:web/src/view/vmContext.ts",
"file:web/src/view/App.tsx"
],
"parentId": "module:web/src"
},
{
"id": "module:web/src/view/components",
"kind": "module",
"name": "components",
"provenance": "ast",
"path": "web/src/view/components",
"childModuleIds": [],
"fileIds": [
"file:web/src/view/components/FlowNode.tsx",
"file:web/src/view/components/FlowGraph.tsx",
"file:web/src/view/components/FlowList.tsx",
"file:web/src/view/components/GroupList.tsx",
"file:web/src/view/components/NodeDetailPanel.tsx",
"file:web/src/view/components/SearchBar.tsx"
],
"parentId": "module:web/src/view"
}
],
"files": [
{
"id": "file:src/scanner.ts",
"kind": "file",
"name": "scanner.ts",
"location": {
"file": "src/scanner.ts",
"startLine": 1,
"endLine": 69
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/scanner.ts",
"loc": 69,
"containerIds": [],
"functionIds": [
"func:src/scanner.ts#toPosix@19",
"func:src/scanner.ts#collectSourceFiles@24",
"func:src/scanner.ts#walk@27",
"func:src/scanner.ts#languageOf@52"
]
},
{
"id": "file:src/types.ts",
"kind": "file",
"name": "types.ts",
"location": {
"file": "src/types.ts",
"startLine": 1,
"endLine": 205
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/types.ts",
"loc": 205,
"containerIds": [],
"functionIds": []
},
{
"id": "file:src/externals.ts",
"kind": "file",
"name": "externals.ts",
"location": {
"file": "src/externals.ts",
"startLine": 1,
"endLine": 61
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/externals.ts",
"loc": 61,
"containerIds": [],
"functionIds": [
"func:src/externals.ts#deriveExternalSystems@4"
]
},
{
"id": "file:src/flows.ts",
"kind": "file",
"name": "flows.ts",
"location": {
"file": "src/flows.ts",
"startLine": 1,
"endLine": 103
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/flows.ts",
"loc": 103,
"containerIds": [],
"functionIds": [
"func:src/flows.ts#generateCallFlows@16",
"func:src/flows.ts#stepIdOf@70",
"func:src/flows.ts#map() 回调@72@72"
]
},
{
"id": "file:src/analyzer.ts",
"kind": "file",
"name": "analyzer.ts",
"location": {
"file": "src/analyzer.ts",
"startLine": 1,
"endLine": 610
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/analyzer.ts",
"loc": 610,
"containerIds": [],
"functionIds": [
"func:src/analyzer.ts#analyzeProject@32",
"func:src/analyzer.ts#relOf@64",
"func:src/analyzer.ts#inProject@65",
"func:src/analyzer.ts#locOf@70",
"func:src/analyzer.ts#ensureModule@83",
"func:src/analyzer.ts#getParams@108",
"func:src/analyzer.ts#buildSignature@117",
"func:src/analyzer.ts#registerFunc@122",
"func:src/analyzer.ts#isFnInit@169",
"func:src/analyzer.ts#containsCall@173",
"func:src/analyzer.ts#scan@175",
"func:src/analyzer.ts#routeNameFromCall@188",
"func:src/analyzer.ts#inlineName@202",
"func:src/analyzer.ts#registerFile@223",
"func:src/analyzer.ts#visit@245",
"func:src/analyzer.ts#extractPathArg@333",
"func:src/analyzer.ts#extractMethodFromOptions@341",
"func:src/analyzer.ts#hostOf@352",
"func:src/analyzer.ts#detectDb@358",
"func:src/analyzer.ts#detectApiOut@382",
"func:src/analyzer.ts#detectApiIn@400",
"func:src/analyzer.ts#addInteraction@419",
"func:src/analyzer.ts#addEdge@433",
"func:src/analyzer.ts#resolveCallTargetFuncId@440",
"func:src/analyzer.ts#getModuleFunc@462",
"func:src/analyzer.ts#analyzeRelations@487",
"func:src/analyzer.ts#walk@492",
"func:src/analyzer.ts#resolveInternalImport@548"
]
},
{
"id": "file:src/cli.ts",
"kind": "file",
"name": "cli.ts",
"location": {
"file": "src/cli.ts",
"startLine": 1,
"endLine": 71
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/cli.ts",
"loc": 71,
"containerIds": [],
"functionIds": [
"func:src/cli.ts#parseArgs@13",
"func:src/cli.ts#main@40",
"func:src/cli.ts#<module>@0"
]
},
{
"id": "file:web/src/model/report.ts",
"kind": "file",
"name": "report.ts",
"location": {
"file": "web/src/model/report.ts",
"startLine": 1,
"endLine": 194
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/model",
"path": "web/src/model/report.ts",
"loc": 194,
"containerIds": [],
"functionIds": []
},
{
"id": "file:web/src/model/reportRepository.ts",
"kind": "file",
"name": "reportRepository.ts",
"location": {
"file": "web/src/model/reportRepository.ts",
"startLine": 1,
"endLine": 27
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/model",
"path": "web/src/model/reportRepository.ts",
"loc": 27,
"containerIds": [
"container:web/src/model/reportRepository.ts#HttpReportRepository@16"
],
"functionIds": []
},
{
"id": "file:web/src/model/graphModel.ts",
"kind": "file",
"name": "graphModel.ts",
"location": {
"file": "web/src/model/graphModel.ts",
"startLine": 1,
"endLine": 67
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/model",
"path": "web/src/model/graphModel.ts",
"loc": 67,
"containerIds": [],
"functionIds": [
"func:web/src/model/graphModel.ts#baseName@19",
"func:web/src/model/graphModel.ts#qualifierOf@24",
"func:web/src/model/graphModel.ts#flowToGraph@43",
"func:web/src/model/graphModel.ts#map() 回调@44@44"
]
},
{
"id": "file:web/src/services/dagreLayout.ts",
"kind": "file",
"name": "dagreLayout.ts",
"location": {
"file": "web/src/services/dagreLayout.ts",
"startLine": 1,
"endLine": 63
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/services",
"path": "web/src/services/dagreLayout.ts",
"loc": 63,
"containerIds": [],
"functionIds": [
"func:web/src/services/dagreLayout.ts#computeLayout@31"
]
},
{
"id": "file:web/src/viewmodel/GraphViewModel.ts",
"kind": "file",
"name": "GraphViewModel.ts",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 1,
"endLine": 290
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/viewmodel",
"path": "web/src/viewmodel/GraphViewModel.ts",
"loc": 290,
"containerIds": [
"container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43"
],
"functionIds": [
"func:web/src/viewmodel/GraphViewModel.ts#baseName@34",
"func:web/src/viewmodel/GraphViewModel.ts#runInAction() 回调@149@149",
"func:web/src/viewmodel/GraphViewModel.ts#map() 回调@186@186"
]
},
{
"id": "file:web/src/view/vmContext.ts",
"kind": "file",
"name": "vmContext.ts",
"location": {
"file": "web/src/view/vmContext.ts",
"startLine": 1,
"endLine": 11
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/view",
"path": "web/src/view/vmContext.ts",
"loc": 11,
"containerIds": [],
"functionIds": [
"func:web/src/view/vmContext.ts#useGraphVM@6",
"func:web/src/view/vmContext.ts#<module>@0"
]
},
{
"id": "file:web/src/view/components/FlowNode.tsx",
"kind": "file",
"name": "FlowNode.tsx",
"location": {
"file": "web/src/view/components/FlowNode.tsx",
"startLine": 1,
"endLine": 67
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/FlowNode.tsx",
"loc": 67,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/FlowNode.tsx#interactionBadges@12",
"func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"func:web/src/view/components/FlowNode.tsx#<module>@0"
]
},
{
"id": "file:web/src/view/components/FlowGraph.tsx",
"kind": "file",
"name": "FlowGraph.tsx",
"location": {
"file": "web/src/view/components/FlowGraph.tsx",
"startLine": 1,
"endLine": 73
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/FlowGraph.tsx",
"loc": 73,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17",
"func:web/src/view/components/FlowGraph.tsx#<module>@0"
]
},
{
"id": "file:web/src/view/components/FlowList.tsx",
"kind": "file",
"name": "FlowList.tsx",
"location": {
"file": "web/src/view/components/FlowList.tsx",
"startLine": 1,
"endLine": 26
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/FlowList.tsx",
"loc": 26,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"func:web/src/view/components/FlowList.tsx#<module>@0"
]
},
{
"id": "file:web/src/view/components/GroupList.tsx",
"kind": "file",
"name": "GroupList.tsx",
"location": {
"file": "web/src/view/components/GroupList.tsx",
"startLine": 1,
"endLine": 37
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/GroupList.tsx",
"loc": 37,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"func:web/src/view/components/GroupList.tsx#<module>@0"
]
},
{
"id": "file:web/src/view/components/NodeDetailPanel.tsx",
"kind": "file",
"name": "NodeDetailPanel.tsx",
"location": {
"file": "web/src/view/components/NodeDetailPanel.tsx",
"startLine": 1,
"endLine": 86
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/NodeDetailPanel.tsx",
"loc": 86,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"func:web/src/view/components/NodeDetailPanel.tsx#<module>@0"
]
},
{
"id": "file:web/src/view/components/SearchBar.tsx",
"kind": "file",
"name": "SearchBar.tsx",
"location": {
"file": "web/src/view/components/SearchBar.tsx",
"startLine": 1,
"endLine": 60
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/SearchBar.tsx",
"loc": 60,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"func:web/src/view/components/SearchBar.tsx#activate@12",
"func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"func:web/src/view/components/SearchBar.tsx#<module>@0"
]
},
{
"id": "file:web/src/view/App.tsx",
"kind": "file",
"name": "App.tsx",
"location": {
"file": "web/src/view/App.tsx",
"startLine": 1,
"endLine": 55
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view",
"path": "web/src/view/App.tsx",
"loc": 55,
"containerIds": [],
"functionIds": [
"func:web/src/view/App.tsx#observer() 回调@9@9",
"func:web/src/view/App.tsx#<module>@0"
]
},
{
"id": "file:web/src/main.tsx",
"kind": "file",
"name": "main.tsx",
"location": {
"file": "web/src/main.tsx",
"startLine": 1,
"endLine": 26
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src",
"path": "web/src/main.tsx",
"loc": 26,
"containerIds": [],
"functionIds": [
"func:web/src/main.tsx#<module>@0"
]
},
{
"id": "file:web/vite.config.ts",
"kind": "file",
"name": "vite.config.ts",
"location": {
"file": "web/vite.config.ts",
"startLine": 1,
"endLine": 11
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web",
"path": "web/vite.config.ts",
"loc": 11,
"containerIds": [],
"functionIds": [
"func:web/vite.config.ts#<module>@0"
]
}
],
"containers": [
{
"id": "container:web/src/model/reportRepository.ts#HttpReportRepository@16",
"kind": "container",
"name": "HttpReportRepository",
"qualifiedName": "HttpReportRepository",
"location": {
"file": "web/src/model/reportRepository.ts",
"startLine": 16,
"endLine": 26,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/reportRepository.ts",
"moduleId": "module:web/src/model",
"functionIds": [
"func:web/src/model/reportRepository.ts#HttpReportRepository.constructor@17",
"func:web/src/model/reportRepository.ts#HttpReportRepository.load@19"
],
"fieldIds": []
},
{
"id": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"kind": "container",
"name": "GraphViewModel",
"qualifiedName": "GraphViewModel",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 43,
"endLine": 289,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"moduleId": "module:web/src/viewmodel",
"functionIds": [
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.constructor@58",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.sources@66",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentSource@70",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flows@160",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentFlow@165",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFunc@194",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flowsForSelectedFunc@202",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcIdsInFlows@225",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchResults@240",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286"
],
"fieldIds": [
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loading@44",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.error@45",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.report@46",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedSourceId@48",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedGroupId@49",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFlowId@50",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedNodeId@51",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchQuery@52",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcById@54",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.containerById@55",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.fileById@56"
]
}
],
"functions": [
{
"id": "func:src/scanner.ts#toPosix@19",
"kind": "function",
"name": "toPosix",
"qualifiedName": "toPosix",
"location": {
"file": "src/scanner.ts",
"startLine": 19,
"endLine": 21,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/scanner.ts",
"moduleId": "module:src",
"signature": "toPosix(p: string): string",
"params": [
{
"name": "p",
"typeRef": "string",
"optional": false
}
],
"returnType": "string",
"loc": 3
},
{
"id": "func:src/scanner.ts#collectSourceFiles@24",
"kind": "function",
"name": "collectSourceFiles",
"qualifiedName": "collectSourceFiles",
"location": {
"file": "src/scanner.ts",
"startLine": 24,
"endLine": 50,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/scanner.ts",
"moduleId": "module:src",
"signature": "collectSourceFiles(root: string): string[]",
"params": [
{
"name": "root",
"typeRef": "string",
"optional": false
}
],
"returnType": "string[]",
"loc": 27
},
{
"id": "func:src/scanner.ts#walk@27",
"kind": "function",
"name": "walk",
"qualifiedName": "walk",
"location": {
"file": "src/scanner.ts",
"startLine": 27,
"endLine": 46,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/scanner.ts",
"moduleId": "module:src",
"signature": "walk(dir: string): void",
"params": [
{
"name": "dir",
"typeRef": "string",
"optional": false
}
],
"returnType": "void",
"loc": 20
},
{
"id": "func:src/scanner.ts#languageOf@52",
"kind": "function",
"name": "languageOf",
"qualifiedName": "languageOf",
"location": {
"file": "src/scanner.ts",
"startLine": 52,
"endLine": 68,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/scanner.ts",
"moduleId": "module:src",
"signature": "languageOf(file: string): string",
"params": [
{
"name": "file",
"typeRef": "string",
"optional": false
}
],
"returnType": "string",
"loc": 17
},
{
"id": "func:src/externals.ts#deriveExternalSystems@4",
"kind": "function",
"name": "deriveExternalSystems",
"qualifiedName": "deriveExternalSystems",
"location": {
"file": "src/externals.ts",
"startLine": 4,
"endLine": 60,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/externals.ts",
"moduleId": "module:src",
"signature": "deriveExternalSystems(functions: Func[]): ExternalSystem[]",
"params": [
{
"name": "functions",
"typeRef": "Func[]",
"optional": false
}
],
"returnType": "ExternalSystem[]",
"loc": 57
},
{
"id": "func:src/flows.ts#generateCallFlows@16",
"kind": "function",
"name": "generateCallFlows",
"qualifiedName": "generateCallFlows",
"location": {
"file": "src/flows.ts",
"startLine": 16,
"endLine": 102,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/flows.ts",
"moduleId": "module:src",
"signature": "generateCallFlows(functions: Func[], edges: Edge[], options: Partial<FlowOptions>): Flow[]",
"params": [
{
"name": "functions",
"typeRef": "Func[]",
"optional": false
},
{
"name": "edges",
"typeRef": "Edge[]",
"optional": false
},
{
"name": "options",
"typeRef": "Partial<FlowOptions>",
"optional": true
}
],
"returnType": "Flow[]",
"loc": 87
},
{
"id": "func:src/flows.ts#stepIdOf@70",
"kind": "function",
"name": "stepIdOf",
"qualifiedName": "stepIdOf",
"location": {
"file": "src/flows.ts",
"startLine": 70,
"endLine": 70,
"startCol": 11,
"endCol": 70
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/flows.ts",
"moduleId": "module:src",
"signature": "stepIdOf(fid: string): string",
"params": [
{
"name": "fid",
"typeRef": "string",
"optional": false
}
],
"returnType": "string",
"loc": 1
},
{
"id": "func:src/flows.ts#map() 回调@72@72",
"kind": "function",
"name": "map() 回调@72",
"qualifiedName": "map() 回调@72",
"location": {
"file": "src/flows.ts",
"startLine": 72,
"endLine": 81,
"startCol": 44,
"endCol": 6
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/flows.ts",
"moduleId": "module:src",
"signature": "map() 回调@72(fid, i)",
"params": [
{
"name": "fid",
"optional": false
},
{
"name": "i",
"optional": false
}
],
"loc": 10
},
{
"id": "func:src/analyzer.ts#analyzeProject@32",
"kind": "function",
"name": "analyzeProject",
"qualifiedName": "analyzeProject",
"location": {
"file": "src/analyzer.ts",
"startLine": 32,
"endLine": 609,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "analyzeProject(root: string): Report",
"params": [
{
"name": "root",
"typeRef": "string",
"optional": false
}
],
"returnType": "Report",
"loc": 578
},
{
"id": "func:src/analyzer.ts#relOf@64",
"kind": "function",
"name": "relOf",
"qualifiedName": "relOf",
"location": {
"file": "src/analyzer.ts",
"startLine": 64,
"endLine": 64,
"startCol": 9,
"endCol": 106
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "relOf(sf: ts.SourceFile): string",
"params": [
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "string",
"loc": 1
},
{
"id": "func:src/analyzer.ts#inProject@65",
"kind": "function",
"name": "inProject",
"qualifiedName": "inProject",
"location": {
"file": "src/analyzer.ts",
"startLine": 65,
"endLine": 68,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "inProject(sf: ts.SourceFile): boolean",
"params": [
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "boolean",
"loc": 4
},
{
"id": "func:src/analyzer.ts#locOf@70",
"kind": "function",
"name": "locOf",
"qualifiedName": "locOf",
"location": {
"file": "src/analyzer.ts",
"startLine": 70,
"endLine": 80,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "locOf(node: ts.Node, sf: ts.SourceFile): SourceLocation",
"params": [
{
"name": "node",
"typeRef": "ts.Node",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "SourceLocation",
"loc": 11
},
{
"id": "func:src/analyzer.ts#ensureModule@83",
"kind": "function",
"name": "ensureModule",
"qualifiedName": "ensureModule",
"location": {
"file": "src/analyzer.ts",
"startLine": 83,
"endLine": 105,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "ensureModule(dir: string): Module",
"params": [
{
"name": "dir",
"typeRef": "string",
"optional": false
}
],
"returnType": "Module",
"loc": 23
},
{
"id": "func:src/analyzer.ts#getParams@108",
"kind": "function",
"name": "getParams",
"qualifiedName": "getParams",
"location": {
"file": "src/analyzer.ts",
"startLine": 108,
"endLine": 115,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "getParams(fn: ts.SignatureDeclarationBase, sf: ts.SourceFile): Param[]",
"params": [
{
"name": "fn",
"typeRef": "ts.SignatureDeclarationBase",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "Param[]",
"loc": 8
},
{
"id": "func:src/analyzer.ts#buildSignature@117",
"kind": "function",
"name": "buildSignature",
"qualifiedName": "buildSignature",
"location": {
"file": "src/analyzer.ts",
"startLine": 117,
"endLine": 120,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "buildSignature(name: string, params: Param[], ret: string): string",
"params": [
{
"name": "name",
"typeRef": "string",
"optional": false
},
{
"name": "params",
"typeRef": "Param[]",
"optional": false
},
{
"name": "ret",
"typeRef": "string",
"optional": true
}
],
"returnType": "string",
"loc": 4
},
{
"id": "func:src/analyzer.ts#registerFunc@122",
"kind": "function",
"name": "registerFunc",
"qualifiedName": "registerFunc",
"location": {
"file": "src/analyzer.ts",
"startLine": 122,
"endLine": 167,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "registerFunc(declNode: ts.Node, fnNode: ts.SignatureDeclarationBase & ts.Node, name: string, sf: ts.SourceFile, rel: string, fileEntity: CodeFile, ownerId: string, qualifiedPrefix: string): Func",
"params": [
{
"name": "declNode",
"typeRef": "ts.Node",
"optional": false
},
{
"name": "fnNode",
"typeRef": "ts.SignatureDeclarationBase & ts.Node",
"optional": false
},
{
"name": "name",
"typeRef": "string",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
},
{
"name": "rel",
"typeRef": "string",
"optional": false
},
{
"name": "fileEntity",
"typeRef": "CodeFile",
"optional": false
},
{
"name": "ownerId",
"typeRef": "string",
"optional": true
},
{
"name": "qualifiedPrefix",
"typeRef": "string",
"optional": true
}
],
"returnType": "Func",
"loc": 46
},
{
"id": "func:src/analyzer.ts#isFnInit@169",
"kind": "function",
"name": "isFnInit",
"qualifiedName": "isFnInit",
"location": {
"file": "src/analyzer.ts",
"startLine": 169,
"endLine": 170,
"startCol": 9,
"endCol": 74
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "isFnInit(node: ts.Node): node is ts.ArrowFunction | ts.FunctionExpression",
"params": [
{
"name": "node",
"typeRef": "ts.Node",
"optional": true
}
],
"returnType": "node is ts.ArrowFunction | ts.FunctionExpression",
"loc": 2
},
{
"id": "func:src/analyzer.ts#containsCall@173",
"kind": "function",
"name": "containsCall",
"qualifiedName": "containsCall",
"location": {
"file": "src/analyzer.ts",
"startLine": 173,
"endLine": 185,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "containsCall(n: ts.Node): boolean",
"params": [
{
"name": "n",
"typeRef": "ts.Node",
"optional": false
}
],
"returnType": "boolean",
"loc": 13
},
{
"id": "func:src/analyzer.ts#scan@175",
"kind": "function",
"name": "scan",
"qualifiedName": "scan",
"location": {
"file": "src/analyzer.ts",
"startLine": 175,
"endLine": 182,
"startCol": 11,
"endCol": 6
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "scan(x: ts.Node): void",
"params": [
{
"name": "x",
"typeRef": "ts.Node",
"optional": false
}
],
"returnType": "void",
"loc": 8
},
{
"id": "func:src/analyzer.ts#routeNameFromCall@188",
"kind": "function",
"name": "routeNameFromCall",
"qualifiedName": "routeNameFromCall",
"location": {
"file": "src/analyzer.ts",
"startLine": 188,
"endLine": 199,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "routeNameFromCall(call: ts.CallExpression, sf: ts.SourceFile): string | undefined",
"params": [
{
"name": "call",
"typeRef": "ts.CallExpression",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "string | undefined",
"loc": 12
},
{
"id": "func:src/analyzer.ts#inlineName@202",
"kind": "function",
"name": "inlineName",
"qualifiedName": "inlineName",
"location": {
"file": "src/analyzer.ts",
"startLine": 202,
"endLine": 220,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "inlineName(fn: ts.ArrowFunction | ts.FunctionExpression, sf: ts.SourceFile): string",
"params": [
{
"name": "fn",
"typeRef": "ts.ArrowFunction | ts.FunctionExpression",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "string",
"loc": 19
},
{
"id": "func:src/analyzer.ts#registerFile@223",
"kind": "function",
"name": "registerFile",
"qualifiedName": "registerFile",
"location": {
"file": "src/analyzer.ts",
"startLine": 223,
"endLine": 330,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "registerFile(sf: ts.SourceFile): void",
"params": [
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "void",
"loc": 108
},
{
"id": "func:src/analyzer.ts#visit@245",
"kind": "function",
"name": "visit",
"qualifiedName": "visit",
"location": {
"file": "src/analyzer.ts",
"startLine": 245,
"endLine": 327,
"startCol": 11,
"endCol": 6
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "visit(node: ts.Node): void",
"params": [
{
"name": "node",
"typeRef": "ts.Node",
"optional": false
}
],
"returnType": "void",
"loc": 83
},
{
"id": "func:src/analyzer.ts#extractPathArg@333",
"kind": "function",
"name": "extractPathArg",
"qualifiedName": "extractPathArg",
"location": {
"file": "src/analyzer.ts",
"startLine": 333,
"endLine": 339,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "extractPathArg(node: ts.Expression | undefined, sf: ts.SourceFile): string | undefined",
"params": [
{
"name": "node",
"typeRef": "ts.Expression | undefined",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "string | undefined",
"loc": 7
},
{
"id": "func:src/analyzer.ts#extractMethodFromOptions@341",
"kind": "function",
"name": "extractMethodFromOptions",
"qualifiedName": "extractMethodFromOptions",
"location": {
"file": "src/analyzer.ts",
"startLine": 341,
"endLine": 350,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "extractMethodFromOptions(arg: ts.Expression | undefined, sf: ts.SourceFile): string | undefined",
"params": [
{
"name": "arg",
"typeRef": "ts.Expression | undefined",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "string | undefined",
"loc": 10
},
{
"id": "func:src/analyzer.ts#hostOf@352",
"kind": "function",
"name": "hostOf",
"qualifiedName": "hostOf",
"location": {
"file": "src/analyzer.ts",
"startLine": 352,
"endLine": 356,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "hostOf(url: string): string | undefined",
"params": [
{
"name": "url",
"typeRef": "string",
"optional": true
}
],
"returnType": "string | undefined",
"loc": 5
},
{
"id": "func:src/analyzer.ts#detectDb@358",
"kind": "function",
"name": "detectDb",
"qualifiedName": "detectDb",
"location": {
"file": "src/analyzer.ts",
"startLine": 358,
"endLine": 380,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "detectDb(call: ts.CallExpression, sf: ts.SourceFile): DbInteraction | undefined",
"params": [
{
"name": "call",
"typeRef": "ts.CallExpression",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "DbInteraction | undefined",
"loc": 23
},
{
"id": "func:src/analyzer.ts#detectApiOut@382",
"kind": "function",
"name": "detectApiOut",
"qualifiedName": "detectApiOut",
"location": {
"file": "src/analyzer.ts",
"startLine": 382,
"endLine": 398,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "detectApiOut(call: ts.CallExpression, sf: ts.SourceFile): ApiInteraction | undefined",
"params": [
{
"name": "call",
"typeRef": "ts.CallExpression",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "ApiInteraction | undefined",
"loc": 17
},
{
"id": "func:src/analyzer.ts#detectApiIn@400",
"kind": "function",
"name": "detectApiIn",
"qualifiedName": "detectApiIn",
"location": {
"file": "src/analyzer.ts",
"startLine": 400,
"endLine": 417,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "detectApiIn(call: ts.CallExpression, sf: ts.SourceFile): { interaction: ApiInteraction; handler?: ts.Node } | undefined",
"params": [
{
"name": "call",
"typeRef": "ts.CallExpression",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "{ interaction: ApiInteraction; handler?: ts.Node } | undefined",
"loc": 18
},
{
"id": "func:src/analyzer.ts#addInteraction@419",
"kind": "function",
"name": "addInteraction",
"qualifiedName": "addInteraction",
"location": {
"file": "src/analyzer.ts",
"startLine": 419,
"endLine": 430,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "addInteraction(fnId: string, ix: Interaction): void",
"params": [
{
"name": "fnId",
"typeRef": "string",
"optional": false
},
{
"name": "ix",
"typeRef": "Interaction",
"optional": false
}
],
"returnType": "void",
"loc": 12
},
{
"id": "func:src/analyzer.ts#addEdge@433",
"kind": "function",
"name": "addEdge",
"qualifiedName": "addEdge",
"location": {
"file": "src/analyzer.ts",
"startLine": 433,
"endLine": 438,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "addEdge(kind: Edge[\"kind\"], sourceId: string, targetId: string, provenance: Edge[\"provenance\"]): void",
"params": [
{
"name": "kind",
"typeRef": "Edge[\"kind\"]",
"optional": false
},
{
"name": "sourceId",
"typeRef": "string",
"optional": false
},
{
"name": "targetId",
"typeRef": "string",
"optional": false
},
{
"name": "provenance",
"typeRef": "Edge[\"provenance\"]",
"optional": false
}
],
"returnType": "void",
"loc": 6
},
{
"id": "func:src/analyzer.ts#resolveCallTargetFuncId@440",
"kind": "function",
"name": "resolveCallTargetFuncId",
"qualifiedName": "resolveCallTargetFuncId",
"location": {
"file": "src/analyzer.ts",
"startLine": 440,
"endLine": 459,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "resolveCallTargetFuncId(call: ts.CallExpression): string | undefined",
"params": [
{
"name": "call",
"typeRef": "ts.CallExpression",
"optional": false
}
],
"returnType": "string | undefined",
"loc": 20
},
{
"id": "func:src/analyzer.ts#getModuleFunc@462",
"kind": "function",
"name": "getModuleFunc",
"qualifiedName": "getModuleFunc",
"location": {
"file": "src/analyzer.ts",
"startLine": 462,
"endLine": 485,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "getModuleFunc(sf: ts.SourceFile, rel: string, fileEntity: CodeFile): string",
"params": [
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
},
{
"name": "rel",
"typeRef": "string",
"optional": false
},
{
"name": "fileEntity",
"typeRef": "CodeFile",
"optional": false
}
],
"returnType": "string",
"loc": 24
},
{
"id": "func:src/analyzer.ts#analyzeRelations@487",
"kind": "function",
"name": "analyzeRelations",
"qualifiedName": "analyzeRelations",
"location": {
"file": "src/analyzer.ts",
"startLine": 487,
"endLine": 546,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "analyzeRelations(sf: ts.SourceFile): void",
"params": [
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "void",
"loc": 60
},
{
"id": "func:src/analyzer.ts#walk@492",
"kind": "function",
"name": "walk",
"qualifiedName": "walk",
"location": {
"file": "src/analyzer.ts",
"startLine": 492,
"endLine": 543,
"startCol": 11,
"endCol": 6
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "walk(node: ts.Node, currentFuncId: string | undefined): void",
"params": [
{
"name": "node",
"typeRef": "ts.Node",
"optional": false
},
{
"name": "currentFuncId",
"typeRef": "string | undefined",
"optional": false
}
],
"returnType": "void",
"loc": 52
},
{
"id": "func:src/analyzer.ts#resolveInternalImport@548",
"kind": "function",
"name": "resolveInternalImport",
"qualifiedName": "resolveInternalImport",
"location": {
"file": "src/analyzer.ts",
"startLine": 548,
"endLine": 569,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "resolveInternalImport(fromRel: string, spec: string): string | undefined",
"params": [
{
"name": "fromRel",
"typeRef": "string",
"optional": false
},
{
"name": "spec",
"typeRef": "string",
"optional": false
}
],
"returnType": "string | undefined",
"loc": 22
},
{
"id": "func:src/cli.ts#parseArgs@13",
"kind": "function",
"name": "parseArgs",
"qualifiedName": "parseArgs",
"location": {
"file": "src/cli.ts",
"startLine": 13,
"endLine": 23,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/cli.ts",
"moduleId": "module:src",
"signature": "parseArgs(argv: string[]): CliArgs",
"params": [
{
"name": "argv",
"typeRef": "string[]",
"optional": false
}
],
"returnType": "CliArgs",
"loc": 11
},
{
"id": "func:src/cli.ts#main@40",
"kind": "function",
"name": "main",
"qualifiedName": "main",
"location": {
"file": "src/cli.ts",
"startLine": 40,
"endLine": 68,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/cli.ts",
"moduleId": "module:src",
"signature": "main(): void",
"params": [],
"returnType": "void",
"loc": 29
},
{
"id": "func:web/src/model/reportRepository.ts#HttpReportRepository.constructor@17",
"kind": "function",
"name": "constructor",
"qualifiedName": "HttpReportRepository.constructor",
"location": {
"file": "web/src/model/reportRepository.ts",
"startLine": 17,
"endLine": 17,
"startCol": 3,
"endCol": 47
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/reportRepository.ts",
"ownerId": "container:web/src/model/reportRepository.ts#HttpReportRepository@16",
"moduleId": "module:web/src/model",
"signature": "constructor(url: string)",
"params": [
{
"name": "url",
"typeRef": "string",
"optional": false
}
],
"loc": 1
},
{
"id": "func:web/src/model/reportRepository.ts#HttpReportRepository.load@19",
"kind": "function",
"name": "load",
"qualifiedName": "HttpReportRepository.load",
"location": {
"file": "web/src/model/reportRepository.ts",
"startLine": 19,
"endLine": 25,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/reportRepository.ts",
"ownerId": "container:web/src/model/reportRepository.ts#HttpReportRepository@16",
"moduleId": "module:web/src/model",
"signature": "load(): Promise<Report>",
"params": [],
"returnType": "Promise<Report>",
"loc": 7,
"interactions": [
{
"id": "ix:func:web/src/model/reportRepository.ts#HttpReportRepository.load@19:api:out:GET:",
"kind": "api",
"direction": "out",
"provenance": "resolved",
"protocol": "http",
"method": "GET"
}
]
},
{
"id": "func:web/src/model/graphModel.ts#baseName@19",
"kind": "function",
"name": "baseName",
"qualifiedName": "baseName",
"location": {
"file": "web/src/model/graphModel.ts",
"startLine": 19,
"endLine": 22,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/graphModel.ts",
"moduleId": "module:web/src/model",
"signature": "baseName(path: string): string",
"params": [
{
"name": "path",
"typeRef": "string",
"optional": false
}
],
"returnType": "string",
"loc": 4
},
{
"id": "func:web/src/model/graphModel.ts#qualifierOf@24",
"kind": "function",
"name": "qualifierOf",
"qualifiedName": "qualifierOf",
"location": {
"file": "web/src/model/graphModel.ts",
"startLine": 24,
"endLine": 29,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/graphModel.ts",
"moduleId": "module:web/src/model",
"signature": "qualifierOf(fn: Func | undefined, ctx: GraphContext): string | undefined",
"params": [
{
"name": "fn",
"typeRef": "Func | undefined",
"optional": false
},
{
"name": "ctx",
"typeRef": "GraphContext",
"optional": false
}
],
"returnType": "string | undefined",
"loc": 6
},
{
"id": "func:web/src/model/graphModel.ts#flowToGraph@43",
"kind": "function",
"name": "flowToGraph",
"qualifiedName": "flowToGraph",
"location": {
"file": "web/src/model/graphModel.ts",
"startLine": 43,
"endLine": 66,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/graphModel.ts",
"moduleId": "module:web/src/model",
"signature": "flowToGraph(flow: Flow, ctx: GraphContext): GraphData",
"params": [
{
"name": "flow",
"typeRef": "Flow",
"optional": false
},
{
"name": "ctx",
"typeRef": "GraphContext",
"optional": false
}
],
"returnType": "GraphData",
"loc": 24
},
{
"id": "func:web/src/model/graphModel.ts#map() 回调@44@44",
"kind": "function",
"name": "map() 回调@44",
"qualifiedName": "map() 回调@44",
"location": {
"file": "web/src/model/graphModel.ts",
"startLine": 44,
"endLine": 54,
"startCol": 45,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/graphModel.ts",
"moduleId": "module:web/src/model",
"signature": "map() 回调@44(step)",
"params": [
{
"name": "step",
"optional": false
}
],
"loc": 11
},
{
"id": "func:web/src/services/dagreLayout.ts#computeLayout@31",
"kind": "function",
"name": "computeLayout",
"qualifiedName": "computeLayout",
"location": {
"file": "web/src/services/dagreLayout.ts",
"startLine": 31,
"endLine": 62,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/services/dagreLayout.ts",
"moduleId": "module:web/src/services",
"signature": "computeLayout(nodes: LayoutNodeInput[], edges: LayoutEdgeInput[], options: LayoutOptions): Map<string, Position>",
"params": [
{
"name": "nodes",
"typeRef": "LayoutNodeInput[]",
"optional": false
},
{
"name": "edges",
"typeRef": "LayoutEdgeInput[]",
"optional": false
},
{
"name": "options",
"typeRef": "LayoutOptions",
"optional": true,
"defaultValue": "{}"
}
],
"returnType": "Map<string, Position>",
"loc": 32
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#baseName@34",
"kind": "function",
"name": "baseName",
"qualifiedName": "baseName",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 34,
"endLine": 37,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"moduleId": "module:web/src/viewmodel",
"signature": "baseName(path: string): string",
"params": [
{
"name": "path",
"typeRef": "string",
"optional": false
}
],
"returnType": "string",
"loc": 4
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.constructor@58",
"kind": "function",
"name": "constructor",
"qualifiedName": "GraphViewModel.constructor",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 58,
"endLine": 64,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "constructor(sourceList: ReportSource[], makeRepository: (url: string) => ReportRepository)",
"params": [
{
"name": "sourceList",
"typeRef": "ReportSource[]",
"optional": false
},
{
"name": "makeRepository",
"typeRef": "(url: string) => ReportRepository",
"optional": false
}
],
"loc": 7
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.sources@66",
"kind": "function",
"name": "sources",
"qualifiedName": "GraphViewModel.sources",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 66,
"endLine": 68,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "sources(): ReportSource[]",
"params": [],
"returnType": "ReportSource[]",
"loc": 3
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentSource@70",
"kind": "function",
"name": "currentSource",
"qualifiedName": "GraphViewModel.currentSource",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 70,
"endLine": 72,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "currentSource(): ReportSource | null",
"params": [],
"returnType": "ReportSource | null",
"loc": 3
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74",
"kind": "function",
"name": "selectReport",
"qualifiedName": "GraphViewModel.selectReport",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 74,
"endLine": 83,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "selectReport(sourceId: string): void",
"params": [
{
"name": "sourceId",
"typeRef": "string",
"optional": false
}
],
"returnType": "void",
"loc": 10
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86",
"kind": "function",
"name": "groupOfFlow",
"qualifiedName": "GraphViewModel.groupOfFlow",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 86,
"endLine": 97,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "groupOfFlow(flow: Flow): FlowGroup",
"params": [
{
"name": "flow",
"typeRef": "Flow",
"optional": false
}
],
"returnType": "FlowGroup",
"loc": 12
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100",
"kind": "function",
"name": "groups",
"qualifiedName": "GraphViewModel.groups",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 100,
"endLine": 109,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "groups(): FlowGroup[]",
"params": [],
"returnType": "FlowGroup[]",
"loc": 10
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112",
"kind": "function",
"name": "visibleFlows",
"qualifiedName": "GraphViewModel.visibleFlows",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 112,
"endLine": 115,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "visibleFlows(): Flow[]",
"params": [],
"returnType": "Flow[]",
"loc": 4
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117",
"kind": "function",
"name": "selectGroup",
"qualifiedName": "GraphViewModel.selectGroup",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 117,
"endLine": 124,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "selectGroup(groupId: string | null): void",
"params": [
{
"name": "groupId",
"typeRef": "string | null",
"optional": false
}
],
"returnType": "void",
"loc": 8
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126",
"kind": "function",
"name": "load",
"qualifiedName": "GraphViewModel.load",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 126,
"endLine": 157,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "load(): Promise<void>",
"params": [],
"returnType": "Promise<void>",
"loc": 32
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flows@160",
"kind": "function",
"name": "flows",
"qualifiedName": "GraphViewModel.flows",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 160,
"endLine": 163,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "flows(): Flow[]",
"params": [],
"returnType": "Flow[]",
"loc": 4
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentFlow@165",
"kind": "function",
"name": "currentFlow",
"qualifiedName": "GraphViewModel.currentFlow",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 165,
"endLine": 168,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "currentFlow(): Flow | null",
"params": [],
"returnType": "Flow | null",
"loc": 4
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171",
"kind": "function",
"name": "positionedGraph",
"qualifiedName": "GraphViewModel.positionedGraph",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 171,
"endLine": 192,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "positionedGraph(): PositionedGraph",
"params": [],
"returnType": "PositionedGraph",
"loc": 22
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFunc@194",
"kind": "function",
"name": "selectedFunc",
"qualifiedName": "GraphViewModel.selectedFunc",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 194,
"endLine": 199,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "selectedFunc(): Func | null",
"params": [],
"returnType": "Func | null",
"loc": 6
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flowsForSelectedFunc@202",
"kind": "function",
"name": "flowsForSelectedFunc",
"qualifiedName": "GraphViewModel.flowsForSelectedFunc",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 202,
"endLine": 208,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "flowsForSelectedFunc(): Flow[]",
"params": [],
"returnType": "Flow[]",
"loc": 7
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"kind": "function",
"name": "openFlowForFunc",
"qualifiedName": "GraphViewModel.openFlowForFunc",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 211,
"endLine": 217,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "openFlowForFunc(flowId: string, funcId: string): void",
"params": [
{
"name": "flowId",
"typeRef": "string",
"optional": false
},
{
"name": "funcId",
"typeRef": "string",
"optional": false
}
],
"returnType": "void",
"loc": 7
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221",
"kind": "function",
"name": "setSearchQuery",
"qualifiedName": "GraphViewModel.setSearchQuery",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 221,
"endLine": 223,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "setSearchQuery(q: string): void",
"params": [
{
"name": "q",
"typeRef": "string",
"optional": false
}
],
"returnType": "void",
"loc": 3
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcIdsInFlows@225",
"kind": "function",
"name": "funcIdsInFlows",
"qualifiedName": "GraphViewModel.funcIdsInFlows",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 225,
"endLine": 231,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "funcIdsInFlows(): Set<string>",
"params": [],
"returnType": "Set<string>",
"loc": 7
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233",
"kind": "function",
"name": "biggestFlowForFunc",
"qualifiedName": "GraphViewModel.biggestFlowForFunc",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 233,
"endLine": 238,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "biggestFlowForFunc(funcId: string): Flow | null",
"params": [
{
"name": "funcId",
"typeRef": "string",
"optional": false
}
],
"returnType": "Flow | null",
"loc": 6
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchResults@240",
"kind": "function",
"name": "searchResults",
"qualifiedName": "GraphViewModel.searchResults",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 240,
"endLine": 266,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "searchResults(): SearchResult[]",
"params": [],
"returnType": "SearchResult[]",
"loc": 27
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268",
"kind": "function",
"name": "activateSearchResult",
"qualifiedName": "GraphViewModel.activateSearchResult",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 268,
"endLine": 278,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "activateSearchResult(result: SearchResult): void",
"params": [
{
"name": "result",
"typeRef": "SearchResult",
"optional": false
}
],
"returnType": "void",
"loc": 11
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280",
"kind": "function",
"name": "selectFlow",
"qualifiedName": "GraphViewModel.selectFlow",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 280,
"endLine": 284,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "selectFlow(flowId: string): void",
"params": [
{
"name": "flowId",
"typeRef": "string",
"optional": false
}
],
"returnType": "void",
"loc": 5
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286",
"kind": "function",
"name": "selectNode",
"qualifiedName": "GraphViewModel.selectNode",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 286,
"endLine": 288,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"moduleId": "module:web/src/viewmodel",
"signature": "selectNode(nodeId: string | null): void",
"params": [
{
"name": "nodeId",
"typeRef": "string | null",
"optional": false
}
],
"returnType": "void",
"loc": 3
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#runInAction() 回调@149@149",
"kind": "function",
"name": "runInAction() 回调@149",
"qualifiedName": "runInAction() 回调@149",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 149,
"endLine": 151,
"startCol": 19,
"endCol": 8
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"moduleId": "module:web/src/viewmodel",
"signature": "runInAction() 回调@149()",
"params": [],
"loc": 3
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#map() 回调@186@186",
"kind": "function",
"name": "map() 回调@186",
"qualifiedName": "map() 回调@186",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 186,
"endLine": 189,
"startCol": 53,
"endCol": 6
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"moduleId": "module:web/src/viewmodel",
"signature": "map() 回调@186(n)",
"params": [
{
"name": "n",
"optional": false
}
],
"loc": 4
},
{
"id": "func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "function",
"name": "useGraphVM",
"qualifiedName": "useGraphVM",
"location": {
"file": "web/src/view/vmContext.ts",
"startLine": 6,
"endLine": 10,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/view/vmContext.ts",
"moduleId": "module:web/src/view",
"signature": "useGraphVM(): GraphViewModel",
"params": [],
"returnType": "GraphViewModel",
"loc": 5
},
{
"id": "func:web/src/view/components/FlowNode.tsx#interactionBadges@12",
"kind": "function",
"name": "interactionBadges",
"qualifiedName": "interactionBadges",
"location": {
"file": "web/src/view/components/FlowNode.tsx",
"startLine": 12,
"endLine": 38,
"startCol": 1,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowNode.tsx",
"moduleId": "module:web/src/view/components",
"signature": "interactionBadges(interactions: Interaction[]): { key: string; text: string; cls: string }[]",
"params": [
{
"name": "interactions",
"typeRef": "Interaction[]",
"optional": true
}
],
"returnType": "{ key: string; text: string; cls: string }[]",
"loc": 27
},
{
"id": "func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"kind": "function",
"name": "memo() 回调@40",
"qualifiedName": "memo() 回调@40",
"location": {
"file": "web/src/view/components/FlowNode.tsx",
"startLine": 40,
"endLine": 66,
"startCol": 30,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowNode.tsx",
"moduleId": "module:web/src/view/components",
"signature": "memo() 回调@40({ data, selected }: NodeProps & { data: FlowNodeData })",
"params": [
{
"name": "{ data, selected }",
"typeRef": "NodeProps & { data: FlowNodeData }",
"optional": false
}
],
"loc": 27
},
{
"id": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17",
"kind": "function",
"name": "observer() 回调@17",
"qualifiedName": "observer() 回调@17",
"location": {
"file": "web/src/view/components/FlowGraph.tsx",
"startLine": 17,
"endLine": 72,
"startCol": 35,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowGraph.tsx",
"moduleId": "module:web/src/view/components",
"signature": "observer() 回调@17()",
"params": [],
"loc": 56
},
{
"id": "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"kind": "function",
"name": "observer() 回调@4",
"qualifiedName": "observer() 回调@4",
"location": {
"file": "web/src/view/components/FlowList.tsx",
"startLine": 4,
"endLine": 25,
"startCol": 34,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowList.tsx",
"moduleId": "module:web/src/view/components",
"signature": "observer() 回调@4()",
"params": [],
"loc": 22
},
{
"id": "func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"kind": "function",
"name": "observer() 回调@4",
"qualifiedName": "observer() 回调@4",
"location": {
"file": "web/src/view/components/GroupList.tsx",
"startLine": 4,
"endLine": 36,
"startCol": 35,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/GroupList.tsx",
"moduleId": "module:web/src/view/components",
"signature": "observer() 回调@4()",
"params": [],
"loc": 33
},
{
"id": "func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"kind": "function",
"name": "describeInteraction",
"qualifiedName": "describeInteraction",
"location": {
"file": "web/src/view/components/NodeDetailPanel.tsx",
"startLine": 5,
"endLine": 11,
"startCol": 1,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/NodeDetailPanel.tsx",
"moduleId": "module:web/src/view/components",
"signature": "describeInteraction(ix: Interaction): string",
"params": [
{
"name": "ix",
"typeRef": "Interaction",
"optional": false
}
],
"returnType": "string",
"loc": 7
},
{
"id": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"kind": "function",
"name": "observer() 回调@13",
"qualifiedName": "observer() 回调@13",
"location": {
"file": "web/src/view/components/NodeDetailPanel.tsx",
"startLine": 13,
"endLine": 85,
"startCol": 41,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/NodeDetailPanel.tsx",
"moduleId": "module:web/src/view/components",
"signature": "observer() 回调@13()",
"params": [],
"loc": 73
},
{
"id": "func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"kind": "function",
"name": "observer() 回调@6",
"qualifiedName": "observer() 回调@6",
"location": {
"file": "web/src/view/components/SearchBar.tsx",
"startLine": 6,
"endLine": 59,
"startCol": 35,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/SearchBar.tsx",
"moduleId": "module:web/src/view/components",
"signature": "observer() 回调@6()",
"params": [],
"loc": 54
},
{
"id": "func:web/src/view/components/SearchBar.tsx#activate@12",
"kind": "function",
"name": "activate",
"qualifiedName": "activate",
"location": {
"file": "web/src/view/components/SearchBar.tsx",
"startLine": 12,
"endLine": 15,
"startCol": 9,
"endCol": 4
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/SearchBar.tsx",
"moduleId": "module:web/src/view/components",
"signature": "activate(r: SearchResult): void",
"params": [
{
"name": "r",
"typeRef": "SearchResult",
"optional": false
}
],
"returnType": "void",
"loc": 4
},
{
"id": "func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"kind": "function",
"name": "匿名函数@26",
"qualifiedName": "匿名函数@26",
"location": {
"file": "web/src/view/components/SearchBar.tsx",
"startLine": 26,
"endLine": 29,
"startCol": 20,
"endCol": 10
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/SearchBar.tsx",
"moduleId": "module:web/src/view/components",
"signature": "匿名函数@26(e)",
"params": [
{
"name": "e",
"optional": false
}
],
"loc": 4
},
{
"id": "func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"kind": "function",
"name": "匿名函数@41",
"qualifiedName": "匿名函数@41",
"location": {
"file": "web/src/view/components/SearchBar.tsx",
"startLine": 41,
"endLine": 44,
"startCol": 30,
"endCol": 18
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/SearchBar.tsx",
"moduleId": "module:web/src/view/components",
"signature": "匿名函数@41(e)",
"params": [
{
"name": "e",
"optional": false
}
],
"loc": 4
},
{
"id": "func:web/src/view/App.tsx#observer() 回调@9@9",
"kind": "function",
"name": "observer() 回调@9",
"qualifiedName": "observer() 回调@9",
"location": {
"file": "web/src/view/App.tsx",
"startLine": 9,
"endLine": 54,
"startCol": 29,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/App.tsx",
"moduleId": "module:web/src/view",
"signature": "observer() 回调@9()",
"params": [],
"loc": 46
},
{
"id": "func:src/cli.ts#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "src/cli.ts",
"startLine": 1,
"endLine": 71
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/cli.ts",
"moduleId": "module:src",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/vmContext.ts#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/vmContext.ts",
"startLine": 1,
"endLine": 11
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/view/vmContext.ts",
"moduleId": "module:web/src/view",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/FlowNode.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/FlowNode.tsx",
"startLine": 1,
"endLine": 67
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowNode.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/FlowGraph.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/FlowGraph.tsx",
"startLine": 1,
"endLine": 73
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowGraph.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/FlowList.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/FlowList.tsx",
"startLine": 1,
"endLine": 26
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowList.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/GroupList.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/GroupList.tsx",
"startLine": 1,
"endLine": 37
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/GroupList.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/NodeDetailPanel.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/NodeDetailPanel.tsx",
"startLine": 1,
"endLine": 86
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/NodeDetailPanel.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/SearchBar.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/SearchBar.tsx",
"startLine": 1,
"endLine": 60
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/SearchBar.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/App.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/App.tsx",
"startLine": 1,
"endLine": 55
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/App.tsx",
"moduleId": "module:web/src/view",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/main.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/main.tsx",
"startLine": 1,
"endLine": 26
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/main.tsx",
"moduleId": "module:web/src",
"params": [],
"isEntry": true,
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/vite.config.ts#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/vite.config.ts",
"startLine": 1,
"endLine": 11
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/vite.config.ts",
"moduleId": "module:web",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
}
],
"fields": [
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loading@44",
"kind": "field",
"name": "loading",
"qualifiedName": "GraphViewModel.loading",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 44,
"endLine": 44,
"startCol": 3,
"endCol": 19
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.error@45",
"kind": "field",
"name": "error",
"qualifiedName": "GraphViewModel.error",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 45,
"endLine": 45,
"startCol": 3,
"endCol": 31
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"typeRef": "string | null"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.report@46",
"kind": "field",
"name": "report",
"qualifiedName": "GraphViewModel.report",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 46,
"endLine": 46,
"startCol": 3,
"endCol": 32
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"typeRef": "Report | null"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedSourceId@48",
"kind": "field",
"name": "selectedSourceId",
"qualifiedName": "GraphViewModel.selectedSourceId",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 48,
"endLine": 48,
"startCol": 3,
"endCol": 42
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"typeRef": "string | null"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedGroupId@49",
"kind": "field",
"name": "selectedGroupId",
"qualifiedName": "GraphViewModel.selectedGroupId",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 49,
"endLine": 49,
"startCol": 3,
"endCol": 41
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"typeRef": "string | null"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFlowId@50",
"kind": "field",
"name": "selectedFlowId",
"qualifiedName": "GraphViewModel.selectedFlowId",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 50,
"endLine": 50,
"startCol": 3,
"endCol": 40
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"typeRef": "string | null"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedNodeId@51",
"kind": "field",
"name": "selectedNodeId",
"qualifiedName": "GraphViewModel.selectedNodeId",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 51,
"endLine": 51,
"startCol": 3,
"endCol": 40
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43",
"typeRef": "string | null"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchQuery@52",
"kind": "field",
"name": "searchQuery",
"qualifiedName": "GraphViewModel.searchQuery",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 52,
"endLine": 52,
"startCol": 3,
"endCol": 20
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcById@54",
"kind": "field",
"name": "funcById",
"qualifiedName": "GraphViewModel.funcById",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 54,
"endLine": 54,
"startCol": 3,
"endCol": 46
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.containerById@55",
"kind": "field",
"name": "containerById",
"qualifiedName": "GraphViewModel.containerById",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 55,
"endLine": 55,
"startCol": 3,
"endCol": 56
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.fileById@56",
"kind": "field",
"name": "fileById",
"qualifiedName": "GraphViewModel.fileById",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 56,
"endLine": 56,
"startCol": 3,
"endCol": 50
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43"
}
],
"edges": [
{
"id": "edge:call:func:src/scanner.ts#collectSourceFiles@24=>func:src/scanner.ts#walk@27",
"kind": "call",
"sourceId": "func:src/scanner.ts#collectSourceFiles@24",
"targetId": "func:src/scanner.ts#walk@27",
"provenance": "resolved"
},
{
"id": "edge:import:file:src/externals.ts=>file:src/types.ts",
"kind": "import",
"sourceId": "file:src/externals.ts",
"targetId": "file:src/types.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:src/flows.ts=>file:src/types.ts",
"kind": "import",
"sourceId": "file:src/flows.ts",
"targetId": "file:src/types.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:src/flows.ts#map() 回调@72@72=>func:src/flows.ts#stepIdOf@70",
"kind": "call",
"sourceId": "func:src/flows.ts#map() 回调@72@72",
"targetId": "func:src/flows.ts#stepIdOf@70",
"provenance": "resolved"
},
{
"id": "edge:import:file:src/analyzer.ts=>file:src/scanner.ts",
"kind": "import",
"sourceId": "file:src/analyzer.ts",
"targetId": "file:src/scanner.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:src/analyzer.ts=>file:src/types.ts",
"kind": "import",
"sourceId": "file:src/analyzer.ts",
"targetId": "file:src/types.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:src/analyzer.ts=>file:src/externals.ts",
"kind": "import",
"sourceId": "file:src/analyzer.ts",
"targetId": "file:src/externals.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:src/analyzer.ts=>file:src/flows.ts",
"kind": "import",
"sourceId": "file:src/analyzer.ts",
"targetId": "file:src/flows.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/scanner.ts#collectSourceFiles@24",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/scanner.ts#collectSourceFiles@24",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#relOf@64=>func:src/scanner.ts#toPosix@19",
"kind": "call",
"sourceId": "func:src/analyzer.ts#relOf@64",
"targetId": "func:src/scanner.ts#toPosix@19",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#inProject@65=>func:src/analyzer.ts#relOf@64",
"kind": "call",
"sourceId": "func:src/analyzer.ts#inProject@65",
"targetId": "func:src/analyzer.ts#relOf@64",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#locOf@70=>func:src/analyzer.ts#relOf@64",
"kind": "call",
"sourceId": "func:src/analyzer.ts#locOf@70",
"targetId": "func:src/analyzer.ts#relOf@64",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/analyzer.ts#locOf@70",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFunc@122",
"targetId": "func:src/analyzer.ts#locOf@70",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/analyzer.ts#getParams@108",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFunc@122",
"targetId": "func:src/analyzer.ts#getParams@108",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/scanner.ts#languageOf@52",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFunc@122",
"targetId": "func:src/scanner.ts#languageOf@52",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/analyzer.ts#buildSignature@117",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFunc@122",
"targetId": "func:src/analyzer.ts#buildSignature@117",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#routeNameFromCall@188=>func:src/analyzer.ts#extractPathArg@333",
"kind": "call",
"sourceId": "func:src/analyzer.ts#routeNameFromCall@188",
"targetId": "func:src/analyzer.ts#extractPathArg@333",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#inlineName@202=>func:src/analyzer.ts#locOf@70",
"kind": "call",
"sourceId": "func:src/analyzer.ts#inlineName@202",
"targetId": "func:src/analyzer.ts#locOf@70",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#inlineName@202=>func:src/analyzer.ts#routeNameFromCall@188",
"kind": "call",
"sourceId": "func:src/analyzer.ts#inlineName@202",
"targetId": "func:src/analyzer.ts#routeNameFromCall@188",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFile@223=>func:src/analyzer.ts#relOf@64",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFile@223",
"targetId": "func:src/analyzer.ts#relOf@64",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFile@223=>func:src/scanner.ts#languageOf@52",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFile@223",
"targetId": "func:src/scanner.ts#languageOf@52",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFile@223=>func:src/scanner.ts#toPosix@19",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFile@223",
"targetId": "func:src/scanner.ts#toPosix@19",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFile@223=>func:src/analyzer.ts#ensureModule@83",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFile@223",
"targetId": "func:src/analyzer.ts#ensureModule@83",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#locOf@70",
"kind": "call",
"sourceId": "func:src/analyzer.ts#visit@245",
"targetId": "func:src/analyzer.ts#locOf@70",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#visit@245=>func:src/scanner.ts#languageOf@52",
"kind": "call",
"sourceId": "func:src/analyzer.ts#visit@245",
"targetId": "func:src/scanner.ts#languageOf@52",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#registerFunc@122",
"kind": "call",
"sourceId": "func:src/analyzer.ts#visit@245",
"targetId": "func:src/analyzer.ts#registerFunc@122",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#isFnInit@169",
"kind": "call",
"sourceId": "func:src/analyzer.ts#visit@245",
"targetId": "func:src/analyzer.ts#isFnInit@169",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#containsCall@173",
"kind": "call",
"sourceId": "func:src/analyzer.ts#visit@245",
"targetId": "func:src/analyzer.ts#containsCall@173",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#inlineName@202",
"kind": "call",
"sourceId": "func:src/analyzer.ts#visit@245",
"targetId": "func:src/analyzer.ts#inlineName@202",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#detectApiOut@382=>func:src/analyzer.ts#extractPathArg@333",
"kind": "call",
"sourceId": "func:src/analyzer.ts#detectApiOut@382",
"targetId": "func:src/analyzer.ts#extractPathArg@333",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#detectApiOut@382=>func:src/analyzer.ts#extractMethodFromOptions@341",
"kind": "call",
"sourceId": "func:src/analyzer.ts#detectApiOut@382",
"targetId": "func:src/analyzer.ts#extractMethodFromOptions@341",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#detectApiOut@382=>func:src/analyzer.ts#hostOf@352",
"kind": "call",
"sourceId": "func:src/analyzer.ts#detectApiOut@382",
"targetId": "func:src/analyzer.ts#hostOf@352",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#detectApiIn@400=>func:src/analyzer.ts#extractPathArg@333",
"kind": "call",
"sourceId": "func:src/analyzer.ts#detectApiIn@400",
"targetId": "func:src/analyzer.ts#extractPathArg@333",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#getModuleFunc@462=>func:src/scanner.ts#languageOf@52",
"kind": "call",
"sourceId": "func:src/analyzer.ts#getModuleFunc@462",
"targetId": "func:src/scanner.ts#languageOf@52",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeRelations@487=>func:src/analyzer.ts#relOf@64",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeRelations@487",
"targetId": "func:src/analyzer.ts#relOf@64",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#resolveInternalImport@548",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#resolveInternalImport@548",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#addEdge@433",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#addEdge@433",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#getModuleFunc@462",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#getModuleFunc@462",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#resolveCallTargetFuncId@440",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#resolveCallTargetFuncId@440",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#detectDb@358",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#detectDb@358",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#addInteraction@419",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#addInteraction@419",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#detectApiOut@382",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#detectApiOut@382",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#detectApiIn@400",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#detectApiIn@400",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeRelations@487=>func:src/analyzer.ts#walk@492",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeRelations@487",
"targetId": "func:src/analyzer.ts#walk@492",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#resolveInternalImport@548=>func:src/scanner.ts#toPosix@19",
"kind": "call",
"sourceId": "func:src/analyzer.ts#resolveInternalImport@548",
"targetId": "func:src/scanner.ts#toPosix@19",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/analyzer.ts#registerFile@223",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/analyzer.ts#registerFile@223",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/analyzer.ts#analyzeRelations@487",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/analyzer.ts#analyzeRelations@487",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/analyzer.ts#ensureModule@83",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/analyzer.ts#ensureModule@83",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/flows.ts#generateCallFlows@16",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/flows.ts#generateCallFlows@16",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/scanner.ts#toPosix@19",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/scanner.ts#toPosix@19",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/externals.ts#deriveExternalSystems@4",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/externals.ts#deriveExternalSystems@4",
"provenance": "resolved"
},
{
"id": "edge:import:file:src/cli.ts=>file:src/analyzer.ts",
"kind": "import",
"sourceId": "file:src/cli.ts",
"targetId": "file:src/analyzer.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:src/cli.ts#main@40=>func:src/cli.ts#parseArgs@13",
"kind": "call",
"sourceId": "func:src/cli.ts#main@40",
"targetId": "func:src/cli.ts#parseArgs@13",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/cli.ts#main@40=>func:src/analyzer.ts#analyzeProject@32",
"kind": "call",
"sourceId": "func:src/cli.ts#main@40",
"targetId": "func:src/analyzer.ts#analyzeProject@32",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/cli.ts#<module>@0=>func:src/cli.ts#main@40",
"kind": "call",
"sourceId": "func:src/cli.ts#<module>@0",
"targetId": "func:src/cli.ts#main@40",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/model/reportRepository.ts=>file:web/src/model/report.ts",
"kind": "import",
"sourceId": "file:web/src/model/reportRepository.ts",
"targetId": "file:web/src/model/report.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/model/graphModel.ts=>file:web/src/model/report.ts",
"kind": "import",
"sourceId": "file:web/src/model/graphModel.ts",
"targetId": "file:web/src/model/report.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/model/graphModel.ts#qualifierOf@24=>func:web/src/model/graphModel.ts#baseName@19",
"kind": "call",
"sourceId": "func:web/src/model/graphModel.ts#qualifierOf@24",
"targetId": "func:web/src/model/graphModel.ts#baseName@19",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/model/graphModel.ts#map() 回调@44@44=>func:web/src/model/graphModel.ts#qualifierOf@24",
"kind": "call",
"sourceId": "func:web/src/model/graphModel.ts#map() 回调@44@44",
"targetId": "func:web/src/model/graphModel.ts#qualifierOf@24",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/viewmodel/GraphViewModel.ts=>file:web/src/model/report.ts",
"kind": "import",
"sourceId": "file:web/src/viewmodel/GraphViewModel.ts",
"targetId": "file:web/src/model/report.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/viewmodel/GraphViewModel.ts=>file:web/src/model/reportRepository.ts",
"kind": "import",
"sourceId": "file:web/src/viewmodel/GraphViewModel.ts",
"targetId": "file:web/src/model/reportRepository.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/viewmodel/GraphViewModel.ts=>file:web/src/model/graphModel.ts",
"kind": "import",
"sourceId": "file:web/src/viewmodel/GraphViewModel.ts",
"targetId": "file:web/src/model/graphModel.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/viewmodel/GraphViewModel.ts=>file:web/src/services/dagreLayout.ts",
"kind": "import",
"sourceId": "file:web/src/viewmodel/GraphViewModel.ts",
"targetId": "file:web/src/services/dagreLayout.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86=>func:web/src/viewmodel/GraphViewModel.ts#baseName@34",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@34",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171=>func:web/src/model/graphModel.ts#flowToGraph@43",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171",
"targetId": "func:web/src/model/graphModel.ts#flowToGraph@43",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171=>func:web/src/services/dagreLayout.ts#computeLayout@31",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171",
"targetId": "func:web/src/services/dagreLayout.ts#computeLayout@31",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/vmContext.ts=>file:web/src/viewmodel/GraphViewModel.ts",
"kind": "import",
"sourceId": "file:web/src/view/vmContext.ts",
"targetId": "file:web/src/viewmodel/GraphViewModel.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/components/FlowNode.tsx=>file:web/src/model/report.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/FlowNode.tsx",
"targetId": "file:web/src/model/report.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40=>func:web/src/view/components/FlowNode.tsx#interactionBadges@12",
"kind": "call",
"sourceId": "func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"targetId": "func:web/src/view/components/FlowNode.tsx#interactionBadges@12",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/components/FlowGraph.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/FlowGraph.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/components/FlowGraph.tsx=>file:web/src/view/components/FlowNode.tsx",
"kind": "import",
"sourceId": "file:web/src/view/components/FlowGraph.tsx",
"targetId": "file:web/src/view/components/FlowNode.tsx",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286",
"kind": "call",
"sourceId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/components/FlowList.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/FlowList.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280",
"kind": "call",
"sourceId": "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/components/GroupList.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/GroupList.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117",
"kind": "call",
"sourceId": "func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/components/NodeDetailPanel.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/NodeDetailPanel.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/components/NodeDetailPanel.tsx=>file:web/src/model/report.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/NodeDetailPanel.tsx",
"targetId": "file:web/src/model/report.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13=>func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"kind": "call",
"sourceId": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"targetId": "func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"kind": "call",
"sourceId": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/components/SearchBar.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/SearchBar.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/components/SearchBar.tsx=>file:web/src/viewmodel/GraphViewModel.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/SearchBar.tsx",
"targetId": "file:web/src/viewmodel/GraphViewModel.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/SearchBar.tsx#activate@12=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268",
"kind": "call",
"sourceId": "func:web/src/view/components/SearchBar.tsx#activate@12",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221",
"kind": "call",
"sourceId": "func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26=>func:web/src/view/components/SearchBar.tsx#activate@12",
"kind": "call",
"sourceId": "func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"targetId": "func:web/src/view/components/SearchBar.tsx#activate@12",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221",
"kind": "call",
"sourceId": "func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41=>func:web/src/view/components/SearchBar.tsx#activate@12",
"kind": "call",
"sourceId": "func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"targetId": "func:web/src/view/components/SearchBar.tsx#activate@12",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/components/FlowGraph.tsx",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/components/FlowGraph.tsx",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/components/FlowList.tsx",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/components/FlowList.tsx",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/components/GroupList.tsx",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/components/GroupList.tsx",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/components/NodeDetailPanel.tsx",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/components/NodeDetailPanel.tsx",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/components/SearchBar.tsx",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/components/SearchBar.tsx",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/App.tsx#observer() 回调@9@9=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/App.tsx#observer() 回调@9@9",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/App.tsx#observer() 回调@9@9=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74",
"kind": "call",
"sourceId": "func:web/src/view/App.tsx#observer() 回调@9@9",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/main.tsx=>file:web/src/view/App.tsx",
"kind": "import",
"sourceId": "file:web/src/main.tsx",
"targetId": "file:web/src/view/App.tsx",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/main.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/main.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/main.tsx=>file:web/src/viewmodel/GraphViewModel.ts",
"kind": "import",
"sourceId": "file:web/src/main.tsx",
"targetId": "file:web/src/viewmodel/GraphViewModel.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/main.tsx=>file:web/src/model/reportRepository.ts",
"kind": "import",
"sourceId": "file:web/src/main.tsx",
"targetId": "file:web/src/model/reportRepository.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/main.tsx#<module>@0=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126",
"kind": "call",
"sourceId": "func:web/src/main.tsx#<module>@0",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126",
"provenance": "resolved"
}
],
"flows": [
{
"id": "flow:call:func:web/src/main.tsx#<module>@0",
"name": "<module> (web/src/main.tsx)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/main.tsx#<module>@0",
"steps": [
{
"id": "step:flow:call:func:web/src/main.tsx#<module>@0:func:web/src/main.tsx#<module>@0",
"order": 0,
"nodeId": "func:web/src/main.tsx#<module>@0",
"title": "<module>",
"nextStepIds": [
"step:flow:call:func:web/src/main.tsx#<module>@0:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126"
]
},
{
"id": "step:flow:call:func:web/src/main.tsx#<module>@0:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126",
"order": 1,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126",
"title": "GraphViewModel.load",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/main.tsx#<module>@0=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126"
],
"summary": "以 <module> 为入口的调用链,覆盖 2 个函数"
},
{
"id": "flow:call:func:src/analyzer.ts#visit@245",
"name": "visit (src/analyzer.ts)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:src/analyzer.ts#visit@245",
"steps": [
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#visit@245",
"order": 0,
"nodeId": "func:src/analyzer.ts#visit@245",
"title": "visit",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#locOf@70",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/scanner.ts#languageOf@52",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#registerFunc@122",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#isFnInit@169",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#containsCall@173",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#inlineName@202"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#locOf@70",
"order": 1,
"nodeId": "func:src/analyzer.ts#locOf@70",
"title": "locOf",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#relOf@64"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/scanner.ts#languageOf@52",
"order": 2,
"nodeId": "func:src/scanner.ts#languageOf@52",
"title": "languageOf",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#registerFunc@122",
"order": 3,
"nodeId": "func:src/analyzer.ts#registerFunc@122",
"title": "registerFunc",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#locOf@70",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#getParams@108",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/scanner.ts#languageOf@52",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#buildSignature@117"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#isFnInit@169",
"order": 4,
"nodeId": "func:src/analyzer.ts#isFnInit@169",
"title": "isFnInit",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#containsCall@173",
"order": 5,
"nodeId": "func:src/analyzer.ts#containsCall@173",
"title": "containsCall",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#inlineName@202",
"order": 6,
"nodeId": "func:src/analyzer.ts#inlineName@202",
"title": "inlineName",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#locOf@70",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#routeNameFromCall@188"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#relOf@64",
"order": 7,
"nodeId": "func:src/analyzer.ts#relOf@64",
"title": "relOf",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/scanner.ts#toPosix@19"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#getParams@108",
"order": 8,
"nodeId": "func:src/analyzer.ts#getParams@108",
"title": "getParams",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#buildSignature@117",
"order": 9,
"nodeId": "func:src/analyzer.ts#buildSignature@117",
"title": "buildSignature",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#routeNameFromCall@188",
"order": 10,
"nodeId": "func:src/analyzer.ts#routeNameFromCall@188",
"title": "routeNameFromCall",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#extractPathArg@333"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/scanner.ts#toPosix@19",
"order": 11,
"nodeId": "func:src/scanner.ts#toPosix@19",
"title": "toPosix",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#extractPathArg@333",
"order": 12,
"nodeId": "func:src/analyzer.ts#extractPathArg@333",
"title": "extractPathArg",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:src/analyzer.ts#relOf@64=>func:src/scanner.ts#toPosix@19",
"edge:call:func:src/analyzer.ts#locOf@70=>func:src/analyzer.ts#relOf@64",
"edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/analyzer.ts#locOf@70",
"edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/analyzer.ts#getParams@108",
"edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/scanner.ts#languageOf@52",
"edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/analyzer.ts#buildSignature@117",
"edge:call:func:src/analyzer.ts#routeNameFromCall@188=>func:src/analyzer.ts#extractPathArg@333",
"edge:call:func:src/analyzer.ts#inlineName@202=>func:src/analyzer.ts#locOf@70",
"edge:call:func:src/analyzer.ts#inlineName@202=>func:src/analyzer.ts#routeNameFromCall@188",
"edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#locOf@70",
"edge:call:func:src/analyzer.ts#visit@245=>func:src/scanner.ts#languageOf@52",
"edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#registerFunc@122",
"edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#isFnInit@169",
"edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#containsCall@173",
"edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#inlineName@202"
],
"summary": "以 visit 为入口的调用链,覆盖 13 个函数"
},
{
"id": "flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"name": "observer() 回调@13 (web/src/view/components/NodeDetailPanel.tsx)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"order": 0,
"nodeId": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"title": "observer() 回调@13",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/view/vmContext.ts#useGraphVM@6",
"step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211"
]
},
{
"id": "step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"order": 2,
"nodeId": "func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"title": "describeInteraction",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"order": 3,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"title": "GraphViewModel.openFlowForFunc",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13=>func:web/src/view/vmContext.ts#useGraphVM@6",
"edge:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13=>func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"edge:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211"
],
"summary": "以 observer() 回调@13 为入口的调用链,覆盖 4 个函数"
},
{
"id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171",
"name": "GraphViewModel.positionedGraph (web/src/viewmodel/GraphViewModel.ts)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171",
"steps": [
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171",
"order": 0,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171",
"title": "GraphViewModel.positionedGraph",
"nextStepIds": [
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171:func:web/src/model/graphModel.ts#flowToGraph@43",
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171:func:web/src/services/dagreLayout.ts#computeLayout@31"
]
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171:func:web/src/model/graphModel.ts#flowToGraph@43",
"order": 1,
"nodeId": "func:web/src/model/graphModel.ts#flowToGraph@43",
"title": "flowToGraph",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171:func:web/src/services/dagreLayout.ts#computeLayout@31",
"order": 2,
"nodeId": "func:web/src/services/dagreLayout.ts#computeLayout@31",
"title": "computeLayout",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171=>func:web/src/model/graphModel.ts#flowToGraph@43",
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171=>func:web/src/services/dagreLayout.ts#computeLayout@31"
],
"summary": "以 GraphViewModel.positionedGraph 为入口的调用链,覆盖 3 个函数"
},
{
"id": "flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17",
"name": "observer() 回调@17 (web/src/view/components/FlowGraph.tsx)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17",
"order": 0,
"nodeId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17",
"title": "observer() 回调@17",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17:func:web/src/view/vmContext.ts#useGraphVM@6",
"step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286"
]
},
{
"id": "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286",
"title": "GraphViewModel.selectNode",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17=>func:web/src/view/vmContext.ts#useGraphVM@6",
"edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286"
],
"summary": "以 observer() 回调@17 为入口的调用链,覆盖 3 个函数"
},
{
"id": "flow:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"name": "observer() 回调@4 (web/src/view/components/FlowList.tsx)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"order": 0,
"nodeId": "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"title": "observer() 回调@4",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4:func:web/src/view/vmContext.ts#useGraphVM@6",
"step:flow:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280"
]
},
{
"id": "step:flow:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280",
"title": "GraphViewModel.selectFlow",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4=>func:web/src/view/vmContext.ts#useGraphVM@6",
"edge:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280"
],
"summary": "以 observer() 回调@4 为入口的调用链,覆盖 3 个函数"
},
{
"id": "flow:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"name": "observer() 回调@4 (web/src/view/components/GroupList.tsx)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"order": 0,
"nodeId": "func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"title": "observer() 回调@4",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4:func:web/src/view/vmContext.ts#useGraphVM@6",
"step:flow:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117"
]
},
{
"id": "step:flow:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117",
"title": "GraphViewModel.selectGroup",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4=>func:web/src/view/vmContext.ts#useGraphVM@6",
"edge:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117"
],
"summary": "以 observer() 回调@4 为入口的调用链,覆盖 3 个函数"
},
{
"id": "flow:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"name": "observer() 回调@6 (web/src/view/components/SearchBar.tsx)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"order": 0,
"nodeId": "func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"title": "observer() 回调@6",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6:func:web/src/view/vmContext.ts#useGraphVM@6",
"step:flow:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221",
"title": "GraphViewModel.setSearchQuery",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6=>func:web/src/view/vmContext.ts#useGraphVM@6",
"edge:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221"
],
"summary": "以 observer() 回调@6 为入口的调用链,覆盖 3 个函数"
},
{
"id": "flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"name": "匿名函数@26 (web/src/view/components/SearchBar.tsx)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"order": 0,
"nodeId": "func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"title": "匿名函数@26",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/view/components/SearchBar.tsx#activate@12",
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/view/components/SearchBar.tsx#activate@12",
"order": 1,
"nodeId": "func:web/src/view/components/SearchBar.tsx#activate@12",
"title": "activate",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221",
"title": "GraphViewModel.setSearchQuery",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268",
"order": 3,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268",
"title": "GraphViewModel.activateSearchResult",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233",
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233",
"order": 4,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233",
"title": "GraphViewModel.biggestFlowForFunc",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"order": 5,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"title": "GraphViewModel.openFlowForFunc",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233",
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"edge:call:func:web/src/view/components/SearchBar.tsx#activate@12=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268",
"edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26=>func:web/src/view/components/SearchBar.tsx#activate@12",
"edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221"
],
"summary": "以 匿名函数@26 为入口的调用链,覆盖 6 个函数"
},
{
"id": "flow:call:func:web/src/view/App.tsx#observer() 回调@9@9",
"name": "observer() 回调@9 (web/src/view/App.tsx)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/view/App.tsx#observer() 回调@9@9",
"steps": [
{
"id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/view/App.tsx#observer() 回调@9@9",
"order": 0,
"nodeId": "func:web/src/view/App.tsx#observer() 回调@9@9",
"title": "observer() 回调@9",
"nextStepIds": [
"step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/view/vmContext.ts#useGraphVM@6",
"step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74"
]
},
{
"id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74",
"title": "GraphViewModel.selectReport",
"nextStepIds": [
"step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126"
]
},
{
"id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126",
"order": 3,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126",
"title": "GraphViewModel.load",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126",
"edge:call:func:web/src/view/App.tsx#observer() 回调@9@9=>func:web/src/view/vmContext.ts#useGraphVM@6",
"edge:call:func:web/src/view/App.tsx#observer() 回调@9@9=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74"
],
"summary": "以 observer() 回调@9 为入口的调用链,覆盖 4 个函数"
},
{
"id": "flow:call:func:src/flows.ts#map() 回调@72@72",
"name": "map() 回调@72 (src/flows.ts)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:src/flows.ts#map() 回调@72@72",
"steps": [
{
"id": "step:flow:call:func:src/flows.ts#map() 回调@72@72:func:src/flows.ts#map() 回调@72@72",
"order": 0,
"nodeId": "func:src/flows.ts#map() 回调@72@72",
"title": "map() 回调@72",
"nextStepIds": [
"step:flow:call:func:src/flows.ts#map() 回调@72@72:func:src/flows.ts#stepIdOf@70"
]
},
{
"id": "step:flow:call:func:src/flows.ts#map() 回调@72@72:func:src/flows.ts#stepIdOf@70",
"order": 1,
"nodeId": "func:src/flows.ts#stepIdOf@70",
"title": "stepIdOf",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:src/flows.ts#map() 回调@72@72=>func:src/flows.ts#stepIdOf@70"
],
"summary": "以 map() 回调@72 为入口的调用链,覆盖 2 个函数"
},
{
"id": "flow:call:func:src/analyzer.ts#inProject@65",
"name": "inProject (src/analyzer.ts)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:src/analyzer.ts#inProject@65",
"steps": [
{
"id": "step:flow:call:func:src/analyzer.ts#inProject@65:func:src/analyzer.ts#inProject@65",
"order": 0,
"nodeId": "func:src/analyzer.ts#inProject@65",
"title": "inProject",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#inProject@65:func:src/analyzer.ts#relOf@64"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#inProject@65:func:src/analyzer.ts#relOf@64",
"order": 1,
"nodeId": "func:src/analyzer.ts#relOf@64",
"title": "relOf",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#inProject@65:func:src/scanner.ts#toPosix@19"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#inProject@65:func:src/scanner.ts#toPosix@19",
"order": 2,
"nodeId": "func:src/scanner.ts#toPosix@19",
"title": "toPosix",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:src/analyzer.ts#relOf@64=>func:src/scanner.ts#toPosix@19",
"edge:call:func:src/analyzer.ts#inProject@65=>func:src/analyzer.ts#relOf@64"
],
"summary": "以 inProject 为入口的调用链,覆盖 3 个函数"
},
{
"id": "flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44",
"name": "map() 回调@44 (web/src/model/graphModel.ts)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/model/graphModel.ts#map() 回调@44@44",
"steps": [
{
"id": "step:flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44:func:web/src/model/graphModel.ts#map() 回调@44@44",
"order": 0,
"nodeId": "func:web/src/model/graphModel.ts#map() 回调@44@44",
"title": "map() 回调@44",
"nextStepIds": [
"step:flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44:func:web/src/model/graphModel.ts#qualifierOf@24"
]
},
{
"id": "step:flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44:func:web/src/model/graphModel.ts#qualifierOf@24",
"order": 1,
"nodeId": "func:web/src/model/graphModel.ts#qualifierOf@24",
"title": "qualifierOf",
"nextStepIds": [
"step:flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44:func:web/src/model/graphModel.ts#baseName@19"
]
},
{
"id": "step:flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44:func:web/src/model/graphModel.ts#baseName@19",
"order": 2,
"nodeId": "func:web/src/model/graphModel.ts#baseName@19",
"title": "baseName",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/model/graphModel.ts#qualifierOf@24=>func:web/src/model/graphModel.ts#baseName@19",
"edge:call:func:web/src/model/graphModel.ts#map() 回调@44@44=>func:web/src/model/graphModel.ts#qualifierOf@24"
],
"summary": "以 map() 回调@44 为入口的调用链,覆盖 3 个函数"
},
{
"id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100",
"name": "GraphViewModel.groups (web/src/viewmodel/GraphViewModel.ts)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100",
"steps": [
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100",
"order": 0,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100",
"title": "GraphViewModel.groups",
"nextStepIds": [
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86"
]
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86",
"order": 1,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86",
"title": "GraphViewModel.groupOfFlow",
"nextStepIds": [
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#baseName@34"
]
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#baseName@34",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@34",
"title": "baseName",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86=>func:web/src/viewmodel/GraphViewModel.ts#baseName@34",
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86"
],
"summary": "以 GraphViewModel.groups 为入口的调用链,覆盖 3 个函数"
},
{
"id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112",
"name": "GraphViewModel.visibleFlows (web/src/viewmodel/GraphViewModel.ts)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112",
"steps": [
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112",
"order": 0,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112",
"title": "GraphViewModel.visibleFlows",
"nextStepIds": [
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86"
]
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86",
"order": 1,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86",
"title": "GraphViewModel.groupOfFlow",
"nextStepIds": [
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#baseName@34"
]
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#baseName@34",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@34",
"title": "baseName",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86=>func:web/src/viewmodel/GraphViewModel.ts#baseName@34",
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86"
],
"summary": "以 GraphViewModel.visibleFlows 为入口的调用链,覆盖 3 个函数"
},
{
"id": "flow:call:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"name": "memo() 回调@40 (web/src/view/components/FlowNode.tsx)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"order": 0,
"nodeId": "func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"title": "memo() 回调@40",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40:func:web/src/view/components/FlowNode.tsx#interactionBadges@12"
]
},
{
"id": "step:flow:call:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40:func:web/src/view/components/FlowNode.tsx#interactionBadges@12",
"order": 1,
"nodeId": "func:web/src/view/components/FlowNode.tsx#interactionBadges@12",
"title": "interactionBadges",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40=>func:web/src/view/components/FlowNode.tsx#interactionBadges@12"
],
"summary": "以 memo() 回调@40 为入口的调用链,覆盖 2 个函数"
},
{
"id": "flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"name": "匿名函数@41 (web/src/view/components/SearchBar.tsx)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"order": 0,
"nodeId": "func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"title": "匿名函数@41",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/view/components/SearchBar.tsx#activate@12"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/view/components/SearchBar.tsx#activate@12",
"order": 1,
"nodeId": "func:web/src/view/components/SearchBar.tsx#activate@12",
"title": "activate",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268",
"title": "GraphViewModel.activateSearchResult",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233",
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233",
"order": 3,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233",
"title": "GraphViewModel.biggestFlowForFunc",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"order": 4,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"title": "GraphViewModel.openFlowForFunc",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233",
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211",
"edge:call:func:web/src/view/components/SearchBar.tsx#activate@12=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268",
"edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41=>func:web/src/view/components/SearchBar.tsx#activate@12"
],
"summary": "以 匿名函数@41 为入口的调用链,覆盖 5 个函数"
},
{
"id": "flow:call:func:src/cli.ts#<module>@0",
"name": "<module> (src/cli.ts)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:src/cli.ts#<module>@0",
"steps": [
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/cli.ts#<module>@0",
"order": 0,
"nodeId": "func:src/cli.ts#<module>@0",
"title": "<module>",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/cli.ts#main@40"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/cli.ts#main@40",
"order": 1,
"nodeId": "func:src/cli.ts#main@40",
"title": "main",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/cli.ts#parseArgs@13",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#analyzeProject@32"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/cli.ts#parseArgs@13",
"order": 2,
"nodeId": "func:src/cli.ts#parseArgs@13",
"title": "parseArgs",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#analyzeProject@32",
"order": 3,
"nodeId": "func:src/analyzer.ts#analyzeProject@32",
"title": "analyzeProject",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#collectSourceFiles@24",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#registerFile@223",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#analyzeRelations@487",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#ensureModule@83",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/flows.ts#generateCallFlows@16",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#toPosix@19",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/externals.ts#deriveExternalSystems@4"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#collectSourceFiles@24",
"order": 4,
"nodeId": "func:src/scanner.ts#collectSourceFiles@24",
"title": "collectSourceFiles",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#walk@27"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#registerFile@223",
"order": 5,
"nodeId": "func:src/analyzer.ts#registerFile@223",
"title": "registerFile",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#relOf@64",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#languageOf@52",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#toPosix@19",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#ensureModule@83"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#analyzeRelations@487",
"order": 6,
"nodeId": "func:src/analyzer.ts#analyzeRelations@487",
"title": "analyzeRelations",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#relOf@64",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#walk@492"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#ensureModule@83",
"order": 7,
"nodeId": "func:src/analyzer.ts#ensureModule@83",
"title": "ensureModule",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/flows.ts#generateCallFlows@16",
"order": 8,
"nodeId": "func:src/flows.ts#generateCallFlows@16",
"title": "generateCallFlows",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#toPosix@19",
"order": 9,
"nodeId": "func:src/scanner.ts#toPosix@19",
"title": "toPosix",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/externals.ts#deriveExternalSystems@4",
"order": 10,
"nodeId": "func:src/externals.ts#deriveExternalSystems@4",
"title": "deriveExternalSystems",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#walk@27",
"order": 11,
"nodeId": "func:src/scanner.ts#walk@27",
"title": "walk",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#relOf@64",
"order": 12,
"nodeId": "func:src/analyzer.ts#relOf@64",
"title": "relOf",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#toPosix@19"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#languageOf@52",
"order": 13,
"nodeId": "func:src/scanner.ts#languageOf@52",
"title": "languageOf",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#walk@492",
"order": 14,
"nodeId": "func:src/analyzer.ts#walk@492",
"title": "walk",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#resolveInternalImport@548",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#addEdge@433",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#getModuleFunc@462",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#resolveCallTargetFuncId@440",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#detectDb@358",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#addInteraction@419",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#detectApiOut@382",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#detectApiIn@400"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#resolveInternalImport@548",
"order": 15,
"nodeId": "func:src/analyzer.ts#resolveInternalImport@548",
"title": "resolveInternalImport",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#toPosix@19"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#addEdge@433",
"order": 16,
"nodeId": "func:src/analyzer.ts#addEdge@433",
"title": "addEdge",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#getModuleFunc@462",
"order": 17,
"nodeId": "func:src/analyzer.ts#getModuleFunc@462",
"title": "getModuleFunc",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#languageOf@52"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#resolveCallTargetFuncId@440",
"order": 18,
"nodeId": "func:src/analyzer.ts#resolveCallTargetFuncId@440",
"title": "resolveCallTargetFuncId",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#detectDb@358",
"order": 19,
"nodeId": "func:src/analyzer.ts#detectDb@358",
"title": "detectDb",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#addInteraction@419",
"order": 20,
"nodeId": "func:src/analyzer.ts#addInteraction@419",
"title": "addInteraction",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#detectApiOut@382",
"order": 21,
"nodeId": "func:src/analyzer.ts#detectApiOut@382",
"title": "detectApiOut",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#extractPathArg@333",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#extractMethodFromOptions@341",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#hostOf@352"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#detectApiIn@400",
"order": 22,
"nodeId": "func:src/analyzer.ts#detectApiIn@400",
"title": "detectApiIn",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#extractPathArg@333"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#extractPathArg@333",
"order": 23,
"nodeId": "func:src/analyzer.ts#extractPathArg@333",
"title": "extractPathArg",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#extractMethodFromOptions@341",
"order": 24,
"nodeId": "func:src/analyzer.ts#extractMethodFromOptions@341",
"title": "extractMethodFromOptions",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#hostOf@352",
"order": 25,
"nodeId": "func:src/analyzer.ts#hostOf@352",
"title": "hostOf",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:src/scanner.ts#collectSourceFiles@24=>func:src/scanner.ts#walk@27",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/scanner.ts#collectSourceFiles@24",
"edge:call:func:src/analyzer.ts#relOf@64=>func:src/scanner.ts#toPosix@19",
"edge:call:func:src/analyzer.ts#registerFile@223=>func:src/analyzer.ts#relOf@64",
"edge:call:func:src/analyzer.ts#registerFile@223=>func:src/scanner.ts#languageOf@52",
"edge:call:func:src/analyzer.ts#registerFile@223=>func:src/scanner.ts#toPosix@19",
"edge:call:func:src/analyzer.ts#registerFile@223=>func:src/analyzer.ts#ensureModule@83",
"edge:call:func:src/analyzer.ts#detectApiOut@382=>func:src/analyzer.ts#extractPathArg@333",
"edge:call:func:src/analyzer.ts#detectApiOut@382=>func:src/analyzer.ts#extractMethodFromOptions@341",
"edge:call:func:src/analyzer.ts#detectApiOut@382=>func:src/analyzer.ts#hostOf@352",
"edge:call:func:src/analyzer.ts#detectApiIn@400=>func:src/analyzer.ts#extractPathArg@333",
"edge:call:func:src/analyzer.ts#getModuleFunc@462=>func:src/scanner.ts#languageOf@52",
"edge:call:func:src/analyzer.ts#analyzeRelations@487=>func:src/analyzer.ts#relOf@64",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#resolveInternalImport@548",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#addEdge@433",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#getModuleFunc@462",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#resolveCallTargetFuncId@440",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#detectDb@358",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#addInteraction@419",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#detectApiOut@382",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#detectApiIn@400",
"edge:call:func:src/analyzer.ts#analyzeRelations@487=>func:src/analyzer.ts#walk@492",
"edge:call:func:src/analyzer.ts#resolveInternalImport@548=>func:src/scanner.ts#toPosix@19",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/analyzer.ts#registerFile@223",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/analyzer.ts#analyzeRelations@487",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/analyzer.ts#ensureModule@83",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/flows.ts#generateCallFlows@16",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/scanner.ts#toPosix@19",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/externals.ts#deriveExternalSystems@4",
"edge:call:func:src/cli.ts#main@40=>func:src/cli.ts#parseArgs@13",
"edge:call:func:src/cli.ts#main@40=>func:src/analyzer.ts#analyzeProject@32",
"edge:call:func:src/cli.ts#<module>@0=>func:src/cli.ts#main@40"
],
"summary": "以 <module> 为入口的调用链,覆盖 26 个函数"
}
],
"externalSystems": []
}