@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,180 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
import { ParsingError } from '../errors/parsing-error.js';
|
|
3
|
+
const logger = getLogger('VisualforceParser');
|
|
4
|
+
/**
|
|
5
|
+
* Extract Apex controller from Visualforce markup
|
|
6
|
+
*
|
|
7
|
+
* @ac US-018-AC-1: Extract controller Apex class
|
|
8
|
+
*/
|
|
9
|
+
function extractApexController(vfContent) {
|
|
10
|
+
// Pattern: <apex:page controller="MyController">
|
|
11
|
+
const controllerMatch = vfContent.match(/<apex:(?:page|component)[^>]*\scontroller\s*=\s*["']([a-zA-Z][a-zA-Z0-9_.]*?)["']/i);
|
|
12
|
+
return controllerMatch ? controllerMatch[1] : undefined;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Extract standard controller from Visualforce markup
|
|
16
|
+
*
|
|
17
|
+
* @ac US-018-AC-2: Extract standardController (SObject reference)
|
|
18
|
+
*/
|
|
19
|
+
function extractStandardController(vfContent) {
|
|
20
|
+
// Pattern: <apex:page standardController="Account">
|
|
21
|
+
const stdControllerMatch = vfContent.match(/<apex:(?:page|component)[^>]*\sstandardController\s*=\s*["']([a-zA-Z][a-zA-Z0-9_]*?)["']/i);
|
|
22
|
+
return stdControllerMatch ? stdControllerMatch[1] : undefined;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Extract controller extensions from Visualforce markup
|
|
26
|
+
*
|
|
27
|
+
* @ac US-018-AC-3: Extract extensions (controller extensions)
|
|
28
|
+
*/
|
|
29
|
+
function extractExtensions(vfContent) {
|
|
30
|
+
// Pattern: extensions="Extension1,Extension2,Extension3"
|
|
31
|
+
const extensionsMatch = vfContent.match(/<apex:(?:page|component)[^>]*\sextensions\s*=\s*["']([^"']+)["']/i);
|
|
32
|
+
if (!extensionsMatch) {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
return extensionsMatch[1]
|
|
36
|
+
.split(',')
|
|
37
|
+
.map((ext) => ext.trim())
|
|
38
|
+
.filter((ext) => ext.length > 0);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Extract recordSetVar from Visualforce markup
|
|
42
|
+
*/
|
|
43
|
+
function extractRecordSetVar(vfContent) {
|
|
44
|
+
// Pattern: recordSetVar="accounts"
|
|
45
|
+
const recordSetVarMatch = vfContent.match(/<apex:page[^>]*\srecordSetVar\s*=\s*["']([a-zA-Z][a-zA-Z0-9_]*?)["']/i);
|
|
46
|
+
return recordSetVarMatch ? recordSetVarMatch[1] : undefined;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Extract Visualforce component references
|
|
50
|
+
*
|
|
51
|
+
* @ac US-018-AC-4: Extract VF component references
|
|
52
|
+
*/
|
|
53
|
+
function extractComponents(vfContent) {
|
|
54
|
+
const components = [];
|
|
55
|
+
// Pattern: <c:MyComponent /> or <namespace:ComponentName />
|
|
56
|
+
const componentPattern = /<([a-zA-Z][a-zA-Z0-9_]*):([a-zA-Z][a-zA-Z0-9_]*)[^>]*\/?>/gi;
|
|
57
|
+
const matches = vfContent.matchAll(componentPattern);
|
|
58
|
+
for (const match of matches) {
|
|
59
|
+
const namespace = match[1];
|
|
60
|
+
const componentName = match[2];
|
|
61
|
+
// Exclude apex: namespace (standard components)
|
|
62
|
+
if (namespace.toLowerCase() !== 'apex' && namespace.toLowerCase() !== 'chatter') {
|
|
63
|
+
const fullName = `${namespace}:${componentName}`;
|
|
64
|
+
if (!components.includes(fullName)) {
|
|
65
|
+
components.push(fullName);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return components;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Determine if the file is a page or component based on extension
|
|
73
|
+
*
|
|
74
|
+
* @ac US-018-AC-6: Validate file extension (.page or .component)
|
|
75
|
+
*/
|
|
76
|
+
function getVisualforceType(fileName) {
|
|
77
|
+
if (fileName.endsWith('.page')) {
|
|
78
|
+
return 'page';
|
|
79
|
+
}
|
|
80
|
+
if (fileName.endsWith('.component')) {
|
|
81
|
+
return 'component';
|
|
82
|
+
}
|
|
83
|
+
throw new ParsingError(`Invalid Visualforce file extension: ${fileName}`, {
|
|
84
|
+
filePath: fileName,
|
|
85
|
+
expectedExtensions: ['.page', '.component'],
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Parse a Visualforce page or component and extract dependencies
|
|
90
|
+
*
|
|
91
|
+
* @param fileName - Name of the Visualforce file (with extension)
|
|
92
|
+
* @param vfContent - Content of the Visualforce file
|
|
93
|
+
* @returns VisualforceParseResult with all extracted dependencies
|
|
94
|
+
*
|
|
95
|
+
* @throws {ParsingError} If the file cannot be parsed or has invalid extension
|
|
96
|
+
*
|
|
97
|
+
* @ac US-018-AC-5: Parse both pages and components
|
|
98
|
+
* @ac US-018-AC-6: Validate file extension (.page or .component)
|
|
99
|
+
* @ac US-018-AC-7: Handle namespace prefixes in controllers and components
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* const result = parseVisualforce('MyPage.page', vfContent);
|
|
104
|
+
* console.log(result.apexController); // 'MyController'
|
|
105
|
+
* console.log(result.components); // ['c:MyComponent']
|
|
106
|
+
* console.log(result.standardController); // 'Account'
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export function parseVisualforce(fileName, vfContent) {
|
|
110
|
+
try {
|
|
111
|
+
logger.debug(`Parsing Visualforce: ${fileName}`);
|
|
112
|
+
// Validate and determine type
|
|
113
|
+
const type = getVisualforceType(fileName);
|
|
114
|
+
const name = fileName.replace(/\.(page|component)$/, '');
|
|
115
|
+
// Extract dependencies
|
|
116
|
+
const apexController = extractApexController(vfContent);
|
|
117
|
+
const standardController = extractStandardController(vfContent);
|
|
118
|
+
const apexExtensions = extractExtensions(vfContent);
|
|
119
|
+
const recordSetVar = extractRecordSetVar(vfContent);
|
|
120
|
+
const components = extractComponents(vfContent);
|
|
121
|
+
// Build dependencies array
|
|
122
|
+
const dependencies = [];
|
|
123
|
+
if (apexController) {
|
|
124
|
+
dependencies.push({
|
|
125
|
+
type: 'apex_controller',
|
|
126
|
+
name: apexController,
|
|
127
|
+
namespace: apexController.includes('__') ? apexController.split('__')[0] : undefined,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
if (standardController) {
|
|
131
|
+
dependencies.push({
|
|
132
|
+
type: 'standard_controller',
|
|
133
|
+
name: standardController,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
for (const extension of apexExtensions) {
|
|
137
|
+
dependencies.push({
|
|
138
|
+
type: 'apex_extension',
|
|
139
|
+
name: extension,
|
|
140
|
+
namespace: extension.includes('__') ? extension.split('__')[0] : undefined,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
for (const component of components) {
|
|
144
|
+
dependencies.push({
|
|
145
|
+
type: 'vf_component',
|
|
146
|
+
name: component,
|
|
147
|
+
namespace: component.includes(':') ? component.split(':')[0] : undefined,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
const result = {
|
|
151
|
+
name,
|
|
152
|
+
type,
|
|
153
|
+
apexController,
|
|
154
|
+
apexExtensions,
|
|
155
|
+
standardController,
|
|
156
|
+
recordSetVar,
|
|
157
|
+
components,
|
|
158
|
+
dependencies,
|
|
159
|
+
};
|
|
160
|
+
logger.debug(`Parsed Visualforce: ${fileName}`, {
|
|
161
|
+
type,
|
|
162
|
+
apexController: !!apexController,
|
|
163
|
+
standardController: !!standardController,
|
|
164
|
+
extensionsCount: apexExtensions.length,
|
|
165
|
+
componentsCount: components.length,
|
|
166
|
+
dependenciesCount: dependencies.length,
|
|
167
|
+
});
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
if (error instanceof ParsingError) {
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
throw new ParsingError(`Failed to parse Visualforce file: ${fileName}`, {
|
|
175
|
+
filePath: fileName,
|
|
176
|
+
originalError: error instanceof Error ? error.message : String(error),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=visualforce-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualforce-parser.js","sourceRoot":"","sources":["../../src/parsers/visualforce-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data Provisioner - US-107
|
|
3
|
+
* Handles data provisioning between deployment waves
|
|
4
|
+
*
|
|
5
|
+
* @ac US-107-AC-1: Detect when data provisioning is needed
|
|
6
|
+
* @ac US-107-AC-2: Support Custom Metadata Type record creation
|
|
7
|
+
* @ac US-107-AC-3: Handle Custom Settings data
|
|
8
|
+
* @ac US-107-AC-4: Queue data operations between waves
|
|
9
|
+
* @ac US-107-AC-5: Validate data exists before deploying dependent metadata
|
|
10
|
+
* @issue #107
|
|
11
|
+
*/
|
|
12
|
+
import type { MetadataComponent } from '../types/metadata.js';
|
|
13
|
+
export type DataProvisioningRecord = {
|
|
14
|
+
type: 'CustomMetadata' | 'CustomSettings' | 'PicklistValue' | 'RecordType';
|
|
15
|
+
name: string;
|
|
16
|
+
filePath: string;
|
|
17
|
+
metadata: Record<string, unknown>;
|
|
18
|
+
dependsOn: string[];
|
|
19
|
+
};
|
|
20
|
+
export type DataProvisioningWave = {
|
|
21
|
+
waveNumber: number;
|
|
22
|
+
records: DataProvisioningRecord[];
|
|
23
|
+
estimatedTime: number;
|
|
24
|
+
dependencies: string[];
|
|
25
|
+
};
|
|
26
|
+
export type ProvisioningResult = {
|
|
27
|
+
success: boolean;
|
|
28
|
+
recordsCreated: number;
|
|
29
|
+
recordsFailed: number;
|
|
30
|
+
errors: Array<{
|
|
31
|
+
record: string;
|
|
32
|
+
error: string;
|
|
33
|
+
}>;
|
|
34
|
+
executionTime: number;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* @ac US-107-AC-1: Detect when data provisioning is needed
|
|
38
|
+
*/
|
|
39
|
+
export declare class DataProvisioner {
|
|
40
|
+
/**
|
|
41
|
+
* @ac US-107-AC-1: Detect when data provisioning is needed
|
|
42
|
+
* Detect data provisioning requirements from metadata
|
|
43
|
+
*/
|
|
44
|
+
detectProvisioningNeeds(components: MetadataComponent[]): DataProvisioningRecord[];
|
|
45
|
+
/**
|
|
46
|
+
* @ac US-107-AC-2: Support Custom Metadata Type record creation
|
|
47
|
+
* Parse Custom Metadata records
|
|
48
|
+
*/
|
|
49
|
+
parseCustomMetadataRecord(filePath: string): Promise<DataProvisioningRecord>;
|
|
50
|
+
/**
|
|
51
|
+
* @ac US-107-AC-3: Handle Custom Settings data
|
|
52
|
+
* Prepare Custom Settings data for provisioning
|
|
53
|
+
*/
|
|
54
|
+
prepareCustomSettingsData(component: MetadataComponent, data: Record<string, unknown>): DataProvisioningRecord;
|
|
55
|
+
/**
|
|
56
|
+
* @ac US-107-AC-4: Queue data operations between waves
|
|
57
|
+
* Create data provisioning wave
|
|
58
|
+
*/
|
|
59
|
+
createProvisioningWave(records: DataProvisioningRecord[], waveNumber: number): DataProvisioningWave;
|
|
60
|
+
/**
|
|
61
|
+
* @ac US-107-AC-5: Validate data exists before deploying dependent metadata
|
|
62
|
+
* Validate data exists
|
|
63
|
+
*/
|
|
64
|
+
validateDataExists(records: DataProvisioningRecord[], orgApi: {
|
|
65
|
+
query: (soql: string) => Promise<unknown[]>;
|
|
66
|
+
}): Promise<{
|
|
67
|
+
valid: boolean;
|
|
68
|
+
missing: string[];
|
|
69
|
+
}>;
|
|
70
|
+
/**
|
|
71
|
+
* Execute data provisioning
|
|
72
|
+
*/
|
|
73
|
+
executeProvisioning(wave: DataProvisioningWave, orgApi: {
|
|
74
|
+
create: (type: string, records: unknown[]) => Promise<unknown[]>;
|
|
75
|
+
}): Promise<ProvisioningResult>;
|
|
76
|
+
/**
|
|
77
|
+
* Create Custom Metadata record
|
|
78
|
+
*/
|
|
79
|
+
private createCustomMetadataRecord;
|
|
80
|
+
/**
|
|
81
|
+
* Create Custom Settings data
|
|
82
|
+
*/
|
|
83
|
+
private createCustomSettingsData;
|
|
84
|
+
/**
|
|
85
|
+
* Format provisioning report
|
|
86
|
+
*/
|
|
87
|
+
formatReport(result: ProvisioningResult): string;
|
|
88
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data Provisioner - US-107
|
|
3
|
+
* Handles data provisioning between deployment waves
|
|
4
|
+
*
|
|
5
|
+
* @ac US-107-AC-1: Detect when data provisioning is needed
|
|
6
|
+
* @ac US-107-AC-2: Support Custom Metadata Type record creation
|
|
7
|
+
* @ac US-107-AC-3: Handle Custom Settings data
|
|
8
|
+
* @ac US-107-AC-4: Queue data operations between waves
|
|
9
|
+
* @ac US-107-AC-5: Validate data exists before deploying dependent metadata
|
|
10
|
+
* @issue #107
|
|
11
|
+
*/
|
|
12
|
+
import { promises as fs } from 'node:fs';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
import { getLogger } from '../utils/logger.js';
|
|
15
|
+
const logger = getLogger('DataProvisioner');
|
|
16
|
+
/**
|
|
17
|
+
* @ac US-107-AC-1: Detect when data provisioning is needed
|
|
18
|
+
*/
|
|
19
|
+
export class DataProvisioner {
|
|
20
|
+
/**
|
|
21
|
+
* @ac US-107-AC-1: Detect when data provisioning is needed
|
|
22
|
+
* Detect data provisioning requirements from metadata
|
|
23
|
+
*/
|
|
24
|
+
detectProvisioningNeeds(components) {
|
|
25
|
+
logger.info('Detecting data provisioning needs', { componentCount: components.length });
|
|
26
|
+
const records = [];
|
|
27
|
+
for (const component of components) {
|
|
28
|
+
// Detect Custom Metadata records
|
|
29
|
+
if (component.filePath?.endsWith('.md-meta.xml')) {
|
|
30
|
+
records.push({
|
|
31
|
+
type: 'CustomMetadata',
|
|
32
|
+
name: component.name,
|
|
33
|
+
filePath: component.filePath,
|
|
34
|
+
metadata: {},
|
|
35
|
+
dependsOn: [],
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
// Detect Custom Settings (via metadata type)
|
|
39
|
+
if (component.type === 'CustomSetting') {
|
|
40
|
+
records.push({
|
|
41
|
+
type: 'CustomSettings',
|
|
42
|
+
name: component.name,
|
|
43
|
+
filePath: component.filePath ?? '',
|
|
44
|
+
metadata: {},
|
|
45
|
+
dependsOn: [],
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Detect Record Types
|
|
49
|
+
if (component.type === 'RecordType') {
|
|
50
|
+
records.push({
|
|
51
|
+
type: 'RecordType',
|
|
52
|
+
name: component.name,
|
|
53
|
+
filePath: component.filePath ?? '',
|
|
54
|
+
metadata: {},
|
|
55
|
+
dependsOn: [component.dependencies.values().next().value ?? ''],
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
logger.info('Data provisioning needs detected', {
|
|
60
|
+
recordCount: records.length,
|
|
61
|
+
types: [...new Set(records.map((r) => r.type))],
|
|
62
|
+
});
|
|
63
|
+
return records;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @ac US-107-AC-2: Support Custom Metadata Type record creation
|
|
67
|
+
* Parse Custom Metadata records
|
|
68
|
+
*/
|
|
69
|
+
async parseCustomMetadataRecord(filePath) {
|
|
70
|
+
logger.debug('Parsing Custom Metadata record', { filePath });
|
|
71
|
+
try {
|
|
72
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
73
|
+
const name = path.basename(filePath, '.md-meta.xml');
|
|
74
|
+
// Extract metadata from XML (simplified)
|
|
75
|
+
const metadata = {};
|
|
76
|
+
const labelMatch = content.match(/<label>([^<]+)<\/label>/);
|
|
77
|
+
if (labelMatch) {
|
|
78
|
+
metadata.label = labelMatch[1];
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
type: 'CustomMetadata',
|
|
82
|
+
name,
|
|
83
|
+
filePath,
|
|
84
|
+
metadata,
|
|
85
|
+
dependsOn: [],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
logger.error('Failed to parse Custom Metadata record', {
|
|
90
|
+
filePath,
|
|
91
|
+
error: error instanceof Error ? error.message : String(error),
|
|
92
|
+
});
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* @ac US-107-AC-3: Handle Custom Settings data
|
|
98
|
+
* Prepare Custom Settings data for provisioning
|
|
99
|
+
*/
|
|
100
|
+
prepareCustomSettingsData(component, data) {
|
|
101
|
+
return {
|
|
102
|
+
type: 'CustomSettings',
|
|
103
|
+
name: component.name,
|
|
104
|
+
filePath: component.filePath ?? '',
|
|
105
|
+
metadata: data,
|
|
106
|
+
dependsOn: [],
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* @ac US-107-AC-4: Queue data operations between waves
|
|
111
|
+
* Create data provisioning wave
|
|
112
|
+
*/
|
|
113
|
+
createProvisioningWave(records, waveNumber) {
|
|
114
|
+
logger.info('Creating data provisioning wave', {
|
|
115
|
+
waveNumber,
|
|
116
|
+
recordCount: records.length,
|
|
117
|
+
});
|
|
118
|
+
// Calculate dependencies
|
|
119
|
+
const dependencies = new Set();
|
|
120
|
+
for (const record of records) {
|
|
121
|
+
for (const dep of record.dependsOn) {
|
|
122
|
+
dependencies.add(dep);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Estimate time (rough: 1 second per record)
|
|
126
|
+
const estimatedTime = records.length * 1000;
|
|
127
|
+
return {
|
|
128
|
+
waveNumber,
|
|
129
|
+
records,
|
|
130
|
+
estimatedTime,
|
|
131
|
+
dependencies: Array.from(dependencies),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* @ac US-107-AC-5: Validate data exists before deploying dependent metadata
|
|
136
|
+
* Validate data exists
|
|
137
|
+
*/
|
|
138
|
+
async validateDataExists(records, orgApi) {
|
|
139
|
+
logger.info('Validating data exists', { recordCount: records.length });
|
|
140
|
+
const validationResults = await Promise.all(records.map(async (record) => {
|
|
141
|
+
try {
|
|
142
|
+
if (record.type !== 'CustomMetadata') {
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
const developerName = record.name.split('.').pop() ?? '';
|
|
146
|
+
const metadataTypeName = record.name.split('.').slice(0, -1).join('.');
|
|
147
|
+
const soql = `SELECT Id FROM ${metadataTypeName}__mdt WHERE DeveloperName = '${developerName}'`;
|
|
148
|
+
const results = await orgApi.query(soql);
|
|
149
|
+
return results.length === 0 ? record.name : undefined;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
logger.warn('Failed to validate data existence', {
|
|
153
|
+
record: record.name,
|
|
154
|
+
error: error instanceof Error ? error.message : String(error),
|
|
155
|
+
});
|
|
156
|
+
return record.name;
|
|
157
|
+
}
|
|
158
|
+
}));
|
|
159
|
+
const missing = validationResults.filter((recordName) => recordName !== undefined);
|
|
160
|
+
const valid = missing.length === 0;
|
|
161
|
+
logger.info('Data validation complete', {
|
|
162
|
+
valid,
|
|
163
|
+
missingCount: missing.length,
|
|
164
|
+
});
|
|
165
|
+
return { valid, missing };
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Execute data provisioning
|
|
169
|
+
*/
|
|
170
|
+
executeProvisioning(wave, orgApi) {
|
|
171
|
+
const startTime = Date.now();
|
|
172
|
+
logger.info('Executing data provisioning', {
|
|
173
|
+
waveNumber: wave.waveNumber,
|
|
174
|
+
recordCount: wave.records.length,
|
|
175
|
+
});
|
|
176
|
+
const errors = [];
|
|
177
|
+
let recordsCreated = 0;
|
|
178
|
+
let recordsFailed = 0;
|
|
179
|
+
for (const record of wave.records) {
|
|
180
|
+
try {
|
|
181
|
+
if (record.type === 'CustomMetadata') {
|
|
182
|
+
// Create Custom Metadata record via Metadata API
|
|
183
|
+
this.createCustomMetadataRecord(record, orgApi);
|
|
184
|
+
recordsCreated++;
|
|
185
|
+
}
|
|
186
|
+
else if (record.type === 'CustomSettings') {
|
|
187
|
+
// Create Custom Settings data
|
|
188
|
+
this.createCustomSettingsData(record, orgApi);
|
|
189
|
+
recordsCreated++;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
recordsFailed++;
|
|
194
|
+
errors.push({
|
|
195
|
+
record: record.name,
|
|
196
|
+
error: error instanceof Error ? error.message : String(error),
|
|
197
|
+
});
|
|
198
|
+
logger.error('Failed to provision data record', {
|
|
199
|
+
record: record.name,
|
|
200
|
+
error: error instanceof Error ? error.message : String(error),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const executionTime = Date.now() - startTime;
|
|
205
|
+
logger.info('Data provisioning complete', {
|
|
206
|
+
waveNumber: wave.waveNumber,
|
|
207
|
+
recordsCreated,
|
|
208
|
+
recordsFailed,
|
|
209
|
+
executionTime,
|
|
210
|
+
});
|
|
211
|
+
return Promise.resolve({
|
|
212
|
+
success: recordsFailed === 0,
|
|
213
|
+
recordsCreated,
|
|
214
|
+
recordsFailed,
|
|
215
|
+
errors,
|
|
216
|
+
executionTime,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Create Custom Metadata record
|
|
221
|
+
*/
|
|
222
|
+
createCustomMetadataRecord(record, orgApi) {
|
|
223
|
+
void orgApi;
|
|
224
|
+
// This would use Metadata API to create CMT record
|
|
225
|
+
// Simplified for now
|
|
226
|
+
logger.debug('Creating Custom Metadata record', { name: record.name });
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Create Custom Settings data
|
|
230
|
+
*/
|
|
231
|
+
createCustomSettingsData(record, orgApi) {
|
|
232
|
+
void orgApi;
|
|
233
|
+
// This would use SOAP/REST API to create Custom Settings data
|
|
234
|
+
logger.debug('Creating Custom Settings data', { name: record.name });
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Format provisioning report
|
|
238
|
+
*/
|
|
239
|
+
formatReport(result) {
|
|
240
|
+
const lines = [];
|
|
241
|
+
lines.push('📦 Data Provisioning Report');
|
|
242
|
+
lines.push('═══════════════════════════════════════');
|
|
243
|
+
lines.push(`Status: ${result.success ? '✅ SUCCESS' : '❌ FAILED'}`);
|
|
244
|
+
lines.push(`Records Created: ${result.recordsCreated}`);
|
|
245
|
+
lines.push(`Records Failed: ${result.recordsFailed}`);
|
|
246
|
+
lines.push(`Execution Time: ${result.executionTime}ms`);
|
|
247
|
+
lines.push('');
|
|
248
|
+
if (result.errors.length > 0) {
|
|
249
|
+
lines.push('❌ Errors:');
|
|
250
|
+
for (const error of result.errors) {
|
|
251
|
+
lines.push(` • ${error.record}: ${error.error}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return lines.join('\n');
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=data-provisioner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-provisioner.js","sourceRoot":"","sources":["../../src/provisioning/data-provisioner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Structure Scanner - US-081
|
|
3
|
+
* Support non-standard SFDX project structures
|
|
4
|
+
*
|
|
5
|
+
* @ac US-081-AC-1: Detect custom package directories
|
|
6
|
+
* @ac US-081-AC-2: Support custom naming conventions
|
|
7
|
+
* @ac US-081-AC-3: Handle nested structures
|
|
8
|
+
* @ac US-081-AC-4: Support legacy structures
|
|
9
|
+
* @ac US-081-AC-5: Validate custom paths
|
|
10
|
+
* @ac US-081-AC-6: Generate structure report
|
|
11
|
+
* @issue #81
|
|
12
|
+
*/
|
|
13
|
+
export type CustomStructure = {
|
|
14
|
+
packageDirs: string[];
|
|
15
|
+
namingConvention: 'standard' | 'custom';
|
|
16
|
+
isNested: boolean;
|
|
17
|
+
isLegacy: boolean;
|
|
18
|
+
customPaths: Record<string, string>;
|
|
19
|
+
};
|
|
20
|
+
export type StructureReport = {
|
|
21
|
+
structure: CustomStructure;
|
|
22
|
+
warnings: string[];
|
|
23
|
+
recommendations: string[];
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* @ac US-081-AC-1: Detect custom package directories
|
|
27
|
+
*/
|
|
28
|
+
export declare class CustomStructureScanner {
|
|
29
|
+
/**
|
|
30
|
+
* @ac US-081-AC-1: Detect custom package directories
|
|
31
|
+
* Scan for custom package directories
|
|
32
|
+
*/
|
|
33
|
+
detectCustomPackageDirs(projectRoot: string): Promise<string[]>;
|
|
34
|
+
/**
|
|
35
|
+
* @ac US-081-AC-2: Support custom naming conventions
|
|
36
|
+
* Detect naming convention
|
|
37
|
+
*/
|
|
38
|
+
detectNamingConvention(directories: string[]): 'standard' | 'custom';
|
|
39
|
+
/**
|
|
40
|
+
* @ac US-081-AC-3: Handle nested structures
|
|
41
|
+
* Check if structure is nested
|
|
42
|
+
*/
|
|
43
|
+
isNestedStructure(projectRoot: string, packageDirs: string[]): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* @ac US-081-AC-4: Support legacy structures
|
|
46
|
+
* Detect legacy structure (Metadata API format)
|
|
47
|
+
*/
|
|
48
|
+
isLegacyStructure(projectRoot: string): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* @ac US-081-AC-5: Validate custom paths
|
|
51
|
+
* Validate custom paths exist and are accessible
|
|
52
|
+
*/
|
|
53
|
+
validateCustomPaths(projectRoot: string, customPaths: Record<string, string>): Promise<{
|
|
54
|
+
valid: boolean;
|
|
55
|
+
errors: string[];
|
|
56
|
+
}>;
|
|
57
|
+
/**
|
|
58
|
+
* @ac US-081-AC-6: Generate structure report
|
|
59
|
+
* Scan and generate comprehensive structure report
|
|
60
|
+
*/
|
|
61
|
+
scanStructure(projectRoot: string): Promise<StructureReport>;
|
|
62
|
+
/**
|
|
63
|
+
* Format structure report
|
|
64
|
+
*/
|
|
65
|
+
formatReport(report: StructureReport): string;
|
|
66
|
+
}
|