@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.
- package/README.md +3 -2
- package/lib/ai/wave-validation-prompt.d.ts +2 -0
- package/lib/ai/wave-validation-prompt.js +56 -0
- package/lib/ai/wave-validation-prompt.js.map +1 -0
- package/lib/ai/wave-validation-report.d.ts +2 -0
- package/lib/ai/wave-validation-report.js +96 -0
- package/lib/ai/wave-validation-report.js.map +1 -0
- package/lib/ai/wave-validation-response-parser.d.ts +8 -0
- package/lib/ai/wave-validation-response-parser.js +112 -0
- package/lib/ai/wave-validation-response-parser.js.map +1 -0
- package/lib/ai/wave-validation-result-synthesis.d.ts +6 -0
- package/lib/ai/wave-validation-result-synthesis.js +49 -0
- package/lib/ai/wave-validation-result-synthesis.js.map +1 -0
- package/lib/ai/wave-validation-service.d.ts +1 -55
- package/lib/ai/wave-validation-service.js +11 -359
- package/lib/ai/wave-validation-service.js.map +1 -1
- package/lib/ai/wave-validation-transport.d.ts +7 -0
- package/lib/ai/wave-validation-transport.js +10 -0
- package/lib/ai/wave-validation-transport.js.map +1 -0
- package/lib/analysis/analysis-reporter.d.ts +29 -0
- package/lib/analysis/analysis-reporter.js +84 -1
- package/lib/analysis/analysis-reporter.js.map +1 -1
- package/lib/analysis/analyze-context-service.d.ts +1 -1
- package/lib/analysis/analyze-context-service.js +2 -0
- package/lib/analysis/analyze-context-service.js.map +1 -1
- package/lib/analysis/project-analysis-service.d.ts +2 -0
- package/lib/analysis/project-analysis-service.js +2 -0
- package/lib/analysis/project-analysis-service.js.map +1 -1
- package/lib/commands/start.d.ts +1 -0
- package/lib/commands/start.js +14 -1
- package/lib/commands/start.js.map +1 -1
- package/lib/commands/status.d.ts +2 -0
- package/lib/commands/status.js +1 -0
- package/lib/commands/status.js.map +1 -1
- package/lib/commands/validate.d.ts +3 -3
- package/lib/commands/validate.js +4 -4
- package/lib/commands/validate.js.map +1 -1
- package/lib/constants/api-version.d.ts +2 -2
- package/lib/constants/api-version.js +2 -2
- package/lib/constants/deployment-order.js +11 -8
- package/lib/constants/deployment-order.js.map +1 -1
- package/lib/dependencies/circular-dependency-detector.d.ts +1 -31
- package/lib/dependencies/circular-dependency-detector.js +7 -156
- package/lib/dependencies/circular-dependency-detector.js.map +1 -1
- package/lib/dependencies/cycle-break-suggestions.d.ts +3 -0
- package/lib/dependencies/cycle-break-suggestions.js +63 -0
- package/lib/dependencies/cycle-break-suggestions.js.map +1 -0
- package/lib/dependencies/cycle-discovery.d.ts +16 -0
- package/lib/dependencies/cycle-discovery.js +70 -0
- package/lib/dependencies/cycle-discovery.js.map +1 -0
- package/lib/dependencies/dependency-graph-builder.d.ts +0 -65
- package/lib/dependencies/dependency-graph-builder.js +19 -233
- package/lib/dependencies/dependency-graph-builder.js.map +1 -1
- package/lib/dependencies/dependency-graph-intake.d.ts +17 -0
- package/lib/dependencies/dependency-graph-intake.js +20 -0
- package/lib/dependencies/dependency-graph-intake.js.map +1 -0
- package/lib/dependencies/dependency-graph-stats.d.ts +4 -0
- package/lib/dependencies/dependency-graph-stats.js +82 -0
- package/lib/dependencies/dependency-graph-stats.js.map +1 -0
- package/lib/dependencies/dependency-graph-validation.d.ts +16 -0
- package/lib/dependencies/dependency-graph-validation.js +78 -0
- package/lib/dependencies/dependency-graph-validation.js.map +1 -0
- package/lib/dependencies/dependency-impact-analyzer.d.ts +1 -22
- package/lib/dependencies/dependency-impact-analyzer.js +12 -110
- package/lib/dependencies/dependency-impact-analyzer.js.map +1 -1
- package/lib/dependencies/dependency-impact-scoring.d.ts +5 -0
- package/lib/dependencies/dependency-impact-scoring.js +24 -0
- package/lib/dependencies/dependency-impact-scoring.js.map +1 -0
- package/lib/dependencies/dependency-impact-traversal.d.ts +18 -0
- package/lib/dependencies/dependency-impact-traversal.js +74 -0
- package/lib/dependencies/dependency-impact-traversal.js.map +1 -0
- package/lib/dependencies/dependency-resolution-classifier.d.ts +19 -0
- package/lib/dependencies/dependency-resolution-classifier.js +67 -0
- package/lib/dependencies/dependency-resolution-classifier.js.map +1 -0
- package/lib/dependencies/dependency-resolver.d.ts +1 -48
- package/lib/dependencies/dependency-resolver.js +12 -181
- package/lib/dependencies/dependency-resolver.js.map +1 -1
- package/lib/dependencies/dynamic-query-dependency-references.d.ts +3 -0
- package/lib/dependencies/dynamic-query-dependency-references.js +41 -0
- package/lib/dependencies/dynamic-query-dependency-references.js.map +1 -0
- package/lib/dependencies/topological-dependency-sorter.d.ts +10 -0
- package/lib/dependencies/topological-dependency-sorter.js +84 -0
- package/lib/dependencies/topological-dependency-sorter.js.map +1 -0
- package/lib/deployment/cycle-remediation-runner.d.ts +1 -0
- package/lib/deployment/cycle-remediation-runner.js +5 -1
- package/lib/deployment/cycle-remediation-runner.js.map +1 -1
- package/lib/deployment/deployment-runner.d.ts +3 -1
- package/lib/deployment/deployment-runner.js +6 -1
- package/lib/deployment/deployment-runner.js.map +1 -1
- package/lib/deployment/deployment-status-service.d.ts +2 -0
- package/lib/deployment/deployment-status-service.js +2 -0
- package/lib/deployment/deployment-status-service.js.map +1 -1
- package/lib/deployment/deployment-validation-service.js +1 -1
- package/lib/deployment/deployment-validation-service.js.map +1 -1
- package/lib/deployment/dynamic-query-target-validator.d.ts +24 -0
- package/lib/deployment/dynamic-query-target-validator.js +65 -0
- package/lib/deployment/dynamic-query-target-validator.js.map +1 -0
- package/lib/deployment/sf-cli-integration.d.ts +1 -0
- package/lib/deployment/sf-cli-integration.js +1 -1
- package/lib/deployment/sf-cli-integration.js.map +1 -1
- package/lib/deployment/sf-cli-metadata-lookup.d.ts +4 -0
- package/lib/deployment/sf-cli-metadata-lookup.js +26 -0
- package/lib/deployment/sf-cli-metadata-lookup.js.map +1 -0
- package/lib/deployment/start-execution-service.d.ts +5 -0
- package/lib/deployment/start-execution-service.js +26 -6
- package/lib/deployment/start-execution-service.js.map +1 -1
- package/lib/deployment/wave-graph-state.d.ts +6 -0
- package/lib/deployment/wave-graph-state.js +89 -0
- package/lib/deployment/wave-graph-state.js.map +1 -0
- package/lib/deployment/wave-manifest-service.d.ts +1 -0
- package/lib/deployment/wave-manifest-service.js +1 -1
- package/lib/deployment/wave-manifest-service.js.map +1 -1
- package/lib/errors/deployment-error.js +1 -1
- package/lib/errors/deployment-error.js.map +1 -1
- package/lib/parsers/apex-class-dependencies.d.ts +4 -0
- package/lib/parsers/apex-class-dependencies.js +122 -0
- package/lib/parsers/apex-class-dependencies.js.map +1 -0
- package/lib/parsers/apex-class-lexical.d.ts +3 -0
- package/lib/parsers/apex-class-lexical.js +101 -0
- package/lib/parsers/apex-class-lexical.js.map +1 -0
- package/lib/parsers/apex-class-names.d.ts +18 -0
- package/lib/parsers/apex-class-names.js +93 -0
- package/lib/parsers/apex-class-names.js.map +1 -0
- package/lib/parsers/apex-class-parser-model.d.ts +59 -0
- package/lib/parsers/apex-class-parser-model.js +2 -0
- package/lib/parsers/apex-class-parser-model.js.map +1 -0
- package/lib/parsers/apex-class-parser.d.ts +3 -29
- package/lib/parsers/apex-class-parser.js +10 -395
- package/lib/parsers/apex-class-parser.js.map +1 -1
- package/lib/parsers/apex-class-symbols.d.ts +2 -0
- package/lib/parsers/apex-class-symbols.js +61 -0
- package/lib/parsers/apex-class-symbols.js.map +1 -0
- package/lib/parsers/apex-dynamic-query-analysis.d.ts +2 -0
- package/lib/parsers/apex-dynamic-query-analysis.js +150 -0
- package/lib/parsers/apex-dynamic-query-analysis.js.map +1 -0
- package/lib/parsers/custom-metadata-dynamic-query-analysis.d.ts +2 -0
- package/lib/parsers/custom-metadata-dynamic-query-analysis.js +50 -0
- package/lib/parsers/custom-metadata-dynamic-query-analysis.js.map +1 -0
- package/lib/parsers/custom-metadata-parser.d.ts +2 -0
- package/lib/parsers/custom-metadata-parser.js +3 -0
- package/lib/parsers/custom-metadata-parser.js.map +1 -1
- package/lib/parsers/custom-object-dependency-builder.d.ts +3 -0
- package/lib/parsers/custom-object-dependency-builder.js +103 -0
- package/lib/parsers/custom-object-dependency-builder.js.map +1 -0
- package/lib/parsers/custom-object-parser.js +1 -208
- package/lib/parsers/custom-object-parser.js.map +1 -1
- package/lib/parsers/custom-object-reference-helpers.d.ts +4 -0
- package/lib/parsers/custom-object-reference-helpers.js +92 -0
- package/lib/parsers/custom-object-reference-helpers.js.map +1 -0
- package/lib/parsers/dynamic-query-reference.d.ts +16 -0
- package/lib/parsers/dynamic-query-reference.js +65 -0
- package/lib/parsers/dynamic-query-reference.js.map +1 -0
- package/lib/parsers/layout-action-analysis.d.ts +6 -0
- package/lib/parsers/layout-action-analysis.js +36 -0
- package/lib/parsers/layout-action-analysis.js.map +1 -0
- package/lib/parsers/layout-parser.js +4 -272
- package/lib/parsers/layout-parser.js.map +1 -1
- package/lib/parsers/layout-reference-analysis.d.ts +9 -0
- package/lib/parsers/layout-reference-analysis.js +70 -0
- package/lib/parsers/layout-reference-analysis.js.map +1 -0
- package/lib/parsers/layout-result-assembly.d.ts +5 -0
- package/lib/parsers/layout-result-assembly.js +35 -0
- package/lib/parsers/layout-result-assembly.js.map +1 -0
- package/lib/parsers/layout-section-analysis.d.ts +7 -0
- package/lib/parsers/layout-section-analysis.js +9 -0
- package/lib/parsers/layout-section-analysis.js.map +1 -0
- package/lib/parsers/lwc-code-analysis.d.ts +10 -0
- package/lib/parsers/lwc-code-analysis.js +161 -0
- package/lib/parsers/lwc-code-analysis.js.map +1 -0
- package/lib/parsers/lwc-metadata-analysis.d.ts +6 -0
- package/lib/parsers/lwc-metadata-analysis.js +112 -0
- package/lib/parsers/lwc-metadata-analysis.js.map +1 -0
- package/lib/parsers/lwc-parser.d.ts +3 -27
- package/lib/parsers/lwc-parser.js +6 -377
- package/lib/parsers/lwc-parser.js.map +1 -1
- package/lib/parsers/lwc-result-assembly.d.ts +4 -0
- package/lib/parsers/lwc-result-assembly.js +47 -0
- package/lib/parsers/lwc-result-assembly.js.map +1 -0
- package/lib/presentation/status-command-presenter.d.ts +1 -0
- package/lib/presentation/status-command-presenter.js +20 -0
- package/lib/presentation/status-command-presenter.js.map +1 -1
- package/lib/scanner/forceignore-parser.d.ts +1 -0
- package/lib/scanner/forceignore-parser.js +14 -3
- package/lib/scanner/forceignore-parser.js.map +1 -1
- package/lib/scanner/structure-validator.js +1 -1
- package/lib/services/metadata-scanner-service.d.ts +2 -0
- package/lib/services/metadata-scanner-service.js +9 -2
- package/lib/services/metadata-scanner-service.js.map +1 -1
- package/lib/services/scanners/additional-metadata-scanner.d.ts +2 -0
- package/lib/services/scanners/additional-metadata-scanner.js +183 -0
- package/lib/services/scanners/additional-metadata-scanner.js.map +1 -0
- package/lib/services/scanners/automation-ai-metadata-scanner.d.ts +1 -0
- package/lib/services/scanners/automation-ai-metadata-scanner.js +11 -0
- package/lib/services/scanners/automation-ai-metadata-scanner.js.map +1 -1
- package/lib/services/scanners/code-metadata-scanner.js +14 -1
- package/lib/services/scanners/code-metadata-scanner.js.map +1 -1
- package/lib/services/scanners/data-metadata-scanner.js +24 -8
- package/lib/services/scanners/data-metadata-scanner.js.map +1 -1
- package/lib/types/metadata.d.ts +1 -1
- package/lib/utils/cache-entry-serializer.d.ts +7 -0
- package/lib/utils/cache-entry-serializer.js +15 -0
- package/lib/utils/cache-entry-serializer.js.map +1 -0
- package/lib/utils/cache-expiry-policy.d.ts +7 -0
- package/lib/utils/cache-expiry-policy.js +34 -0
- package/lib/utils/cache-expiry-policy.js.map +1 -0
- package/lib/utils/cache-key-derivation.d.ts +11 -0
- package/lib/utils/cache-key-derivation.js +28 -0
- package/lib/utils/cache-key-derivation.js.map +1 -0
- package/lib/utils/cache-lock-lifecycle.d.ts +15 -0
- package/lib/utils/cache-lock-lifecycle.js +84 -0
- package/lib/utils/cache-lock-lifecycle.js.map +1 -0
- package/lib/utils/cache-logger.d.ts +8 -0
- package/lib/utils/cache-logger.js +19 -0
- package/lib/utils/cache-logger.js.map +1 -0
- package/lib/utils/cache-manager.d.ts +1 -2
- package/lib/utils/cache-manager.js +7 -253
- package/lib/utils/cache-manager.js.map +1 -1
- package/lib/utils/cache-storage.d.ts +20 -0
- package/lib/utils/cache-storage.js +83 -0
- package/lib/utils/cache-storage.js.map +1 -0
- package/lib/validators/xml-metadata-validator.js +1 -1
- package/lib/waves/priority-wave-generator.js +8 -2
- package/lib/waves/priority-wave-generator.js.map +1 -1
- package/lib/waves/test-optimizer-discovery.d.ts +12 -0
- package/lib/waves/test-optimizer-discovery.js +46 -0
- package/lib/waves/test-optimizer-discovery.js.map +1 -0
- package/lib/waves/test-optimizer-matching.d.ts +6 -0
- package/lib/waves/test-optimizer-matching.js +43 -0
- package/lib/waves/test-optimizer-matching.js.map +1 -0
- package/lib/waves/test-optimizer-model.d.ts +92 -0
- package/lib/waves/test-optimizer-model.js +2 -0
- package/lib/waves/test-optimizer-model.js.map +1 -0
- package/lib/waves/test-optimizer-scoring.d.ts +11 -0
- package/lib/waves/test-optimizer-scoring.js +53 -0
- package/lib/waves/test-optimizer-scoring.js.map +1 -0
- package/lib/waves/test-optimizer.d.ts +2 -102
- package/lib/waves/test-optimizer.js +9 -154
- package/lib/waves/test-optimizer.js.map +1 -1
- package/lib/waves/wave-builder.d.ts +0 -11
- package/lib/waves/wave-builder.js +19 -193
- package/lib/waves/wave-builder.js.map +1 -1
- package/lib/waves/wave-graph.d.ts +25 -0
- package/lib/waves/wave-graph.js +138 -0
- package/lib/waves/wave-graph.js.map +1 -0
- package/lib/waves/wave-metadata.d.ts +4 -0
- package/lib/waves/wave-metadata.js +36 -0
- package/lib/waves/wave-metadata.js.map +1 -0
- package/lib/waves/wave-priority-policy.d.ts +5 -0
- package/lib/waves/wave-priority-policy.js +83 -0
- package/lib/waves/wave-priority-policy.js.map +1 -0
- package/lib/waves/wave-topology.d.ts +28 -0
- package/lib/waves/wave-topology.js +65 -0
- package/lib/waves/wave-topology.js.map +1 -0
- package/messages/start.json +5 -5
- package/messages/validate.json +1 -1
- package/npm-shrinkwrap.json +342 -751
- package/oclif.lock +83 -262
- package/oclif.manifest.json +7 -7
- 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
|
|
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,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,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
|