@jterrats/smart-deployment 1.0.5 → 1.1.0

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 (259) hide show
  1. package/README.md +3 -2
  2. package/lib/ai/wave-validation-prompt.d.ts +2 -0
  3. package/lib/ai/wave-validation-prompt.js +56 -0
  4. package/lib/ai/wave-validation-prompt.js.map +1 -0
  5. package/lib/ai/wave-validation-report.d.ts +2 -0
  6. package/lib/ai/wave-validation-report.js +96 -0
  7. package/lib/ai/wave-validation-report.js.map +1 -0
  8. package/lib/ai/wave-validation-response-parser.d.ts +8 -0
  9. package/lib/ai/wave-validation-response-parser.js +112 -0
  10. package/lib/ai/wave-validation-response-parser.js.map +1 -0
  11. package/lib/ai/wave-validation-result-synthesis.d.ts +6 -0
  12. package/lib/ai/wave-validation-result-synthesis.js +49 -0
  13. package/lib/ai/wave-validation-result-synthesis.js.map +1 -0
  14. package/lib/ai/wave-validation-service.d.ts +1 -55
  15. package/lib/ai/wave-validation-service.js +11 -359
  16. package/lib/ai/wave-validation-service.js.map +1 -1
  17. package/lib/ai/wave-validation-transport.d.ts +7 -0
  18. package/lib/ai/wave-validation-transport.js +10 -0
  19. package/lib/ai/wave-validation-transport.js.map +1 -0
  20. package/lib/analysis/analysis-reporter.d.ts +29 -0
  21. package/lib/analysis/analysis-reporter.js +84 -1
  22. package/lib/analysis/analysis-reporter.js.map +1 -1
  23. package/lib/analysis/analyze-context-service.d.ts +1 -1
  24. package/lib/analysis/analyze-context-service.js +2 -0
  25. package/lib/analysis/analyze-context-service.js.map +1 -1
  26. package/lib/analysis/project-analysis-service.d.ts +2 -0
  27. package/lib/analysis/project-analysis-service.js +2 -0
  28. package/lib/analysis/project-analysis-service.js.map +1 -1
  29. package/lib/commands/start.d.ts +1 -0
  30. package/lib/commands/start.js +14 -1
  31. package/lib/commands/start.js.map +1 -1
  32. package/lib/commands/status.d.ts +2 -0
  33. package/lib/commands/status.js +1 -0
  34. package/lib/commands/status.js.map +1 -1
  35. package/lib/commands/validate.d.ts +3 -3
  36. package/lib/commands/validate.js +4 -4
  37. package/lib/commands/validate.js.map +1 -1
  38. package/lib/constants/api-version.d.ts +2 -2
  39. package/lib/constants/api-version.js +2 -2
  40. package/lib/constants/deployment-order.js +11 -8
  41. package/lib/constants/deployment-order.js.map +1 -1
  42. package/lib/dependencies/circular-dependency-detector.d.ts +1 -31
  43. package/lib/dependencies/circular-dependency-detector.js +7 -156
  44. package/lib/dependencies/circular-dependency-detector.js.map +1 -1
  45. package/lib/dependencies/cycle-break-suggestions.d.ts +3 -0
  46. package/lib/dependencies/cycle-break-suggestions.js +63 -0
  47. package/lib/dependencies/cycle-break-suggestions.js.map +1 -0
  48. package/lib/dependencies/cycle-discovery.d.ts +16 -0
  49. package/lib/dependencies/cycle-discovery.js +70 -0
  50. package/lib/dependencies/cycle-discovery.js.map +1 -0
  51. package/lib/dependencies/dependency-graph-builder.d.ts +0 -65
  52. package/lib/dependencies/dependency-graph-builder.js +19 -233
  53. package/lib/dependencies/dependency-graph-builder.js.map +1 -1
  54. package/lib/dependencies/dependency-graph-intake.d.ts +17 -0
  55. package/lib/dependencies/dependency-graph-intake.js +20 -0
  56. package/lib/dependencies/dependency-graph-intake.js.map +1 -0
  57. package/lib/dependencies/dependency-graph-stats.d.ts +4 -0
  58. package/lib/dependencies/dependency-graph-stats.js +82 -0
  59. package/lib/dependencies/dependency-graph-stats.js.map +1 -0
  60. package/lib/dependencies/dependency-graph-validation.d.ts +16 -0
  61. package/lib/dependencies/dependency-graph-validation.js +78 -0
  62. package/lib/dependencies/dependency-graph-validation.js.map +1 -0
  63. package/lib/dependencies/dependency-impact-analyzer.d.ts +1 -22
  64. package/lib/dependencies/dependency-impact-analyzer.js +12 -110
  65. package/lib/dependencies/dependency-impact-analyzer.js.map +1 -1
  66. package/lib/dependencies/dependency-impact-scoring.d.ts +5 -0
  67. package/lib/dependencies/dependency-impact-scoring.js +24 -0
  68. package/lib/dependencies/dependency-impact-scoring.js.map +1 -0
  69. package/lib/dependencies/dependency-impact-traversal.d.ts +18 -0
  70. package/lib/dependencies/dependency-impact-traversal.js +74 -0
  71. package/lib/dependencies/dependency-impact-traversal.js.map +1 -0
  72. package/lib/dependencies/dependency-resolution-classifier.d.ts +19 -0
  73. package/lib/dependencies/dependency-resolution-classifier.js +67 -0
  74. package/lib/dependencies/dependency-resolution-classifier.js.map +1 -0
  75. package/lib/dependencies/dependency-resolver.d.ts +1 -48
  76. package/lib/dependencies/dependency-resolver.js +12 -181
  77. package/lib/dependencies/dependency-resolver.js.map +1 -1
  78. package/lib/dependencies/dynamic-query-dependency-references.d.ts +3 -0
  79. package/lib/dependencies/dynamic-query-dependency-references.js +41 -0
  80. package/lib/dependencies/dynamic-query-dependency-references.js.map +1 -0
  81. package/lib/dependencies/topological-dependency-sorter.d.ts +10 -0
  82. package/lib/dependencies/topological-dependency-sorter.js +84 -0
  83. package/lib/dependencies/topological-dependency-sorter.js.map +1 -0
  84. package/lib/deployment/cycle-remediation-runner.d.ts +1 -0
  85. package/lib/deployment/cycle-remediation-runner.js +5 -1
  86. package/lib/deployment/cycle-remediation-runner.js.map +1 -1
  87. package/lib/deployment/deployment-runner.d.ts +3 -1
  88. package/lib/deployment/deployment-runner.js +6 -1
  89. package/lib/deployment/deployment-runner.js.map +1 -1
  90. package/lib/deployment/deployment-status-service.d.ts +2 -0
  91. package/lib/deployment/deployment-status-service.js +2 -0
  92. package/lib/deployment/deployment-status-service.js.map +1 -1
  93. package/lib/deployment/deployment-validation-service.js +1 -1
  94. package/lib/deployment/deployment-validation-service.js.map +1 -1
  95. package/lib/deployment/dynamic-query-target-validator.d.ts +24 -0
  96. package/lib/deployment/dynamic-query-target-validator.js +65 -0
  97. package/lib/deployment/dynamic-query-target-validator.js.map +1 -0
  98. package/lib/deployment/sf-cli-integration.d.ts +1 -0
  99. package/lib/deployment/sf-cli-integration.js +1 -1
  100. package/lib/deployment/sf-cli-integration.js.map +1 -1
  101. package/lib/deployment/sf-cli-metadata-lookup.d.ts +4 -0
  102. package/lib/deployment/sf-cli-metadata-lookup.js +26 -0
  103. package/lib/deployment/sf-cli-metadata-lookup.js.map +1 -0
  104. package/lib/deployment/start-execution-service.d.ts +5 -0
  105. package/lib/deployment/start-execution-service.js +26 -6
  106. package/lib/deployment/start-execution-service.js.map +1 -1
  107. package/lib/deployment/wave-graph-state.d.ts +6 -0
  108. package/lib/deployment/wave-graph-state.js +89 -0
  109. package/lib/deployment/wave-graph-state.js.map +1 -0
  110. package/lib/deployment/wave-manifest-service.d.ts +1 -0
  111. package/lib/deployment/wave-manifest-service.js +1 -1
  112. package/lib/deployment/wave-manifest-service.js.map +1 -1
  113. package/lib/errors/deployment-error.js +1 -1
  114. package/lib/errors/deployment-error.js.map +1 -1
  115. package/lib/parsers/apex-class-dependencies.d.ts +4 -0
  116. package/lib/parsers/apex-class-dependencies.js +122 -0
  117. package/lib/parsers/apex-class-dependencies.js.map +1 -0
  118. package/lib/parsers/apex-class-lexical.d.ts +3 -0
  119. package/lib/parsers/apex-class-lexical.js +101 -0
  120. package/lib/parsers/apex-class-lexical.js.map +1 -0
  121. package/lib/parsers/apex-class-names.d.ts +18 -0
  122. package/lib/parsers/apex-class-names.js +93 -0
  123. package/lib/parsers/apex-class-names.js.map +1 -0
  124. package/lib/parsers/apex-class-parser-model.d.ts +59 -0
  125. package/lib/parsers/apex-class-parser-model.js +2 -0
  126. package/lib/parsers/apex-class-parser-model.js.map +1 -0
  127. package/lib/parsers/apex-class-parser.d.ts +3 -29
  128. package/lib/parsers/apex-class-parser.js +10 -395
  129. package/lib/parsers/apex-class-parser.js.map +1 -1
  130. package/lib/parsers/apex-class-symbols.d.ts +2 -0
  131. package/lib/parsers/apex-class-symbols.js +61 -0
  132. package/lib/parsers/apex-class-symbols.js.map +1 -0
  133. package/lib/parsers/apex-dynamic-query-analysis.d.ts +2 -0
  134. package/lib/parsers/apex-dynamic-query-analysis.js +150 -0
  135. package/lib/parsers/apex-dynamic-query-analysis.js.map +1 -0
  136. package/lib/parsers/custom-metadata-dynamic-query-analysis.d.ts +2 -0
  137. package/lib/parsers/custom-metadata-dynamic-query-analysis.js +50 -0
  138. package/lib/parsers/custom-metadata-dynamic-query-analysis.js.map +1 -0
  139. package/lib/parsers/custom-metadata-parser.d.ts +2 -0
  140. package/lib/parsers/custom-metadata-parser.js +3 -0
  141. package/lib/parsers/custom-metadata-parser.js.map +1 -1
  142. package/lib/parsers/custom-object-dependency-builder.d.ts +3 -0
  143. package/lib/parsers/custom-object-dependency-builder.js +103 -0
  144. package/lib/parsers/custom-object-dependency-builder.js.map +1 -0
  145. package/lib/parsers/custom-object-parser.js +1 -208
  146. package/lib/parsers/custom-object-parser.js.map +1 -1
  147. package/lib/parsers/custom-object-reference-helpers.d.ts +4 -0
  148. package/lib/parsers/custom-object-reference-helpers.js +92 -0
  149. package/lib/parsers/custom-object-reference-helpers.js.map +1 -0
  150. package/lib/parsers/dynamic-query-reference.d.ts +16 -0
  151. package/lib/parsers/dynamic-query-reference.js +65 -0
  152. package/lib/parsers/dynamic-query-reference.js.map +1 -0
  153. package/lib/parsers/layout-action-analysis.d.ts +6 -0
  154. package/lib/parsers/layout-action-analysis.js +36 -0
  155. package/lib/parsers/layout-action-analysis.js.map +1 -0
  156. package/lib/parsers/layout-parser.js +4 -272
  157. package/lib/parsers/layout-parser.js.map +1 -1
  158. package/lib/parsers/layout-reference-analysis.d.ts +9 -0
  159. package/lib/parsers/layout-reference-analysis.js +70 -0
  160. package/lib/parsers/layout-reference-analysis.js.map +1 -0
  161. package/lib/parsers/layout-result-assembly.d.ts +5 -0
  162. package/lib/parsers/layout-result-assembly.js +35 -0
  163. package/lib/parsers/layout-result-assembly.js.map +1 -0
  164. package/lib/parsers/layout-section-analysis.d.ts +7 -0
  165. package/lib/parsers/layout-section-analysis.js +9 -0
  166. package/lib/parsers/layout-section-analysis.js.map +1 -0
  167. package/lib/parsers/lwc-code-analysis.d.ts +10 -0
  168. package/lib/parsers/lwc-code-analysis.js +161 -0
  169. package/lib/parsers/lwc-code-analysis.js.map +1 -0
  170. package/lib/parsers/lwc-metadata-analysis.d.ts +6 -0
  171. package/lib/parsers/lwc-metadata-analysis.js +112 -0
  172. package/lib/parsers/lwc-metadata-analysis.js.map +1 -0
  173. package/lib/parsers/lwc-parser.d.ts +3 -27
  174. package/lib/parsers/lwc-parser.js +6 -377
  175. package/lib/parsers/lwc-parser.js.map +1 -1
  176. package/lib/parsers/lwc-result-assembly.d.ts +4 -0
  177. package/lib/parsers/lwc-result-assembly.js +47 -0
  178. package/lib/parsers/lwc-result-assembly.js.map +1 -0
  179. package/lib/presentation/status-command-presenter.d.ts +1 -0
  180. package/lib/presentation/status-command-presenter.js +20 -0
  181. package/lib/presentation/status-command-presenter.js.map +1 -1
  182. package/lib/scanner/forceignore-parser.d.ts +1 -0
  183. package/lib/scanner/forceignore-parser.js +14 -3
  184. package/lib/scanner/forceignore-parser.js.map +1 -1
  185. package/lib/scanner/structure-validator.js +1 -1
  186. package/lib/services/metadata-scanner-service.d.ts +2 -0
  187. package/lib/services/metadata-scanner-service.js +9 -2
  188. package/lib/services/metadata-scanner-service.js.map +1 -1
  189. package/lib/services/scanners/additional-metadata-scanner.d.ts +2 -0
  190. package/lib/services/scanners/additional-metadata-scanner.js +183 -0
  191. package/lib/services/scanners/additional-metadata-scanner.js.map +1 -0
  192. package/lib/services/scanners/automation-ai-metadata-scanner.d.ts +1 -0
  193. package/lib/services/scanners/automation-ai-metadata-scanner.js +11 -0
  194. package/lib/services/scanners/automation-ai-metadata-scanner.js.map +1 -1
  195. package/lib/services/scanners/code-metadata-scanner.js +14 -1
  196. package/lib/services/scanners/code-metadata-scanner.js.map +1 -1
  197. package/lib/services/scanners/data-metadata-scanner.js +24 -8
  198. package/lib/services/scanners/data-metadata-scanner.js.map +1 -1
  199. package/lib/types/metadata.d.ts +1 -1
  200. package/lib/utils/cache-entry-serializer.d.ts +7 -0
  201. package/lib/utils/cache-entry-serializer.js +15 -0
  202. package/lib/utils/cache-entry-serializer.js.map +1 -0
  203. package/lib/utils/cache-expiry-policy.d.ts +7 -0
  204. package/lib/utils/cache-expiry-policy.js +34 -0
  205. package/lib/utils/cache-expiry-policy.js.map +1 -0
  206. package/lib/utils/cache-key-derivation.d.ts +11 -0
  207. package/lib/utils/cache-key-derivation.js +28 -0
  208. package/lib/utils/cache-key-derivation.js.map +1 -0
  209. package/lib/utils/cache-lock-lifecycle.d.ts +15 -0
  210. package/lib/utils/cache-lock-lifecycle.js +84 -0
  211. package/lib/utils/cache-lock-lifecycle.js.map +1 -0
  212. package/lib/utils/cache-logger.d.ts +8 -0
  213. package/lib/utils/cache-logger.js +19 -0
  214. package/lib/utils/cache-logger.js.map +1 -0
  215. package/lib/utils/cache-manager.d.ts +1 -2
  216. package/lib/utils/cache-manager.js +7 -253
  217. package/lib/utils/cache-manager.js.map +1 -1
  218. package/lib/utils/cache-storage.d.ts +20 -0
  219. package/lib/utils/cache-storage.js +83 -0
  220. package/lib/utils/cache-storage.js.map +1 -0
  221. package/lib/validators/xml-metadata-validator.js +1 -1
  222. package/lib/waves/priority-wave-generator.js +8 -2
  223. package/lib/waves/priority-wave-generator.js.map +1 -1
  224. package/lib/waves/test-optimizer-discovery.d.ts +12 -0
  225. package/lib/waves/test-optimizer-discovery.js +46 -0
  226. package/lib/waves/test-optimizer-discovery.js.map +1 -0
  227. package/lib/waves/test-optimizer-matching.d.ts +6 -0
  228. package/lib/waves/test-optimizer-matching.js +43 -0
  229. package/lib/waves/test-optimizer-matching.js.map +1 -0
  230. package/lib/waves/test-optimizer-model.d.ts +92 -0
  231. package/lib/waves/test-optimizer-model.js +2 -0
  232. package/lib/waves/test-optimizer-model.js.map +1 -0
  233. package/lib/waves/test-optimizer-scoring.d.ts +11 -0
  234. package/lib/waves/test-optimizer-scoring.js +53 -0
  235. package/lib/waves/test-optimizer-scoring.js.map +1 -0
  236. package/lib/waves/test-optimizer.d.ts +2 -102
  237. package/lib/waves/test-optimizer.js +9 -154
  238. package/lib/waves/test-optimizer.js.map +1 -1
  239. package/lib/waves/wave-builder.d.ts +0 -11
  240. package/lib/waves/wave-builder.js +19 -193
  241. package/lib/waves/wave-builder.js.map +1 -1
  242. package/lib/waves/wave-graph.d.ts +25 -0
  243. package/lib/waves/wave-graph.js +138 -0
  244. package/lib/waves/wave-graph.js.map +1 -0
  245. package/lib/waves/wave-metadata.d.ts +4 -0
  246. package/lib/waves/wave-metadata.js +36 -0
  247. package/lib/waves/wave-metadata.js.map +1 -0
  248. package/lib/waves/wave-priority-policy.d.ts +5 -0
  249. package/lib/waves/wave-priority-policy.js +83 -0
  250. package/lib/waves/wave-priority-policy.js.map +1 -0
  251. package/lib/waves/wave-topology.d.ts +28 -0
  252. package/lib/waves/wave-topology.js +65 -0
  253. package/lib/waves/wave-topology.js.map +1 -0
  254. package/messages/start.json +5 -5
  255. package/messages/validate.json +1 -1
  256. package/npm-shrinkwrap.json +342 -751
  257. package/oclif.lock +83 -262
  258. package/oclif.manifest.json +7 -7
  259. package/package.json +6 -2
@@ -1,405 +1,18 @@
1
- import { getLogger } from '../utils/logger.js';
2
1
  import { ParsingError } from '../errors/parsing-error.js';
2
+ import { getLogger } from '../utils/logger.js';
3
+ import { collectDependencies, collectDependencyBuckets, flattenReferenceDependencies, } from './apex-class-dependencies.js';
4
+ import { extractDynamicQueryReferences } from './apex-dynamic-query-analysis.js';
5
+ import { createLexicalContext, detectTestMetadata } from './apex-class-lexical.js';
6
+ import { extractSymbols } from './apex-class-symbols.js';
3
7
  const logger = getLogger('ApexClassParser');
4
- /**
5
- * Standard Apex classes that should be ignored
6
- */
7
- const STANDARD_APEX_CLASSES = new Set([
8
- 'System',
9
- 'String',
10
- 'Integer',
11
- 'Boolean',
12
- 'Date',
13
- 'Datetime',
14
- 'Time',
15
- 'Decimal',
16
- 'Double',
17
- 'Long',
18
- 'Id',
19
- 'Blob',
20
- 'Object',
21
- 'List',
22
- 'Set',
23
- 'Map',
24
- 'SObject',
25
- 'Database',
26
- 'Schema',
27
- 'Test',
28
- 'Limits',
29
- 'ApexPages',
30
- 'PageReference',
31
- 'Trigger',
32
- 'UserInfo',
33
- 'Math',
34
- 'Messaging',
35
- 'Http',
36
- 'HttpRequest',
37
- 'HttpResponse',
38
- 'JsonParser',
39
- 'JsonGenerator',
40
- 'JSON',
41
- 'Pattern',
42
- 'Matcher',
43
- 'Exception',
44
- 'DmlException',
45
- 'QueryException',
46
- 'NullPointerException',
47
- 'TypeException',
48
- 'CalloutException',
49
- 'LimitException',
50
- ]);
51
- const TEST_ANNOTATION_PATTERN = /(?:^|\W)@isTest\b/i;
52
- const TEST_METHOD_PATTERN = /\btestMethod\b/i;
53
- /**
54
- * Remove comments from Apex code
55
- *
56
- * @ac US-013-AC-9: Remove comments before parsing
57
- */
58
- function removeComments(code) {
59
- let result = '';
60
- let inSingleLineComment = false;
61
- let inMultiLineComment = false;
62
- let stringDelimiter = null;
63
- let escapeNext = false;
64
- for (let index = 0; index < code.length; index++) {
65
- const current = code[index];
66
- const next = code[index + 1];
67
- if (inSingleLineComment) {
68
- if (current === '\n') {
69
- inSingleLineComment = false;
70
- result += current;
71
- }
72
- continue;
73
- }
74
- if (inMultiLineComment) {
75
- if (current === '*' && next === '/') {
76
- inMultiLineComment = false;
77
- index += 1;
78
- }
79
- else if (current === '\n') {
80
- result += '\n';
81
- }
82
- continue;
83
- }
84
- if (stringDelimiter) {
85
- result += current;
86
- if (escapeNext) {
87
- escapeNext = false;
88
- }
89
- else if (current === '\\') {
90
- escapeNext = true;
91
- }
92
- else if (current === stringDelimiter) {
93
- stringDelimiter = null;
94
- }
95
- continue;
96
- }
97
- if (current === '"' || current === "'") {
98
- stringDelimiter = current;
99
- result += current;
100
- continue;
101
- }
102
- if (current === '/' && next === '/') {
103
- inSingleLineComment = true;
104
- index += 1;
105
- continue;
106
- }
107
- if (current === '/' && next === '*') {
108
- inMultiLineComment = true;
109
- index += 1;
110
- continue;
111
- }
112
- result += current;
113
- }
114
- return result;
115
- }
116
- /**
117
- * Check if a class is a standard Apex class
118
- *
119
- * @ac US-013-AC-7: Ignore standard classes (System.*, etc.)
120
- */
121
- function isStandardClass(className) {
122
- // Remove namespace if present
123
- const cleanName = className.includes('.') ? className.split('.').pop() : className;
124
- // Check if it's in the standard classes set
125
- if (STANDARD_APEX_CLASSES.has(cleanName)) {
126
- return true;
127
- }
128
- // Check if it starts with a standard prefix
129
- if (cleanName.startsWith('System.') ||
130
- cleanName.startsWith('Database.') ||
131
- cleanName.startsWith('Schema.') ||
132
- cleanName.startsWith('Test.') ||
133
- cleanName.startsWith('ApexPages.')) {
134
- return true;
135
- }
136
- return false;
137
- }
138
- /**
139
- * Extract namespace from a fully qualified class name
140
- *
141
- * @ac US-013-AC-8: Handle managed packages
142
- */
143
- function extractNamespace(className) {
144
- // Pattern: Namespace__ClassName or Namespace.ClassName
145
- const namespacePattern = /^([a-zA-Z][a-zA-Z0-9_]*(?:__|\.))(.+)$/;
146
- const match = className.match(namespacePattern);
147
- if (match) {
148
- const namespace = match[1].replace(/__|\.$/g, '');
149
- const cleanName = match[2];
150
- const isManagedPackage = match[1].includes('__');
151
- return { namespace, cleanName, isManagedPackage };
152
- }
153
- return { cleanName: className, isManagedPackage: false };
154
- }
155
- function buildDependency(type, className) {
156
- const { namespace, cleanName, isManagedPackage } = extractNamespace(className);
8
+ function buildParseResult(className, symbols, dependencies, dynamicQueryReferences = []) {
157
9
  return {
158
- type,
159
- className: cleanName,
160
- namespace,
161
- isStandard: false,
162
- isManagedPackage,
163
- };
164
- }
165
- /**
166
- * Extract extends relationship
167
- *
168
- * @ac US-013-AC-1: Extract extends relationships
169
- */
170
- function extractExtends(code) {
171
- const extendsPattern = /class\s+\w+\s+extends\s+([a-zA-Z][a-zA-Z0-9_<>.,\s]*?)(?:\s+implements|\s*\{)/i;
172
- const match = code.match(extendsPattern);
173
- if (match) {
174
- // Clean up generic types and whitespace
175
- return match[1].replace(/<.*?>/g, '').trim();
176
- }
177
- return undefined;
178
- }
179
- /**
180
- * Extract implements relationships
181
- *
182
- * @ac US-013-AC-2: Extract implements relationships
183
- */
184
- function extractImplements(code) {
185
- const implementsPattern = /implements\s+([a-zA-Z][a-zA-Z0-9_<>.,\s]+?)(?:\s*\{)/gi;
186
- const matches = code.matchAll(implementsPattern);
187
- const interfaces = [];
188
- for (const match of matches) {
189
- // Split by comma to handle multiple interfaces
190
- const interfaceList = match[1].split(',');
191
- for (const iface of interfaceList) {
192
- // Clean up generic types and whitespace
193
- const cleanInterface = iface.replace(/<.*?>/g, '').trim();
194
- if (cleanInterface && !interfaces.includes(cleanInterface)) {
195
- interfaces.push(cleanInterface);
196
- }
197
- }
198
- }
199
- return interfaces;
200
- }
201
- /**
202
- * Extract static method calls
203
- *
204
- * @ac US-013-AC-3: Extract static method calls
205
- */
206
- function extractStaticMethodCalls(code) {
207
- const staticCallPattern = /([a-zA-Z][a-zA-Z0-9_]*(?:\.[a-zA-Z][a-zA-Z0-9_]*)*)\s*\.\s*[a-zA-Z][a-zA-Z0-9_]*\s*\(/g;
208
- const matches = code.matchAll(staticCallPattern);
209
- const dependencies = [];
210
- const seen = new Set();
211
- for (const match of matches) {
212
- const className = match[1];
213
- // Skip if already seen or is a standard class
214
- if (seen.has(className) || isStandardClass(className)) {
215
- continue;
216
- }
217
- seen.add(className);
218
- dependencies.push(buildDependency('static_method', className));
219
- }
220
- return dependencies;
221
- }
222
- /**
223
- * Extract object instantiations (new ClassName())
224
- *
225
- * @ac US-013-AC-4: Extract object instantiations
226
- */
227
- function extractInstantiations(code) {
228
- const newPattern = /new\s+([a-zA-Z][a-zA-Z0-9_]*(?:\.[a-zA-Z][a-zA-Z0-9_]*)*)\s*(?:<[^>]+>)?\s*\(/g;
229
- const matches = code.matchAll(newPattern);
230
- const dependencies = [];
231
- const seen = new Set();
232
- for (const match of matches) {
233
- const className = match[1];
234
- // Skip if already seen or is a standard class
235
- if (seen.has(className) || isStandardClass(className)) {
236
- continue;
237
- }
238
- seen.add(className);
239
- dependencies.push(buildDependency('instantiation', className));
240
- }
241
- return dependencies;
242
- }
243
- /**
244
- * Extract variable declarations
245
- *
246
- * @ac US-013-AC-5: Extract variable declarations
247
- */
248
- function extractVariableDeclarations(code) {
249
- // Pattern: ClassName variableName = ...
250
- const varPattern = /(?:^|[;\s{])\s*([A-Z][a-zA-Z0-9_]*(?:\.[A-Z][a-zA-Z0-9_]*)*)\s+[a-z][a-zA-Z0-9_]*\s*[=;]/gm;
251
- const matches = code.matchAll(varPattern);
252
- const dependencies = [];
253
- const seen = new Set();
254
- for (const match of matches) {
255
- const className = match[1];
256
- // Skip if already seen or is a standard class
257
- if (seen.has(className) || isStandardClass(className)) {
258
- continue;
259
- }
260
- seen.add(className);
261
- dependencies.push(buildDependency('variable_declaration', className));
262
- }
263
- return dependencies;
264
- }
265
- /**
266
- * Extract inner classes
267
- *
268
- * @ac US-013-AC-6: Handle inner classes
269
- */
270
- function extractInnerClasses(code, outerClassName) {
271
- // Pattern: class InnerClassName { ... }
272
- // More permissive: allows any combination of modifiers and keywords
273
- const innerClassPattern = /\bclass\s+([a-zA-Z][a-zA-Z0-9_]*)\s*(?:extends|implements|\{)/g;
274
- const matches = code.matchAll(innerClassPattern);
275
- const innerClasses = [];
276
- for (const match of matches) {
277
- const className = match[1];
278
- // Skip the outer class itself
279
- if (className !== outerClassName && !innerClasses.includes(className)) {
280
- innerClasses.push(className);
281
- }
282
- }
283
- return innerClasses;
284
- }
285
- /**
286
- * Extract Type.forName() dynamic instantiation
287
- *
288
- * @ac US-013-AC-10: Handle Type.forName() dynamic instantiation
289
- */
290
- function extractDynamicInstantiations(code) {
291
- // Pattern: Type.forName('ClassName') or Type.forName("ClassName")
292
- const typeForNamePattern = /Type\.forName\s*\(\s*['"]([a-zA-Z][a-zA-Z0-9_.]*)['"][\s)]/g;
293
- const matches = code.matchAll(typeForNamePattern);
294
- const dependencies = [];
295
- const seen = new Set();
296
- for (const match of matches) {
297
- const className = match[1];
298
- // Skip if already seen or is a standard class
299
- if (seen.has(className) || isStandardClass(className)) {
300
- continue;
301
- }
302
- seen.add(className);
303
- dependencies.push(buildDependency('dynamic_instantiation', className));
304
- }
305
- return dependencies;
306
- }
307
- function extractClassNameFromFilePath(filePath) {
308
- const classNameMatch = filePath.match(/([a-zA-Z][a-zA-Z0-9_]*)\.cls$/);
309
- if (!classNameMatch) {
310
- throw new ParsingError(`Invalid Apex class file name: ${filePath}`, {
311
- filePath,
312
- suggestion: 'Apex class files must end with .cls',
313
- });
314
- }
315
- return classNameMatch[1];
316
- }
317
- function prepareLexicalSource(content) {
318
- return {
319
- originalCode: content,
320
- cleanCode: removeComments(content),
321
- };
322
- }
323
- function createLexicalContext(filePath, content) {
324
- const className = extractClassNameFromFilePath(filePath);
325
- const lexicalPreparation = prepareLexicalSource(content);
326
- return {
327
- filePath,
328
10
  className,
329
- ...lexicalPreparation,
330
- };
331
- }
332
- function extractSymbols(context) {
333
- const { namespace } = extractNamespace(context.className);
334
- return {
335
- namespace,
336
- extendsClass: extractExtends(context.cleanCode),
337
- implementsList: extractImplements(context.cleanCode),
338
- innerClasses: extractInnerClasses(context.cleanCode, context.className),
339
- };
340
- }
341
- function detectTestMetadata(context) {
342
- return detectTestMetadataFromPreparation({
343
- originalCode: context.originalCode,
344
- cleanCode: context.cleanCode,
345
- });
346
- }
347
- function detectTestMetadataFromPreparation(preparation) {
348
- const usesIsTestAnnotation = TEST_ANNOTATION_PATTERN.test(preparation.originalCode);
349
- const usesTestMethodKeyword = TEST_METHOD_PATTERN.test(preparation.cleanCode);
350
- return {
351
- isTestClass: usesIsTestAnnotation || usesTestMethodKeyword,
352
- usesIsTestAnnotation,
353
- usesTestMethodKeyword,
354
- };
355
- }
356
- function extractSignatureDependencies(symbols) {
357
- const dependencies = [];
358
- if (symbols.extendsClass && !isStandardClass(symbols.extendsClass)) {
359
- dependencies.push(buildDependency('extends', symbols.extendsClass));
360
- }
361
- for (const iface of symbols.implementsList) {
362
- if (!isStandardClass(iface)) {
363
- dependencies.push(buildDependency('implements', iface));
364
- }
365
- }
366
- return dependencies;
367
- }
368
- function extractReferenceDependencies(context) {
369
- return {
370
- staticMethodCalls: extractStaticMethodCalls(context.cleanCode),
371
- instantiations: extractInstantiations(context.cleanCode),
372
- variableDeclarations: extractVariableDeclarations(context.cleanCode),
373
- dynamicInstantiations: extractDynamicInstantiations(context.cleanCode),
374
- };
375
- }
376
- function flattenReferenceDependencies(referenceDependencies) {
377
- return [
378
- ...referenceDependencies.staticMethodCalls,
379
- ...referenceDependencies.instantiations,
380
- ...referenceDependencies.variableDeclarations,
381
- ...referenceDependencies.dynamicInstantiations,
382
- ];
383
- }
384
- function collectDependencyBuckets(context, symbols) {
385
- return {
386
- signatureDependencies: extractSignatureDependencies(symbols),
387
- referenceDependencies: extractReferenceDependencies(context),
388
- };
389
- }
390
- function collectDependencies(dependencyBuckets) {
391
- return [
392
- ...dependencyBuckets.signatureDependencies,
393
- ...flattenReferenceDependencies(dependencyBuckets.referenceDependencies),
394
- ];
395
- }
396
- function buildParseResult(context, symbols, dependencies) {
397
- return {
398
- className: context.className,
399
11
  namespace: symbols.namespace,
400
12
  extends: symbols.extendsClass,
401
13
  implements: symbols.implementsList,
402
14
  dependencies,
15
+ dynamicQueryReferences,
403
16
  innerClasses: symbols.innerClasses,
404
17
  };
405
18
  }
@@ -428,12 +41,14 @@ export function parseApexClass(filePath, content) {
428
41
  const testMetadata = detectTestMetadata(lexicalContext);
429
42
  const dependencyBuckets = collectDependencyBuckets(lexicalContext, symbols);
430
43
  const dependencies = collectDependencies(dependencyBuckets);
431
- const result = buildParseResult(lexicalContext, symbols, dependencies);
44
+ const dynamicQueryReferences = extractDynamicQueryReferences(lexicalContext.cleanCode);
45
+ const result = buildParseResult(lexicalContext.className, symbols, dependencies, dynamicQueryReferences);
432
46
  logger.debug(`Parsed Apex class: ${lexicalContext.className}`, {
433
47
  dependencies: dependencies.length,
434
48
  innerClasses: symbols.innerClasses.length,
435
49
  isTestClass: testMetadata.isTestClass,
436
50
  referenceDependencies: flattenReferenceDependencies(dependencyBuckets.referenceDependencies).length,
51
+ dynamicQueryReferences: dynamicQueryReferences.length,
437
52
  });
438
53
  return result;
439
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"apex-class-parser.js","sourceRoot":"","sources":["../../src/parsers/apex-class-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apex-class-parser.js","sourceRoot":"","sources":["../../src/parsers/apex-class-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAEnF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAMzD,MAAM,MAAM,GAAG,SAAS,CAAC,iBAAiB,CAAC,CAAC;AAE5C,SAAS,gBAAgB,CACvB,SAAiB,EACjB,OAA6B,EAC7B,YAA8B,EAC9B,yBAAkD,EAAE;IAEpD,OAAO;QACL,SAAS;QACT,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,YAAY;QAC7B,UAAU,EAAE,OAAO,CAAC,cAAc;QAClC,YAAY;QACZ,sBAAsB;QACtB,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAe;IAC9D,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;QAEhD,MAAM,cAAc,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;QACxD,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAC5E,MAAM,YAAY,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;QAC5D,MAAM,sBAAsB,GAAG,6BAA6B,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACvF,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,sBAAsB,CAAC,CAAC;QAEzG,MAAM,CAAC,KAAK,CAAC,sBAAsB,cAAc,CAAC,SAAS,EAAE,EAAE;YAC7D,YAAY,EAAE,YAAY,CAAC,MAAM;YACjC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM;YACzC,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,qBAAqB,EAAE,4BAA4B,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAC,MAAM;YACnG,sBAAsB,EAAE,sBAAsB,CAAC,MAAM;SACtD,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,IAAI,YAAY,CAAC,+BAA+B,QAAQ,EAAE,EAAE;YAChE,QAAQ;YACR,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SACtE,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ApexLexicalContext, ApexSymbolExtraction } from './apex-class-parser-model.js';
2
+ export declare function extractSymbols(context: ApexLexicalContext): ApexSymbolExtraction;
@@ -0,0 +1,61 @@
1
+ import { extractNamespace } from './apex-class-names.js';
2
+ /**
3
+ * Extract extends relationship
4
+ *
5
+ * @ac US-013-AC-1: Extract extends relationships
6
+ */
7
+ function extractExtends(code) {
8
+ const extendsPattern = /class\s+\w+\s+extends\s+([a-zA-Z][a-zA-Z0-9_<>.,\s]*?)(?:\s+implements|\s*\{)/i;
9
+ const match = code.match(extendsPattern);
10
+ if (match) {
11
+ return match[1].replace(/<.*?>/g, '').trim();
12
+ }
13
+ return undefined;
14
+ }
15
+ /**
16
+ * Extract implements relationships
17
+ *
18
+ * @ac US-013-AC-2: Extract implements relationships
19
+ */
20
+ function extractImplements(code) {
21
+ const implementsPattern = /implements\s+([a-zA-Z][a-zA-Z0-9_<>.,\s]+?)(?:\s*\{)/gi;
22
+ const matches = code.matchAll(implementsPattern);
23
+ const interfaces = [];
24
+ for (const match of matches) {
25
+ const interfaceList = match[1].split(',');
26
+ for (const iface of interfaceList) {
27
+ const cleanInterface = iface.replace(/<.*?>/g, '').trim();
28
+ if (cleanInterface && !interfaces.includes(cleanInterface)) {
29
+ interfaces.push(cleanInterface);
30
+ }
31
+ }
32
+ }
33
+ return interfaces;
34
+ }
35
+ /**
36
+ * Extract inner classes
37
+ *
38
+ * @ac US-013-AC-6: Handle inner classes
39
+ */
40
+ function extractInnerClasses(code, outerClassName) {
41
+ const innerClassPattern = /\bclass\s+([a-zA-Z][a-zA-Z0-9_]*)\s*(?:extends|implements|\{)/g;
42
+ const matches = code.matchAll(innerClassPattern);
43
+ const innerClasses = [];
44
+ for (const match of matches) {
45
+ const className = match[1];
46
+ if (className !== outerClassName && !innerClasses.includes(className)) {
47
+ innerClasses.push(className);
48
+ }
49
+ }
50
+ return innerClasses;
51
+ }
52
+ export function extractSymbols(context) {
53
+ const { namespace } = extractNamespace(context.className);
54
+ return {
55
+ namespace,
56
+ extendsClass: extractExtends(context.cleanCode),
57
+ implementsList: extractImplements(context.cleanCode),
58
+ innerClasses: extractInnerClasses(context.cleanCode, context.className),
59
+ };
60
+ }
61
+ //# sourceMappingURL=apex-class-symbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apex-class-symbols.js","sourceRoot":"","sources":["../../src/parsers/apex-class-symbols.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;;GAIG;AACH,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,cAAc,GAAG,gFAAgF,CAAC;IACxG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAEzC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,iBAAiB,GAAG,wDAAwD,CAAC;IACnF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACjD,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,cAAc,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC3D,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,IAAY,EAAE,cAAsB;IAC/D,MAAM,iBAAiB,GAAG,gEAAgE,CAAC;IAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACjD,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3B,IAAI,SAAS,KAAK,cAAc,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACtE,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAA2B;IACxD,MAAM,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE1D,OAAO;QACL,SAAS;QACT,YAAY,EAAE,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC;QAC/C,cAAc,EAAE,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC;QACpD,YAAY,EAAE,mBAAmB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC;KACxE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { DynamicQueryReference } from './dynamic-query-reference.js';
2
+ export declare function extractDynamicQueryReferences(code: string): DynamicQueryReference[];
@@ -0,0 +1,150 @@
1
+ import { parseSoqlReference } from './dynamic-query-reference.js';
2
+ const DYNAMIC_QUERY_CALL_PATTERN = /\b(?:Database\.(?:query|getQueryLocator)|Search\.query)\s*\(/g;
3
+ const STRING_ASSIGNMENT_PATTERN = /\bString\s+([a-zA-Z][a-zA-Z0-9_]*)\s*=\s*([^;]+);/g;
4
+ const IDENTIFIER_PATTERN = /^[a-zA-Z][a-zA-Z0-9_]*$/;
5
+ export function extractDynamicQueryReferences(code) {
6
+ const constants = collectStringAssignments(code);
7
+ const references = [];
8
+ const seen = new Set();
9
+ for (const expression of collectDynamicQueryExpressions(code)) {
10
+ const resolved = resolveStringExpression(expression, constants);
11
+ const reference = parseDynamicQueryReference(resolved);
12
+ if (!reference) {
13
+ continue;
14
+ }
15
+ const key = `${reference.objectName ?? ''}:${reference.fieldNames.join(',')}:${reference.rawQuery}`;
16
+ if (!seen.has(key)) {
17
+ seen.add(key);
18
+ references.push(reference);
19
+ }
20
+ }
21
+ return references;
22
+ }
23
+ function collectStringAssignments(code) {
24
+ const assignments = new Map();
25
+ for (const match of code.matchAll(STRING_ASSIGNMENT_PATTERN)) {
26
+ assignments.set(match[1], resolveStringExpression(match[2], assignments));
27
+ }
28
+ return assignments;
29
+ }
30
+ function collectDynamicQueryExpressions(code) {
31
+ const expressions = [];
32
+ for (const match of code.matchAll(DYNAMIC_QUERY_CALL_PATTERN)) {
33
+ const startIndex = match.index + match[0].length;
34
+ const expression = readCallExpression(code, startIndex);
35
+ if (expression) {
36
+ expressions.push(expression);
37
+ }
38
+ }
39
+ return expressions;
40
+ }
41
+ function readCallExpression(code, startIndex) {
42
+ let depth = 1;
43
+ let stringDelimiter = null;
44
+ let escapeNext = false;
45
+ for (let index = startIndex; index < code.length; index++) {
46
+ const current = code[index];
47
+ if (stringDelimiter) {
48
+ if (escapeNext) {
49
+ escapeNext = false;
50
+ }
51
+ else if (current === '\\') {
52
+ escapeNext = true;
53
+ }
54
+ else if (current === stringDelimiter) {
55
+ stringDelimiter = null;
56
+ }
57
+ continue;
58
+ }
59
+ if (current === "'" || current === '"') {
60
+ stringDelimiter = current;
61
+ continue;
62
+ }
63
+ if (current === '(') {
64
+ depth++;
65
+ }
66
+ else if (current === ')') {
67
+ depth--;
68
+ if (depth === 0) {
69
+ return code.slice(startIndex, index).trim();
70
+ }
71
+ }
72
+ }
73
+ return null;
74
+ }
75
+ function resolveStringExpression(expression, constants) {
76
+ const parts = splitStringExpression(expression);
77
+ let value = '';
78
+ let fullyResolved = true;
79
+ let usedConstant = false;
80
+ for (const part of parts) {
81
+ const literal = readStringLiteral(part);
82
+ if (literal !== null) {
83
+ value += literal;
84
+ continue;
85
+ }
86
+ if (IDENTIFIER_PATTERN.test(part) && constants.has(part)) {
87
+ const resolved = constants.get(part);
88
+ value += resolved.value;
89
+ fullyResolved = fullyResolved && resolved.fullyResolved;
90
+ usedConstant = true;
91
+ continue;
92
+ }
93
+ value += `{${part}}`;
94
+ fullyResolved = false;
95
+ }
96
+ return {
97
+ value,
98
+ fullyResolved,
99
+ origin: usedConstant ? 'apex-constant' : 'apex-string',
100
+ };
101
+ }
102
+ function splitStringExpression(expression) {
103
+ const parts = [];
104
+ let stringDelimiter = null;
105
+ let escapeNext = false;
106
+ let partStartIndex = 0;
107
+ for (let index = 0; index < expression.length; index++) {
108
+ const current = expression[index];
109
+ if (stringDelimiter) {
110
+ if (escapeNext) {
111
+ escapeNext = false;
112
+ }
113
+ else if (current === '\\') {
114
+ escapeNext = true;
115
+ }
116
+ else if (current === stringDelimiter) {
117
+ stringDelimiter = null;
118
+ }
119
+ continue;
120
+ }
121
+ if (current === "'" || current === '"') {
122
+ stringDelimiter = current;
123
+ continue;
124
+ }
125
+ if (current === '+') {
126
+ parts.push(expression.slice(partStartIndex, index).trim());
127
+ partStartIndex = index + 1;
128
+ }
129
+ }
130
+ parts.push(expression.slice(partStartIndex).trim());
131
+ return parts;
132
+ }
133
+ function readStringLiteral(expression) {
134
+ const match = /^'((?:\\'|[^'])*)'$|^"((?:\\"|[^"])*)"$/.exec(expression);
135
+ if (!match) {
136
+ return null;
137
+ }
138
+ return (match[1] ?? match[2] ?? '').replaceAll("\\'", "'").replaceAll('\\"', '"');
139
+ }
140
+ function parseDynamicQueryReference(resolved) {
141
+ const reference = parseSoqlReference(resolved.value, resolved.origin);
142
+ if (!reference) {
143
+ return null;
144
+ }
145
+ return {
146
+ ...reference,
147
+ confidence: resolved.fullyResolved ? reference.confidence : 'low',
148
+ };
149
+ }
150
+ //# sourceMappingURL=apex-dynamic-query-analysis.js.map