@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,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Set Parser
|
|
3
|
+
* Parses Salesforce Permission Set metadata files (.permissionset-meta.xml)
|
|
4
|
+
*
|
|
5
|
+
* @ac AC-1: Parse permission set metadata files
|
|
6
|
+
* @ac AC-2: Extract object permissions (CRUD + modify/view all)
|
|
7
|
+
* @ac AC-3: Extract field-level security (FLS) permissions
|
|
8
|
+
* @ac AC-4: Extract Apex class access permissions
|
|
9
|
+
* @ac AC-5: Extract Visualforce page access permissions
|
|
10
|
+
* @ac AC-6: Extract custom permission references
|
|
11
|
+
* @ac AC-7: Extract application visibility settings
|
|
12
|
+
* @ac AC-8: Extract tab visibility settings
|
|
13
|
+
* @ac AC-9: Identify all dependent metadata types
|
|
14
|
+
*
|
|
15
|
+
* @issue #22
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Result of parsing a Permission Set file
|
|
19
|
+
*/
|
|
20
|
+
export type PermissionSetParseResult = {
|
|
21
|
+
/** Name of the permission set (from filename) */
|
|
22
|
+
name: string;
|
|
23
|
+
/** Permission set label */
|
|
24
|
+
label: string;
|
|
25
|
+
/** Description */
|
|
26
|
+
description?: string;
|
|
27
|
+
/** Whether activation is required */
|
|
28
|
+
hasActivationRequired?: boolean;
|
|
29
|
+
/** License type (e.g., 'Salesforce', 'SalesforcePlatform') */
|
|
30
|
+
license?: string;
|
|
31
|
+
/** Objects with permissions granted */
|
|
32
|
+
objectPermissions: string[];
|
|
33
|
+
/** Fields with FLS permissions granted */
|
|
34
|
+
fieldPermissions: string[];
|
|
35
|
+
/** Apex classes with access granted */
|
|
36
|
+
apexClassAccesses: string[];
|
|
37
|
+
/** Visualforce pages with access granted */
|
|
38
|
+
visualforcePageAccesses: string[];
|
|
39
|
+
/** Custom permissions granted */
|
|
40
|
+
customPermissions: string[];
|
|
41
|
+
/** Applications with visibility settings */
|
|
42
|
+
applicationVisibilities: string[];
|
|
43
|
+
/** Tabs with visibility settings */
|
|
44
|
+
tabSettings: string[];
|
|
45
|
+
/** Custom Metadata Types with access */
|
|
46
|
+
customMetadataTypeAccesses: string[];
|
|
47
|
+
/** Flows with access */
|
|
48
|
+
flowAccesses: string[];
|
|
49
|
+
/** External data sources with access */
|
|
50
|
+
externalDataSourceAccesses: string[];
|
|
51
|
+
/** Custom settings with access */
|
|
52
|
+
customSettingAccesses: string[];
|
|
53
|
+
/** User permissions granted */
|
|
54
|
+
userPermissions: string[];
|
|
55
|
+
/** All dependencies extracted from this permission set */
|
|
56
|
+
dependencies: {
|
|
57
|
+
objects: string[];
|
|
58
|
+
fields: string[];
|
|
59
|
+
apexClasses: string[];
|
|
60
|
+
visualforcePages: string[];
|
|
61
|
+
customPermissions: string[];
|
|
62
|
+
applications: string[];
|
|
63
|
+
tabs: string[];
|
|
64
|
+
customMetadataTypes: string[];
|
|
65
|
+
flows: string[];
|
|
66
|
+
externalDataSources: string[];
|
|
67
|
+
customSettings: string[];
|
|
68
|
+
recordTypes: string[];
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Parse a Permission Set metadata XML file
|
|
73
|
+
*
|
|
74
|
+
* @param filePath - Path to the .permissionset-meta.xml file
|
|
75
|
+
* @param permissionSetName - Name of the permission set (typically from filename)
|
|
76
|
+
* @returns Parsed permission set metadata with dependencies
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* const result = await parsePermissionSet(
|
|
80
|
+
* 'force-app/main/default/permissionsets/Sales_User.permissionset-meta.xml',
|
|
81
|
+
* 'Sales_User'
|
|
82
|
+
* );
|
|
83
|
+
* console.log(result.objectPermissions); // ['Account', 'Contact', 'Opportunity']
|
|
84
|
+
* console.log(result.dependencies.apexClasses); // ['AccountService', 'OpportunityHandler']
|
|
85
|
+
*/
|
|
86
|
+
export declare function parsePermissionSet(filePath: string, permissionSetName: string): Promise<PermissionSetParseResult>;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Set Parser
|
|
3
|
+
* Parses Salesforce Permission Set metadata files (.permissionset-meta.xml)
|
|
4
|
+
*
|
|
5
|
+
* @ac AC-1: Parse permission set metadata files
|
|
6
|
+
* @ac AC-2: Extract object permissions (CRUD + modify/view all)
|
|
7
|
+
* @ac AC-3: Extract field-level security (FLS) permissions
|
|
8
|
+
* @ac AC-4: Extract Apex class access permissions
|
|
9
|
+
* @ac AC-5: Extract Visualforce page access permissions
|
|
10
|
+
* @ac AC-6: Extract custom permission references
|
|
11
|
+
* @ac AC-7: Extract application visibility settings
|
|
12
|
+
* @ac AC-8: Extract tab visibility settings
|
|
13
|
+
* @ac AC-9: Identify all dependent metadata types
|
|
14
|
+
*
|
|
15
|
+
* @issue #22
|
|
16
|
+
*/
|
|
17
|
+
import { readFile } from 'node:fs/promises';
|
|
18
|
+
import { XMLParser } from 'fast-xml-parser';
|
|
19
|
+
/**
|
|
20
|
+
* Normalize value to array (handles XML parser returning single object vs array)
|
|
21
|
+
*/
|
|
22
|
+
function normalizeArray(value) {
|
|
23
|
+
if (!value)
|
|
24
|
+
return [];
|
|
25
|
+
return Array.isArray(value) ? value : [value];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Parse a Permission Set metadata XML file
|
|
29
|
+
*
|
|
30
|
+
* @param filePath - Path to the .permissionset-meta.xml file
|
|
31
|
+
* @param permissionSetName - Name of the permission set (typically from filename)
|
|
32
|
+
* @returns Parsed permission set metadata with dependencies
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* const result = await parsePermissionSet(
|
|
36
|
+
* 'force-app/main/default/permissionsets/Sales_User.permissionset-meta.xml',
|
|
37
|
+
* 'Sales_User'
|
|
38
|
+
* );
|
|
39
|
+
* console.log(result.objectPermissions); // ['Account', 'Contact', 'Opportunity']
|
|
40
|
+
* console.log(result.dependencies.apexClasses); // ['AccountService', 'OpportunityHandler']
|
|
41
|
+
*/
|
|
42
|
+
export async function parsePermissionSet(filePath, permissionSetName) {
|
|
43
|
+
// Read and parse XML
|
|
44
|
+
const xmlContent = await readFile(filePath, 'utf-8');
|
|
45
|
+
const parser = new XMLParser({
|
|
46
|
+
ignoreAttributes: false,
|
|
47
|
+
parseAttributeValue: true,
|
|
48
|
+
trimValues: true,
|
|
49
|
+
});
|
|
50
|
+
let parsed;
|
|
51
|
+
try {
|
|
52
|
+
parsed = parser.parse(xmlContent);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
throw new Error(`Failed to parse Permission Set XML at ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
56
|
+
}
|
|
57
|
+
// Type assertion with validation
|
|
58
|
+
const root = parsed;
|
|
59
|
+
if (!root.PermissionSet) {
|
|
60
|
+
throw new Error(`Invalid Permission Set XML structure at ${filePath}: missing PermissionSet root element`);
|
|
61
|
+
}
|
|
62
|
+
const metadata = root.PermissionSet;
|
|
63
|
+
// Normalize arrays
|
|
64
|
+
const objectPermissions = normalizeArray(metadata.objectPermissions);
|
|
65
|
+
const fieldPermissions = normalizeArray(metadata.fieldPermissions);
|
|
66
|
+
const classAccesses = normalizeArray(metadata.classAccesses);
|
|
67
|
+
const pageAccesses = normalizeArray(metadata.pageAccesses);
|
|
68
|
+
const customPermissions = normalizeArray(metadata.customPermissions);
|
|
69
|
+
const applicationVisibilities = normalizeArray(metadata.applicationVisibilities);
|
|
70
|
+
const tabSettings = normalizeArray(metadata.tabSettings);
|
|
71
|
+
const customMetadataTypeAccesses = normalizeArray(metadata.customMetadataTypeAccesses);
|
|
72
|
+
const flowAccesses = normalizeArray(metadata.flowAccesses);
|
|
73
|
+
const externalDataSourceAccesses = normalizeArray(metadata.externalDataSourceAccesses);
|
|
74
|
+
const customSettingAccesses = normalizeArray(metadata.customSettingAccesses);
|
|
75
|
+
const userPermissions = normalizeArray(metadata.userPermissions);
|
|
76
|
+
const recordTypeVisibilities = normalizeArray(metadata.recordTypeVisibilities);
|
|
77
|
+
// Extract object names
|
|
78
|
+
const objectNames = objectPermissions.map((perm) => perm.object);
|
|
79
|
+
// Extract field names (format: ObjectName.FieldName)
|
|
80
|
+
const fieldNames = fieldPermissions.map((perm) => perm.field);
|
|
81
|
+
// Extract Apex class names
|
|
82
|
+
const apexClassNames = classAccesses.map((access) => access.apexClass);
|
|
83
|
+
// Extract Visualforce page names
|
|
84
|
+
const visualforcePageNames = pageAccesses.map((access) => access.apexPage);
|
|
85
|
+
// Extract custom permission names
|
|
86
|
+
const customPermissionNames = customPermissions
|
|
87
|
+
.filter((perm) => perm.enabled)
|
|
88
|
+
.map((perm) => perm.name);
|
|
89
|
+
// Extract application names
|
|
90
|
+
const applicationNames = applicationVisibilities.map((app) => app.application);
|
|
91
|
+
// Extract tab names
|
|
92
|
+
const tabNames = tabSettings.map((tab) => tab.tab);
|
|
93
|
+
// Extract custom metadata type names
|
|
94
|
+
const customMetadataTypeNames = customMetadataTypeAccesses
|
|
95
|
+
.filter((access) => access.enabled)
|
|
96
|
+
.map((access) => access.name);
|
|
97
|
+
// Extract flow names
|
|
98
|
+
const flowNames = flowAccesses
|
|
99
|
+
.filter((access) => access.enabled)
|
|
100
|
+
.map((access) => access.flow);
|
|
101
|
+
// Extract external data source names
|
|
102
|
+
const externalDataSourceNames = externalDataSourceAccesses
|
|
103
|
+
.filter((access) => access.enabled)
|
|
104
|
+
.map((access) => access.externalDataSource);
|
|
105
|
+
// Extract custom setting names
|
|
106
|
+
const customSettingNames = customSettingAccesses
|
|
107
|
+
.filter((access) => access.enabled)
|
|
108
|
+
.map((access) => access.name);
|
|
109
|
+
// Extract user permission names
|
|
110
|
+
const userPermissionNames = userPermissions
|
|
111
|
+
.filter((perm) => perm.enabled)
|
|
112
|
+
.map((perm) => perm.name);
|
|
113
|
+
// Extract record type names
|
|
114
|
+
const recordTypeNames = recordTypeVisibilities
|
|
115
|
+
.filter((rt) => rt.visible)
|
|
116
|
+
.map((rt) => rt.recordType);
|
|
117
|
+
// Build result
|
|
118
|
+
return {
|
|
119
|
+
name: permissionSetName,
|
|
120
|
+
label: metadata.label,
|
|
121
|
+
description: metadata.description,
|
|
122
|
+
hasActivationRequired: metadata.hasActivationRequired,
|
|
123
|
+
license: metadata.license,
|
|
124
|
+
objectPermissions: objectNames,
|
|
125
|
+
fieldPermissions: fieldNames,
|
|
126
|
+
apexClassAccesses: apexClassNames,
|
|
127
|
+
visualforcePageAccesses: visualforcePageNames,
|
|
128
|
+
customPermissions: customPermissionNames,
|
|
129
|
+
applicationVisibilities: applicationNames,
|
|
130
|
+
tabSettings: tabNames,
|
|
131
|
+
customMetadataTypeAccesses: customMetadataTypeNames,
|
|
132
|
+
flowAccesses: flowNames,
|
|
133
|
+
externalDataSourceAccesses: externalDataSourceNames,
|
|
134
|
+
customSettingAccesses: customSettingNames,
|
|
135
|
+
userPermissions: userPermissionNames,
|
|
136
|
+
dependencies: {
|
|
137
|
+
objects: objectNames,
|
|
138
|
+
fields: fieldNames,
|
|
139
|
+
apexClasses: apexClassNames,
|
|
140
|
+
visualforcePages: visualforcePageNames,
|
|
141
|
+
customPermissions: customPermissionNames,
|
|
142
|
+
applications: applicationNames,
|
|
143
|
+
tabs: tabNames,
|
|
144
|
+
customMetadataTypes: customMetadataTypeNames,
|
|
145
|
+
flows: flowNames,
|
|
146
|
+
externalDataSources: externalDataSourceNames,
|
|
147
|
+
customSettings: customSettingNames,
|
|
148
|
+
recordTypes: recordTypeNames,
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=permission-set-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-set-parser.js","sourceRoot":"","sources":["../../src/parsers/permission-set-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profile Parser
|
|
3
|
+
* Parses Salesforce Profile metadata files (.profile-meta.xml)
|
|
4
|
+
*
|
|
5
|
+
* @ac US-020-AC-1: Extract object permissions (CRUD + modify/view all)
|
|
6
|
+
* @ac US-020-AC-2: Extract field-level security (FLS) permissions
|
|
7
|
+
* @ac US-020-AC-3: Extract Apex class access permissions
|
|
8
|
+
* @ac US-020-AC-4: Extract page layout assignments
|
|
9
|
+
* @ac US-020-AC-5: Extract record type visibility
|
|
10
|
+
* @ac US-020-AC-6: Extract application assignments
|
|
11
|
+
* @ac US-020-AC-7: Link to all dependent metadata
|
|
12
|
+
*
|
|
13
|
+
* @issue #20
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Result of parsing a Profile file
|
|
17
|
+
*/
|
|
18
|
+
export type ProfileParseResult = {
|
|
19
|
+
/** Name of the profile (from filename) */
|
|
20
|
+
name: string;
|
|
21
|
+
/** Whether this is a custom profile */
|
|
22
|
+
custom: boolean;
|
|
23
|
+
/** Description */
|
|
24
|
+
description?: string;
|
|
25
|
+
/** User license */
|
|
26
|
+
userLicense?: string;
|
|
27
|
+
/** Objects with permissions granted */
|
|
28
|
+
objectPermissions: string[];
|
|
29
|
+
/** Fields with FLS permissions granted */
|
|
30
|
+
fieldPermissions: string[];
|
|
31
|
+
/** Apex classes with access granted */
|
|
32
|
+
apexClassAccesses: string[];
|
|
33
|
+
/** Visualforce pages with access granted */
|
|
34
|
+
visualforcePageAccesses: string[];
|
|
35
|
+
/** Page layout assignments */
|
|
36
|
+
layoutAssignments: string[];
|
|
37
|
+
/** Record types with visibility */
|
|
38
|
+
recordTypeVisibilities: string[];
|
|
39
|
+
/** Applications assigned */
|
|
40
|
+
applicationVisibilities: string[];
|
|
41
|
+
/** Tabs with visibility settings */
|
|
42
|
+
tabVisibilities: string[];
|
|
43
|
+
/** Custom permissions granted */
|
|
44
|
+
customPermissions: string[];
|
|
45
|
+
/** Custom Metadata Types with access */
|
|
46
|
+
customMetadataTypeAccesses: string[];
|
|
47
|
+
/** Flows with access */
|
|
48
|
+
flowAccesses: string[];
|
|
49
|
+
/** User permissions granted */
|
|
50
|
+
userPermissions: string[];
|
|
51
|
+
/** All dependencies extracted from this profile */
|
|
52
|
+
dependencies: {
|
|
53
|
+
objects: string[];
|
|
54
|
+
fields: string[];
|
|
55
|
+
apexClasses: string[];
|
|
56
|
+
visualforcePages: string[];
|
|
57
|
+
layouts: string[];
|
|
58
|
+
recordTypes: string[];
|
|
59
|
+
applications: string[];
|
|
60
|
+
tabs: string[];
|
|
61
|
+
customPermissions: string[];
|
|
62
|
+
customMetadataTypes: string[];
|
|
63
|
+
flows: string[];
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Parse a Profile metadata XML file
|
|
68
|
+
*
|
|
69
|
+
* @param filePath - Path to the .profile-meta.xml file
|
|
70
|
+
* @param profileName - Name of the profile (typically from filename)
|
|
71
|
+
* @returns Parsed profile metadata with dependencies
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* const result = await parseProfile(
|
|
75
|
+
* 'force-app/main/default/profiles/Admin.profile-meta.xml',
|
|
76
|
+
* 'Admin'
|
|
77
|
+
* );
|
|
78
|
+
* console.log(result.objectPermissions); // ['Account', 'Contact', 'Opportunity']
|
|
79
|
+
* console.log(result.dependencies.apexClasses); // ['AccountService', 'OpportunityHandler']
|
|
80
|
+
*/
|
|
81
|
+
export declare function parseProfile(filePath: string, profileName: string): Promise<ProfileParseResult>;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profile Parser
|
|
3
|
+
* Parses Salesforce Profile metadata files (.profile-meta.xml)
|
|
4
|
+
*
|
|
5
|
+
* @ac US-020-AC-1: Extract object permissions (CRUD + modify/view all)
|
|
6
|
+
* @ac US-020-AC-2: Extract field-level security (FLS) permissions
|
|
7
|
+
* @ac US-020-AC-3: Extract Apex class access permissions
|
|
8
|
+
* @ac US-020-AC-4: Extract page layout assignments
|
|
9
|
+
* @ac US-020-AC-5: Extract record type visibility
|
|
10
|
+
* @ac US-020-AC-6: Extract application assignments
|
|
11
|
+
* @ac US-020-AC-7: Link to all dependent metadata
|
|
12
|
+
*
|
|
13
|
+
* @issue #20
|
|
14
|
+
*/
|
|
15
|
+
import { readFile } from 'node:fs/promises';
|
|
16
|
+
import { XMLParser } from 'fast-xml-parser';
|
|
17
|
+
/**
|
|
18
|
+
* Normalize value to array (handles XML parser returning single object vs array)
|
|
19
|
+
*/
|
|
20
|
+
function normalizeArray(value) {
|
|
21
|
+
if (!value)
|
|
22
|
+
return [];
|
|
23
|
+
return Array.isArray(value) ? value : [value];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse a Profile metadata XML file
|
|
27
|
+
*
|
|
28
|
+
* @param filePath - Path to the .profile-meta.xml file
|
|
29
|
+
* @param profileName - Name of the profile (typically from filename)
|
|
30
|
+
* @returns Parsed profile metadata with dependencies
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* const result = await parseProfile(
|
|
34
|
+
* 'force-app/main/default/profiles/Admin.profile-meta.xml',
|
|
35
|
+
* 'Admin'
|
|
36
|
+
* );
|
|
37
|
+
* console.log(result.objectPermissions); // ['Account', 'Contact', 'Opportunity']
|
|
38
|
+
* console.log(result.dependencies.apexClasses); // ['AccountService', 'OpportunityHandler']
|
|
39
|
+
*/
|
|
40
|
+
export async function parseProfile(filePath, profileName) {
|
|
41
|
+
// Read and parse XML
|
|
42
|
+
const xmlContent = await readFile(filePath, 'utf-8');
|
|
43
|
+
const parser = new XMLParser({
|
|
44
|
+
ignoreAttributes: false,
|
|
45
|
+
parseAttributeValue: true,
|
|
46
|
+
trimValues: true,
|
|
47
|
+
});
|
|
48
|
+
let parsed;
|
|
49
|
+
try {
|
|
50
|
+
parsed = parser.parse(xmlContent);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
throw new Error(`Failed to parse Profile XML at ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
54
|
+
}
|
|
55
|
+
// Type assertion with validation
|
|
56
|
+
const root = parsed;
|
|
57
|
+
if (!root.Profile) {
|
|
58
|
+
throw new Error(`Invalid Profile XML structure at ${filePath}: missing Profile root element`);
|
|
59
|
+
}
|
|
60
|
+
const metadata = root.Profile;
|
|
61
|
+
// Normalize arrays
|
|
62
|
+
const objectPermissions = normalizeArray(metadata.objectPermissions);
|
|
63
|
+
const fieldPermissions = normalizeArray(metadata.fieldPermissions);
|
|
64
|
+
const classAccesses = normalizeArray(metadata.classAccesses);
|
|
65
|
+
const pageAccesses = normalizeArray(metadata.pageAccesses);
|
|
66
|
+
const layoutAssignments = normalizeArray(metadata.layoutAssignments);
|
|
67
|
+
const recordTypeVisibilities = normalizeArray(metadata.recordTypeVisibilities);
|
|
68
|
+
const applicationVisibilities = normalizeArray(metadata.applicationVisibilities);
|
|
69
|
+
const tabVisibilities = normalizeArray(metadata.tabVisibilities);
|
|
70
|
+
const customPermissions = normalizeArray(metadata.customPermissions);
|
|
71
|
+
const customMetadataTypeAccesses = normalizeArray(metadata.customMetadataTypeAccesses);
|
|
72
|
+
const flowAccesses = normalizeArray(metadata.flowAccesses);
|
|
73
|
+
const userPermissions = normalizeArray(metadata.userPermissions);
|
|
74
|
+
// Extract object names
|
|
75
|
+
const objectNames = objectPermissions.map((perm) => perm.object);
|
|
76
|
+
// Extract field names (format: ObjectName.FieldName)
|
|
77
|
+
const fieldNames = fieldPermissions.map((perm) => perm.field);
|
|
78
|
+
// Extract Apex class names
|
|
79
|
+
const apexClassNames = classAccesses.map((access) => access.apexClass);
|
|
80
|
+
// Extract Visualforce page names
|
|
81
|
+
const visualforcePageNames = pageAccesses.map((access) => access.apexPage);
|
|
82
|
+
// Extract layout names
|
|
83
|
+
const layoutNames = layoutAssignments.map((assignment) => assignment.layout);
|
|
84
|
+
// Extract record type names
|
|
85
|
+
const recordTypeNames = recordTypeVisibilities
|
|
86
|
+
.filter((rt) => rt.visible)
|
|
87
|
+
.map((rt) => rt.recordType);
|
|
88
|
+
// Extract application names
|
|
89
|
+
const applicationNames = applicationVisibilities.map((app) => app.application);
|
|
90
|
+
// Extract tab names
|
|
91
|
+
const tabNames = tabVisibilities.map((tab) => tab.tab);
|
|
92
|
+
// Extract custom permission names
|
|
93
|
+
const customPermissionNames = customPermissions
|
|
94
|
+
.filter((perm) => perm.enabled)
|
|
95
|
+
.map((perm) => perm.name);
|
|
96
|
+
// Extract custom metadata type names
|
|
97
|
+
const customMetadataTypeNames = customMetadataTypeAccesses
|
|
98
|
+
.filter((access) => access.enabled)
|
|
99
|
+
.map((access) => access.name);
|
|
100
|
+
// Extract flow names
|
|
101
|
+
const flowNames = flowAccesses
|
|
102
|
+
.filter((access) => access.enabled)
|
|
103
|
+
.map((access) => access.flow);
|
|
104
|
+
// Extract user permission names
|
|
105
|
+
const userPermissionNames = userPermissions
|
|
106
|
+
.filter((perm) => perm.enabled)
|
|
107
|
+
.map((perm) => perm.name);
|
|
108
|
+
// Build result
|
|
109
|
+
return {
|
|
110
|
+
name: profileName,
|
|
111
|
+
custom: metadata.custom ?? false,
|
|
112
|
+
description: metadata.description,
|
|
113
|
+
userLicense: metadata.userLicense,
|
|
114
|
+
objectPermissions: objectNames,
|
|
115
|
+
fieldPermissions: fieldNames,
|
|
116
|
+
apexClassAccesses: apexClassNames,
|
|
117
|
+
visualforcePageAccesses: visualforcePageNames,
|
|
118
|
+
layoutAssignments: layoutNames,
|
|
119
|
+
recordTypeVisibilities: recordTypeNames,
|
|
120
|
+
applicationVisibilities: applicationNames,
|
|
121
|
+
tabVisibilities: tabNames,
|
|
122
|
+
customPermissions: customPermissionNames,
|
|
123
|
+
customMetadataTypeAccesses: customMetadataTypeNames,
|
|
124
|
+
flowAccesses: flowNames,
|
|
125
|
+
userPermissions: userPermissionNames,
|
|
126
|
+
dependencies: {
|
|
127
|
+
objects: objectNames,
|
|
128
|
+
fields: fieldNames,
|
|
129
|
+
apexClasses: apexClassNames,
|
|
130
|
+
visualforcePages: visualforcePageNames,
|
|
131
|
+
layouts: layoutNames,
|
|
132
|
+
recordTypes: recordTypeNames,
|
|
133
|
+
applications: applicationNames,
|
|
134
|
+
tabs: tabNames,
|
|
135
|
+
customPermissions: customPermissionNames,
|
|
136
|
+
customMetadataTypes: customMetadataTypeNames,
|
|
137
|
+
flows: flowNames,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=profile-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-parser.js","sourceRoot":"","sources":["../../src/parsers/profile-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Visualforce dependency types
|
|
3
|
+
*/
|
|
4
|
+
export type VisualforceDependencyType = 'apex_controller' | 'apex_extension' | 'vf_component' | 'standard_controller' | 'custom_component';
|
|
5
|
+
/**
|
|
6
|
+
* Represents a dependency found in a Visualforce page/component
|
|
7
|
+
*/
|
|
8
|
+
export type VisualforceDependency = {
|
|
9
|
+
type: VisualforceDependencyType;
|
|
10
|
+
name: string;
|
|
11
|
+
namespace?: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Result of parsing a Visualforce page/component
|
|
15
|
+
*/
|
|
16
|
+
export type VisualforceParseResult = {
|
|
17
|
+
name: string;
|
|
18
|
+
type: 'page' | 'component';
|
|
19
|
+
apexController?: string;
|
|
20
|
+
apexExtensions: string[];
|
|
21
|
+
standardController?: string;
|
|
22
|
+
recordSetVar?: string;
|
|
23
|
+
components: string[];
|
|
24
|
+
dependencies: VisualforceDependency[];
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Parse a Visualforce page or component and extract dependencies
|
|
28
|
+
*
|
|
29
|
+
* @param fileName - Name of the Visualforce file (with extension)
|
|
30
|
+
* @param vfContent - Content of the Visualforce file
|
|
31
|
+
* @returns VisualforceParseResult with all extracted dependencies
|
|
32
|
+
*
|
|
33
|
+
* @throws {ParsingError} If the file cannot be parsed or has invalid extension
|
|
34
|
+
*
|
|
35
|
+
* @ac US-018-AC-5: Parse both pages and components
|
|
36
|
+
* @ac US-018-AC-6: Validate file extension (.page or .component)
|
|
37
|
+
* @ac US-018-AC-7: Handle namespace prefixes in controllers and components
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* const result = parseVisualforce('MyPage.page', vfContent);
|
|
42
|
+
* console.log(result.apexController); // 'MyController'
|
|
43
|
+
* console.log(result.components); // ['c:MyComponent']
|
|
44
|
+
* console.log(result.standardController); // 'Account'
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function parseVisualforce(fileName: string, vfContent: string): VisualforceParseResult;
|