@saptools/service-flow 0.1.55 → 0.1.57

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/dist/cli.js CHANGED
@@ -35,7 +35,7 @@ import {
35
35
  trace,
36
36
  upsertRepository,
37
37
  upsertWorkspace
38
- } from "./chunk-GXYVIHJ5.js";
38
+ } from "./chunk-DCOFNDKS.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.55",
240
+ version: "0.1.57",
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)) imports.set(named.name.text, sourceText);
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 targetName = instance && callee.member ? `${instance.className}.${callee.member}` : proxy && callee.member ? callee.member : directThisMethod ? callee.member : callee.member && callee.local ? `${callee.local}.${callee.member}` : callee.local;
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 importedFromPackage = Boolean(importSource && !isRelativeImport(importSource));
813
- const ignored = loggerLike || terminalMember || importedFromPackage || ignoredFrameworkCall(callee);
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);