@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,94 @@
|
|
|
1
|
+
import type { CustomMetadataType, CustomMetadataField, CustomMetadataRecord as CMDRecord } from '../types/salesforce/custom-metadata.js';
|
|
2
|
+
/**
|
|
3
|
+
* Custom Metadata dependency types
|
|
4
|
+
*/
|
|
5
|
+
export type CustomMetadataDependencyType = 'metadata_type' | 'relationship_field' | 'lookup_reference' | 'record';
|
|
6
|
+
/**
|
|
7
|
+
* Represents a dependency found in custom metadata
|
|
8
|
+
*/
|
|
9
|
+
export type CustomMetadataDependency = {
|
|
10
|
+
type: CustomMetadataDependencyType;
|
|
11
|
+
name: string;
|
|
12
|
+
referencedObject?: string;
|
|
13
|
+
fieldName?: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Custom Metadata Record (extended with fullName and simplified values for parsing)
|
|
17
|
+
*/
|
|
18
|
+
export type CustomMetadataRecord = Omit<CMDRecord, 'values'> & {
|
|
19
|
+
fullName: string;
|
|
20
|
+
values: Record<string, unknown>;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Result of parsing a Custom Metadata Type
|
|
24
|
+
* Extends CustomMetadataType with parsing-specific fields
|
|
25
|
+
*/
|
|
26
|
+
export type CustomMetadataParseResult = CustomMetadataType & {
|
|
27
|
+
typeName: string;
|
|
28
|
+
fields: CustomMetadataField[];
|
|
29
|
+
records: CustomMetadataRecord[];
|
|
30
|
+
dependencies: CustomMetadataDependency[];
|
|
31
|
+
requiresSplitting: boolean;
|
|
32
|
+
splitBatches?: number;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Parse Custom Metadata Type definition
|
|
36
|
+
*
|
|
37
|
+
* @param typeName - Name of the custom metadata type
|
|
38
|
+
* @param metadataContent - Content of the .md-meta.xml file
|
|
39
|
+
* @returns CustomMetadataParseResult
|
|
40
|
+
*
|
|
41
|
+
* @throws {ParsingError} If the metadata cannot be parsed
|
|
42
|
+
*
|
|
43
|
+
* @ac US-026-AC-1: Extract field definitions
|
|
44
|
+
* @ac US-026-AC-2: Extract relationship references
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const result = await parseCustomMetadataType('MyConfig__mdt', metadataXml);
|
|
49
|
+
* console.log(result.fields); // [{fullName: 'Value__c', ...}]
|
|
50
|
+
* console.log(result.dependencies); // [{type: 'relationship_field', ...}]
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function parseCustomMetadataType(typeName: string, metadataContent: string): Promise<CustomMetadataParseResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Parse Custom Metadata Record
|
|
56
|
+
*
|
|
57
|
+
* @param recordName - Name of the record
|
|
58
|
+
* @param metadataContent - Content of the .md file
|
|
59
|
+
* @returns CustomMetadataRecord
|
|
60
|
+
*
|
|
61
|
+
* @throws {ParsingError} If the record cannot be parsed
|
|
62
|
+
*
|
|
63
|
+
* @ac US-026-AC-4: Identify CMT records separately
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const record = await parseCustomMetadataRecord('MyConfig.Default', recordXml);
|
|
68
|
+
* console.log(record.label); // 'Default'
|
|
69
|
+
* console.log(record.values); // {Value__c: 'test'}
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export declare function parseCustomMetadataRecord(recordName: string, metadataContent: string): Promise<CustomMetadataRecord>;
|
|
73
|
+
/**
|
|
74
|
+
* Group Custom Metadata Type with its records
|
|
75
|
+
*
|
|
76
|
+
* @param typeResult - Result from parseCustomMetadataType
|
|
77
|
+
* @param records - Array of parsed records
|
|
78
|
+
* @returns Updated CustomMetadataParseResult with records
|
|
79
|
+
*
|
|
80
|
+
* @ac US-026-AC-3: Group type with records
|
|
81
|
+
* @ac US-026-AC-5: Handle CMT splitting (200 records/wave)
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* const typeResult = await parseCustomMetadataType('MyConfig__mdt', typeXml);
|
|
86
|
+
* const records = await Promise.all(
|
|
87
|
+
* recordFiles.map(f => parseCustomMetadataRecord(f.name, f.content))
|
|
88
|
+
* );
|
|
89
|
+
* const grouped = groupCustomMetadataWithRecords(typeResult, records);
|
|
90
|
+
* console.log(grouped.requiresSplitting); // true if >200 records
|
|
91
|
+
* console.log(grouped.splitBatches); // number of 200-record batches
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export declare function groupCustomMetadataWithRecords(typeResult: CustomMetadataParseResult, records: CustomMetadataRecord[]): CustomMetadataParseResult;
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
import { ParsingError } from '../errors/parsing-error.js';
|
|
3
|
+
import { parseXml } from '../utils/xml.js';
|
|
4
|
+
const logger = getLogger('CustomMetadataParser');
|
|
5
|
+
/**
|
|
6
|
+
* Parse Custom Metadata Type definition
|
|
7
|
+
*
|
|
8
|
+
* @param typeName - Name of the custom metadata type
|
|
9
|
+
* @param metadataContent - Content of the .md-meta.xml file
|
|
10
|
+
* @returns CustomMetadataParseResult
|
|
11
|
+
*
|
|
12
|
+
* @throws {ParsingError} If the metadata cannot be parsed
|
|
13
|
+
*
|
|
14
|
+
* @ac US-026-AC-1: Extract field definitions
|
|
15
|
+
* @ac US-026-AC-2: Extract relationship references
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const result = await parseCustomMetadataType('MyConfig__mdt', metadataXml);
|
|
20
|
+
* console.log(result.fields); // [{fullName: 'Value__c', ...}]
|
|
21
|
+
* console.log(result.dependencies); // [{type: 'relationship_field', ...}]
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export async function parseCustomMetadataType(typeName, metadataContent) {
|
|
25
|
+
try {
|
|
26
|
+
logger.debug(`Parsing custom metadata type: ${typeName}`);
|
|
27
|
+
const parsed = await parseXml(metadataContent);
|
|
28
|
+
const parsedObj = parsed;
|
|
29
|
+
const customMetadata = parsedObj.CustomMetadata || parsedObj;
|
|
30
|
+
// Normalize arrays
|
|
31
|
+
const normalizeArray = (value) => {
|
|
32
|
+
if (value === undefined)
|
|
33
|
+
return [];
|
|
34
|
+
return Array.isArray(value) ? value : [value];
|
|
35
|
+
};
|
|
36
|
+
// Extract fields
|
|
37
|
+
const fieldsRaw = normalizeArray(customMetadata.fields);
|
|
38
|
+
const fields = fieldsRaw.map((field) => ({
|
|
39
|
+
fullName: String(field.fullName ?? ''),
|
|
40
|
+
label: String(field.label ?? ''),
|
|
41
|
+
type: String(field.type ?? 'Text'),
|
|
42
|
+
required: field.required ? Boolean(field.required) : undefined,
|
|
43
|
+
unique: field.unique ? Boolean(field.unique) : undefined,
|
|
44
|
+
description: field.description ? String(field.description) : undefined,
|
|
45
|
+
referenceTo: field.referenceTo ? String(field.referenceTo) : undefined,
|
|
46
|
+
}));
|
|
47
|
+
// Extract basic metadata info
|
|
48
|
+
const label = customMetadata.label ?? typeName;
|
|
49
|
+
const pluralLabel = customMetadata.pluralLabel ?? `${label}s`;
|
|
50
|
+
const description = customMetadata.description;
|
|
51
|
+
// Build dependencies
|
|
52
|
+
const dependencies = [];
|
|
53
|
+
// Add field dependencies (especially EntityDefinition relationships)
|
|
54
|
+
for (const field of fields) {
|
|
55
|
+
if (field.referenceTo) {
|
|
56
|
+
dependencies.push({
|
|
57
|
+
type: 'relationship_field',
|
|
58
|
+
name: field.fullName,
|
|
59
|
+
referencedObject: field.referenceTo,
|
|
60
|
+
fieldName: field.fullName,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Note: Records are parsed separately from .md files in the customMetadata directory
|
|
65
|
+
const records = [];
|
|
66
|
+
// CMT splitting logic (200 records per wave)
|
|
67
|
+
const CMT_RECORDS_PER_WAVE = 200;
|
|
68
|
+
const requiresSplitting = records.length > CMT_RECORDS_PER_WAVE;
|
|
69
|
+
const splitBatches = requiresSplitting ? Math.ceil(records.length / CMT_RECORDS_PER_WAVE) : undefined;
|
|
70
|
+
const result = {
|
|
71
|
+
typeName,
|
|
72
|
+
label,
|
|
73
|
+
pluralLabel,
|
|
74
|
+
description,
|
|
75
|
+
fields,
|
|
76
|
+
records,
|
|
77
|
+
dependencies,
|
|
78
|
+
requiresSplitting,
|
|
79
|
+
splitBatches,
|
|
80
|
+
};
|
|
81
|
+
logger.debug(`Parsed custom metadata type: ${typeName}`, {
|
|
82
|
+
fieldsCount: fields.length,
|
|
83
|
+
recordsCount: records.length,
|
|
84
|
+
requiresSplitting,
|
|
85
|
+
splitBatches,
|
|
86
|
+
dependenciesCount: dependencies.length,
|
|
87
|
+
});
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (error instanceof ParsingError) {
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
throw new ParsingError(`Failed to parse custom metadata type: ${typeName}`, {
|
|
95
|
+
filePath: typeName,
|
|
96
|
+
originalError: error instanceof Error ? error.message : String(error),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Parse Custom Metadata Record
|
|
102
|
+
*
|
|
103
|
+
* @param recordName - Name of the record
|
|
104
|
+
* @param metadataContent - Content of the .md file
|
|
105
|
+
* @returns CustomMetadataRecord
|
|
106
|
+
*
|
|
107
|
+
* @throws {ParsingError} If the record cannot be parsed
|
|
108
|
+
*
|
|
109
|
+
* @ac US-026-AC-4: Identify CMT records separately
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* const record = await parseCustomMetadataRecord('MyConfig.Default', recordXml);
|
|
114
|
+
* console.log(record.label); // 'Default'
|
|
115
|
+
* console.log(record.values); // {Value__c: 'test'}
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
export async function parseCustomMetadataRecord(recordName, metadataContent) {
|
|
119
|
+
try {
|
|
120
|
+
logger.debug(`Parsing custom metadata record: ${recordName}`);
|
|
121
|
+
const parsed = await parseXml(metadataContent);
|
|
122
|
+
const parsedObj = parsed;
|
|
123
|
+
const customMetadata = parsedObj.CustomMetadata || parsedObj;
|
|
124
|
+
const label = customMetadata.label ?? recordName;
|
|
125
|
+
const protectedFlag = customMetadata.protected;
|
|
126
|
+
// Extract values
|
|
127
|
+
const valuesRaw = customMetadata.values;
|
|
128
|
+
const values = {};
|
|
129
|
+
if (valuesRaw) {
|
|
130
|
+
// Parse CustomMetadataValue entries
|
|
131
|
+
const valueEntries = Array.isArray(valuesRaw) ? valuesRaw : [valuesRaw];
|
|
132
|
+
for (const entry of valueEntries) {
|
|
133
|
+
const field = entry.field;
|
|
134
|
+
const value = entry.value;
|
|
135
|
+
if (field) {
|
|
136
|
+
values[field] = value;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const record = {
|
|
141
|
+
fullName: recordName,
|
|
142
|
+
label,
|
|
143
|
+
protected: protectedFlag,
|
|
144
|
+
values,
|
|
145
|
+
};
|
|
146
|
+
logger.debug(`Parsed custom metadata record: ${recordName}`, {
|
|
147
|
+
valuesCount: Object.keys(values).length,
|
|
148
|
+
});
|
|
149
|
+
return record;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
if (error instanceof ParsingError) {
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
throw new ParsingError(`Failed to parse custom metadata record: ${recordName}`, {
|
|
156
|
+
filePath: recordName,
|
|
157
|
+
originalError: error instanceof Error ? error.message : String(error),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Group Custom Metadata Type with its records
|
|
163
|
+
*
|
|
164
|
+
* @param typeResult - Result from parseCustomMetadataType
|
|
165
|
+
* @param records - Array of parsed records
|
|
166
|
+
* @returns Updated CustomMetadataParseResult with records
|
|
167
|
+
*
|
|
168
|
+
* @ac US-026-AC-3: Group type with records
|
|
169
|
+
* @ac US-026-AC-5: Handle CMT splitting (200 records/wave)
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* ```typescript
|
|
173
|
+
* const typeResult = await parseCustomMetadataType('MyConfig__mdt', typeXml);
|
|
174
|
+
* const records = await Promise.all(
|
|
175
|
+
* recordFiles.map(f => parseCustomMetadataRecord(f.name, f.content))
|
|
176
|
+
* );
|
|
177
|
+
* const grouped = groupCustomMetadataWithRecords(typeResult, records);
|
|
178
|
+
* console.log(grouped.requiresSplitting); // true if >200 records
|
|
179
|
+
* console.log(grouped.splitBatches); // number of 200-record batches
|
|
180
|
+
* ```
|
|
181
|
+
*/
|
|
182
|
+
export function groupCustomMetadataWithRecords(typeResult, records) {
|
|
183
|
+
const CMT_RECORDS_PER_WAVE = 200;
|
|
184
|
+
const requiresSplitting = records.length > CMT_RECORDS_PER_WAVE;
|
|
185
|
+
const splitBatches = requiresSplitting ? Math.ceil(records.length / CMT_RECORDS_PER_WAVE) : undefined;
|
|
186
|
+
// Add record dependencies
|
|
187
|
+
const recordDependencies = records.map((record) => ({
|
|
188
|
+
type: 'record',
|
|
189
|
+
name: record.fullName,
|
|
190
|
+
}));
|
|
191
|
+
return {
|
|
192
|
+
...typeResult,
|
|
193
|
+
records,
|
|
194
|
+
dependencies: [...typeResult.dependencies, ...recordDependencies],
|
|
195
|
+
requiresSplitting,
|
|
196
|
+
splitBatches,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=custom-metadata-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-metadata-parser.js","sourceRoot":"","sources":["../../src/parsers/custom-metadata-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { CustomObjectMetadata, CustomField, ValidationRule, RecordType, ListView } from '../types/salesforce/object.js';
|
|
2
|
+
/**
|
|
3
|
+
* Custom object dependency types
|
|
4
|
+
*/
|
|
5
|
+
export type CustomObjectDependencyType = 'lookup_field' | 'master_detail_field' | 'formula_field' | 'validation_rule' | 'workflow_rule' | 'apex_class' | 'record_type' | 'custom_field';
|
|
6
|
+
/**
|
|
7
|
+
* Represents a dependency found in a custom object
|
|
8
|
+
*/
|
|
9
|
+
export type CustomObjectDependency = {
|
|
10
|
+
type: CustomObjectDependencyType;
|
|
11
|
+
name: string;
|
|
12
|
+
referencedObject?: string;
|
|
13
|
+
fieldName?: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Sharing rule metadata (for parsing)
|
|
17
|
+
*/
|
|
18
|
+
export type SharingRule = {
|
|
19
|
+
fullName: string;
|
|
20
|
+
accessLevel: string;
|
|
21
|
+
sharedTo?: {
|
|
22
|
+
group?: string;
|
|
23
|
+
role?: string;
|
|
24
|
+
roleAndSubordinates?: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Result of parsing a custom object
|
|
29
|
+
* Extends CustomObjectMetadata with parsed dependencies
|
|
30
|
+
* Ensures arrays are always defined (never undefined)
|
|
31
|
+
*/
|
|
32
|
+
export type CustomObjectParseResult = Omit<CustomObjectMetadata, 'fields' | 'validationRules' | 'recordTypes' | 'listViews'> & {
|
|
33
|
+
fields: CustomField[];
|
|
34
|
+
validationRules: ValidationRule[];
|
|
35
|
+
recordTypes: RecordType[];
|
|
36
|
+
listViews: ListView[];
|
|
37
|
+
sharingRules: SharingRule[];
|
|
38
|
+
dependencies: CustomObjectDependency[];
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Parse a custom object and extract dependencies
|
|
42
|
+
*
|
|
43
|
+
* @param objectName - Name of the custom object
|
|
44
|
+
* @param metadataContent - Content of the .object file
|
|
45
|
+
* @returns CustomObjectParseResult with all extracted dependencies
|
|
46
|
+
*
|
|
47
|
+
* @throws {ParsingError} If the object cannot be parsed
|
|
48
|
+
*
|
|
49
|
+
* @ac US-020-AC-1: Extract custom field definitions
|
|
50
|
+
* @ac US-020-AC-2: Extract validation rule dependencies
|
|
51
|
+
* @ac US-020-AC-4: Extract lookup/master-detail relationships
|
|
52
|
+
* @ac US-020-AC-6: Extract record types
|
|
53
|
+
* @ac US-020-AC-8: Extract list views
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* const result = await parseCustomObject('Account', objectXml);
|
|
58
|
+
* console.log(result.fields); // [{fullName: 'CustomField__c', ...}]
|
|
59
|
+
* console.log(result.dependencies); // [{type: 'lookup_field', ...}]
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export declare function parseCustomObject(objectName: string, metadataContent: string): Promise<CustomObjectParseResult>;
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
import { ParsingError } from '../errors/parsing-error.js';
|
|
3
|
+
import { parseXml } from '../utils/xml.js';
|
|
4
|
+
const logger = getLogger('CustomObjectParser');
|
|
5
|
+
/**
|
|
6
|
+
* Extract object references from formula
|
|
7
|
+
*
|
|
8
|
+
* @ac US-020-AC-3: Extract formula field dependencies
|
|
9
|
+
*/
|
|
10
|
+
function extractFormulaReferences(formula) {
|
|
11
|
+
const references = new Set();
|
|
12
|
+
// Pattern: ObjectName.FieldName or $ObjectType.ObjectName
|
|
13
|
+
const objectPattern = /\b([A-Z][a-zA-Z0-9_]*)\./g;
|
|
14
|
+
const matches = formula.matchAll(objectPattern);
|
|
15
|
+
for (const match of matches) {
|
|
16
|
+
const objectName = match[1];
|
|
17
|
+
// Skip common formula functions
|
|
18
|
+
if (!['IF', 'AND', 'OR', 'NOT', 'CASE', 'TEXT', 'VALUE', 'DATE', 'DATEVALUE', 'NOW', 'TODAY'].includes(objectName)) {
|
|
19
|
+
references.add(objectName);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Also check for $ObjectType references
|
|
23
|
+
const objectTypePattern = /\$ObjectType\.([a-zA-Z][a-zA-Z0-9_]*)/g;
|
|
24
|
+
const objectTypeMatches = formula.matchAll(objectTypePattern);
|
|
25
|
+
for (const match of objectTypeMatches) {
|
|
26
|
+
references.add(match[1]);
|
|
27
|
+
}
|
|
28
|
+
return [...references];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extract Apex class references from validation rules
|
|
32
|
+
*
|
|
33
|
+
* @ac US-020-AC-5: Extract Apex class references in formulas
|
|
34
|
+
*/
|
|
35
|
+
function extractApexReferences(formula) {
|
|
36
|
+
const apexClasses = new Set();
|
|
37
|
+
// Pattern: ClassName.methodName() or @RemoteAction patterns
|
|
38
|
+
const apexPattern = /\b([A-Z][a-zA-Z0-9_]*)\.[a-zA-Z][a-zA-Z0-9_]*\s*\(/g;
|
|
39
|
+
const matches = formula.matchAll(apexPattern);
|
|
40
|
+
for (const match of matches) {
|
|
41
|
+
apexClasses.add(match[1]);
|
|
42
|
+
}
|
|
43
|
+
return [...apexClasses];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Extract sharing rules from metadata
|
|
47
|
+
*
|
|
48
|
+
* @ac US-020-AC-7: Extract sharing rules
|
|
49
|
+
*/
|
|
50
|
+
function extractSharingRules(metadata) {
|
|
51
|
+
const sharingRules = [];
|
|
52
|
+
const sharingObj = metadata.sharingRules;
|
|
53
|
+
if (!sharingObj) {
|
|
54
|
+
return sharingRules;
|
|
55
|
+
}
|
|
56
|
+
// Sharing rules can be criteriaBasedRules or ownerRules
|
|
57
|
+
const criteriaRules = sharingObj.criteriaBasedRules;
|
|
58
|
+
const ownerRules = sharingObj.ownerRules;
|
|
59
|
+
if (criteriaRules) {
|
|
60
|
+
const criteriaList = Array.isArray(criteriaRules) ? criteriaRules : [criteriaRules];
|
|
61
|
+
for (const rule of criteriaList) {
|
|
62
|
+
const criteriaRule = rule;
|
|
63
|
+
const sharingRule = {
|
|
64
|
+
fullName: criteriaRule.fullName ?? '',
|
|
65
|
+
accessLevel: criteriaRule.accessLevel ?? '',
|
|
66
|
+
sharedTo: criteriaRule.sharedTo,
|
|
67
|
+
};
|
|
68
|
+
sharingRules.push(sharingRule);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (ownerRules) {
|
|
72
|
+
const ownerList = Array.isArray(ownerRules) ? ownerRules : [ownerRules];
|
|
73
|
+
for (const rule of ownerList) {
|
|
74
|
+
const ownerRule = rule;
|
|
75
|
+
const sharingRule = {
|
|
76
|
+
fullName: ownerRule.fullName ?? '',
|
|
77
|
+
accessLevel: ownerRule.accessLevel ?? '',
|
|
78
|
+
sharedTo: ownerRule.sharedTo,
|
|
79
|
+
};
|
|
80
|
+
sharingRules.push(sharingRule);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return sharingRules;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parse custom object metadata XML
|
|
87
|
+
*/
|
|
88
|
+
async function parseMetadataXml(metadataContent) {
|
|
89
|
+
try {
|
|
90
|
+
const parsed = await parseXml(metadataContent);
|
|
91
|
+
const parsedObj = parsed;
|
|
92
|
+
const customObject = parsedObj.CustomObject || parsedObj;
|
|
93
|
+
// Validate that we have at least label and pluralLabel
|
|
94
|
+
if (!customObject.label || !customObject.pluralLabel) {
|
|
95
|
+
logger.warn('Missing required fields in custom object metadata', {
|
|
96
|
+
hasLabel: Boolean(customObject.label),
|
|
97
|
+
hasPluralLabel: Boolean(customObject.pluralLabel),
|
|
98
|
+
parsedKeys: Object.keys(customObject),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// Normalize arrays (XML parser returns single items as objects, not arrays)
|
|
102
|
+
const normalizeArray = (value) => {
|
|
103
|
+
if (value === undefined)
|
|
104
|
+
return undefined;
|
|
105
|
+
return Array.isArray(value) ? value : [value];
|
|
106
|
+
};
|
|
107
|
+
// Map to CustomObjectMetadata using the robust types from src/types/salesforce/object.ts
|
|
108
|
+
let fields = normalizeArray(customObject.fields);
|
|
109
|
+
// Normalize referenceTo within each field (XML parser returns single string, but type expects array)
|
|
110
|
+
if (fields) {
|
|
111
|
+
fields = fields.map((field) => ({
|
|
112
|
+
...field,
|
|
113
|
+
referenceTo: field.referenceTo
|
|
114
|
+
? Array.isArray(field.referenceTo)
|
|
115
|
+
? field.referenceTo
|
|
116
|
+
: [field.referenceTo]
|
|
117
|
+
: undefined,
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
120
|
+
const metadata = {
|
|
121
|
+
label: customObject.label ?? '',
|
|
122
|
+
pluralLabel: customObject.pluralLabel ?? '',
|
|
123
|
+
actionOverrides: normalizeArray(customObject.actionOverrides),
|
|
124
|
+
allowInChatterGroups: customObject.allowInChatterGroups,
|
|
125
|
+
compactLayoutAssignment: customObject.compactLayoutAssignment,
|
|
126
|
+
customHelpPage: customObject.customHelpPage,
|
|
127
|
+
deploymentStatus: customObject.deploymentStatus,
|
|
128
|
+
deprecated: customObject.deprecated,
|
|
129
|
+
description: customObject.description,
|
|
130
|
+
enableActivities: customObject.enableActivities,
|
|
131
|
+
enableBulkApi: customObject.enableBulkApi,
|
|
132
|
+
enableChangeDataCapture: customObject.enableChangeDataCapture,
|
|
133
|
+
enableEnhancedLookup: customObject.enableEnhancedLookup,
|
|
134
|
+
enableFeeds: customObject.enableFeeds,
|
|
135
|
+
enableHistory: customObject.enableHistory,
|
|
136
|
+
enableReports: customObject.enableReports,
|
|
137
|
+
enableSearch: customObject.enableSearch,
|
|
138
|
+
enableSharing: customObject.enableSharing,
|
|
139
|
+
enableStreamingApi: customObject.enableStreamingApi,
|
|
140
|
+
externalSharingModel: customObject.externalSharingModel,
|
|
141
|
+
fields,
|
|
142
|
+
fieldSets: normalizeArray(customObject.fieldSets),
|
|
143
|
+
gender: customObject.gender,
|
|
144
|
+
household: customObject.household,
|
|
145
|
+
listViews: normalizeArray(customObject.listViews),
|
|
146
|
+
nameField: customObject.nameField,
|
|
147
|
+
recordTypes: normalizeArray(customObject.recordTypes),
|
|
148
|
+
searchLayouts: customObject.searchLayouts,
|
|
149
|
+
sharingModel: customObject.sharingModel,
|
|
150
|
+
sharingReasons: normalizeArray(customObject.sharingReasons),
|
|
151
|
+
sharingRecalculations: normalizeArray(customObject.sharingRecalculations),
|
|
152
|
+
startsWith: customObject.startsWith,
|
|
153
|
+
validationRules: normalizeArray(customObject.validationRules),
|
|
154
|
+
visibility: customObject.visibility,
|
|
155
|
+
webLinks: normalizeArray(customObject.webLinks),
|
|
156
|
+
};
|
|
157
|
+
return metadata;
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
throw new ParsingError('Failed to parse custom object metadata XML', {
|
|
161
|
+
originalError: error instanceof Error ? error.message : String(error),
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Parse a custom object and extract dependencies
|
|
167
|
+
*
|
|
168
|
+
* @param objectName - Name of the custom object
|
|
169
|
+
* @param metadataContent - Content of the .object file
|
|
170
|
+
* @returns CustomObjectParseResult with all extracted dependencies
|
|
171
|
+
*
|
|
172
|
+
* @throws {ParsingError} If the object cannot be parsed
|
|
173
|
+
*
|
|
174
|
+
* @ac US-020-AC-1: Extract custom field definitions
|
|
175
|
+
* @ac US-020-AC-2: Extract validation rule dependencies
|
|
176
|
+
* @ac US-020-AC-4: Extract lookup/master-detail relationships
|
|
177
|
+
* @ac US-020-AC-6: Extract record types
|
|
178
|
+
* @ac US-020-AC-8: Extract list views
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```typescript
|
|
182
|
+
* const result = await parseCustomObject('Account', objectXml);
|
|
183
|
+
* console.log(result.fields); // [{fullName: 'CustomField__c', ...}]
|
|
184
|
+
* console.log(result.dependencies); // [{type: 'lookup_field', ...}]
|
|
185
|
+
* ```
|
|
186
|
+
*/
|
|
187
|
+
// eslint-disable-next-line complexity
|
|
188
|
+
export async function parseCustomObject(objectName, metadataContent) {
|
|
189
|
+
try {
|
|
190
|
+
logger.debug(`Parsing custom object: ${objectName}`);
|
|
191
|
+
// Parse metadata XML using Salesforce types
|
|
192
|
+
const metadata = await parseMetadataXml(metadataContent);
|
|
193
|
+
// Parse the raw XML for sharing rules (not part of CustomObjectMetadata)
|
|
194
|
+
const parsedRaw = await parseXml(metadataContent);
|
|
195
|
+
const customObject = parsedRaw.CustomObject || parsedRaw;
|
|
196
|
+
const sharingRules = extractSharingRules(customObject);
|
|
197
|
+
// Extract fields
|
|
198
|
+
const fields = metadata.fields ?? [];
|
|
199
|
+
const validationRules = metadata.validationRules ?? [];
|
|
200
|
+
const recordTypes = metadata.recordTypes ?? [];
|
|
201
|
+
const listViews = metadata.listViews ?? [];
|
|
202
|
+
// Build dependencies array
|
|
203
|
+
const dependencies = [];
|
|
204
|
+
// Add field dependencies
|
|
205
|
+
for (const field of fields) {
|
|
206
|
+
// Lookup/Master-Detail relationships
|
|
207
|
+
if (field.referenceTo && (field.type === 'Lookup' || field.type === 'MasterDetail')) {
|
|
208
|
+
const refObjects = field.referenceTo;
|
|
209
|
+
for (const refObject of refObjects) {
|
|
210
|
+
dependencies.push({
|
|
211
|
+
type: field.type === 'MasterDetail' ? 'master_detail_field' : 'lookup_field',
|
|
212
|
+
name: field.fullName,
|
|
213
|
+
referencedObject: refObject,
|
|
214
|
+
fieldName: field.fullName,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// Formula fields
|
|
219
|
+
if (field.formula) {
|
|
220
|
+
const formulaRefs = extractFormulaReferences(field.formula);
|
|
221
|
+
for (const ref of formulaRefs) {
|
|
222
|
+
dependencies.push({
|
|
223
|
+
type: 'formula_field',
|
|
224
|
+
name: field.fullName,
|
|
225
|
+
referencedObject: ref,
|
|
226
|
+
fieldName: field.fullName,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
// Apex class references in formulas
|
|
230
|
+
const apexRefs = extractApexReferences(field.formula);
|
|
231
|
+
for (const apexClass of apexRefs) {
|
|
232
|
+
dependencies.push({
|
|
233
|
+
type: 'apex_class',
|
|
234
|
+
name: apexClass,
|
|
235
|
+
fieldName: field.fullName,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Add validation rule dependencies
|
|
241
|
+
for (const rule of validationRules) {
|
|
242
|
+
if (rule.errorConditionFormula) {
|
|
243
|
+
const formulaRefs = extractFormulaReferences(rule.errorConditionFormula);
|
|
244
|
+
for (const ref of formulaRefs) {
|
|
245
|
+
dependencies.push({
|
|
246
|
+
type: 'validation_rule',
|
|
247
|
+
name: rule.fullName,
|
|
248
|
+
referencedObject: ref,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
// Apex class references in validation rules
|
|
252
|
+
const apexRefs = extractApexReferences(rule.errorConditionFormula);
|
|
253
|
+
for (const apexClass of apexRefs) {
|
|
254
|
+
dependencies.push({
|
|
255
|
+
type: 'apex_class',
|
|
256
|
+
name: apexClass,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Add record type dependencies
|
|
262
|
+
for (const rt of recordTypes) {
|
|
263
|
+
dependencies.push({
|
|
264
|
+
type: 'record_type',
|
|
265
|
+
name: rt.fullName,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
const result = {
|
|
269
|
+
...metadata,
|
|
270
|
+
fields,
|
|
271
|
+
validationRules,
|
|
272
|
+
recordTypes,
|
|
273
|
+
listViews,
|
|
274
|
+
sharingRules,
|
|
275
|
+
dependencies,
|
|
276
|
+
};
|
|
277
|
+
logger.debug(`Parsed custom object: ${objectName}`, {
|
|
278
|
+
fieldsCount: fields.length,
|
|
279
|
+
validationRulesCount: validationRules.length,
|
|
280
|
+
recordTypesCount: recordTypes.length,
|
|
281
|
+
sharingRulesCount: sharingRules.length,
|
|
282
|
+
listViewsCount: listViews.length,
|
|
283
|
+
dependenciesCount: dependencies.length,
|
|
284
|
+
});
|
|
285
|
+
return result;
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
if (error instanceof ParsingError) {
|
|
289
|
+
throw error;
|
|
290
|
+
}
|
|
291
|
+
throw new ParsingError(`Failed to parse custom object: ${objectName}`, {
|
|
292
|
+
filePath: objectName,
|
|
293
|
+
originalError: error instanceof Error ? error.message : String(error),
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=custom-object-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-object-parser.js","sourceRoot":"","sources":["../../src/parsers/custom-object-parser.ts"],"names":[],"mappings":"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"}
|