@ryanstark24/sfgraph-core 1.1.0 → 1.1.3

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.
Files changed (112) hide show
  1. package/dist/analyze/__tests__/audit-graph.test.d.ts +2 -0
  2. package/dist/analyze/__tests__/audit-graph.test.d.ts.map +1 -0
  3. package/dist/analyze/__tests__/audit-graph.test.js +122 -0
  4. package/dist/analyze/__tests__/audit-graph.test.js.map +1 -0
  5. package/dist/analyze/audit-graph.d.ts +48 -0
  6. package/dist/analyze/audit-graph.d.ts.map +1 -0
  7. package/dist/analyze/audit-graph.js +50 -0
  8. package/dist/analyze/audit-graph.js.map +1 -0
  9. package/dist/analyze/index.d.ts +1 -0
  10. package/dist/analyze/index.d.ts.map +1 -1
  11. package/dist/analyze/index.js +1 -0
  12. package/dist/analyze/index.js.map +1 -1
  13. package/dist/domain/rel-types.d.ts +7 -0
  14. package/dist/domain/rel-types.d.ts.map +1 -1
  15. package/dist/domain/rel-types.js +7 -0
  16. package/dist/domain/rel-types.js.map +1 -1
  17. package/dist/extractors/live-org/__tests__/rate-limit.test.js +46 -1
  18. package/dist/extractors/live-org/__tests__/rate-limit.test.js.map +1 -1
  19. package/dist/extractors/live-org/capabilities.d.ts.map +1 -1
  20. package/dist/extractors/live-org/capabilities.js +21 -3
  21. package/dist/extractors/live-org/capabilities.js.map +1 -1
  22. package/dist/extractors/live-org/discovery.d.ts.map +1 -1
  23. package/dist/extractors/live-org/discovery.js +2 -4
  24. package/dist/extractors/live-org/discovery.js.map +1 -1
  25. package/dist/extractors/live-org/extractors/apex.d.ts.map +1 -1
  26. package/dist/extractors/live-org/extractors/apex.js +4 -4
  27. package/dist/extractors/live-org/extractors/apex.js.map +1 -1
  28. package/dist/extractors/live-org/extractors/generic-sobject.d.ts.map +1 -1
  29. package/dist/extractors/live-org/extractors/generic-sobject.js +2 -2
  30. package/dist/extractors/live-org/extractors/generic-sobject.js.map +1 -1
  31. package/dist/extractors/live-org/extractors/lwc.d.ts.map +1 -1
  32. package/dist/extractors/live-org/extractors/lwc.js +3 -3
  33. package/dist/extractors/live-org/extractors/lwc.js.map +1 -1
  34. package/dist/extractors/live-org/extractors/object.d.ts.map +1 -1
  35. package/dist/extractors/live-org/extractors/object.js +4 -4
  36. package/dist/extractors/live-org/extractors/object.js.map +1 -1
  37. package/dist/extractors/live-org/extractors/omnistudio.d.ts.map +1 -1
  38. package/dist/extractors/live-org/extractors/omnistudio.js +3 -3
  39. package/dist/extractors/live-org/extractors/omnistudio.js.map +1 -1
  40. package/dist/extractors/live-org/rate-limit.d.ts +18 -11
  41. package/dist/extractors/live-org/rate-limit.d.ts.map +1 -1
  42. package/dist/extractors/live-org/rate-limit.js +51 -19
  43. package/dist/extractors/live-org/rate-limit.js.map +1 -1
  44. package/dist/extractors/live-org/source-member.d.ts.map +1 -1
  45. package/dist/extractors/live-org/source-member.js +3 -3
  46. package/dist/extractors/live-org/source-member.js.map +1 -1
  47. package/dist/extractors/live-org/vlocity/runner.d.ts.map +1 -1
  48. package/dist/extractors/live-org/vlocity/runner.js +71 -38
  49. package/dist/extractors/live-org/vlocity/runner.js.map +1 -1
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +2 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/ingest/__tests__/multi-org-orchestrator.test.js +4 -0
  55. package/dist/ingest/__tests__/multi-org-orchestrator.test.js.map +1 -1
  56. package/dist/ingest/live-ingest.d.ts +16 -0
  57. package/dist/ingest/live-ingest.d.ts.map +1 -1
  58. package/dist/ingest/live-ingest.js +93 -0
  59. package/dist/ingest/live-ingest.js.map +1 -1
  60. package/dist/parsers/__tests__/lwc-bindings.test.d.ts +2 -0
  61. package/dist/parsers/__tests__/lwc-bindings.test.d.ts.map +1 -0
  62. package/dist/parsers/__tests__/lwc-bindings.test.js +74 -0
  63. package/dist/parsers/__tests__/lwc-bindings.test.js.map +1 -0
  64. package/dist/parsers/apex/__tests__/arity-resolver.test.d.ts +2 -0
  65. package/dist/parsers/apex/__tests__/arity-resolver.test.d.ts.map +1 -0
  66. package/dist/parsers/apex/__tests__/arity-resolver.test.js +135 -0
  67. package/dist/parsers/apex/__tests__/arity-resolver.test.js.map +1 -0
  68. package/dist/parsers/apex/__tests__/ast-extractor.test.d.ts +2 -0
  69. package/dist/parsers/apex/__tests__/ast-extractor.test.d.ts.map +1 -0
  70. package/dist/parsers/apex/__tests__/ast-extractor.test.js +146 -0
  71. package/dist/parsers/apex/__tests__/ast-extractor.test.js.map +1 -0
  72. package/dist/parsers/apex/arity-resolver.d.ts +42 -0
  73. package/dist/parsers/apex/arity-resolver.d.ts.map +1 -0
  74. package/dist/parsers/apex/arity-resolver.js +111 -0
  75. package/dist/parsers/apex/arity-resolver.js.map +1 -0
  76. package/dist/parsers/apex/ast-extractor.d.ts +42 -0
  77. package/dist/parsers/apex/ast-extractor.d.ts.map +1 -0
  78. package/dist/parsers/apex/ast-extractor.js +402 -0
  79. package/dist/parsers/apex/ast-extractor.js.map +1 -0
  80. package/dist/parsers/apex/class.d.ts.map +1 -1
  81. package/dist/parsers/apex/class.js +56 -2
  82. package/dist/parsers/apex/class.js.map +1 -1
  83. package/dist/parsers/flow/__tests__/invocable-resolver.test.d.ts +2 -0
  84. package/dist/parsers/flow/__tests__/invocable-resolver.test.d.ts.map +1 -0
  85. package/dist/parsers/flow/__tests__/invocable-resolver.test.js +91 -0
  86. package/dist/parsers/flow/__tests__/invocable-resolver.test.js.map +1 -0
  87. package/dist/parsers/flow/invocable-resolver.d.ts +30 -0
  88. package/dist/parsers/flow/invocable-resolver.d.ts.map +1 -0
  89. package/dist/parsers/flow/invocable-resolver.js +67 -0
  90. package/dist/parsers/flow/invocable-resolver.js.map +1 -0
  91. package/dist/parsers/index.d.ts +2 -0
  92. package/dist/parsers/index.d.ts.map +1 -1
  93. package/dist/parsers/index.js +2 -0
  94. package/dist/parsers/index.js.map +1 -1
  95. package/dist/parsers/lwc/bundle.d.ts.map +1 -1
  96. package/dist/parsers/lwc/bundle.js +19 -4
  97. package/dist/parsers/lwc/bundle.js.map +1 -1
  98. package/dist/parsers/lwc/html-visitor.d.ts +2 -1
  99. package/dist/parsers/lwc/html-visitor.d.ts.map +1 -1
  100. package/dist/parsers/lwc/html-visitor.js +67 -3
  101. package/dist/parsers/lwc/html-visitor.js.map +1 -1
  102. package/dist/parsers/lwc/js-visitor.d.ts +22 -0
  103. package/dist/parsers/lwc/js-visitor.d.ts.map +1 -1
  104. package/dist/parsers/lwc/js-visitor.js +86 -2
  105. package/dist/parsers/lwc/js-visitor.js.map +1 -1
  106. package/dist/storage/interfaces.d.ts +9 -0
  107. package/dist/storage/interfaces.d.ts.map +1 -1
  108. package/dist/storage/sqlite/graph-store.d.ts +10 -0
  109. package/dist/storage/sqlite/graph-store.d.ts.map +1 -1
  110. package/dist/storage/sqlite/graph-store.js +56 -0
  111. package/dist/storage/sqlite/graph-store.js.map +1 -1
  112. package/package.json +2 -2
@@ -0,0 +1,146 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { extractFromAst } from "../ast-extractor.js";
3
+ import { makeTestCtx } from "../../__tests__/_harness.js";
4
+ async function parse(source) {
5
+ const apex = await import("apex-parser");
6
+ const { ApexLexer, ApexParser, CommonTokenStream, CaseInsensitiveInputStream, ThrowingErrorListener, } = apex;
7
+ const input = new CaseInsensitiveInputStream("test.cls", source);
8
+ const lexer = new ApexLexer(input);
9
+ lexer.removeErrorListeners();
10
+ lexer.addErrorListener(new ThrowingErrorListener());
11
+ const tokens = new CommonTokenStream(lexer);
12
+ const parser = new ApexParser(tokens);
13
+ parser.removeErrorListeners();
14
+ parser.addErrorListener(new ThrowingErrorListener());
15
+ return parser.compilationUnit();
16
+ }
17
+ function dstSet(edges, rel, all) {
18
+ const filtered = rel ? (all ?? edges).filter((e) => e.relType === rel) : edges;
19
+ return filtered.map((e) => String(e.dstQualifiedName)).sort();
20
+ }
21
+ describe("extractFromAst", () => {
22
+ it("captures SOQL FROM and SELECT-list field reads", async () => {
23
+ const src = `
24
+ public class Foo {
25
+ public void run() {
26
+ List<Account> accs = [SELECT Id, Name, Phone FROM Account];
27
+ }
28
+ }
29
+ `;
30
+ const tree = await parse(src);
31
+ const out = extractFromAst(tree, {
32
+ ctx: makeTestCtx(),
33
+ classQname: "ApexClass:Foo",
34
+ effectiveName: "Foo",
35
+ namespace: null,
36
+ });
37
+ expect(out.edges.some((e) => e.relType === "EXECUTES_SOQL" && e.dstQualifiedName === "CustomObject:Account")).toBe(true);
38
+ const reads = out.edges.filter((e) => e.relType === "READS_FIELD").map((e) => String(e.dstQualifiedName)).sort();
39
+ expect(reads).toEqual([
40
+ "CustomField:Account.Id",
41
+ "CustomField:Account.Name",
42
+ "CustomField:Account.Phone",
43
+ ]);
44
+ });
45
+ it("captures dotted field access via local-variable type inference", async () => {
46
+ const src = `
47
+ public class Bar {
48
+ public void run() {
49
+ Account a = new Account();
50
+ String n = a.Name;
51
+ }
52
+ }
53
+ `;
54
+ const tree = await parse(src);
55
+ const out = extractFromAst(tree, {
56
+ ctx: makeTestCtx(),
57
+ classQname: "ApexClass:Bar",
58
+ effectiveName: "Bar",
59
+ namespace: null,
60
+ });
61
+ expect(out.edges.some((e) => e.relType === "READS_FIELD" && e.dstQualifiedName === "CustomField:Account.Name")).toBe(true);
62
+ // INSTANCE_OF for new Account()
63
+ expect(out.edges.some((e) => e.relType === "INSTANCE_OF" && e.dstQualifiedName === "ApexClass:Account")).toBe(true);
64
+ });
65
+ it("captures method calls with real arity", async () => {
66
+ const src = `
67
+ public class Caller {
68
+ public void run() {
69
+ MyService.doIt(1, 'two', null);
70
+ MyService.doIt();
71
+ }
72
+ }
73
+ `;
74
+ const tree = await parse(src);
75
+ const out = extractFromAst(tree, {
76
+ ctx: makeTestCtx(),
77
+ classQname: "ApexClass:Caller",
78
+ effectiveName: "Caller",
79
+ namespace: null,
80
+ });
81
+ const calls = out.edges.filter((e) => e.relType === "CALLS").map((e) => String(e.dstQualifiedName)).sort();
82
+ expect(calls).toContain("ApexMethod:MyService.doIt(0)");
83
+ expect(calls).toContain("ApexMethod:MyService.doIt(3)");
84
+ // None should still have the (?) arity placeholder.
85
+ for (const c of calls)
86
+ expect(c).not.toMatch(/\(\?\)$/);
87
+ });
88
+ it("infers sObject type for for-each loop variables", async () => {
89
+ const src = `
90
+ public class Loop {
91
+ public void run() {
92
+ for (Account a : [SELECT Id, Name FROM Account]) {
93
+ String s = a.Name;
94
+ }
95
+ }
96
+ }
97
+ `;
98
+ const tree = await parse(src);
99
+ const out = extractFromAst(tree, {
100
+ ctx: makeTestCtx(),
101
+ classQname: "ApexClass:Loop",
102
+ effectiveName: "Loop",
103
+ namespace: null,
104
+ });
105
+ // Both SOQL select-list AND dotted access produce Account.Name reads.
106
+ const accNameReads = out.edges.filter((e) => e.relType === "READS_FIELD" && e.dstQualifiedName === "CustomField:Account.Name");
107
+ expect(accNameReads.length).toBeGreaterThanOrEqual(1);
108
+ });
109
+ it("emits EXECUTES_DML and resolves target sObject when known", async () => {
110
+ const src = `
111
+ public class Writer {
112
+ public void run() {
113
+ Account a = new Account(Name = 'X');
114
+ insert a;
115
+ }
116
+ }
117
+ `;
118
+ const tree = await parse(src);
119
+ const out = extractFromAst(tree, {
120
+ ctx: makeTestCtx(),
121
+ classQname: "ApexClass:Writer",
122
+ effectiveName: "Writer",
123
+ namespace: null,
124
+ });
125
+ const dml = out.edges.filter((e) => e.relType === "EXECUTES_DML");
126
+ expect(dml.length).toBe(1);
127
+ expect(dml[0].attributes.targetSObject).toBe("Account");
128
+ expect(out.edges.some((e) => e.relType === "WRITES_FIELD" && e.dstQualifiedName === "CustomObject:Account")).toBe(true);
129
+ });
130
+ it("captures extends and implements declarations", async () => {
131
+ const src = `
132
+ public class Child extends Parent implements MyIface, Other {}
133
+ `;
134
+ const tree = await parse(src);
135
+ const out = extractFromAst(tree, {
136
+ ctx: makeTestCtx(),
137
+ classQname: "ApexClass:Child",
138
+ effectiveName: "Child",
139
+ namespace: null,
140
+ });
141
+ expect(out.edges.some((e) => e.relType === "EXTENDS" && e.dstQualifiedName === "ApexClass:Parent")).toBe(true);
142
+ const impls = out.edges.filter((e) => e.relType === "IMPLEMENTS").map((e) => String(e.dstQualifiedName)).sort();
143
+ expect(impls).toEqual(["ApexInterface:MyIface", "ApexInterface:Other"]);
144
+ });
145
+ });
146
+ //# sourceMappingURL=ast-extractor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-extractor.test.js","sourceRoot":"","sources":["../../../../src/parsers/apex/__tests__/ast-extractor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,KAAK,UAAU,KAAK,CAAC,MAAc;IACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,EACJ,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,qBAAqB,GACtB,GAAG,IAAW,CAAC;IAChB,MAAM,KAAK,GAAG,IAAI,0BAA0B,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;IACnC,KAAK,CAAC,oBAAoB,EAAE,CAAC;IAC7B,KAAK,CAAC,gBAAgB,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAC9B,MAAM,CAAC,gBAAgB,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,eAAe,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,MAAM,CAAC,KAAqC,EAAE,GAAY,EAAE,GAAW;IAC9E,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACpF,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACrE,CAAC;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,GAAG,GAAG;;;;;;KAMX,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE;YAC/B,GAAG,EAAE,WAAW,EAAE;YAClB,UAAU,EAAE,eAAe;YAC3B,aAAa,EAAE,KAAK;YACpB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,eAAe,IAAI,CAAC,CAAC,gBAAgB,KAAK,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9H,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3H,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YACpB,wBAAwB;YACxB,0BAA0B;YAC1B,2BAA2B;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,GAAG,GAAG;;;;;;;KAOX,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE;YAC/B,GAAG,EAAE,WAAW,EAAE;YAClB,UAAU,EAAE,eAAe;YAC3B,aAAa,EAAE,KAAK;YACpB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAC/B,CAAC,CAAC,OAAO,KAAK,aAAa,IAAI,CAAC,CAAC,gBAAgB,KAAK,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChG,gCAAgC;QAChC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAC/B,CAAC,CAAC,OAAO,KAAK,aAAa,IAAI,CAAC,CAAC,gBAAgB,KAAK,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,GAAG,GAAG;;;;;;;KAOX,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE;YAC/B,GAAG,EAAE,WAAW,EAAE;YAClB,UAAU,EAAE,kBAAkB;YAC9B,aAAa,EAAE,QAAQ;YACvB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrH,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACxD,oDAAoD;QACpD,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,GAAG,GAAG;;;;;;;;KAQX,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE;YAC/B,GAAG,EAAE,WAAW,EAAE;YAClB,UAAU,EAAE,gBAAgB;YAC5B,aAAa,EAAE,MAAM;YACrB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,sEAAsE;QACtE,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CACnC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,aAAa,IAAI,CAAC,CAAC,gBAAgB,KAAK,0BAA0B,CAC7F,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,GAAG,GAAG;;;;;;;KAOX,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE;YAC/B,GAAG,EAAE,WAAW,EAAE;YAClB,UAAU,EAAE,kBAAkB;YAC9B,aAAa,EAAE,QAAQ;YACvB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,cAAc,CAAC,CAAC;QACvE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAE,GAAG,CAAC,CAAC,CAAS,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAC/B,CAAC,CAAC,OAAO,KAAK,cAAc,IAAI,CAAC,CAAC,gBAAgB,KAAK,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,GAAG,GAAG;;KAEX,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE;YAC/B,GAAG,EAAE,WAAW,EAAE;YAClB,UAAU,EAAE,iBAAiB;YAC7B,aAAa,EAAE,OAAO;YACtB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,gBAAgB,KAAK,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpH,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1H,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { OrgId } from "@ryanstark24/sfgraph-shared";
2
+ import type { GraphStore } from "../../storage/interfaces.js";
3
+ import type { ParseContext } from "../contract.js";
4
+ /**
5
+ * Rewrites Apex CALLS edges whose `dst` is `ApexMethod:Class.name(?)` —
6
+ * a placeholder emitted at parse time because the regex-based extractor
7
+ * can't determine arity from the call site — by matching against real
8
+ * `ApexMethod` nodes in the graph and emitting edges to every overload.
9
+ *
10
+ * Pragmatic semantics:
11
+ * - exactly one overload found → edge rewritten to that target, `ambiguous=false`.
12
+ * - multiple overloads → one edge per overload, all marked `ambiguous=true`.
13
+ * - zero overloads → original edge left in place so the dangling-edge audit
14
+ * surfaces it (managed-package targets, typos, third-party imports).
15
+ *
16
+ * The new edges carry `resolvedBy:"arity-resolver"` in their attributes so
17
+ * downstream consumers can distinguish resolver-emitted edges from
18
+ * extractor-emitted ones.
19
+ */
20
+ export interface ArityResolveOpts {
21
+ orgId: OrgId | string;
22
+ ctx: ParseContext;
23
+ /** When true, compute the result but do not mutate the graph. */
24
+ dryRun?: boolean;
25
+ /** Maximum stranded edges to inspect per call (safety valve for huge orgs).
26
+ * Default Number.POSITIVE_INFINITY. */
27
+ limit?: number;
28
+ }
29
+ export interface ArityResolveResult {
30
+ /** Stranded edges examined. */
31
+ scanned: number;
32
+ /** Stranded edges that found ≥1 target. Counts inputs, not outputs. */
33
+ resolved: number;
34
+ /** Stranded edges that found >1 target (subset of `resolved`). */
35
+ ambiguous: number;
36
+ /** Stranded edges with no candidate target — left in place. */
37
+ unresolved: number;
38
+ /** Total new edges emitted across all rewrites. */
39
+ edgesEmitted: number;
40
+ }
41
+ export declare function resolveApexMethodArity(store: GraphStore, opts: ArityResolveOpts): ArityResolveResult;
42
+ //# sourceMappingURL=arity-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arity-resolver.d.ts","sourceRoot":"","sources":["../../../src/parsers/apex/arity-resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,6BAA6B,CAAC;AAExE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;IACtB,GAAG,EAAE,YAAY,CAAC;IAClB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;4CACwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;CACtB;AA2BD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,gBAAgB,GACrB,kBAAkB,CAmGpB"}
@@ -0,0 +1,111 @@
1
+ import { asOrgId, asQualifiedName } from "@ryanstark24/sfgraph-shared";
2
+ import { makeEdge } from "../common.js";
3
+ const STRANDED_PATTERN = "ApexMethod:%(?)";
4
+ const QNAME_RE = /^ApexMethod:(.+)\.([A-Za-z_][\w]*)\(\?\)$/;
5
+ const REAL_QNAME_RE = /^ApexMethod:(.+)\.([A-Za-z_][\w]*)\((\d+)\)$/;
6
+ function parseStranded(qname) {
7
+ const m = QNAME_RE.exec(qname);
8
+ if (!m)
9
+ return null;
10
+ return { className: m[1] ?? "", methodName: m[2] ?? "" };
11
+ }
12
+ function parseResolved(qname) {
13
+ const m = REAL_QNAME_RE.exec(qname);
14
+ if (!m)
15
+ return null;
16
+ return {
17
+ className: m[1] ?? "",
18
+ methodName: m[2] ?? "",
19
+ arity: Number.parseInt(m[3] ?? "0", 10),
20
+ };
21
+ }
22
+ export function resolveApexMethodArity(store, opts) {
23
+ const orgId = typeof opts.orgId === "string" ? asOrgId(opts.orgId) : opts.orgId;
24
+ // ---- Build the index of real ApexMethod nodes -------------------------
25
+ const apexMethods = store.listNodesByLabel(orgId, "ApexMethod");
26
+ const testMethods = store.listNodesByLabel(orgId, "TestMethod");
27
+ const all = [...apexMethods, ...testMethods];
28
+ // className -> methodName -> NodeFact[]
29
+ const index = new Map();
30
+ for (const n of all) {
31
+ const parsed = parseResolved(String(n.qualifiedName));
32
+ if (!parsed)
33
+ continue;
34
+ const byMethod = index.get(parsed.className) ?? new Map();
35
+ const bucket = byMethod.get(parsed.methodName) ?? [];
36
+ bucket.push(n);
37
+ byMethod.set(parsed.methodName, bucket);
38
+ index.set(parsed.className, byMethod);
39
+ }
40
+ // ---- Find stranded edges ---------------------------------------------
41
+ const stranded = store.listEdgesByDstLike(orgId, STRANDED_PATTERN, undefined, opts.limit);
42
+ const result = {
43
+ scanned: stranded.length,
44
+ resolved: 0,
45
+ ambiguous: 0,
46
+ unresolved: 0,
47
+ edgesEmitted: 0,
48
+ };
49
+ if (stranded.length === 0)
50
+ return result;
51
+ const apply = () => {
52
+ for (const edge of stranded) {
53
+ const dst = String(edge.dstQualifiedName);
54
+ const key = parseStranded(dst);
55
+ if (!key) {
56
+ result.unresolved += 1;
57
+ continue;
58
+ }
59
+ const candidates = index.get(key.className)?.get(key.methodName) ?? [];
60
+ if (candidates.length === 0) {
61
+ result.unresolved += 1;
62
+ continue;
63
+ }
64
+ result.resolved += 1;
65
+ if (candidates.length > 1)
66
+ result.ambiguous += 1;
67
+ const newEdges = candidates.map((cand) => {
68
+ const e = makeEdge(opts.ctx, String(edge.srcQualifiedName), edge.relType, String(cand.qualifiedName), {
69
+ ...edge.attributes,
70
+ unresolvedArity: undefined,
71
+ resolvedBy: "arity-resolver",
72
+ ambiguous: candidates.length > 1,
73
+ overloadCount: candidates.length,
74
+ });
75
+ // makeEdge stamps firstSeenAt = now; preserve the original to keep
76
+ // freshness signals intact. Force orgId to match the stranded
77
+ // edge in case the caller passed a ParseContext bound to a
78
+ // different org (defensive — in production they always match).
79
+ return { ...e, orgId: edge.orgId, firstSeenAt: edge.firstSeenAt };
80
+ });
81
+ // Delete the stranded edge, insert real ones in the same transaction.
82
+ store.deleteEdge(orgId, edge.srcQualifiedName, asQualifiedName(dst), edge.relType);
83
+ store.mergeEdges(newEdges);
84
+ result.edgesEmitted += newEdges.length;
85
+ }
86
+ };
87
+ if (opts.dryRun) {
88
+ // Compute counts without mutating: walk the same logic but skip writes.
89
+ for (const edge of stranded) {
90
+ const dst = String(edge.dstQualifiedName);
91
+ const key = parseStranded(dst);
92
+ if (!key) {
93
+ result.unresolved += 1;
94
+ continue;
95
+ }
96
+ const candidates = index.get(key.className)?.get(key.methodName) ?? [];
97
+ if (candidates.length === 0) {
98
+ result.unresolved += 1;
99
+ continue;
100
+ }
101
+ result.resolved += 1;
102
+ if (candidates.length > 1)
103
+ result.ambiguous += 1;
104
+ result.edgesEmitted += candidates.length;
105
+ }
106
+ return result;
107
+ }
108
+ apply();
109
+ return result;
110
+ }
111
+ //# sourceMappingURL=arity-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arity-resolver.js","sourceRoot":"","sources":["../../../src/parsers/apex/arity-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Apex AST-based edge extractor.
3
+ *
4
+ * Walks the `apex-parser` ANTLR4 ParseTree to emit edges that the
5
+ * regex-based extractor in class.ts misses or guesses at:
6
+ * - SOQL queries that span multiple lines or contain ternaries / nested
7
+ * subqueries; FROM clauses with relationship traversals.
8
+ * - DML statements whose target is a variable (regex captured `op` but not
9
+ * the real sObject) — resolved here via a per-method symbol table that
10
+ * tracks `SObject var` declarations from LocalVariableDeclaration,
11
+ * EnhancedForControl (for-each), and FormalParameter.
12
+ * - Dotted field access like `a.Name` and relationship traversals
13
+ * `Account__r.Name`, resolved against the symbol table.
14
+ * - Method calls with **real arity** counted from `expressionList`.
15
+ * - `new Foo(args)` creator expressions, again with real arity.
16
+ * - Class `extends`/`implements` declarations.
17
+ *
18
+ * Edges emitted use the same RelType constants as the regex extractor so
19
+ * downstream consumers (dead_code_audit, trace_*, freshness_report) keep
20
+ * working without changes.
21
+ */
22
+ import type { EdgeFact } from "../../domain/index.js";
23
+ import type { ParseContext } from "../contract.js";
24
+ export interface AstExtractorOpts {
25
+ ctx: ParseContext;
26
+ classQname: string;
27
+ effectiveName: string;
28
+ namespace: string | null;
29
+ }
30
+ export interface AstExtraction {
31
+ edges: EdgeFact[];
32
+ /** Diagnostic messages worth logging in debug mode. Not persisted. */
33
+ diagnostics: string[];
34
+ /** Per-method-name → arity, mostly used by tests. */
35
+ methodArities: Map<string, number>;
36
+ }
37
+ /**
38
+ * Public entry point. Walks the parsed compilationUnit and returns edges.
39
+ * Pass the tree returned by `parser.compilationUnit()`.
40
+ */
41
+ export declare function extractFromAst(tree: unknown, opts: AstExtractorOpts): AstExtraction;
42
+ //# sourceMappingURL=ast-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-extractor.d.ts","sourceRoot":"","sources":["../../../src/parsers/apex/ast-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,YAAY,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,sEAAsE;IACtE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qDAAqD;IACrD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAybD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,GAAG,aAAa,CAmCnF"}