{ "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#@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#@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#@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#@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#@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#@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#@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#@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#@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#@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#@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): Flow[]", "params": [ { "name": "functions", "typeRef": "Func[]", "optional": false }, { "name": "edges", "typeRef": "Edge[]", "optional": false }, { "name": "options", "typeRef": "Partial", "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", "params": [], "returnType": "Promise", "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", "params": [ { "name": "nodes", "typeRef": "LayoutNodeInput[]", "optional": false }, { "name": "edges", "typeRef": "LayoutEdgeInput[]", "optional": false }, { "name": "options", "typeRef": "LayoutOptions", "optional": true, "defaultValue": "{}" } ], "returnType": "Map", "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", "params": [], "returnType": "Promise", "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", "params": [], "returnType": "Set", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0=>func:src/cli.ts#main@40", "kind": "call", "sourceId": "func:src/cli.ts#@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#@0=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", "kind": "call", "sourceId": "func:web/src/main.tsx#@0", "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", "provenance": "resolved" } ], "flows": [ { "id": "flow:call:func:web/src/main.tsx#@0", "name": " (web/src/main.tsx)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:web/src/main.tsx#@0", "steps": [ { "id": "step:flow:call:func:web/src/main.tsx#@0:func:web/src/main.tsx#@0", "order": 0, "nodeId": "func:web/src/main.tsx#@0", "title": "", "nextStepIds": [ "step:flow:call:func:web/src/main.tsx#@0:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126" ] }, { "id": "step:flow:call:func:web/src/main.tsx#@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#@0=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126" ], "summary": "以 为入口的调用链,覆盖 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#@0", "name": " (src/cli.ts)", "flowType": "call", "provenance": "resolved", "entryNodeId": "func:src/cli.ts#@0", "steps": [ { "id": "step:flow:call:func:src/cli.ts#@0:func:src/cli.ts#@0", "order": 0, "nodeId": "func:src/cli.ts#@0", "title": "", "nextStepIds": [ "step:flow:call:func:src/cli.ts#@0:func:src/cli.ts#main@40" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@0:func:src/cli.ts#parseArgs@13", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#analyzeProject@32" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@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#@0:func:src/scanner.ts#collectSourceFiles@24", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#registerFile@223", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#analyzeRelations@487", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#ensureModule@83", "step:flow:call:func:src/cli.ts#@0:func:src/flows.ts#generateCallFlows@16", "step:flow:call:func:src/cli.ts#@0:func:src/scanner.ts#toPosix@19", "step:flow:call:func:src/cli.ts#@0:func:src/externals.ts#deriveExternalSystems@4" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@0:func:src/scanner.ts#walk@27" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@0:func:src/analyzer.ts#relOf@64", "step:flow:call:func:src/cli.ts#@0:func:src/scanner.ts#languageOf@52", "step:flow:call:func:src/cli.ts#@0:func:src/scanner.ts#toPosix@19", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#ensureModule@83" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@0:func:src/analyzer.ts#relOf@64", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#walk@492" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@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#@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#@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#@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#@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#@0:func:src/scanner.ts#toPosix@19" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@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#@0:func:src/analyzer.ts#resolveInternalImport@548", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#addEdge@433", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#getModuleFunc@462", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#resolveCallTargetFuncId@440", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#detectDb@358", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#addInteraction@419", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#detectApiOut@382", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#detectApiIn@400" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@0:func:src/scanner.ts#toPosix@19" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@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#@0:func:src/scanner.ts#languageOf@52" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@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#@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#@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#@0:func:src/analyzer.ts#extractPathArg@333", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#extractMethodFromOptions@341", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#hostOf@352" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@0:func:src/analyzer.ts#extractPathArg@333" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@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#@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#@0=>func:src/cli.ts#main@40" ], "summary": "以 为入口的调用链,覆盖 26 个函数" } ], "externalSystems": [] }