@jterrats/smart-deployment 1.0.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.
- package/README.md +193 -0
- package/lib/ai/agentforce-error-handler.d.ts +81 -0
- package/lib/ai/agentforce-error-handler.js +196 -0
- package/lib/ai/agentforce-error-handler.js.map +1 -0
- package/lib/ai/agentforce-priority-service.d.ts +82 -0
- package/lib/ai/agentforce-priority-service.js +257 -0
- package/lib/ai/agentforce-priority-service.js.map +1 -0
- package/lib/ai/agentforce-service.d.ts +99 -0
- package/lib/ai/agentforce-service.js +300 -0
- package/lib/ai/agentforce-service.js.map +1 -0
- package/lib/ai/circuit-breaker.d.ts +115 -0
- package/lib/ai/circuit-breaker.js +277 -0
- package/lib/ai/circuit-breaker.js.map +1 -0
- package/lib/ai/dependency-inference-service.d.ts +76 -0
- package/lib/ai/dependency-inference-service.js +220 -0
- package/lib/ai/dependency-inference-service.js.map +1 -0
- package/lib/ai/llm-provider-factory.d.ts +15 -0
- package/lib/ai/llm-provider-factory.js +36 -0
- package/lib/ai/llm-provider-factory.js.map +1 -0
- package/lib/ai/llm-provider.d.ts +27 -0
- package/lib/ai/llm-provider.js +2 -0
- package/lib/ai/llm-provider.js.map +1 -0
- package/lib/ai/openai-service.d.ts +20 -0
- package/lib/ai/openai-service.js +89 -0
- package/lib/ai/openai-service.js.map +1 -0
- package/lib/ai/prompt-builder.d.ts +79 -0
- package/lib/ai/prompt-builder.js +180 -0
- package/lib/ai/prompt-builder.js.map +1 -0
- package/lib/ai/response-parser.d.ts +67 -0
- package/lib/ai/response-parser.js +234 -0
- package/lib/ai/response-parser.js.map +1 -0
- package/lib/ai/wave-validation-service.d.ts +111 -0
- package/lib/ai/wave-validation-service.js +381 -0
- package/lib/ai/wave-validation-service.js.map +1 -0
- package/lib/analysis/analysis-reporter.d.ts +56 -0
- package/lib/analysis/analysis-reporter.js +170 -0
- package/lib/analysis/analysis-reporter.js.map +1 -0
- package/lib/analytics/error-analytics.d.ts +80 -0
- package/lib/analytics/error-analytics.js +162 -0
- package/lib/analytics/error-analytics.js.map +1 -0
- package/lib/commands/analyze.d.ts +49 -0
- package/lib/commands/analyze.js +232 -0
- package/lib/commands/analyze.js.map +1 -0
- package/lib/commands/config.d.ts +42 -0
- package/lib/commands/config.js +219 -0
- package/lib/commands/config.js.map +1 -0
- package/lib/commands/resume.d.ts +26 -0
- package/lib/commands/resume.js +69 -0
- package/lib/commands/resume.js.map +1 -0
- package/lib/commands/start.d.ts +70 -0
- package/lib/commands/start.js +659 -0
- package/lib/commands/start.js.map +1 -0
- package/lib/commands/status.d.ts +37 -0
- package/lib/commands/status.js +69 -0
- package/lib/commands/status.js.map +1 -0
- package/lib/commands/validate.d.ts +33 -0
- package/lib/commands/validate.js +66 -0
- package/lib/commands/validate.js.map +1 -0
- package/lib/config/repo-config.d.ts +22 -0
- package/lib/config/repo-config.js +31 -0
- package/lib/config/repo-config.js.map +1 -0
- package/lib/constants/agentforce-limits.d.ts +174 -0
- package/lib/constants/agentforce-limits.js +262 -0
- package/lib/constants/agentforce-limits.js.map +1 -0
- package/lib/constants/api-version.d.ts +70 -0
- package/lib/constants/api-version.js +122 -0
- package/lib/constants/api-version.js.map +1 -0
- package/lib/constants/deployment-order.d.ts +68 -0
- package/lib/constants/deployment-order.js +162 -0
- package/lib/constants/deployment-order.js.map +1 -0
- package/lib/constants/salesforce-limits.d.ts +107 -0
- package/lib/constants/salesforce-limits.js +104 -0
- package/lib/constants/salesforce-limits.js.map +1 -0
- package/lib/dependencies/circular-dependency-detector.d.ts +137 -0
- package/lib/dependencies/circular-dependency-detector.js +329 -0
- package/lib/dependencies/circular-dependency-detector.js.map +1 -0
- package/lib/dependencies/cycle-remediation-planner.d.ts +50 -0
- package/lib/dependencies/cycle-remediation-planner.js +192 -0
- package/lib/dependencies/cycle-remediation-planner.js.map +1 -0
- package/lib/dependencies/dependency-cache.d.ts +134 -0
- package/lib/dependencies/dependency-cache.js +303 -0
- package/lib/dependencies/dependency-cache.js.map +1 -0
- package/lib/dependencies/dependency-depth-calculator.d.ts +145 -0
- package/lib/dependencies/dependency-depth-calculator.js +368 -0
- package/lib/dependencies/dependency-depth-calculator.js.map +1 -0
- package/lib/dependencies/dependency-graph-builder.d.ts +151 -0
- package/lib/dependencies/dependency-graph-builder.js +411 -0
- package/lib/dependencies/dependency-graph-builder.js.map +1 -0
- package/lib/dependencies/dependency-impact-analyzer.d.ts +145 -0
- package/lib/dependencies/dependency-impact-analyzer.js +330 -0
- package/lib/dependencies/dependency-impact-analyzer.js.map +1 -0
- package/lib/dependencies/dependency-merger.d.ts +122 -0
- package/lib/dependencies/dependency-merger.js +245 -0
- package/lib/dependencies/dependency-merger.js.map +1 -0
- package/lib/dependencies/dependency-resolver.d.ts +157 -0
- package/lib/dependencies/dependency-resolver.js +298 -0
- package/lib/dependencies/dependency-resolver.js.map +1 -0
- package/lib/dependencies/dependency-validator.d.ts +123 -0
- package/lib/dependencies/dependency-validator.js +291 -0
- package/lib/dependencies/dependency-validator.js.map +1 -0
- package/lib/dependencies/graph-visualizer.d.ts +110 -0
- package/lib/dependencies/graph-visualizer.js +262 -0
- package/lib/dependencies/graph-visualizer.js.map +1 -0
- package/lib/dependencies/heuristic-inference.d.ts +136 -0
- package/lib/dependencies/heuristic-inference.js +430 -0
- package/lib/dependencies/heuristic-inference.js.map +1 -0
- package/lib/deployment/cycle-source-editor.d.ts +34 -0
- package/lib/deployment/cycle-source-editor.js +121 -0
- package/lib/deployment/cycle-source-editor.js.map +1 -0
- package/lib/deployment/deployment-error-handler.d.ts +38 -0
- package/lib/deployment/deployment-error-handler.js +79 -0
- package/lib/deployment/deployment-error-handler.js.map +1 -0
- package/lib/deployment/deployment-reporter.d.ts +63 -0
- package/lib/deployment/deployment-reporter.js +150 -0
- package/lib/deployment/deployment-reporter.js.map +1 -0
- package/lib/deployment/deployment-state-summary.d.ts +38 -0
- package/lib/deployment/deployment-state-summary.js +209 -0
- package/lib/deployment/deployment-state-summary.js.map +1 -0
- package/lib/deployment/deployment-status-service.d.ts +36 -0
- package/lib/deployment/deployment-status-service.js +128 -0
- package/lib/deployment/deployment-status-service.js.map +1 -0
- package/lib/deployment/deployment-tracker.d.ts +42 -0
- package/lib/deployment/deployment-tracker.js +79 -0
- package/lib/deployment/deployment-tracker.js.map +1 -0
- package/lib/deployment/deployment-validation-service.d.ts +28 -0
- package/lib/deployment/deployment-validation-service.js +161 -0
- package/lib/deployment/deployment-validation-service.js.map +1 -0
- package/lib/deployment/retry-handler.d.ts +37 -0
- package/lib/deployment/retry-handler.js +86 -0
- package/lib/deployment/retry-handler.js.map +1 -0
- package/lib/deployment/sf-cli-integration.d.ts +42 -0
- package/lib/deployment/sf-cli-integration.js +105 -0
- package/lib/deployment/sf-cli-integration.js.map +1 -0
- package/lib/deployment/state-manager.d.ts +61 -0
- package/lib/deployment/state-manager.js +83 -0
- package/lib/deployment/state-manager.js.map +1 -0
- package/lib/deployment/test-executor.d.ts +41 -0
- package/lib/deployment/test-executor.js +87 -0
- package/lib/deployment/test-executor.js.map +1 -0
- package/lib/errors/base-error.d.ts +24 -0
- package/lib/errors/base-error.js +66 -0
- package/lib/errors/base-error.js.map +1 -0
- package/lib/errors/dependency-error.d.ts +37 -0
- package/lib/errors/dependency-error.js +76 -0
- package/lib/errors/dependency-error.js.map +1 -0
- package/lib/errors/deployment-error.d.ts +55 -0
- package/lib/errors/deployment-error.js +132 -0
- package/lib/errors/deployment-error.js.map +1 -0
- package/lib/errors/index.d.ts +45 -0
- package/lib/errors/index.js +71 -0
- package/lib/errors/index.js.map +1 -0
- package/lib/errors/network-error.d.ts +53 -0
- package/lib/errors/network-error.js +111 -0
- package/lib/errors/network-error.js.map +1 -0
- package/lib/errors/parsing-error.d.ts +41 -0
- package/lib/errors/parsing-error.js +69 -0
- package/lib/errors/parsing-error.js.map +1 -0
- package/lib/errors/validation-error-reporter.d.ts +34 -0
- package/lib/errors/validation-error-reporter.js +99 -0
- package/lib/errors/validation-error-reporter.js.map +1 -0
- package/lib/errors/validation-error.d.ts +58 -0
- package/lib/errors/validation-error.js +131 -0
- package/lib/errors/validation-error.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/monitoring/performance-monitor.d.ts +98 -0
- package/lib/monitoring/performance-monitor.js +260 -0
- package/lib/monitoring/performance-monitor.js.map +1 -0
- package/lib/parsers/apex-class-parser.d.ts +47 -0
- package/lib/parsers/apex-class-parser.js +368 -0
- package/lib/parsers/apex-class-parser.js.map +1 -0
- package/lib/parsers/apex-trigger-parser.d.ts +48 -0
- package/lib/parsers/apex-trigger-parser.js +229 -0
- package/lib/parsers/apex-trigger-parser.js.map +1 -0
- package/lib/parsers/aura-parser.d.ts +55 -0
- package/lib/parsers/aura-parser.js +229 -0
- package/lib/parsers/aura-parser.js.map +1 -0
- package/lib/parsers/bot-parser.d.ts +65 -0
- package/lib/parsers/bot-parser.js +225 -0
- package/lib/parsers/bot-parser.js.map +1 -0
- package/lib/parsers/custom-metadata-parser.d.ts +94 -0
- package/lib/parsers/custom-metadata-parser.js +199 -0
- package/lib/parsers/custom-metadata-parser.js.map +1 -0
- package/lib/parsers/custom-object-parser.d.ts +62 -0
- package/lib/parsers/custom-object-parser.js +297 -0
- package/lib/parsers/custom-object-parser.js.map +1 -0
- package/lib/parsers/email-template-parser.d.ts +64 -0
- package/lib/parsers/email-template-parser.js +238 -0
- package/lib/parsers/email-template-parser.js.map +1 -0
- package/lib/parsers/error-resilient-parser.d.ts +110 -0
- package/lib/parsers/error-resilient-parser.js +277 -0
- package/lib/parsers/error-resilient-parser.js.map +1 -0
- package/lib/parsers/flexipage-parser.d.ts +64 -0
- package/lib/parsers/flexipage-parser.js +196 -0
- package/lib/parsers/flexipage-parser.js.map +1 -0
- package/lib/parsers/flow-parser.d.ts +54 -0
- package/lib/parsers/flow-parser.js +287 -0
- package/lib/parsers/flow-parser.js.map +1 -0
- package/lib/parsers/genai-prompt-parser.d.ts +67 -0
- package/lib/parsers/genai-prompt-parser.js +160 -0
- package/lib/parsers/genai-prompt-parser.js.map +1 -0
- package/lib/parsers/layout-parser.d.ts +64 -0
- package/lib/parsers/layout-parser.js +267 -0
- package/lib/parsers/layout-parser.js.map +1 -0
- package/lib/parsers/lwc-parser.d.ts +60 -0
- package/lib/parsers/lwc-parser.js +264 -0
- package/lib/parsers/lwc-parser.js.map +1 -0
- package/lib/parsers/permission-set-parser.d.ts +86 -0
- package/lib/parsers/permission-set-parser.js +152 -0
- package/lib/parsers/permission-set-parser.js.map +1 -0
- package/lib/parsers/profile-parser.d.ts +81 -0
- package/lib/parsers/profile-parser.js +141 -0
- package/lib/parsers/profile-parser.js.map +1 -0
- package/lib/parsers/visualforce-parser.d.ts +47 -0
- package/lib/parsers/visualforce-parser.js +180 -0
- package/lib/parsers/visualforce-parser.js.map +1 -0
- package/lib/provisioning/data-provisioner.d.ts +88 -0
- package/lib/provisioning/data-provisioner.js +257 -0
- package/lib/provisioning/data-provisioner.js.map +1 -0
- package/lib/scanner/custom-structure-scanner.d.ts +66 -0
- package/lib/scanner/custom-structure-scanner.js +229 -0
- package/lib/scanner/custom-structure-scanner.js.map +1 -0
- package/lib/scanner/forceignore-parser.d.ts +69 -0
- package/lib/scanner/forceignore-parser.js +195 -0
- package/lib/scanner/forceignore-parser.js.map +1 -0
- package/lib/scanner/metadata-format-scanner.d.ts +77 -0
- package/lib/scanner/metadata-format-scanner.js +282 -0
- package/lib/scanner/metadata-format-scanner.js.map +1 -0
- package/lib/scanner/monorepo-scanner.d.ts +71 -0
- package/lib/scanner/monorepo-scanner.js +225 -0
- package/lib/scanner/monorepo-scanner.js.map +1 -0
- package/lib/scanner/project-validator.d.ts +55 -0
- package/lib/scanner/project-validator.js +235 -0
- package/lib/scanner/project-validator.js.map +1 -0
- package/lib/scanner/sfdx-project-detector.d.ts +86 -0
- package/lib/scanner/sfdx-project-detector.js +240 -0
- package/lib/scanner/sfdx-project-detector.js.map +1 -0
- package/lib/scanner/structure-validator.d.ts +64 -0
- package/lib/scanner/structure-validator.js +296 -0
- package/lib/scanner/structure-validator.js.map +1 -0
- package/lib/services/metadata-scanner-service.d.ts +64 -0
- package/lib/services/metadata-scanner-service.js +651 -0
- package/lib/services/metadata-scanner-service.js.map +1 -0
- package/lib/types/agentforce.d.ts +157 -0
- package/lib/types/agentforce.js +2 -0
- package/lib/types/agentforce.js.map +1 -0
- package/lib/types/dependency.d.ts +98 -0
- package/lib/types/dependency.js +5 -0
- package/lib/types/dependency.js.map +1 -0
- package/lib/types/deployment-plan.d.ts +81 -0
- package/lib/types/deployment-plan.js +6 -0
- package/lib/types/deployment-plan.js.map +1 -0
- package/lib/types/deployment.d.ts +88 -0
- package/lib/types/deployment.js +5 -0
- package/lib/types/deployment.js.map +1 -0
- package/lib/types/graph.d.ts +35 -0
- package/lib/types/graph.js +5 -0
- package/lib/types/graph.js.map +1 -0
- package/lib/types/index.d.ts +12 -0
- package/lib/types/index.js +17 -0
- package/lib/types/index.js.map +1 -0
- package/lib/types/metadata.d.ts +101 -0
- package/lib/types/metadata.js +13 -0
- package/lib/types/metadata.js.map +1 -0
- package/lib/types/project.d.ts +156 -0
- package/lib/types/project.js +56 -0
- package/lib/types/project.js.map +1 -0
- package/lib/types/salesforce/apex.d.ts +94 -0
- package/lib/types/salesforce/apex.js +6 -0
- package/lib/types/salesforce/apex.js.map +1 -0
- package/lib/types/salesforce/aura.d.ts +150 -0
- package/lib/types/salesforce/aura.js +6 -0
- package/lib/types/salesforce/aura.js.map +1 -0
- package/lib/types/salesforce/bot.d.ts +293 -0
- package/lib/types/salesforce/bot.js +6 -0
- package/lib/types/salesforce/bot.js.map +1 -0
- package/lib/types/salesforce/common.d.ts +15 -0
- package/lib/types/salesforce/common.js +5 -0
- package/lib/types/salesforce/common.js.map +1 -0
- package/lib/types/salesforce/custom-metadata.d.ts +92 -0
- package/lib/types/salesforce/custom-metadata.js +6 -0
- package/lib/types/salesforce/custom-metadata.js.map +1 -0
- package/lib/types/salesforce/email.d.ts +56 -0
- package/lib/types/salesforce/email.js +6 -0
- package/lib/types/salesforce/email.js.map +1 -0
- package/lib/types/salesforce/flexipage.d.ts +149 -0
- package/lib/types/salesforce/flexipage.js +6 -0
- package/lib/types/salesforce/flexipage.js.map +1 -0
- package/lib/types/salesforce/flow.d.ts +516 -0
- package/lib/types/salesforce/flow.js +6 -0
- package/lib/types/salesforce/flow.js.map +1 -0
- package/lib/types/salesforce/genai.d.ts +67 -0
- package/lib/types/salesforce/genai.js +6 -0
- package/lib/types/salesforce/genai.js.map +1 -0
- package/lib/types/salesforce/index.d.ts +27 -0
- package/lib/types/salesforce/index.js +43 -0
- package/lib/types/salesforce/index.js.map +1 -0
- package/lib/types/salesforce/layout.d.ts +236 -0
- package/lib/types/salesforce/layout.js +6 -0
- package/lib/types/salesforce/layout.js.map +1 -0
- package/lib/types/salesforce/lwc.d.ts +123 -0
- package/lib/types/salesforce/lwc.js +6 -0
- package/lib/types/salesforce/lwc.js.map +1 -0
- package/lib/types/salesforce/object.d.ts +427 -0
- package/lib/types/salesforce/object.js +6 -0
- package/lib/types/salesforce/object.js.map +1 -0
- package/lib/types/salesforce/parser-types.d.ts +79 -0
- package/lib/types/salesforce/parser-types.js +80 -0
- package/lib/types/salesforce/parser-types.js.map +1 -0
- package/lib/types/salesforce/permission.d.ts +289 -0
- package/lib/types/salesforce/permission.js +6 -0
- package/lib/types/salesforce/permission.js.map +1 -0
- package/lib/types/salesforce/resource.d.ts +93 -0
- package/lib/types/salesforce/resource.js +6 -0
- package/lib/types/salesforce/resource.js.map +1 -0
- package/lib/types/salesforce/visualforce.d.ts +70 -0
- package/lib/types/salesforce/visualforce.js +6 -0
- package/lib/types/salesforce/visualforce.js.map +1 -0
- package/lib/utils/cache-manager.d.ts +158 -0
- package/lib/utils/cache-manager.js +429 -0
- package/lib/utils/cache-manager.js.map +1 -0
- package/lib/utils/deployment-plan-manager.d.ts +40 -0
- package/lib/utils/deployment-plan-manager.js +183 -0
- package/lib/utils/deployment-plan-manager.js.map +1 -0
- package/lib/utils/error-aggregator.d.ts +117 -0
- package/lib/utils/error-aggregator.js +268 -0
- package/lib/utils/error-aggregator.js.map +1 -0
- package/lib/utils/file-system.d.ts +62 -0
- package/lib/utils/file-system.js +167 -0
- package/lib/utils/file-system.js.map +1 -0
- package/lib/utils/functional.d.ts +52 -0
- package/lib/utils/functional.js +61 -0
- package/lib/utils/functional.js.map +1 -0
- package/lib/utils/graph-algorithms.d.ts +53 -0
- package/lib/utils/graph-algorithms.js +177 -0
- package/lib/utils/graph-algorithms.js.map +1 -0
- package/lib/utils/logger.d.ts +154 -0
- package/lib/utils/logger.js +327 -0
- package/lib/utils/logger.js.map +1 -0
- package/lib/utils/network-handler.d.ts +64 -0
- package/lib/utils/network-handler.js +147 -0
- package/lib/utils/network-handler.js.map +1 -0
- package/lib/utils/performance.d.ts +148 -0
- package/lib/utils/performance.js +294 -0
- package/lib/utils/performance.js.map +1 -0
- package/lib/utils/string.d.ts +197 -0
- package/lib/utils/string.js +331 -0
- package/lib/utils/string.js.map +1 -0
- package/lib/utils/xml.d.ts +97 -0
- package/lib/utils/xml.js +227 -0
- package/lib/utils/xml.js.map +1 -0
- package/lib/validators/xml-metadata-validator.d.ts +106 -0
- package/lib/validators/xml-metadata-validator.js +509 -0
- package/lib/validators/xml-metadata-validator.js.map +1 -0
- package/lib/waves/priority-wave-generator-ai.d.ts +85 -0
- package/lib/waves/priority-wave-generator-ai.js +191 -0
- package/lib/waves/priority-wave-generator-ai.js.map +1 -0
- package/lib/waves/priority-wave-generator.d.ts +47 -0
- package/lib/waves/priority-wave-generator.js +88 -0
- package/lib/waves/priority-wave-generator.js.map +1 -0
- package/lib/waves/test-optimizer.d.ts +155 -0
- package/lib/waves/test-optimizer.js +290 -0
- package/lib/waves/test-optimizer.js.map +1 -0
- package/lib/waves/wave-builder.d.ts +147 -0
- package/lib/waves/wave-builder.js +286 -0
- package/lib/waves/wave-builder.js.map +1 -0
- package/lib/waves/wave-diff-generator.d.ts +17 -0
- package/lib/waves/wave-diff-generator.js +6 -0
- package/lib/waves/wave-diff-generator.js.map +1 -0
- package/lib/waves/wave-executor.d.ts +33 -0
- package/lib/waves/wave-executor.js +50 -0
- package/lib/waves/wave-executor.js.map +1 -0
- package/lib/waves/wave-merger.d.ts +96 -0
- package/lib/waves/wave-merger.js +181 -0
- package/lib/waves/wave-merger.js.map +1 -0
- package/lib/waves/wave-metadata-generator.d.ts +13 -0
- package/lib/waves/wave-metadata-generator.js +12 -0
- package/lib/waves/wave-metadata-generator.js.map +1 -0
- package/lib/waves/wave-splitter.d.ts +154 -0
- package/lib/waves/wave-splitter.js +307 -0
- package/lib/waves/wave-splitter.js.map +1 -0
- package/lib/waves/wave-validator.d.ts +17 -0
- package/lib/waves/wave-validator.js +15 -0
- package/lib/waves/wave-validator.js.map +1 -0
- package/messages/analyze.json +18 -0
- package/messages/config.json +29 -0
- package/messages/resume.json +9 -0
- package/messages/start.json +24 -0
- package/messages/status.json +8 -0
- package/messages/validate.json +9 -0
- package/npm-shrinkwrap.json +25676 -0
- package/oclif.lock +11988 -0
- package/oclif.manifest.json +589 -0
- package/package.json +224 -0
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
import { ParsingError } from '../errors/parsing-error.js';
|
|
3
|
+
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
|
+
/**
|
|
52
|
+
* Remove comments from Apex code
|
|
53
|
+
*
|
|
54
|
+
* @ac US-013-AC-9: Remove comments before parsing
|
|
55
|
+
*/
|
|
56
|
+
function removeComments(code) {
|
|
57
|
+
// Remove single-line comments (//)
|
|
58
|
+
let cleaned = code.replace(/\/\/.*$/gm, '');
|
|
59
|
+
// Remove multi-line comments (/* ... */)
|
|
60
|
+
cleaned = cleaned.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
61
|
+
// Remove JavaDoc comments (/** ... */)
|
|
62
|
+
cleaned = cleaned.replace(/\/\*\*[\s\S]*?\*\//g, '');
|
|
63
|
+
return cleaned;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Check if a class is a standard Apex class
|
|
67
|
+
*
|
|
68
|
+
* @ac US-013-AC-7: Ignore standard classes (System.*, etc.)
|
|
69
|
+
*/
|
|
70
|
+
function isStandardClass(className) {
|
|
71
|
+
// Remove namespace if present
|
|
72
|
+
const cleanName = className.includes('.') ? className.split('.').pop() : className;
|
|
73
|
+
// Check if it's in the standard classes set
|
|
74
|
+
if (STANDARD_APEX_CLASSES.has(cleanName)) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
// Check if it starts with a standard prefix
|
|
78
|
+
if (cleanName.startsWith('System.') ||
|
|
79
|
+
cleanName.startsWith('Database.') ||
|
|
80
|
+
cleanName.startsWith('Schema.') ||
|
|
81
|
+
cleanName.startsWith('Test.') ||
|
|
82
|
+
cleanName.startsWith('ApexPages.')) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Extract namespace from a fully qualified class name
|
|
89
|
+
*
|
|
90
|
+
* @ac US-013-AC-8: Handle managed packages
|
|
91
|
+
*/
|
|
92
|
+
function extractNamespace(className) {
|
|
93
|
+
// Pattern: Namespace__ClassName or Namespace.ClassName
|
|
94
|
+
const namespacePattern = /^([a-zA-Z][a-zA-Z0-9_]*(?:__|\.))(.+)$/;
|
|
95
|
+
const match = className.match(namespacePattern);
|
|
96
|
+
if (match) {
|
|
97
|
+
const namespace = match[1].replace(/__|\.$/g, '');
|
|
98
|
+
const cleanName = match[2];
|
|
99
|
+
const isManagedPackage = match[1].includes('__');
|
|
100
|
+
return { namespace, cleanName, isManagedPackage };
|
|
101
|
+
}
|
|
102
|
+
return { cleanName: className, isManagedPackage: false };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Extract extends relationship
|
|
106
|
+
*
|
|
107
|
+
* @ac US-013-AC-1: Extract extends relationships
|
|
108
|
+
*/
|
|
109
|
+
function extractExtends(code) {
|
|
110
|
+
const extendsPattern = /class\s+\w+\s+extends\s+([a-zA-Z][a-zA-Z0-9_<>.,\s]*?)(?:\s+implements|\s*\{)/i;
|
|
111
|
+
const match = code.match(extendsPattern);
|
|
112
|
+
if (match) {
|
|
113
|
+
// Clean up generic types and whitespace
|
|
114
|
+
return match[1].replace(/<.*?>/g, '').trim();
|
|
115
|
+
}
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Extract implements relationships
|
|
120
|
+
*
|
|
121
|
+
* @ac US-013-AC-2: Extract implements relationships
|
|
122
|
+
*/
|
|
123
|
+
function extractImplements(code) {
|
|
124
|
+
const implementsPattern = /implements\s+([a-zA-Z][a-zA-Z0-9_<>.,\s]+?)(?:\s*\{)/gi;
|
|
125
|
+
const matches = code.matchAll(implementsPattern);
|
|
126
|
+
const interfaces = [];
|
|
127
|
+
for (const match of matches) {
|
|
128
|
+
// Split by comma to handle multiple interfaces
|
|
129
|
+
const interfaceList = match[1].split(',');
|
|
130
|
+
for (const iface of interfaceList) {
|
|
131
|
+
// Clean up generic types and whitespace
|
|
132
|
+
const cleanInterface = iface.replace(/<.*?>/g, '').trim();
|
|
133
|
+
if (cleanInterface && !interfaces.includes(cleanInterface)) {
|
|
134
|
+
interfaces.push(cleanInterface);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return interfaces;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Extract static method calls
|
|
142
|
+
*
|
|
143
|
+
* @ac US-013-AC-3: Extract static method calls
|
|
144
|
+
*/
|
|
145
|
+
function extractStaticMethodCalls(code) {
|
|
146
|
+
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;
|
|
147
|
+
const matches = code.matchAll(staticCallPattern);
|
|
148
|
+
const dependencies = [];
|
|
149
|
+
const seen = new Set();
|
|
150
|
+
for (const match of matches) {
|
|
151
|
+
const className = match[1];
|
|
152
|
+
// Skip if already seen or is a standard class
|
|
153
|
+
if (seen.has(className) || isStandardClass(className)) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const { namespace, cleanName, isManagedPackage } = extractNamespace(className);
|
|
157
|
+
seen.add(className);
|
|
158
|
+
dependencies.push({
|
|
159
|
+
type: 'static_method',
|
|
160
|
+
className: cleanName,
|
|
161
|
+
namespace,
|
|
162
|
+
isStandard: false,
|
|
163
|
+
isManagedPackage,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return dependencies;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Extract object instantiations (new ClassName())
|
|
170
|
+
*
|
|
171
|
+
* @ac US-013-AC-4: Extract object instantiations
|
|
172
|
+
*/
|
|
173
|
+
function extractInstantiations(code) {
|
|
174
|
+
const newPattern = /new\s+([a-zA-Z][a-zA-Z0-9_]*(?:\.[a-zA-Z][a-zA-Z0-9_]*)*)\s*(?:<[^>]+>)?\s*\(/g;
|
|
175
|
+
const matches = code.matchAll(newPattern);
|
|
176
|
+
const dependencies = [];
|
|
177
|
+
const seen = new Set();
|
|
178
|
+
for (const match of matches) {
|
|
179
|
+
const className = match[1];
|
|
180
|
+
// Skip if already seen or is a standard class
|
|
181
|
+
if (seen.has(className) || isStandardClass(className)) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const { namespace, cleanName, isManagedPackage } = extractNamespace(className);
|
|
185
|
+
seen.add(className);
|
|
186
|
+
dependencies.push({
|
|
187
|
+
type: 'instantiation',
|
|
188
|
+
className: cleanName,
|
|
189
|
+
namespace,
|
|
190
|
+
isStandard: false,
|
|
191
|
+
isManagedPackage,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return dependencies;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Extract variable declarations
|
|
198
|
+
*
|
|
199
|
+
* @ac US-013-AC-5: Extract variable declarations
|
|
200
|
+
*/
|
|
201
|
+
function extractVariableDeclarations(code) {
|
|
202
|
+
// Pattern: ClassName variableName = ...
|
|
203
|
+
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;
|
|
204
|
+
const matches = code.matchAll(varPattern);
|
|
205
|
+
const dependencies = [];
|
|
206
|
+
const seen = new Set();
|
|
207
|
+
for (const match of matches) {
|
|
208
|
+
const className = match[1];
|
|
209
|
+
// Skip if already seen or is a standard class
|
|
210
|
+
if (seen.has(className) || isStandardClass(className)) {
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
const { namespace, cleanName, isManagedPackage } = extractNamespace(className);
|
|
214
|
+
seen.add(className);
|
|
215
|
+
dependencies.push({
|
|
216
|
+
type: 'variable_declaration',
|
|
217
|
+
className: cleanName,
|
|
218
|
+
namespace,
|
|
219
|
+
isStandard: false,
|
|
220
|
+
isManagedPackage,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
return dependencies;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Extract inner classes
|
|
227
|
+
*
|
|
228
|
+
* @ac US-013-AC-6: Handle inner classes
|
|
229
|
+
*/
|
|
230
|
+
function extractInnerClasses(code, outerClassName) {
|
|
231
|
+
// Pattern: class InnerClassName { ... }
|
|
232
|
+
// More permissive: allows any combination of modifiers and keywords
|
|
233
|
+
const innerClassPattern = /\bclass\s+([a-zA-Z][a-zA-Z0-9_]*)\s*(?:extends|implements|\{)/g;
|
|
234
|
+
const matches = code.matchAll(innerClassPattern);
|
|
235
|
+
const innerClasses = [];
|
|
236
|
+
for (const match of matches) {
|
|
237
|
+
const className = match[1];
|
|
238
|
+
// Skip the outer class itself
|
|
239
|
+
if (className !== outerClassName && !innerClasses.includes(className)) {
|
|
240
|
+
innerClasses.push(className);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return innerClasses;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Extract Type.forName() dynamic instantiation
|
|
247
|
+
*
|
|
248
|
+
* @ac US-013-AC-10: Handle Type.forName() dynamic instantiation
|
|
249
|
+
*/
|
|
250
|
+
function extractDynamicInstantiations(code) {
|
|
251
|
+
// Pattern: Type.forName('ClassName') or Type.forName("ClassName")
|
|
252
|
+
const typeForNamePattern = /Type\.forName\s*\(\s*['"]([a-zA-Z][a-zA-Z0-9_.]*)['"][\s)]/g;
|
|
253
|
+
const matches = code.matchAll(typeForNamePattern);
|
|
254
|
+
const dependencies = [];
|
|
255
|
+
const seen = new Set();
|
|
256
|
+
for (const match of matches) {
|
|
257
|
+
const className = match[1];
|
|
258
|
+
// Skip if already seen or is a standard class
|
|
259
|
+
if (seen.has(className) || isStandardClass(className)) {
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
const { namespace, cleanName, isManagedPackage } = extractNamespace(className);
|
|
263
|
+
seen.add(className);
|
|
264
|
+
dependencies.push({
|
|
265
|
+
type: 'dynamic_instantiation',
|
|
266
|
+
className: cleanName,
|
|
267
|
+
namespace,
|
|
268
|
+
isStandard: false,
|
|
269
|
+
isManagedPackage,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
return dependencies;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Parse an Apex class file and extract dependencies
|
|
276
|
+
*
|
|
277
|
+
* @param filePath - Path to the Apex class file
|
|
278
|
+
* @param content - Content of the Apex class file
|
|
279
|
+
* @returns ApexParseResult with all extracted dependencies
|
|
280
|
+
*
|
|
281
|
+
* @throws {ParsingError} If the file cannot be parsed
|
|
282
|
+
*
|
|
283
|
+
* @example
|
|
284
|
+
* ```typescript
|
|
285
|
+
* const result = parseApexClass('MyController.cls', apexCode);
|
|
286
|
+
* console.log(result.extends); // 'BaseController'
|
|
287
|
+
* console.log(result.implements); // ['IController', 'ICallable']
|
|
288
|
+
* console.log(result.dependencies.length); // 5
|
|
289
|
+
* ```
|
|
290
|
+
*/
|
|
291
|
+
export function parseApexClass(filePath, content) {
|
|
292
|
+
try {
|
|
293
|
+
logger.debug(`Parsing Apex class: ${filePath}`);
|
|
294
|
+
// Extract class name from file path
|
|
295
|
+
const classNameMatch = filePath.match(/([a-zA-Z][a-zA-Z0-9_]*)\.cls$/);
|
|
296
|
+
if (!classNameMatch) {
|
|
297
|
+
throw new ParsingError(`Invalid Apex class file name: ${filePath}`, {
|
|
298
|
+
filePath,
|
|
299
|
+
suggestion: 'Apex class files must end with .cls',
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
const className = classNameMatch[1];
|
|
303
|
+
// Remove comments
|
|
304
|
+
const cleanCode = removeComments(content);
|
|
305
|
+
// Extract namespace from class definition
|
|
306
|
+
const { namespace } = extractNamespace(className);
|
|
307
|
+
// Extract extends relationship
|
|
308
|
+
const extendsClass = extractExtends(cleanCode);
|
|
309
|
+
// Extract implements relationships
|
|
310
|
+
const implementsList = extractImplements(cleanCode);
|
|
311
|
+
// Extract all dependencies
|
|
312
|
+
const dependencies = [];
|
|
313
|
+
// Add extends as a dependency
|
|
314
|
+
if (extendsClass && !isStandardClass(extendsClass)) {
|
|
315
|
+
const { namespace: extNamespace, cleanName, isManagedPackage } = extractNamespace(extendsClass);
|
|
316
|
+
dependencies.push({
|
|
317
|
+
type: 'extends',
|
|
318
|
+
className: cleanName,
|
|
319
|
+
namespace: extNamespace,
|
|
320
|
+
isStandard: false,
|
|
321
|
+
isManagedPackage,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
// Add implements as dependencies
|
|
325
|
+
for (const iface of implementsList) {
|
|
326
|
+
if (!isStandardClass(iface)) {
|
|
327
|
+
const { namespace: ifaceNamespace, cleanName, isManagedPackage } = extractNamespace(iface);
|
|
328
|
+
dependencies.push({
|
|
329
|
+
type: 'implements',
|
|
330
|
+
className: cleanName,
|
|
331
|
+
namespace: ifaceNamespace,
|
|
332
|
+
isStandard: false,
|
|
333
|
+
isManagedPackage,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// Extract and add other dependencies
|
|
338
|
+
dependencies.push(...extractStaticMethodCalls(cleanCode));
|
|
339
|
+
dependencies.push(...extractInstantiations(cleanCode));
|
|
340
|
+
dependencies.push(...extractVariableDeclarations(cleanCode));
|
|
341
|
+
dependencies.push(...extractDynamicInstantiations(cleanCode));
|
|
342
|
+
// Extract inner classes
|
|
343
|
+
const innerClasses = extractInnerClasses(cleanCode, className);
|
|
344
|
+
const result = {
|
|
345
|
+
className,
|
|
346
|
+
namespace,
|
|
347
|
+
extends: extendsClass,
|
|
348
|
+
implements: implementsList,
|
|
349
|
+
dependencies,
|
|
350
|
+
innerClasses,
|
|
351
|
+
};
|
|
352
|
+
logger.debug(`Parsed Apex class: ${className}`, {
|
|
353
|
+
dependencies: dependencies.length,
|
|
354
|
+
innerClasses: innerClasses.length,
|
|
355
|
+
});
|
|
356
|
+
return result;
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
if (error instanceof ParsingError) {
|
|
360
|
+
throw error;
|
|
361
|
+
}
|
|
362
|
+
throw new ParsingError(`Failed to parse Apex class: ${filePath}`, {
|
|
363
|
+
filePath,
|
|
364
|
+
originalError: error instanceof Error ? error.message : String(error),
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=apex-class-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apex-class-parser.js","sourceRoot":"","sources":["../../src/parsers/apex-class-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ApexTriggerMetadata, ApexTriggerEvent } from '../types/salesforce/apex.js';
|
|
2
|
+
/**
|
|
3
|
+
* Re-export ApexTriggerEvent from Salesforce types for backwards compatibility
|
|
4
|
+
*/
|
|
5
|
+
export type { ApexTriggerEvent as TriggerEvent } from '../types/salesforce/apex.js';
|
|
6
|
+
/**
|
|
7
|
+
* Apex trigger dependency types
|
|
8
|
+
*/
|
|
9
|
+
export type TriggerDependencyType = 'handler' | 'variable_declaration';
|
|
10
|
+
/**
|
|
11
|
+
* Represents a dependency found in an Apex trigger
|
|
12
|
+
*/
|
|
13
|
+
export type TriggerDependency = {
|
|
14
|
+
type: TriggerDependencyType;
|
|
15
|
+
className: string;
|
|
16
|
+
namespace?: string;
|
|
17
|
+
isManagedPackage: boolean;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Result of parsing an Apex trigger
|
|
21
|
+
* Optionally includes metadata from .trigger-meta.xml
|
|
22
|
+
*/
|
|
23
|
+
export type TriggerParseResult = {
|
|
24
|
+
triggerName: string;
|
|
25
|
+
sobjectType: string;
|
|
26
|
+
events: ApexTriggerEvent[];
|
|
27
|
+
handlers: TriggerDependency[];
|
|
28
|
+
dependencies: TriggerDependency[];
|
|
29
|
+
metadata?: ApexTriggerMetadata;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Parse an Apex trigger file and extract dependencies
|
|
33
|
+
*
|
|
34
|
+
* @param filePath - Path to the Apex trigger file
|
|
35
|
+
* @param content - Content of the Apex trigger file
|
|
36
|
+
* @returns TriggerParseResult with all extracted dependencies
|
|
37
|
+
*
|
|
38
|
+
* @throws {ParsingError} If the file cannot be parsed
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* const result = parseApexTrigger('AccountTrigger.trigger', triggerCode);
|
|
43
|
+
* console.log(result.sobjectType); // 'Account'
|
|
44
|
+
* console.log(result.events); // ['before insert', 'after update']
|
|
45
|
+
* console.log(result.handlers); // [{ type: 'handler', className: 'AccountTriggerHandler', ... }]
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare function parseApexTrigger(filePath: string, content: string): TriggerParseResult;
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
import { ParsingError } from '../errors/parsing-error.js';
|
|
3
|
+
const logger = getLogger('ApexTriggerParser');
|
|
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
|
+
'Trigger',
|
|
29
|
+
]);
|
|
30
|
+
/**
|
|
31
|
+
* Remove comments from Apex code
|
|
32
|
+
*/
|
|
33
|
+
function removeComments(code) {
|
|
34
|
+
// Remove single-line comments (//)
|
|
35
|
+
let cleaned = code.replace(/\/\/.*$/gm, '');
|
|
36
|
+
// Remove multi-line comments (/* ... */)
|
|
37
|
+
cleaned = cleaned.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
38
|
+
// Remove JavaDoc comments (/** ... */)
|
|
39
|
+
cleaned = cleaned.replace(/\/\*\*[\s\S]*?\*\//g, '');
|
|
40
|
+
return cleaned;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Check if a class is a standard Apex class
|
|
44
|
+
*/
|
|
45
|
+
function isStandardClass(className) {
|
|
46
|
+
// Remove namespace if present
|
|
47
|
+
const cleanName = className.includes('.') ? className.split('.').pop() : className;
|
|
48
|
+
return STANDARD_APEX_CLASSES.has(cleanName);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Extract namespace from a fully qualified class name
|
|
52
|
+
*/
|
|
53
|
+
function extractNamespace(className) {
|
|
54
|
+
// Pattern: Namespace__ClassName or Namespace.ClassName
|
|
55
|
+
const namespacePattern = /^([a-zA-Z][a-zA-Z0-9_]*(?:__|\.))(.+)$/;
|
|
56
|
+
const match = className.match(namespacePattern);
|
|
57
|
+
if (match) {
|
|
58
|
+
const namespace = match[1].replace(/__|\.$/g, '');
|
|
59
|
+
const cleanName = match[2];
|
|
60
|
+
const isManagedPackage = match[1].includes('__');
|
|
61
|
+
return { namespace, cleanName, isManagedPackage };
|
|
62
|
+
}
|
|
63
|
+
return { cleanName: className, isManagedPackage: false };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Extract trigger declaration (name, object, events)
|
|
67
|
+
*
|
|
68
|
+
* @ac US-014-AC-1: Extract trigger object (Account, etc.)
|
|
69
|
+
* @ac US-014-AC-3: Detect trigger events (before insert, etc.)
|
|
70
|
+
*/
|
|
71
|
+
function extractTriggerDeclaration(code, filePath) {
|
|
72
|
+
// Pattern: trigger TriggerName on SObjectType (event1, event2, ...)
|
|
73
|
+
const triggerPattern = /trigger\s+([a-zA-Z][a-zA-Z0-9_]*)\s+on\s+([a-zA-Z][a-zA-Z0-9_]*)\s*\(\s*([^)]+)\s*\)/i;
|
|
74
|
+
const match = code.match(triggerPattern);
|
|
75
|
+
if (!match) {
|
|
76
|
+
throw new ParsingError(`Invalid trigger declaration: ${filePath}`, {
|
|
77
|
+
filePath,
|
|
78
|
+
suggestion: 'Trigger files must have format: trigger TriggerName on SObjectType (events)',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
const triggerName = match[1];
|
|
82
|
+
const sobjectType = match[2];
|
|
83
|
+
const eventsStr = match[3];
|
|
84
|
+
// Parse events (before insert, after update, etc.)
|
|
85
|
+
const eventsList = eventsStr
|
|
86
|
+
.split(',')
|
|
87
|
+
.map((e) => e.trim().toLowerCase())
|
|
88
|
+
.filter((e) => e.length > 0);
|
|
89
|
+
return { triggerName, sobjectType, events: eventsList };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Extract handler class references
|
|
93
|
+
*
|
|
94
|
+
* @ac US-014-AC-2: Extract handler class references
|
|
95
|
+
* @ac US-014-AC-4: Link trigger to handler classes
|
|
96
|
+
* @ac US-014-AC-5: Handle multiple handlers per trigger
|
|
97
|
+
*/
|
|
98
|
+
function extractHandlers(code) {
|
|
99
|
+
const handlers = [];
|
|
100
|
+
const seen = new Set();
|
|
101
|
+
// Pattern 1: ClassName.methodName(...) - Static method calls
|
|
102
|
+
const staticMethodPattern = /([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;
|
|
103
|
+
const staticMatches = code.matchAll(staticMethodPattern);
|
|
104
|
+
for (const match of staticMatches) {
|
|
105
|
+
const className = match[1];
|
|
106
|
+
// Skip if already seen or is a standard class
|
|
107
|
+
if (seen.has(className) || isStandardClass(className)) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const { namespace, cleanName, isManagedPackage } = extractNamespace(className);
|
|
111
|
+
seen.add(className);
|
|
112
|
+
handlers.push({
|
|
113
|
+
type: 'handler',
|
|
114
|
+
className: cleanName,
|
|
115
|
+
namespace,
|
|
116
|
+
isManagedPackage,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// Pattern 2: new ClassName() - Instantiations (for framework patterns)
|
|
120
|
+
const instantiationPattern = /new\s+([a-zA-Z][a-zA-Z0-9_]*(?:\.[a-zA-Z][a-zA-Z0-9_]*)*)\s*\(/g;
|
|
121
|
+
const instantiationMatches = code.matchAll(instantiationPattern);
|
|
122
|
+
for (const match of instantiationMatches) {
|
|
123
|
+
const className = match[1];
|
|
124
|
+
// Skip if already seen or is a standard class
|
|
125
|
+
if (seen.has(className) || isStandardClass(className)) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const { namespace, cleanName, isManagedPackage } = extractNamespace(className);
|
|
129
|
+
seen.add(className);
|
|
130
|
+
handlers.push({
|
|
131
|
+
type: 'handler',
|
|
132
|
+
className: cleanName,
|
|
133
|
+
namespace,
|
|
134
|
+
isManagedPackage,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return handlers;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Extract variable declarations
|
|
141
|
+
*
|
|
142
|
+
* @ac US-014-AC-6: Extract variable declarations
|
|
143
|
+
*/
|
|
144
|
+
function extractVariableDeclarations(code) {
|
|
145
|
+
// Pattern: ClassName variableName = ...
|
|
146
|
+
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;
|
|
147
|
+
const matches = code.matchAll(varPattern);
|
|
148
|
+
const dependencies = [];
|
|
149
|
+
const seen = new Set();
|
|
150
|
+
for (const match of matches) {
|
|
151
|
+
const className = match[1];
|
|
152
|
+
// Skip if already seen or is a standard class
|
|
153
|
+
if (seen.has(className) || isStandardClass(className)) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const { namespace, cleanName, isManagedPackage } = extractNamespace(className);
|
|
157
|
+
seen.add(className);
|
|
158
|
+
dependencies.push({
|
|
159
|
+
type: 'variable_declaration',
|
|
160
|
+
className: cleanName,
|
|
161
|
+
namespace,
|
|
162
|
+
isManagedPackage,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return dependencies;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Parse an Apex trigger file and extract dependencies
|
|
169
|
+
*
|
|
170
|
+
* @param filePath - Path to the Apex trigger file
|
|
171
|
+
* @param content - Content of the Apex trigger file
|
|
172
|
+
* @returns TriggerParseResult with all extracted dependencies
|
|
173
|
+
*
|
|
174
|
+
* @throws {ParsingError} If the file cannot be parsed
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* ```typescript
|
|
178
|
+
* const result = parseApexTrigger('AccountTrigger.trigger', triggerCode);
|
|
179
|
+
* console.log(result.sobjectType); // 'Account'
|
|
180
|
+
* console.log(result.events); // ['before insert', 'after update']
|
|
181
|
+
* console.log(result.handlers); // [{ type: 'handler', className: 'AccountTriggerHandler', ... }]
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
export function parseApexTrigger(filePath, content) {
|
|
185
|
+
try {
|
|
186
|
+
logger.debug(`Parsing Apex trigger: ${filePath}`);
|
|
187
|
+
// Validate file extension
|
|
188
|
+
if (!filePath.endsWith('.trigger')) {
|
|
189
|
+
throw new ParsingError(`Invalid Apex trigger file name: ${filePath}`, {
|
|
190
|
+
filePath,
|
|
191
|
+
suggestion: 'Apex trigger files must end with .trigger',
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
// Remove comments
|
|
195
|
+
const cleanCode = removeComments(content);
|
|
196
|
+
// Extract trigger declaration
|
|
197
|
+
const { triggerName, sobjectType, events } = extractTriggerDeclaration(cleanCode, filePath);
|
|
198
|
+
// Extract handler class references
|
|
199
|
+
const handlers = extractHandlers(cleanCode);
|
|
200
|
+
// Extract variable declarations
|
|
201
|
+
const varDecls = extractVariableDeclarations(cleanCode);
|
|
202
|
+
// Combine all dependencies
|
|
203
|
+
const dependencies = [...handlers, ...varDecls];
|
|
204
|
+
const result = {
|
|
205
|
+
triggerName,
|
|
206
|
+
sobjectType,
|
|
207
|
+
events,
|
|
208
|
+
handlers,
|
|
209
|
+
dependencies,
|
|
210
|
+
};
|
|
211
|
+
logger.debug(`Parsed Apex trigger: ${triggerName}`, {
|
|
212
|
+
sobjectType,
|
|
213
|
+
events: events.length,
|
|
214
|
+
handlers: handlers.length,
|
|
215
|
+
dependencies: dependencies.length,
|
|
216
|
+
});
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
if (error instanceof ParsingError) {
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
throw new ParsingError(`Failed to parse Apex trigger: ${filePath}`, {
|
|
224
|
+
filePath,
|
|
225
|
+
originalError: error instanceof Error ? error.message : String(error),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=apex-trigger-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apex-trigger-parser.js","sourceRoot":"","sources":["../../src/parsers/apex-trigger-parser.ts"],"names":[],"mappings":"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"}
|