@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,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error-Resilient Parser Wrapper - US-071
|
|
3
|
+
* Gracefully handles parse errors without breaking analysis
|
|
4
|
+
*
|
|
5
|
+
* @ac US-071-AC-1: Catch and log parse errors
|
|
6
|
+
* @ac US-071-AC-2: Continue with other files
|
|
7
|
+
* @ac US-071-AC-3: Report errors with file paths
|
|
8
|
+
* @ac US-071-AC-4: Suggest fixes when possible
|
|
9
|
+
* @ac US-071-AC-5: Aggregate error report
|
|
10
|
+
* @ac US-071-AC-6: Option to fail-fast
|
|
11
|
+
* @issue #71
|
|
12
|
+
*/
|
|
13
|
+
import { getLogger } from '../utils/logger.js';
|
|
14
|
+
import { getErrorAggregator } from '../utils/error-aggregator.js';
|
|
15
|
+
const logger = getLogger('ErrorResilientParser');
|
|
16
|
+
const errorAggregator = getErrorAggregator();
|
|
17
|
+
/**
|
|
18
|
+
* @ac US-071-AC-1: Catch and log parse errors
|
|
19
|
+
* @ac US-071-AC-2: Continue with other files
|
|
20
|
+
*/
|
|
21
|
+
export class ErrorResilientParser {
|
|
22
|
+
options;
|
|
23
|
+
errors = [];
|
|
24
|
+
constructor(options = {}) {
|
|
25
|
+
this.options = {
|
|
26
|
+
failFast: options.failFast ?? false,
|
|
27
|
+
logErrors: options.logErrors ?? true,
|
|
28
|
+
suggestFixes: options.suggestFixes ?? true,
|
|
29
|
+
};
|
|
30
|
+
logger.debug('Error-resilient parser initialized', { options: this.options });
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* @ac US-071-AC-1: Catch and log parse errors
|
|
34
|
+
* @ac US-071-AC-2: Continue with other files
|
|
35
|
+
* Parse multiple files with error resilience
|
|
36
|
+
*/
|
|
37
|
+
async parseFiles(filePaths, parser) {
|
|
38
|
+
logger.info('Starting resilient parse', {
|
|
39
|
+
fileCount: filePaths.length,
|
|
40
|
+
failFast: this.options.failFast,
|
|
41
|
+
});
|
|
42
|
+
const results = this.options.failFast
|
|
43
|
+
? await this.parseFilesSequentially(filePaths, parser)
|
|
44
|
+
: await Promise.all(filePaths.map(async (filePath) => this.parseFile(filePath, parser)));
|
|
45
|
+
logger.info('Resilient parse completed', {
|
|
46
|
+
totalFiles: filePaths.length,
|
|
47
|
+
successCount: results.filter((r) => r.success).length,
|
|
48
|
+
errorCount: results.filter((r) => !r.success).length,
|
|
49
|
+
});
|
|
50
|
+
return results;
|
|
51
|
+
}
|
|
52
|
+
async parseFilesSequentially(filePaths, parser, results = []) {
|
|
53
|
+
if (filePaths.length === 0) {
|
|
54
|
+
return results;
|
|
55
|
+
}
|
|
56
|
+
const [filePath, ...remaining] = filePaths;
|
|
57
|
+
const result = await this.parseFile(filePath, parser);
|
|
58
|
+
results.push(result);
|
|
59
|
+
if (!result.success) {
|
|
60
|
+
logger.warn('Fail-fast enabled, stopping parse', {
|
|
61
|
+
filePath,
|
|
62
|
+
totalProcessed: results.length,
|
|
63
|
+
totalFiles: results.length + remaining.length,
|
|
64
|
+
});
|
|
65
|
+
return results;
|
|
66
|
+
}
|
|
67
|
+
return this.parseFilesSequentially(remaining, parser, results);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* @ac US-071-AC-1: Catch and log parse errors
|
|
71
|
+
* Parse single file with error handling
|
|
72
|
+
*/
|
|
73
|
+
async parseFile(filePath, parser) {
|
|
74
|
+
try {
|
|
75
|
+
const data = await parser(filePath);
|
|
76
|
+
return {
|
|
77
|
+
success: true,
|
|
78
|
+
data,
|
|
79
|
+
filePath,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
const parseError = this.createParseError(filePath, error);
|
|
84
|
+
// Log to aggregator
|
|
85
|
+
if (this.options.logErrors) {
|
|
86
|
+
errorAggregator.addError({
|
|
87
|
+
message: parseError.message,
|
|
88
|
+
type: parseError.errorType,
|
|
89
|
+
severity: 'MEDIUM',
|
|
90
|
+
filePath: parseError.filePath,
|
|
91
|
+
lineNumber: parseError.lineNumber,
|
|
92
|
+
columnNumber: parseError.columnNumber,
|
|
93
|
+
context: {
|
|
94
|
+
suggestedFix: parseError.suggestedFix,
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// Track locally
|
|
99
|
+
this.errors.push(parseError);
|
|
100
|
+
logger.warn('Parse error caught', {
|
|
101
|
+
filePath,
|
|
102
|
+
errorType: parseError.errorType,
|
|
103
|
+
message: parseError.message,
|
|
104
|
+
});
|
|
105
|
+
return {
|
|
106
|
+
success: false,
|
|
107
|
+
error: parseError,
|
|
108
|
+
filePath,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* @ac US-071-AC-3: Report errors with file paths
|
|
114
|
+
* @ac US-071-AC-4: Suggest fixes when possible
|
|
115
|
+
* Create structured parse error
|
|
116
|
+
*/
|
|
117
|
+
createParseError(filePath, error) {
|
|
118
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
119
|
+
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
120
|
+
// Extract line/column from error message if available
|
|
121
|
+
const locationMatch = /:(\d+):(\d+)/.exec(errorMessage);
|
|
122
|
+
const lineNumber = locationMatch ? Number.parseInt(locationMatch[1], 10) : undefined;
|
|
123
|
+
const columnNumber = locationMatch ? Number.parseInt(locationMatch[2], 10) : undefined;
|
|
124
|
+
// Determine error type
|
|
125
|
+
const errorType = this.categorizeError(errorMessage);
|
|
126
|
+
// Suggest fix if enabled
|
|
127
|
+
const suggestedFix = this.options.suggestFixes ? this.suggestFix(errorType, errorMessage) : undefined;
|
|
128
|
+
return {
|
|
129
|
+
filePath,
|
|
130
|
+
errorType,
|
|
131
|
+
message: errorMessage,
|
|
132
|
+
lineNumber,
|
|
133
|
+
columnNumber,
|
|
134
|
+
suggestedFix,
|
|
135
|
+
stack: errorStack,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Categorize error by type
|
|
140
|
+
*/
|
|
141
|
+
categorizeError(message) {
|
|
142
|
+
const patterns = [
|
|
143
|
+
{ pattern: /syntax error/i, type: 'SyntaxError' },
|
|
144
|
+
{ pattern: /unexpected token/i, type: 'SyntaxError' },
|
|
145
|
+
{ pattern: /missing/i, type: 'SyntaxError' },
|
|
146
|
+
{ pattern: /expected/i, type: 'SyntaxError' },
|
|
147
|
+
{ pattern: /cannot find/i, type: 'ReferenceError' },
|
|
148
|
+
{ pattern: /not found/i, type: 'ReferenceError' },
|
|
149
|
+
{ pattern: /ENOENT/i, type: 'FileNotFoundError' },
|
|
150
|
+
{ pattern: /EACCES/i, type: 'PermissionError' },
|
|
151
|
+
{ pattern: /encoding/i, type: 'EncodingError' },
|
|
152
|
+
{ pattern: /xml/i, type: 'XMLParseError' },
|
|
153
|
+
];
|
|
154
|
+
for (const { pattern, type } of patterns) {
|
|
155
|
+
if (pattern.test(message)) {
|
|
156
|
+
return type;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return 'ParseError';
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* @ac US-071-AC-4: Suggest fixes when possible
|
|
163
|
+
* Suggest fix based on error type
|
|
164
|
+
*/
|
|
165
|
+
suggestFix(errorType, message) {
|
|
166
|
+
const suggestions = {
|
|
167
|
+
SyntaxError: 'Check for missing brackets, quotes, or semicolons. Validate XML/JSON structure.',
|
|
168
|
+
ReferenceError: 'Ensure the referenced component exists in the project or check dependencies.',
|
|
169
|
+
FileNotFoundError: 'Verify the file exists at the specified path. Check .forceignore rules.',
|
|
170
|
+
PermissionError: 'Check file permissions. Ensure read access to the file.',
|
|
171
|
+
EncodingError: 'Ensure file is encoded in UTF-8. Check for BOM or special characters.',
|
|
172
|
+
XMLParseError: 'Validate XML syntax. Check for unclosed tags or missing declarations.',
|
|
173
|
+
};
|
|
174
|
+
const baseSuggestion = suggestions[errorType];
|
|
175
|
+
// Add specific suggestions based on message
|
|
176
|
+
if (message.includes('Unexpected token')) {
|
|
177
|
+
return `${baseSuggestion || ''} Check for stray characters or incorrect syntax.`.trim();
|
|
178
|
+
}
|
|
179
|
+
if (message.includes('Expected')) {
|
|
180
|
+
return `${baseSuggestion || ''} Ensure all required elements are present.`.trim();
|
|
181
|
+
}
|
|
182
|
+
return baseSuggestion;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* @ac US-071-AC-5: Aggregate error report
|
|
186
|
+
* Generate comprehensive error report
|
|
187
|
+
*/
|
|
188
|
+
generateErrorReport() {
|
|
189
|
+
const lines = [];
|
|
190
|
+
lines.push('🔧 Parse Error Report');
|
|
191
|
+
lines.push('═══════════════════════════════════════');
|
|
192
|
+
if (this.errors.length === 0) {
|
|
193
|
+
lines.push('✅ No parse errors encountered');
|
|
194
|
+
return lines.join('\n');
|
|
195
|
+
}
|
|
196
|
+
lines.push(`❌ Total Errors: ${this.errors.length}`);
|
|
197
|
+
lines.push('');
|
|
198
|
+
// Group by error type
|
|
199
|
+
const byType = new Map();
|
|
200
|
+
for (const error of this.errors) {
|
|
201
|
+
const errors = byType.get(error.errorType) ?? [];
|
|
202
|
+
errors.push(error);
|
|
203
|
+
byType.set(error.errorType, errors);
|
|
204
|
+
}
|
|
205
|
+
lines.push('📊 Errors by Type:');
|
|
206
|
+
for (const [type, errors] of byType.entries()) {
|
|
207
|
+
lines.push(` ${type}: ${errors.length}`);
|
|
208
|
+
}
|
|
209
|
+
lines.push('');
|
|
210
|
+
// List errors (limit to first 20)
|
|
211
|
+
lines.push('📋 Error Details:');
|
|
212
|
+
const errorsToShow = this.errors.slice(0, 20);
|
|
213
|
+
for (const [index, error] of errorsToShow.entries()) {
|
|
214
|
+
lines.push(`\n${index + 1}. ${error.errorType} in ${error.filePath}`);
|
|
215
|
+
lines.push(` Message: ${error.message}`);
|
|
216
|
+
if (error.lineNumber) {
|
|
217
|
+
lines.push(` Location: Line ${error.lineNumber}${error.columnNumber ? `:${error.columnNumber}` : ''}`);
|
|
218
|
+
}
|
|
219
|
+
if (error.suggestedFix) {
|
|
220
|
+
lines.push(` 💡 Suggestion: ${error.suggestedFix}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (this.errors.length > 20) {
|
|
224
|
+
lines.push(`\n... and ${this.errors.length - 20} more errors`);
|
|
225
|
+
}
|
|
226
|
+
return lines.join('\n');
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get all errors
|
|
230
|
+
*/
|
|
231
|
+
getErrors() {
|
|
232
|
+
return [...this.errors];
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get error count
|
|
236
|
+
*/
|
|
237
|
+
getErrorCount() {
|
|
238
|
+
return this.errors.length;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Check if any errors occurred
|
|
242
|
+
*/
|
|
243
|
+
hasErrors() {
|
|
244
|
+
return this.errors.length > 0;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Clear errors
|
|
248
|
+
*/
|
|
249
|
+
clearErrors() {
|
|
250
|
+
this.errors.length = 0;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get successful parse count
|
|
254
|
+
*/
|
|
255
|
+
static getSuccessCount(results) {
|
|
256
|
+
return results.filter((r) => r.success).length;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get failed parse count
|
|
260
|
+
*/
|
|
261
|
+
static getFailureCount(results) {
|
|
262
|
+
return results.filter((r) => !r.success).length;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Extract only successful results
|
|
266
|
+
*/
|
|
267
|
+
static getSuccessfulData(results) {
|
|
268
|
+
return results.filter((r) => r.success && r.data !== undefined).map((r) => r.data);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Extract only errors
|
|
272
|
+
*/
|
|
273
|
+
static getErrors(results) {
|
|
274
|
+
return results.filter((r) => !r.success && r.error !== undefined).map((r) => r.error);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=error-resilient-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-resilient-parser.js","sourceRoot":"","sources":["../../src/parsers/error-resilient-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FlexiPage Parser
|
|
3
|
+
* Parses Salesforce Lightning Page metadata files (.flexipage-meta.xml)
|
|
4
|
+
*
|
|
5
|
+
* @ac US-022-AC-1: Extract LWC component references
|
|
6
|
+
* @ac US-022-AC-2: Extract Aura component references
|
|
7
|
+
* @ac US-022-AC-3: Extract object references
|
|
8
|
+
* @ac US-022-AC-4: Extract record type filters
|
|
9
|
+
* @ac US-022-AC-5: Extract region configurations
|
|
10
|
+
* @ac US-022-AC-6: Link to all component dependencies
|
|
11
|
+
*
|
|
12
|
+
* @issue #22
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Result of parsing a FlexiPage file
|
|
16
|
+
*/
|
|
17
|
+
export type FlexiPageParseResult = {
|
|
18
|
+
/** Name of the FlexiPage (from filename) */
|
|
19
|
+
name: string;
|
|
20
|
+
/** Master label */
|
|
21
|
+
masterLabel: string;
|
|
22
|
+
/** FlexiPage type (AppPage, HomePage, RecordPage, etc.) */
|
|
23
|
+
type: string;
|
|
24
|
+
/** SObject type (for RecordPage) */
|
|
25
|
+
sobjectType?: string;
|
|
26
|
+
/** LWC components referenced */
|
|
27
|
+
lwcComponents: string[];
|
|
28
|
+
/** Aura components referenced */
|
|
29
|
+
auraComponents: string[];
|
|
30
|
+
/** Objects referenced */
|
|
31
|
+
objects: string[];
|
|
32
|
+
/** Record type filters */
|
|
33
|
+
recordTypeFilters: string[];
|
|
34
|
+
/** Region names configured */
|
|
35
|
+
regions: string[];
|
|
36
|
+
/** Quick actions */
|
|
37
|
+
quickActions: string[];
|
|
38
|
+
/** All dependencies extracted from this FlexiPage */
|
|
39
|
+
dependencies: {
|
|
40
|
+
lwcComponents: string[];
|
|
41
|
+
auraComponents: string[];
|
|
42
|
+
objects: string[];
|
|
43
|
+
recordTypes: string[];
|
|
44
|
+
regions: string[];
|
|
45
|
+
quickActions: string[];
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Parse a FlexiPage metadata XML file
|
|
50
|
+
*
|
|
51
|
+
* @param filePath - Path to the .flexipage-meta.xml file
|
|
52
|
+
* @param flexiPageName - Name of the FlexiPage (typically from filename)
|
|
53
|
+
* @returns Parsed FlexiPage metadata with dependencies
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* const result = await parseFlexiPage(
|
|
57
|
+
* 'force-app/main/default/flexipages/Account_Record_Page.flexipage-meta.xml',
|
|
58
|
+
* 'Account_Record_Page'
|
|
59
|
+
* );
|
|
60
|
+
* console.log(result.sobjectType); // 'Account'
|
|
61
|
+
* console.log(result.lwcComponents); // ['c:accountSummary', 'c:relatedContacts']
|
|
62
|
+
* console.log(result.dependencies.auraComponents); // ['c:AccountChart']
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseFlexiPage(filePath: string, flexiPageName: string): Promise<FlexiPageParseResult>;
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FlexiPage Parser
|
|
3
|
+
* Parses Salesforce Lightning Page metadata files (.flexipage-meta.xml)
|
|
4
|
+
*
|
|
5
|
+
* @ac US-022-AC-1: Extract LWC component references
|
|
6
|
+
* @ac US-022-AC-2: Extract Aura component references
|
|
7
|
+
* @ac US-022-AC-3: Extract object references
|
|
8
|
+
* @ac US-022-AC-4: Extract record type filters
|
|
9
|
+
* @ac US-022-AC-5: Extract region configurations
|
|
10
|
+
* @ac US-022-AC-6: Link to all component dependencies
|
|
11
|
+
*
|
|
12
|
+
* @issue #22
|
|
13
|
+
*/
|
|
14
|
+
import { readFile } from 'node:fs/promises';
|
|
15
|
+
import { XMLParser } from 'fast-xml-parser';
|
|
16
|
+
/**
|
|
17
|
+
* Normalize value to array (handles XML parser returning single object vs array)
|
|
18
|
+
*/
|
|
19
|
+
function normalizeArray(value) {
|
|
20
|
+
if (!value)
|
|
21
|
+
return [];
|
|
22
|
+
return Array.isArray(value) ? value : [value];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Extract components from item instances
|
|
26
|
+
*/
|
|
27
|
+
function extractComponentsFromItems(items) {
|
|
28
|
+
const lwcComponents = [];
|
|
29
|
+
const auraComponents = [];
|
|
30
|
+
const recordTypes = [];
|
|
31
|
+
for (const item of items) {
|
|
32
|
+
if (item.componentInstance) {
|
|
33
|
+
const componentName = item.componentInstance.componentName;
|
|
34
|
+
// LWC components use namespace:componentName or c:componentName format
|
|
35
|
+
// Aura components use namespace:componentName or c:componentName format
|
|
36
|
+
// Distinguish by convention: LWC typically lowercase, Aura camelCase
|
|
37
|
+
if (componentName.includes(':')) {
|
|
38
|
+
const [namespace, name] = componentName.split(':');
|
|
39
|
+
// Standard components (force:*, lightning:*, etc.)
|
|
40
|
+
if (namespace === 'force' || namespace === 'lightning' || namespace === 'forceChatter') {
|
|
41
|
+
// Standard component, skip or log
|
|
42
|
+
}
|
|
43
|
+
else if (namespace === 'flexipage') {
|
|
44
|
+
// Flexipage components, skip
|
|
45
|
+
}
|
|
46
|
+
else if (name && name.startsWith(name[0].toUpperCase())) {
|
|
47
|
+
// Custom component - check naming convention
|
|
48
|
+
// LWC: lowercase or camelCase starting with lowercase
|
|
49
|
+
// Aura: PascalCase (starts with uppercase)
|
|
50
|
+
auraComponents.push(componentName);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
lwcComponents.push(componentName);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else if (componentName.startsWith(componentName[0].toUpperCase())) {
|
|
57
|
+
// No namespace - could be either, use naming convention
|
|
58
|
+
auraComponents.push(componentName);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
lwcComponents.push(componentName);
|
|
62
|
+
}
|
|
63
|
+
// Extract record type filters from visibility rules
|
|
64
|
+
if (item.componentInstance.visibilityRule) {
|
|
65
|
+
const criteria = normalizeArray(item.componentInstance.visibilityRule.criteria);
|
|
66
|
+
for (const criterion of criteria) {
|
|
67
|
+
// Check if criterion references RecordType
|
|
68
|
+
if (criterion.leftValue?.includes('RecordType') || criterion.rightValue?.includes('RecordType')) {
|
|
69
|
+
const rtValue = criterion.rightValue ?? criterion.leftValue;
|
|
70
|
+
if (rtValue && !rtValue.includes('RecordType')) {
|
|
71
|
+
recordTypes.push(rtValue);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
lwc: lwcComponents,
|
|
80
|
+
aura: auraComponents,
|
|
81
|
+
recordTypes,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Extract components from all regions
|
|
86
|
+
*/
|
|
87
|
+
function extractComponents(regions) {
|
|
88
|
+
const allLwc = [];
|
|
89
|
+
const allAura = [];
|
|
90
|
+
const allRecordTypes = [];
|
|
91
|
+
for (const region of regions) {
|
|
92
|
+
const items = normalizeArray(region.itemInstances);
|
|
93
|
+
const { lwc, aura, recordTypes } = extractComponentsFromItems(items);
|
|
94
|
+
allLwc.push(...lwc);
|
|
95
|
+
allAura.push(...aura);
|
|
96
|
+
allRecordTypes.push(...recordTypes);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
lwc: [...new Set(allLwc)],
|
|
100
|
+
aura: [...new Set(allAura)],
|
|
101
|
+
recordTypes: [...new Set(allRecordTypes)],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Extract quick actions from FlexiPage
|
|
106
|
+
*/
|
|
107
|
+
function extractQuickActions(metadata) {
|
|
108
|
+
const quickActions = [];
|
|
109
|
+
if (metadata.quickActionList?.quickActionListItems) {
|
|
110
|
+
const items = normalizeArray(metadata.quickActionList.quickActionListItems);
|
|
111
|
+
for (const item of items) {
|
|
112
|
+
quickActions.push(item.quickActionName);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (metadata.platformActionList?.platformActionListItems) {
|
|
116
|
+
const items = normalizeArray(metadata.platformActionList.platformActionListItems);
|
|
117
|
+
for (const item of items) {
|
|
118
|
+
if (item.actionType === 'QuickAction') {
|
|
119
|
+
quickActions.push(item.actionName);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return [...new Set(quickActions)];
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Parse a FlexiPage metadata XML file
|
|
127
|
+
*
|
|
128
|
+
* @param filePath - Path to the .flexipage-meta.xml file
|
|
129
|
+
* @param flexiPageName - Name of the FlexiPage (typically from filename)
|
|
130
|
+
* @returns Parsed FlexiPage metadata with dependencies
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* const result = await parseFlexiPage(
|
|
134
|
+
* 'force-app/main/default/flexipages/Account_Record_Page.flexipage-meta.xml',
|
|
135
|
+
* 'Account_Record_Page'
|
|
136
|
+
* );
|
|
137
|
+
* console.log(result.sobjectType); // 'Account'
|
|
138
|
+
* console.log(result.lwcComponents); // ['c:accountSummary', 'c:relatedContacts']
|
|
139
|
+
* console.log(result.dependencies.auraComponents); // ['c:AccountChart']
|
|
140
|
+
*/
|
|
141
|
+
export async function parseFlexiPage(filePath, flexiPageName) {
|
|
142
|
+
// Read and parse XML
|
|
143
|
+
const xmlContent = await readFile(filePath, 'utf-8');
|
|
144
|
+
const parser = new XMLParser({
|
|
145
|
+
ignoreAttributes: false,
|
|
146
|
+
parseAttributeValue: true,
|
|
147
|
+
trimValues: true,
|
|
148
|
+
});
|
|
149
|
+
let parsed;
|
|
150
|
+
try {
|
|
151
|
+
parsed = parser.parse(xmlContent);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
throw new Error(`Failed to parse FlexiPage XML at ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
155
|
+
}
|
|
156
|
+
// Type assertion with validation
|
|
157
|
+
const root = parsed;
|
|
158
|
+
if (!root.FlexiPage) {
|
|
159
|
+
throw new Error(`Invalid FlexiPage XML structure at ${filePath}: missing FlexiPage root element`);
|
|
160
|
+
}
|
|
161
|
+
const metadata = root.FlexiPage;
|
|
162
|
+
// Extract regions
|
|
163
|
+
const regions = normalizeArray(metadata.flexiPageRegions);
|
|
164
|
+
const regionNames = regions.map((region) => region.name);
|
|
165
|
+
// Extract components
|
|
166
|
+
const { lwc, aura, recordTypes } = extractComponents(regions);
|
|
167
|
+
// Extract objects
|
|
168
|
+
const objects = [];
|
|
169
|
+
if (metadata.sobjectType) {
|
|
170
|
+
objects.push(metadata.sobjectType);
|
|
171
|
+
}
|
|
172
|
+
// Extract quick actions
|
|
173
|
+
const quickActions = extractQuickActions(metadata);
|
|
174
|
+
// Build result
|
|
175
|
+
return {
|
|
176
|
+
name: flexiPageName,
|
|
177
|
+
masterLabel: metadata.masterLabel,
|
|
178
|
+
type: metadata.type,
|
|
179
|
+
sobjectType: metadata.sobjectType,
|
|
180
|
+
lwcComponents: lwc,
|
|
181
|
+
auraComponents: aura,
|
|
182
|
+
objects,
|
|
183
|
+
recordTypeFilters: recordTypes,
|
|
184
|
+
regions: regionNames,
|
|
185
|
+
quickActions,
|
|
186
|
+
dependencies: {
|
|
187
|
+
lwcComponents: lwc,
|
|
188
|
+
auraComponents: aura,
|
|
189
|
+
objects,
|
|
190
|
+
recordTypes,
|
|
191
|
+
regions: regionNames,
|
|
192
|
+
quickActions,
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=flexipage-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flexipage-parser.js","sourceRoot":"","sources":["../../src/parsers/flexipage-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { FlowMetadata, FlowProcessType, FlowStatus } from '../types/salesforce/flow.js';
|
|
2
|
+
/**
|
|
3
|
+
* Flow dependency types
|
|
4
|
+
*/
|
|
5
|
+
export type FlowDependencyType = 'apex_action' | 'subflow' | 'record' | 'genai_prompt' | 'screen_field' | 'decision';
|
|
6
|
+
/**
|
|
7
|
+
* Re-export FlowProcessType and FlowStatus from Salesforce types
|
|
8
|
+
*/
|
|
9
|
+
export type { FlowProcessType, FlowStatus } from '../types/salesforce/flow.js';
|
|
10
|
+
/**
|
|
11
|
+
* Represents a dependency found in a Flow
|
|
12
|
+
*/
|
|
13
|
+
export type FlowDependency = {
|
|
14
|
+
type: FlowDependencyType;
|
|
15
|
+
name: string;
|
|
16
|
+
reference?: string;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Result of parsing a Flow
|
|
20
|
+
* Optionally includes full metadata from Flow-meta.xml
|
|
21
|
+
*/
|
|
22
|
+
export type FlowParseResult = {
|
|
23
|
+
flowName: string;
|
|
24
|
+
flowType?: FlowProcessType;
|
|
25
|
+
status?: FlowStatus;
|
|
26
|
+
apexActions: string[];
|
|
27
|
+
subflows: string[];
|
|
28
|
+
recordReferences: string[];
|
|
29
|
+
genaiPrompts: string[];
|
|
30
|
+
dependencies: FlowDependency[];
|
|
31
|
+
metadata?: FlowMetadata;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Parse a Flow file and extract dependencies
|
|
35
|
+
*
|
|
36
|
+
* @param filePath - Path to the Flow file (.flow-meta.xml)
|
|
37
|
+
* @param content - Content of the Flow file
|
|
38
|
+
* @returns FlowParseResult with all extracted dependencies
|
|
39
|
+
*
|
|
40
|
+
* @throws {ParsingError} If the file cannot be parsed
|
|
41
|
+
*
|
|
42
|
+
* @ac US-015-AC-7: Handle all flow types (screen, record-triggered, scheduled)
|
|
43
|
+
* @ac US-015-AC-8: Parse flow metadata XML correctly
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* const result = parseFlow('MyFlow.flow-meta.xml', flowXmlContent);
|
|
48
|
+
* console.log(result.flowType); // 'Screen'
|
|
49
|
+
* console.log(result.apexActions); // ['MyApexClass.myMethod']
|
|
50
|
+
* console.log(result.subflows); // ['MySubflow']
|
|
51
|
+
* console.log(result.recordReferences); // ['Account', 'Contact']
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare function parseFlow(filePath: string, content: string): FlowParseResult;
|