@saptools/service-flow 0.1.56 → 0.1.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/{chunk-Y7H7ZU5B.js → chunk-CRSSXWQ2.js} +226 -23
- package/dist/chunk-CRSSXWQ2.js.map +1 -0
- package/dist/cli.js +14 -8
- package/dist/cli.js.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/db/repositories.ts +77 -22
- package/src/linker/003-package-import-symbol-resolver.ts +195 -0
- package/src/linker/cross-repo-linker.ts +2 -0
- package/src/parsers/symbol-parser.ts +12 -6
- package/dist/chunk-Y7H7ZU5B.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
trace,
|
|
36
36
|
upsertRepository,
|
|
37
37
|
upsertWorkspace
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-CRSSXWQ2.js";
|
|
39
39
|
|
|
40
40
|
// src/cli.ts
|
|
41
41
|
import { Command } from "commander";
|
|
@@ -237,7 +237,7 @@ function migrate(db) {
|
|
|
237
237
|
// package.json
|
|
238
238
|
var package_default = {
|
|
239
239
|
name: "@saptools/service-flow",
|
|
240
|
-
version: "0.1.
|
|
240
|
+
version: "0.1.58",
|
|
241
241
|
description: "Trace SAP CAP service-to-service flows across multi-repository workspaces with runtime-aware graph resolution",
|
|
242
242
|
type: "module",
|
|
243
243
|
publishConfig: {
|
|
@@ -654,6 +654,7 @@ async function parseExecutableSymbols(repoPath, filePath, context) {
|
|
|
654
654
|
const symbols = [];
|
|
655
655
|
const calls = [];
|
|
656
656
|
const imports = /* @__PURE__ */ new Map();
|
|
657
|
+
const namespaceImports = /* @__PURE__ */ new Set();
|
|
657
658
|
const exportNames = exportDeclarations(source);
|
|
658
659
|
const objectExports = /* @__PURE__ */ new Set();
|
|
659
660
|
const exportedClasses = /* @__PURE__ */ new Set();
|
|
@@ -684,7 +685,10 @@ async function parseExecutableSymbols(repoPath, filePath, context) {
|
|
|
684
685
|
if (clause?.name) imports.set(clause.name.text, sourceText);
|
|
685
686
|
const named = clause?.namedBindings;
|
|
686
687
|
if (named && ts.isNamedImports(named)) for (const el of named.elements) imports.set(el.name.text, sourceText);
|
|
687
|
-
if (named && ts.isNamespaceImport(named))
|
|
688
|
+
if (named && ts.isNamespaceImport(named)) {
|
|
689
|
+
imports.set(named.name.text, sourceText);
|
|
690
|
+
namespaceImports.add(named.name.text);
|
|
691
|
+
}
|
|
688
692
|
}
|
|
689
693
|
if (ts.isVariableStatement(node)) {
|
|
690
694
|
for (const declaration of node.declarationList.declarations) {
|
|
@@ -800,7 +804,9 @@ async function parseExecutableSymbols(repoPath, filePath, context) {
|
|
|
800
804
|
const instance = (callee.local ? classInstances.get(callee.local) : void 0) ?? (callee.receiver ? classInstances.get(callee.receiver) : void 0);
|
|
801
805
|
const importSource = instance?.importSource ?? proxy?.importSource ?? (callee.local ? imports.get(callee.local) : void 0) ?? (callee.member && callee.local ? imports.get(callee.local) : void 0);
|
|
802
806
|
const directThisMethod = callee.receiver === "this";
|
|
803
|
-
const
|
|
807
|
+
const namespaceMember = Boolean(callee.member && callee.local && namespaceImports.has(callee.local));
|
|
808
|
+
const packageImport = Boolean(importSource && !isRelativeImport(importSource));
|
|
809
|
+
const targetName = instance && callee.member ? `${instance.className}.${callee.member}` : proxy && callee.member ? callee.member : directThisMethod ? callee.member : namespaceMember ? callee.member : packageImport ? callee.member ?? callee.local : callee.member && callee.local ? `${callee.local}.${callee.member}` : callee.local;
|
|
804
810
|
const className = caller.qualifiedName.includes(".") ? caller.qualifiedName.split(".")[0] : void 0;
|
|
805
811
|
const thisTarget = directThisMethod && className && callee.member ? `${className}.${callee.member}` : void 0;
|
|
806
812
|
const loggerLike = callee.receiver?.endsWith(".logger") || callee.local === "logger" || (callee.expression.startsWith("this.logger.") && callee.member ? loggerMembers.has(callee.member) : false);
|
|
@@ -809,11 +815,11 @@ async function parseExecutableSymbols(repoPath, filePath, context) {
|
|
|
809
815
|
const provenThisMethod = Boolean(thisTarget && localCallables.has(thisTarget));
|
|
810
816
|
const provenRelativeImport = Boolean(isRelativeImport(importSource) && targetName);
|
|
811
817
|
const provenClassInstance = Boolean(instance && callee.member && targetName);
|
|
812
|
-
const
|
|
813
|
-
const ignored = loggerLike || terminalMember ||
|
|
818
|
+
const provenPackageImport = Boolean(packageImport && targetName);
|
|
819
|
+
const ignored = loggerLike || terminalMember || ignoredFrameworkCall(callee);
|
|
814
820
|
const resolvedTarget = provenThisMethod ? thisTarget : targetName;
|
|
815
|
-
const keep = Boolean(resolvedTarget) && !ignored && (provenLocal || provenThisMethod || provenRelativeImport || provenClassInstance);
|
|
816
|
-
if (keep) calls.push({ callerQualifiedName: caller.qualifiedName, calleeExpression: callee.expression, calleeLocalName: resolvedTarget, receiverLocalName: callee.member ? callee.local ?? callee.receiver : void 0, importSource, sourceFile, sourceLine: line, evidence: { relation: instance ? "class_instance_method" : proxy ? "relative_import_proxy_member" : importSource ? "relative_import" : provenThisMethod ? "indexed_this_method" : "indexed_local_symbol", caller: caller.qualifiedName, targetName: resolvedTarget, instanceVariable: instance ? instance.propertyName ?? callee.local : void 0, className: instance?.className, methodName: instance ? callee.member : void 0, classImportSource: instance?.importSource, callArguments: argumentEvidence(node.arguments, source), proxyVariableName: proxy?.variableName, factory: proxy?.factory, factoryExpression: proxy?.factory, factoryImportSource: proxy?.importSource, candidateStrategy: instance ? instance.importSource ? "relative_import_class_instance_method" : "same_file_class_instance_method" : proxy ? "proxy_member_exact_export_or_unique_member" : void 0 } });
|
|
821
|
+
const keep = Boolean(resolvedTarget) && !ignored && (provenLocal || provenThisMethod || provenRelativeImport || provenClassInstance || provenPackageImport);
|
|
822
|
+
if (keep) calls.push({ callerQualifiedName: caller.qualifiedName, calleeExpression: callee.expression, calleeLocalName: resolvedTarget, receiverLocalName: callee.member ? callee.local ?? callee.receiver : void 0, importSource, sourceFile, sourceLine: line, evidence: { relation: instance ? "class_instance_method" : proxy ? "relative_import_proxy_member" : packageImport ? "package_import" : namespaceMember ? "relative_import_namespace_member" : importSource ? "relative_import" : provenThisMethod ? "indexed_this_method" : "indexed_local_symbol", caller: caller.qualifiedName, targetName: resolvedTarget, instanceVariable: instance ? instance.propertyName ?? callee.local : void 0, className: instance?.className, methodName: instance ? callee.member : void 0, classImportSource: instance?.importSource, callArguments: argumentEvidence(node.arguments, source), proxyVariableName: proxy?.variableName, factory: proxy?.factory, factoryExpression: proxy?.factory, factoryImportSource: proxy?.importSource, candidateStrategy: instance ? instance.importSource ? "relative_import_class_instance_method" : "same_file_class_instance_method" : proxy ? "proxy_member_exact_export_or_unique_member" : void 0 } });
|
|
817
823
|
}
|
|
818
824
|
}
|
|
819
825
|
ts.forEachChild(node, visitCalls);
|