@jwikman/bc-code-intelligence-mcp 1.5.7-dev.1
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/LICENSE +21 -0
- package/README.md +165 -0
- package/dist/cache/cache-manager.d.ts +95 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +328 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/cli/bc-code-intel-cli.d.ts +9 -0
- package/dist/cli/bc-code-intel-cli.d.ts.map +1 -0
- package/dist/cli/bc-code-intel-cli.js +440 -0
- package/dist/cli/bc-code-intel-cli.js.map +1 -0
- package/dist/config/config-loader.d.ts +28 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +497 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-validator.d.ts +84 -0
- package/dist/config/config-validator.d.ts.map +1 -0
- package/dist/config/config-validator.js +608 -0
- package/dist/config/config-validator.js.map +1 -0
- package/dist/config/test-config-loader.d.ts +10 -0
- package/dist/config/test-config-loader.d.ts.map +1 -0
- package/dist/config/test-config-loader.js +135 -0
- package/dist/config/test-config-loader.js.map +1 -0
- package/dist/config/test-enhanced-layer-service.d.ts +7 -0
- package/dist/config/test-enhanced-layer-service.d.ts.map +1 -0
- package/dist/config/test-enhanced-layer-service.js +104 -0
- package/dist/config/test-enhanced-layer-service.js.map +1 -0
- package/dist/config/test-git-layer.d.ts +7 -0
- package/dist/config/test-git-layer.d.ts.map +1 -0
- package/dist/config/test-git-layer.js +68 -0
- package/dist/config/test-git-layer.js.map +1 -0
- package/dist/dev/hot-reload.d.ts +91 -0
- package/dist/dev/hot-reload.d.ts.map +1 -0
- package/dist/dev/hot-reload.js +358 -0
- package/dist/dev/hot-reload.js.map +1 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1211 -0
- package/dist/index.js.map +1 -0
- package/dist/layers/base-layer.d.ts +133 -0
- package/dist/layers/base-layer.d.ts.map +1 -0
- package/dist/layers/base-layer.js +290 -0
- package/dist/layers/base-layer.js.map +1 -0
- package/dist/layers/embedded-layer.d.ts +130 -0
- package/dist/layers/embedded-layer.d.ts.map +1 -0
- package/dist/layers/embedded-layer.js +612 -0
- package/dist/layers/embedded-layer.js.map +1 -0
- package/dist/layers/git-layer.d.ts +77 -0
- package/dist/layers/git-layer.d.ts.map +1 -0
- package/dist/layers/git-layer.js +529 -0
- package/dist/layers/git-layer.js.map +1 -0
- package/dist/layers/index.d.ts +12 -0
- package/dist/layers/index.d.ts.map +1 -0
- package/dist/layers/index.js +11 -0
- package/dist/layers/index.js.map +1 -0
- package/dist/layers/layer-service.d.ts +135 -0
- package/dist/layers/layer-service.d.ts.map +1 -0
- package/dist/layers/layer-service.js +586 -0
- package/dist/layers/layer-service.js.map +1 -0
- package/dist/layers/project-layer.d.ts +58 -0
- package/dist/layers/project-layer.d.ts.map +1 -0
- package/dist/layers/project-layer.js +286 -0
- package/dist/layers/project-layer.js.map +1 -0
- package/dist/monitoring/production-monitor.d.ts +148 -0
- package/dist/monitoring/production-monitor.d.ts.map +1 -0
- package/dist/monitoring/production-monitor.js +463 -0
- package/dist/monitoring/production-monitor.js.map +1 -0
- package/dist/performance/performance-monitor.d.ts +99 -0
- package/dist/performance/performance-monitor.d.ts.map +1 -0
- package/dist/performance/performance-monitor.js +253 -0
- package/dist/performance/performance-monitor.js.map +1 -0
- package/dist/sdk/bc-code-intel-client.d.ts +175 -0
- package/dist/sdk/bc-code-intel-client.d.ts.map +1 -0
- package/dist/sdk/bc-code-intel-client.js +380 -0
- package/dist/sdk/bc-code-intel-client.js.map +1 -0
- package/dist/search/intelligent-search.d.ts +97 -0
- package/dist/search/intelligent-search.d.ts.map +1 -0
- package/dist/search/intelligent-search.js +358 -0
- package/dist/search/intelligent-search.js.map +1 -0
- package/dist/security/access-control.d.ts +110 -0
- package/dist/security/access-control.d.ts.map +1 -0
- package/dist/security/access-control.js +353 -0
- package/dist/security/access-control.js.map +1 -0
- package/dist/services/code-analysis-service.d.ts +72 -0
- package/dist/services/code-analysis-service.d.ts.map +1 -0
- package/dist/services/code-analysis-service.js +818 -0
- package/dist/services/code-analysis-service.js.map +1 -0
- package/dist/services/enhanced-prompt-service.d.ts +56 -0
- package/dist/services/enhanced-prompt-service.d.ts.map +1 -0
- package/dist/services/enhanced-prompt-service.js +165 -0
- package/dist/services/enhanced-prompt-service.js.map +1 -0
- package/dist/services/knowledge-service.d.ts +90 -0
- package/dist/services/knowledge-service.d.ts.map +1 -0
- package/dist/services/knowledge-service.js +342 -0
- package/dist/services/knowledge-service.js.map +1 -0
- package/dist/services/methodology-service.d.ts +91 -0
- package/dist/services/methodology-service.d.ts.map +1 -0
- package/dist/services/methodology-service.js +423 -0
- package/dist/services/methodology-service.js.map +1 -0
- package/dist/services/multi-content-layer-service.d.ts +198 -0
- package/dist/services/multi-content-layer-service.d.ts.map +1 -0
- package/dist/services/multi-content-layer-service.js +991 -0
- package/dist/services/multi-content-layer-service.js.map +1 -0
- package/dist/services/roleplay-engine.d.ts +161 -0
- package/dist/services/roleplay-engine.d.ts.map +1 -0
- package/dist/services/roleplay-engine.js +994 -0
- package/dist/services/roleplay-engine.js.map +1 -0
- package/dist/services/session-storage/file-storage.d.ts +30 -0
- package/dist/services/session-storage/file-storage.d.ts.map +1 -0
- package/dist/services/session-storage/file-storage.js +229 -0
- package/dist/services/session-storage/file-storage.js.map +1 -0
- package/dist/services/session-storage/in-memory-storage.d.ts +31 -0
- package/dist/services/session-storage/in-memory-storage.d.ts.map +1 -0
- package/dist/services/session-storage/in-memory-storage.js +142 -0
- package/dist/services/session-storage/in-memory-storage.js.map +1 -0
- package/dist/services/specialist-discovery.d.ts +98 -0
- package/dist/services/specialist-discovery.d.ts.map +1 -0
- package/dist/services/specialist-discovery.js +387 -0
- package/dist/services/specialist-discovery.js.map +1 -0
- package/dist/services/specialist-loader.d.ts +101 -0
- package/dist/services/specialist-loader.d.ts.map +1 -0
- package/dist/services/specialist-loader.js +256 -0
- package/dist/services/specialist-loader.js.map +1 -0
- package/dist/services/specialist-session-manager.d.ts +76 -0
- package/dist/services/specialist-session-manager.d.ts.map +1 -0
- package/dist/services/specialist-session-manager.js +255 -0
- package/dist/services/specialist-session-manager.js.map +1 -0
- package/dist/services/workflow-service.d.ts +146 -0
- package/dist/services/workflow-service.d.ts.map +1 -0
- package/dist/services/workflow-service.js +409 -0
- package/dist/services/workflow-service.js.map +1 -0
- package/dist/setup/post-install.d.ts +12 -0
- package/dist/setup/post-install.d.ts.map +1 -0
- package/dist/setup/post-install.js +81 -0
- package/dist/setup/post-install.js.map +1 -0
- package/dist/streamlined-handlers.d.ts +94 -0
- package/dist/streamlined-handlers.d.ts.map +1 -0
- package/dist/streamlined-handlers.js +665 -0
- package/dist/streamlined-handlers.js.map +1 -0
- package/dist/test-enhanced-mcp-server.d.ts +7 -0
- package/dist/test-enhanced-mcp-server.d.ts.map +1 -0
- package/dist/test-enhanced-mcp-server.js +177 -0
- package/dist/test-enhanced-mcp-server.js.map +1 -0
- package/dist/tools/config-diagnostic-tools.d.ts +234 -0
- package/dist/tools/config-diagnostic-tools.d.ts.map +1 -0
- package/dist/tools/config-diagnostic-tools.js +887 -0
- package/dist/tools/config-diagnostic-tools.js.map +1 -0
- package/dist/tools/core-tools.d.ts +26 -0
- package/dist/tools/core-tools.d.ts.map +1 -0
- package/dist/tools/core-tools.js +241 -0
- package/dist/tools/core-tools.js.map +1 -0
- package/dist/tools/handoff-tools.d.ts +37 -0
- package/dist/tools/handoff-tools.d.ts.map +1 -0
- package/dist/tools/handoff-tools.js +265 -0
- package/dist/tools/handoff-tools.js.map +1 -0
- package/dist/tools/index.d.ts +61 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +75 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/onboarding-tools.d.ts +43 -0
- package/dist/tools/onboarding-tools.d.ts.map +1 -0
- package/dist/tools/onboarding-tools.js +353 -0
- package/dist/tools/onboarding-tools.js.map +1 -0
- package/dist/tools/specialist-discovery-tools.d.ts +27 -0
- package/dist/tools/specialist-discovery-tools.d.ts.map +1 -0
- package/dist/tools/specialist-discovery-tools.js +275 -0
- package/dist/tools/specialist-discovery-tools.js.map +1 -0
- package/dist/tools/specialist-tools.d.ts +43 -0
- package/dist/tools/specialist-tools.d.ts.map +1 -0
- package/dist/tools/specialist-tools.js +372 -0
- package/dist/tools/specialist-tools.js.map +1 -0
- package/dist/tools/workspace-tools.d.ts +96 -0
- package/dist/tools/workspace-tools.d.ts.map +1 -0
- package/dist/tools/workspace-tools.js +188 -0
- package/dist/tools/workspace-tools.js.map +1 -0
- package/dist/types/bc-knowledge.d.ts +303 -0
- package/dist/types/bc-knowledge.d.ts.map +1 -0
- package/dist/types/bc-knowledge.js +69 -0
- package/dist/types/bc-knowledge.js.map +1 -0
- package/dist/types/config-types.d.ts +186 -0
- package/dist/types/config-types.d.ts.map +1 -0
- package/dist/types/config-types.js +109 -0
- package/dist/types/config-types.js.map +1 -0
- package/dist/types/enhanced-layer-types.d.ts +193 -0
- package/dist/types/enhanced-layer-types.d.ts.map +1 -0
- package/dist/types/enhanced-layer-types.js +9 -0
- package/dist/types/enhanced-layer-types.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/layer-types.d.ts +173 -0
- package/dist/types/layer-types.d.ts.map +1 -0
- package/dist/types/layer-types.js +27 -0
- package/dist/types/layer-types.js.map +1 -0
- package/dist/types/roleplay-types.d.ts +156 -0
- package/dist/types/roleplay-types.d.ts.map +1 -0
- package/dist/types/roleplay-types.js +8 -0
- package/dist/types/roleplay-types.js.map +1 -0
- package/dist/types/session-types.d.ts +127 -0
- package/dist/types/session-types.d.ts.map +1 -0
- package/dist/types/session-types.js +8 -0
- package/dist/types/session-types.js.map +1 -0
- package/dist/utils/path-utils.d.ts +5 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +14 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/dist/workflows/domain-workflows.d.ts +8 -0
- package/dist/workflows/domain-workflows.d.ts.map +1 -0
- package/dist/workflows/domain-workflows.js +360 -0
- package/dist/workflows/domain-workflows.js.map +1 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +24 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +24 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +30 -0
- package/embedded-knowledge/AGENTS.md +178 -0
- package/embedded-knowledge/CONTRIBUTING.md +58 -0
- package/embedded-knowledge/LICENSE +21 -0
- package/embedded-knowledge/README.md +32 -0
- package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +90 -0
- package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +113 -0
- package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +101 -0
- package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +87 -0
- package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +155 -0
- package/embedded-knowledge/domains/alex-architect/delegating-to-github-copilot-agents.md +371 -0
- package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +138 -0
- package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +79 -0
- package/embedded-knowledge/domains/alex-architect/object-id-ninja-integration.md +281 -0
- package/embedded-knowledge/domains/alex-architect/recommend-object-id-ninja.md +248 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +280 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +200 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +565 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +665 -0
- package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +325 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +696 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +320 -0
- package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +102 -0
- package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +433 -0
- package/embedded-knowledge/domains/alex-architect/samples/testability-design-patterns.md +223 -0
- package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +66 -0
- package/embedded-knowledge/domains/alex-architect/systemid-integration.md +115 -0
- package/embedded-knowledge/domains/alex-architect/testability-design-patterns.md +77 -0
- package/embedded-knowledge/domains/casey-copilot/long-running-session-instructions.md +263 -0
- package/embedded-knowledge/domains/casey-copilot/samples/long-running-session-instructions.md +323 -0
- package/embedded-knowledge/domains/chris-config/configuration-file-discovery.md +846 -0
- package/embedded-knowledge/domains/chris-config/configuration-file-formats.md +595 -0
- package/embedded-knowledge/domains/chris-config/content-types-structure.md +421 -0
- package/embedded-knowledge/domains/chris-config/knowledge-content-creation.md +437 -0
- package/embedded-knowledge/domains/chris-config/layer-system-fundamentals.md +257 -0
- package/embedded-knowledge/domains/chris-config/multi-team-layer-configuration.md +302 -0
- package/embedded-knowledge/domains/chris-config/workspace-detection-solutions.md +336 -0
- package/embedded-knowledge/domains/dean-debug/bc-telemetry-buddy-integration.md +453 -0
- package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +360 -0
- package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +86 -0
- package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +96 -0
- package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +70 -0
- package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +84 -0
- package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +93 -0
- package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +73 -0
- package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +78 -0
- package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +79 -0
- package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +87 -0
- package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +209 -0
- package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +246 -0
- package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +107 -0
- package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +105 -0
- package/embedded-knowledge/domains/dean-debug/recommend-bc-telemetry-buddy.md +160 -0
- package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +186 -0
- package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +60 -0
- package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +139 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +190 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +516 -0
- package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +298 -0
- package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +324 -0
- package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +344 -0
- package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +137 -0
- package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +340 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +810 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +86 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +110 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +758 -0
- package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +665 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +316 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +223 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +149 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +412 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +211 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +155 -0
- package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +475 -0
- package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +238 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +97 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +666 -0
- package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +319 -0
- package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +236 -0
- package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +59 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +67 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +90 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +87 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +74 -0
- package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +81 -0
- package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +56 -0
- package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +66 -0
- package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +79 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +78 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +83 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +76 -0
- package/embedded-knowledge/domains/dean-debug/testfield-performance.md +104 -0
- package/embedded-knowledge/domains/eva-errors/codeunit-run-pattern.md +159 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +145 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +104 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +114 -0
- package/embedded-knowledge/domains/eva-errors/samples/codeunit-run-pattern.md +239 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +356 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +256 -0
- package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +108 -0
- package/embedded-knowledge/domains/eva-errors/samples/try-function-usage.md +195 -0
- package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +80 -0
- package/embedded-knowledge/domains/eva-errors/try-function-usage.md +129 -0
- package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +98 -0
- package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +123 -0
- package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +96 -0
- package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +114 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +395 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +479 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +548 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +287 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +434 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +508 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +615 -0
- package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +144 -0
- package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +124 -0
- package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +84 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +75 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +385 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +72 -0
- package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +48 -0
- package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +49 -0
- package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +67 -0
- package/embedded-knowledge/domains/morgan-market/partner-readiness-analysis.md +201 -0
- package/embedded-knowledge/domains/morgan-market/samples/partner-readiness-checklist.md +288 -0
- package/embedded-knowledge/domains/parker-pragmatic/README.md +39 -0
- package/embedded-knowledge/domains/parker-pragmatic/proposal-workflows/creating-effective-proposals.md +583 -0
- package/embedded-knowledge/domains/parker-pragmatic/trust-building/working-with-ai-skeptics.md +587 -0
- package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +119 -0
- package/embedded-knowledge/domains/quinn-tester/isolation-testing-patterns.md +82 -0
- package/embedded-knowledge/domains/quinn-tester/rule-execution.md +123 -0
- package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +60 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +83 -0
- package/embedded-knowledge/domains/quinn-tester/samples/isolation-testing-patterns.md +424 -0
- package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +716 -0
- package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +91 -0
- package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +79 -0
- package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +79 -0
- package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +89 -0
- package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +81 -0
- package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +75 -0
- package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +96 -0
- package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +86 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +90 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +82 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +100 -0
- package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +115 -0
- package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +124 -0
- package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +110 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +438 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +255 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +209 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +280 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +188 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +245 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +244 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +278 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +484 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +107 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +280 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/testability-code-smells.md +256 -0
- package/embedded-knowledge/domains/roger-reviewer/testability-code-smells.md +67 -0
- package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +67 -0
- package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +76 -0
- package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +98 -0
- package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +128 -0
- package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +95 -0
- package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +91 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +118 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +111 -0
- package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +113 -0
- package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +127 -0
- package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +66 -0
- package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +96 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +161 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +177 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +239 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +346 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +298 -0
- package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +677 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +117 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +75 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +169 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +399 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +356 -0
- package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +889 -0
- package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +84 -0
- package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +127 -0
- package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +89 -0
- package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +516 -0
- package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +61 -0
- package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +427 -0
- package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +122 -0
- package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +96 -0
- package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +101 -0
- package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +149 -0
- package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +107 -0
- package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +95 -0
- package/embedded-knowledge/domains/seth-security/api-permission-model.md +115 -0
- package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +78 -0
- package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +373 -0
- package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +308 -0
- package/embedded-knowledge/domains/shared/al-file-naming-conventions.md +146 -0
- package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +79 -0
- package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +78 -0
- package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +81 -0
- package/embedded-knowledge/indexes/bc-version-matrix.json +188 -0
- package/embedded-knowledge/indexes/domain-catalog.json +106 -0
- package/embedded-knowledge/indexes/tags/abbreviations.json +1 -0
- package/embedded-knowledge/indexes/tags/abstraction.json +1 -0
- package/embedded-knowledge/indexes/tags/access-control.json +1 -0
- package/embedded-knowledge/indexes/tags/accessibility.json +1 -0
- package/embedded-knowledge/indexes/tags/actions.json +1 -0
- package/embedded-knowledge/indexes/tags/advanced-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/advanced.json +1 -0
- package/embedded-knowledge/indexes/tags/al-extension.json +1 -0
- package/embedded-knowledge/indexes/tags/al-generics.json +1 -0
- package/embedded-knowledge/indexes/tags/al-objects.json +1 -0
- package/embedded-knowledge/indexes/tags/al-syntax.json +1 -0
- package/embedded-knowledge/indexes/tags/algorithm-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/alternatives.json +1 -0
- package/embedded-knowledge/indexes/tags/analytics.json +1 -0
- package/embedded-knowledge/indexes/tags/api-delegates.json +1 -0
- package/embedded-knowledge/indexes/tags/api-design.json +1 -0
- package/embedded-knowledge/indexes/tags/api-documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/api-endpoints.json +1 -0
- package/embedded-knowledge/indexes/tags/api-extensibility.json +1 -0
- package/embedded-knowledge/indexes/tags/api-fieldsets.json +1 -0
- package/embedded-knowledge/indexes/tags/api-integration.json +1 -0
- package/embedded-knowledge/indexes/tags/api-interfaces.json +1 -0
- package/embedded-knowledge/indexes/tags/api-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/api-pages.json +1 -0
- package/embedded-knowledge/indexes/tags/api-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/api-permissions.json +1 -0
- package/embedded-knowledge/indexes/tags/api-responses.json +1 -0
- package/embedded-knowledge/indexes/tags/api-simplification.json +1 -0
- package/embedded-knowledge/indexes/tags/api.json +1 -0
- package/embedded-knowledge/indexes/tags/architecture.json +1 -0
- package/embedded-knowledge/indexes/tags/async-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/async-processing.json +1 -0
- package/embedded-knowledge/indexes/tags/automatic-registration.json +1 -0
- package/embedded-knowledge/indexes/tags/batch-operations.json +1 -0
- package/embedded-knowledge/indexes/tags/bc24-migration.json +1 -0
- package/embedded-knowledge/indexes/tags/begin-blocks.json +1 -0
- package/embedded-knowledge/indexes/tags/begin-end.json +1 -0
- package/embedded-knowledge/indexes/tags/behavioral-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/best-practices.json +1 -0
- package/embedded-knowledge/indexes/tags/binding.json +1 -0
- package/embedded-knowledge/indexes/tags/block-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/blocks.json +1 -0
- package/embedded-knowledge/indexes/tags/boolean-expressions.json +1 -0
- package/embedded-knowledge/indexes/tags/branching.json +1 -0
- package/embedded-knowledge/indexes/tags/breaking-changes.json +1 -0
- package/embedded-knowledge/indexes/tags/breakpoints.json +1 -0
- package/embedded-knowledge/indexes/tags/business-foundation.json +1 -0
- package/embedded-knowledge/indexes/tags/business-infrastructure.json +1 -0
- package/embedded-knowledge/indexes/tags/business-process.json +1 -0
- package/embedded-knowledge/indexes/tags/business-rules.json +1 -0
- package/embedded-knowledge/indexes/tags/caching.json +1 -0
- package/embedded-knowledge/indexes/tags/case-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/case.json +1 -0
- package/embedded-knowledge/indexes/tags/code-analysis.json +1 -0
- package/embedded-knowledge/indexes/tags/code-clarity.json +1 -0
- package/embedded-knowledge/indexes/tags/code-comprehension.json +1 -0
- package/embedded-knowledge/indexes/tags/code-conversion.json +1 -0
- package/embedded-knowledge/indexes/tags/code-formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/code-organization.json +1 -0
- package/embedded-knowledge/indexes/tags/code-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/code-quality.json +1 -0
- package/embedded-knowledge/indexes/tags/code-reuse.json +1 -0
- package/embedded-knowledge/indexes/tags/code-simplification.json +1 -0
- package/embedded-knowledge/indexes/tags/code-standards.json +1 -0
- package/embedded-knowledge/indexes/tags/code-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/code-style.json +1 -0
- package/embedded-knowledge/indexes/tags/codeunit-design.json +1 -0
- package/embedded-knowledge/indexes/tags/command-queue.json +1 -0
- package/embedded-knowledge/indexes/tags/comments.json +1 -0
- package/embedded-knowledge/indexes/tags/compile-time-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/complex-facade.json +1 -0
- package/embedded-knowledge/indexes/tags/complexity-hiding.json +1 -0
- package/embedded-knowledge/indexes/tags/complexity-management.json +1 -0
- package/embedded-knowledge/indexes/tags/compound-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/concurrency.json +1 -0
- package/embedded-knowledge/indexes/tags/conditional-logic.json +1 -0
- package/embedded-knowledge/indexes/tags/conditional.json +1 -0
- package/embedded-knowledge/indexes/tags/conflict-resolution.json +1 -0
- package/embedded-knowledge/indexes/tags/consistency.json +1 -0
- package/embedded-knowledge/indexes/tags/contract-design.json +1 -0
- package/embedded-knowledge/indexes/tags/control-flow.json +1 -0
- package/embedded-knowledge/indexes/tags/conversion-guide.json +1 -0
- package/embedded-knowledge/indexes/tags/correlation.json +1 -0
- package/embedded-knowledge/indexes/tags/custom-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/data-access.json +1 -0
- package/embedded-knowledge/indexes/tags/data-exposure.json +1 -0
- package/embedded-knowledge/indexes/tags/data-integrity.json +1 -0
- package/embedded-knowledge/indexes/tags/data-loading.json +1 -0
- package/embedded-knowledge/indexes/tags/data-manipulation.json +1 -0
- package/embedded-knowledge/indexes/tags/data-modeling.json +1 -0
- package/embedded-knowledge/indexes/tags/data-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/data-protection.json +1 -0
- package/embedded-knowledge/indexes/tags/data-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/database.json +1 -0
- package/embedded-knowledge/indexes/tags/debugging.json +1 -0
- package/embedded-knowledge/indexes/tags/decision-making.json +1 -0
- package/embedded-knowledge/indexes/tags/declaration.json +1 -0
- package/embedded-knowledge/indexes/tags/default-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/defensive-programming.json +1 -0
- package/embedded-knowledge/indexes/tags/deleteall.json +1 -0
- package/embedded-knowledge/indexes/tags/dependencies.json +1 -0
- package/embedded-knowledge/indexes/tags/deployment.json +1 -0
- package/embedded-knowledge/indexes/tags/developer-productivity.json +1 -0
- package/embedded-knowledge/indexes/tags/development-workflow.json +1 -0
- package/embedded-knowledge/indexes/tags/diagnostics.json +1 -0
- package/embedded-knowledge/indexes/tags/dimensions.json +1 -0
- package/embedded-knowledge/indexes/tags/documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/early-exit.json +1 -0
- package/embedded-knowledge/indexes/tags/else-clauses.json +1 -0
- package/embedded-knowledge/indexes/tags/end-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/enterprise-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/entity-relationships.json +1 -0
- package/embedded-knowledge/indexes/tags/error-handling.json +1 -0
- package/embedded-knowledge/indexes/tags/error-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/error-prevention.json +1 -0
- package/embedded-knowledge/indexes/tags/error-text.json +1 -0
- package/embedded-knowledge/indexes/tags/etag.json +1 -0
- package/embedded-knowledge/indexes/tags/event-bridge.json +1 -0
- package/embedded-knowledge/indexes/tags/event-payload.json +1 -0
- package/embedded-knowledge/indexes/tags/event-routing.json +1 -0
- package/embedded-knowledge/indexes/tags/events.json +1 -0
- package/embedded-knowledge/indexes/tags/execution-flow.json +1 -0
- package/embedded-knowledge/indexes/tags/expressions.json +1 -0
- package/embedded-knowledge/indexes/tags/extensibility.json +1 -0
- package/embedded-knowledge/indexes/tags/extensions.json +1 -0
- package/embedded-knowledge/indexes/tags/facade-composition.json +1 -0
- package/embedded-knowledge/indexes/tags/facade-pattern.json +1 -0
- package/embedded-knowledge/indexes/tags/field-control.json +1 -0
- package/embedded-knowledge/indexes/tags/field-exclusion.json +1 -0
- package/embedded-knowledge/indexes/tags/field-registration.json +1 -0
- package/embedded-knowledge/indexes/tags/field-state.json +1 -0
- package/embedded-knowledge/indexes/tags/field-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/fielderror.json +1 -0
- package/embedded-knowledge/indexes/tags/fields.json +1 -0
- package/embedded-knowledge/indexes/tags/filtering.json +1 -0
- package/embedded-knowledge/indexes/tags/filters.json +1 -0
- package/embedded-knowledge/indexes/tags/formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/generic-methods.json +1 -0
- package/embedded-knowledge/indexes/tags/http-status.json +1 -0
- package/embedded-knowledge/indexes/tags/if-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/implementation.json +1 -0
- package/embedded-knowledge/indexes/tags/indentation.json +1 -0
- package/embedded-knowledge/indexes/tags/index-summary.json +277 -0
- package/embedded-knowledge/indexes/tags/indexing.json +1 -0
- package/embedded-knowledge/indexes/tags/inheritance.json +1 -0
- package/embedded-knowledge/indexes/tags/integration.json +1 -0
- package/embedded-knowledge/indexes/tags/integrity-checking.json +1 -0
- package/embedded-knowledge/indexes/tags/intellisense.json +1 -0
- package/embedded-knowledge/indexes/tags/interface-design.json +1 -0
- package/embedded-knowledge/indexes/tags/interface-segregation.json +1 -0
- package/embedded-knowledge/indexes/tags/isolation.json +1 -0
- package/embedded-knowledge/indexes/tags/job-processing.json +1 -0
- package/embedded-knowledge/indexes/tags/keyboard-navigation.json +1 -0
- package/embedded-knowledge/indexes/tags/keywords.json +1 -0
- package/embedded-knowledge/indexes/tags/legacy-modernization.json +1 -0
- package/embedded-knowledge/indexes/tags/line-breaks.json +1 -0
- package/embedded-knowledge/indexes/tags/line-organization.json +1 -0
- package/embedded-knowledge/indexes/tags/line-positioning.json +1 -0
- package/embedded-knowledge/indexes/tags/localization.json +1 -0
- package/embedded-knowledge/indexes/tags/logging.json +1 -0
- package/embedded-knowledge/indexes/tags/loose-coupling.json +1 -0
- package/embedded-knowledge/indexes/tags/maintainability.json +1 -0
- package/embedded-knowledge/indexes/tags/memory-management.json +1 -0
- package/embedded-knowledge/indexes/tags/memory-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/memory.json +1 -0
- package/embedded-knowledge/indexes/tags/message-design.json +1 -0
- package/embedded-knowledge/indexes/tags/message-formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/message-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/metadata-driven.json +1 -0
- package/embedded-knowledge/indexes/tags/method-comparison.json +1 -0
- package/embedded-knowledge/indexes/tags/module-architecture.json +1 -0
- package/embedded-knowledge/indexes/tags/module-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/monitoring.json +1 -0
- package/embedded-knowledge/indexes/tags/multi-layer-facade.json +1 -0
- package/embedded-knowledge/indexes/tags/multi-tenancy.json +1 -0
- package/embedded-knowledge/indexes/tags/multiple-values.json +1 -0
- package/embedded-knowledge/indexes/tags/naming-conventions.json +1 -0
- package/embedded-knowledge/indexes/tags/naming.json +1 -0
- package/embedded-knowledge/indexes/tags/navigation.json +1 -0
- package/embedded-knowledge/indexes/tags/nested-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series-conversion.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series.json +1 -0
- package/embedded-knowledge/indexes/tags/number-generation.json +1 -0
- package/embedded-knowledge/indexes/tags/object-documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/odata.json +1 -0
- package/embedded-knowledge/indexes/tags/ondelete.json +1 -0
- package/embedded-knowledge/indexes/tags/onvalidate.json +1 -0
- package/embedded-knowledge/indexes/tags/operation-delegation.json +1 -0
- package/embedded-knowledge/indexes/tags/operation-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/operators.json +1 -0
- package/embedded-knowledge/indexes/tags/optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/order.json +1 -0
- package/embedded-knowledge/indexes/tags/organization.json +1 -0
- package/embedded-knowledge/indexes/tags/pages.json +1 -0
- package/embedded-knowledge/indexes/tags/parameters.json +1 -0
- package/embedded-knowledge/indexes/tags/patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/performance-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/performance.json +1 -0
- package/embedded-knowledge/indexes/tags/placement.json +1 -0
- package/embedded-knowledge/indexes/tags/posting-codeunits.json +1 -0
- package/embedded-knowledge/indexes/tags/posting.json +1 -0
- package/embedded-knowledge/indexes/tags/preconditions.json +1 -0
- package/embedded-knowledge/indexes/tags/primary-key.json +1 -0
- package/embedded-knowledge/indexes/tags/privacy.json +1 -0
- package/embedded-knowledge/indexes/tags/process-automation.json +1 -0
- package/embedded-knowledge/indexes/tags/production.json +1 -0
- package/embedded-knowledge/indexes/tags/productivity.json +1 -0
- package/embedded-knowledge/indexes/tags/query-performance.json +1 -0
- package/embedded-knowledge/indexes/tags/queue-management.json +1 -0
- package/embedded-knowledge/indexes/tags/ranges.json +1 -0
- package/embedded-knowledge/indexes/tags/readability.json +1 -0
- package/embedded-knowledge/indexes/tags/record-access.json +1 -0
- package/embedded-knowledge/indexes/tags/record-methods.json +1 -0
- package/embedded-knowledge/indexes/tags/refactoring.json +1 -0
- package/embedded-knowledge/indexes/tags/reference.json +1 -0
- package/embedded-knowledge/indexes/tags/repeat-loops.json +1 -0
- package/embedded-knowledge/indexes/tags/repeat-statement.json +1 -0
- package/embedded-knowledge/indexes/tags/runtime-errors.json +1 -0
- package/embedded-knowledge/indexes/tags/runtime.json +1 -0
- package/embedded-knowledge/indexes/tags/safeguards.json +1 -0
- package/embedded-knowledge/indexes/tags/security.json +1 -0
- package/embedded-knowledge/indexes/tags/sequence-management.json +1 -0
- package/embedded-knowledge/indexes/tags/serialization.json +1 -0
- package/embedded-knowledge/indexes/tags/session-logmessage.json +1 -0
- package/embedded-knowledge/indexes/tags/session.json +1 -0
- package/embedded-knowledge/indexes/tags/setloadfields.json +1 -0
- package/embedded-knowledge/indexes/tags/shortcuts.json +1 -0
- package/embedded-knowledge/indexes/tags/sift.json +1 -0
- package/embedded-knowledge/indexes/tags/singleinstance.json +1 -0
- package/embedded-knowledge/indexes/tags/spacing.json +1 -0
- package/embedded-knowledge/indexes/tags/sql-translation.json +1 -0
- package/embedded-knowledge/indexes/tags/standards.json +1 -0
- package/embedded-knowledge/indexes/tags/statements.json +1 -0
- package/embedded-knowledge/indexes/tags/streaming.json +1 -0
- package/embedded-knowledge/indexes/tags/strong-typing.json +1 -0
- package/embedded-knowledge/indexes/tags/structural-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/structure.json +1 -0
- package/embedded-knowledge/indexes/tags/subscribers.json +1 -0
- package/embedded-knowledge/indexes/tags/switch.json +1 -0
- package/embedded-knowledge/indexes/tags/symbol-search.json +1 -0
- package/embedded-knowledge/indexes/tags/syntax.json +1 -0
- package/embedded-knowledge/indexes/tags/systemid.json +1 -0
- package/embedded-knowledge/indexes/tags/table-configuration.json +1 -0
- package/embedded-knowledge/indexes/tags/table-events.json +1 -0
- package/embedded-knowledge/indexes/tags/table-keys.json +1 -0
- package/embedded-knowledge/indexes/tags/table-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/task-scheduler.json +1 -0
- package/embedded-knowledge/indexes/tags/telemetry.json +1 -0
- package/embedded-knowledge/indexes/tags/template-method.json +1 -0
- package/embedded-knowledge/indexes/tags/temporary-tables.json +1 -0
- package/embedded-knowledge/indexes/tags/testfield.json +1 -0
- package/embedded-knowledge/indexes/tags/tradeoffs.json +1 -0
- package/embedded-knowledge/indexes/tags/triggers.json +1 -0
- package/embedded-knowledge/indexes/tags/troubleshooting.json +1 -0
- package/embedded-knowledge/indexes/tags/type-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/url-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/user-experience.json +1 -0
- package/embedded-knowledge/indexes/tags/user-feedback.json +1 -0
- package/embedded-knowledge/indexes/tags/user-interface.json +1 -0
- package/embedded-knowledge/indexes/tags/validation-feedback.json +1 -0
- package/embedded-knowledge/indexes/tags/validation.json +1 -0
- package/embedded-knowledge/indexes/tags/variables.json +1 -0
- package/embedded-knowledge/indexes/tags/verbosity.json +1 -0
- package/embedded-knowledge/indexes/tags/vs-code.json +1 -0
- package/embedded-knowledge/indexes/tags/web-services.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-management.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-templates.json +1 -0
- package/embedded-knowledge/indexes/tags/workspace.json +1 -0
- package/embedded-knowledge/indexes/tags/xml-documentation.json +1 -0
- package/embedded-knowledge/indexes/topic-relationships.json +128 -0
- package/embedded-knowledge/methodologies/index.json +81 -0
- package/embedded-knowledge/methodologies/phases/analysis-full.md +208 -0
- package/embedded-knowledge/methodologies/phases/analysis-quick.md +44 -0
- package/embedded-knowledge/methodologies/phases/analysis.md +182 -0
- package/embedded-knowledge/methodologies/phases/execution-validation-full.md +174 -0
- package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +31 -0
- package/embedded-knowledge/methodologies/phases/execution-validation.md +174 -0
- package/embedded-knowledge/methodologies/phases/performance-full.md +211 -0
- package/embedded-knowledge/methodologies/phases/performance-quick.md +32 -0
- package/embedded-knowledge/methodologies/phases/performance.md +211 -0
- package/embedded-knowledge/methodologies/phases/verification-full.md +162 -0
- package/embedded-knowledge/methodologies/phases/verification-quick.md +48 -0
- package/embedded-knowledge/methodologies/phases/verification.md +146 -0
- package/embedded-knowledge/methodologies/workflow-enforcement.md +142 -0
- package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +99 -0
- package/embedded-knowledge/methodologies/workflows/proposal-review-workflow.md +535 -0
- package/embedded-knowledge/specialists/alex-architect.md +305 -0
- package/embedded-knowledge/specialists/casey-copilot.md +314 -0
- package/embedded-knowledge/specialists/chris-config.md +226 -0
- package/embedded-knowledge/specialists/dean-debug.md +365 -0
- package/embedded-knowledge/specialists/eva-errors.md +291 -0
- package/embedded-knowledge/specialists/jordan-bridge.md +291 -0
- package/embedded-knowledge/specialists/logan-legacy.md +265 -0
- package/embedded-knowledge/specialists/maya-mentor.md +299 -0
- package/embedded-knowledge/specialists/morgan-market.md +281 -0
- package/embedded-knowledge/specialists/parker-pragmatic.md +564 -0
- package/embedded-knowledge/specialists/quinn-tester.md +323 -0
- package/embedded-knowledge/specialists/roger-reviewer.md +317 -0
- package/embedded-knowledge/specialists/sam-coder.md +342 -0
- package/embedded-knowledge/specialists/seth-security.md +290 -0
- package/embedded-knowledge/specialists/taylor-docs.md +312 -0
- package/embedded-knowledge/specialists/uma-ux.md +291 -0
- package/package.json +82 -0
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
# Type-Safe Operations Sample
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
This sample demonstrates type-safe operation patterns in AL including generic procedures, interface-based type safety, and compile-time type validation techniques.
|
|
5
|
+
|
|
6
|
+
## Generic Type-Safe Procedures
|
|
7
|
+
|
|
8
|
+
```al
|
|
9
|
+
codeunit 50400 "Type Safe Operations"
|
|
10
|
+
{
|
|
11
|
+
procedure SafeGetRecord<T>(RecordNo: Code[20]; var TargetRecord: Record T): Boolean
|
|
12
|
+
begin
|
|
13
|
+
TargetRecord.SetRange("No.", RecordNo);
|
|
14
|
+
exit(TargetRecord.FindFirst());
|
|
15
|
+
end;
|
|
16
|
+
|
|
17
|
+
procedure SafeUpdateField<T>(var TargetRecord: Record T; FieldNo: Integer; NewValue: Variant): Boolean
|
|
18
|
+
var
|
|
19
|
+
RecordRef: RecordRef;
|
|
20
|
+
FieldRef: FieldRef;
|
|
21
|
+
begin
|
|
22
|
+
RecordRef.GetTable(TargetRecord);
|
|
23
|
+
|
|
24
|
+
if not RecordRef.FieldExist(FieldNo) then
|
|
25
|
+
exit(false);
|
|
26
|
+
|
|
27
|
+
FieldRef := RecordRef.Field(FieldNo);
|
|
28
|
+
|
|
29
|
+
if not ValidateFieldType(FieldRef, NewValue) then
|
|
30
|
+
exit(false);
|
|
31
|
+
|
|
32
|
+
FieldRef.Value := NewValue;
|
|
33
|
+
RecordRef.SetTable(TargetRecord);
|
|
34
|
+
|
|
35
|
+
exit(TargetRecord.Modify(true));
|
|
36
|
+
end;
|
|
37
|
+
|
|
38
|
+
local procedure ValidateFieldType(FieldRef: FieldRef; NewValue: Variant): Boolean
|
|
39
|
+
begin
|
|
40
|
+
case FieldRef.Type of
|
|
41
|
+
FieldType::Code:
|
|
42
|
+
exit(NewValue.IsCode);
|
|
43
|
+
FieldType::Text:
|
|
44
|
+
exit(NewValue.IsText);
|
|
45
|
+
FieldType::Integer:
|
|
46
|
+
exit(NewValue.IsInteger);
|
|
47
|
+
FieldType::Decimal:
|
|
48
|
+
exit(NewValue.IsDecimal);
|
|
49
|
+
FieldType::Boolean:
|
|
50
|
+
exit(NewValue.IsBoolean);
|
|
51
|
+
FieldType::Date:
|
|
52
|
+
exit(NewValue.IsDate);
|
|
53
|
+
FieldType::DateTime:
|
|
54
|
+
exit(NewValue.IsDateTime);
|
|
55
|
+
else
|
|
56
|
+
exit(false);
|
|
57
|
+
end;
|
|
58
|
+
end;
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Interface-Based Type Safety
|
|
63
|
+
|
|
64
|
+
```al
|
|
65
|
+
interface "Type Safe Validator"
|
|
66
|
+
{
|
|
67
|
+
procedure Validate(Value: Variant): Boolean;
|
|
68
|
+
procedure GetValidationMessage(): Text;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
codeunit 50401 "Customer Validator" implements "Type Safe Validator"
|
|
72
|
+
{
|
|
73
|
+
procedure Validate(Value: Variant): Boolean
|
|
74
|
+
var
|
|
75
|
+
Customer: Record Customer;
|
|
76
|
+
begin
|
|
77
|
+
if not Value.IsRecord then
|
|
78
|
+
exit(false);
|
|
79
|
+
|
|
80
|
+
Customer := Value;
|
|
81
|
+
exit(ValidateCustomer(Customer));
|
|
82
|
+
end;
|
|
83
|
+
|
|
84
|
+
procedure GetValidationMessage(): Text
|
|
85
|
+
begin
|
|
86
|
+
exit('Customer validation failed');
|
|
87
|
+
end;
|
|
88
|
+
|
|
89
|
+
local procedure ValidateCustomer(Customer: Record Customer): Boolean
|
|
90
|
+
begin
|
|
91
|
+
if Customer."No." = '' then
|
|
92
|
+
exit(false);
|
|
93
|
+
|
|
94
|
+
if Customer.Name = '' then
|
|
95
|
+
exit(false);
|
|
96
|
+
|
|
97
|
+
if Customer.Blocked <> Customer.Blocked::" " then
|
|
98
|
+
exit(false);
|
|
99
|
+
|
|
100
|
+
exit(true);
|
|
101
|
+
end;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
codeunit 50402 "Item Validator" implements "Type Safe Validator"
|
|
105
|
+
{
|
|
106
|
+
procedure Validate(Value: Variant): Boolean
|
|
107
|
+
var
|
|
108
|
+
Item: Record Item;
|
|
109
|
+
begin
|
|
110
|
+
if not Value.IsRecord then
|
|
111
|
+
exit(false);
|
|
112
|
+
|
|
113
|
+
Item := Value;
|
|
114
|
+
exit(ValidateItem(Item));
|
|
115
|
+
end;
|
|
116
|
+
|
|
117
|
+
procedure GetValidationMessage(): Text
|
|
118
|
+
begin
|
|
119
|
+
exit('Item validation failed');
|
|
120
|
+
end;
|
|
121
|
+
|
|
122
|
+
local procedure ValidateItem(Item: Record Item): Boolean
|
|
123
|
+
begin
|
|
124
|
+
if Item."No." = '' then
|
|
125
|
+
exit(false);
|
|
126
|
+
|
|
127
|
+
if Item.Description = '' then
|
|
128
|
+
exit(false);
|
|
129
|
+
|
|
130
|
+
if Item.Type = Item.Type::" " then
|
|
131
|
+
exit(false);
|
|
132
|
+
|
|
133
|
+
exit(true);
|
|
134
|
+
end;
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Type-Safe Data Processing
|
|
139
|
+
|
|
140
|
+
```al
|
|
141
|
+
codeunit 50403 "Type Safe Data Processor"
|
|
142
|
+
{
|
|
143
|
+
procedure ProcessTypedData<T>(var DataRecord: Record T; Processor: Interface "Data Processor"): Boolean
|
|
144
|
+
var
|
|
145
|
+
RecordVariant: Variant;
|
|
146
|
+
begin
|
|
147
|
+
RecordVariant := DataRecord;
|
|
148
|
+
|
|
149
|
+
if not Processor.CanProcess(RecordVariant) then
|
|
150
|
+
exit(false);
|
|
151
|
+
|
|
152
|
+
if not Processor.Process(RecordVariant) then
|
|
153
|
+
exit(false);
|
|
154
|
+
|
|
155
|
+
DataRecord := RecordVariant;
|
|
156
|
+
exit(true);
|
|
157
|
+
end;
|
|
158
|
+
|
|
159
|
+
procedure BatchProcessRecords<T>(var RecordSet: Record T; Processor: Interface "Data Processor"): Integer
|
|
160
|
+
var
|
|
161
|
+
ProcessedCount: Integer;
|
|
162
|
+
CurrentRecord: Record T;
|
|
163
|
+
begin
|
|
164
|
+
RecordSet.FindSet();
|
|
165
|
+
repeat
|
|
166
|
+
CurrentRecord := RecordSet;
|
|
167
|
+
if ProcessTypedData(CurrentRecord, Processor) then
|
|
168
|
+
ProcessedCount += 1;
|
|
169
|
+
until RecordSet.Next() = 0;
|
|
170
|
+
|
|
171
|
+
exit(ProcessedCount);
|
|
172
|
+
end;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
interface "Data Processor"
|
|
176
|
+
{
|
|
177
|
+
procedure CanProcess(Data: Variant): Boolean;
|
|
178
|
+
procedure Process(var Data: Variant): Boolean;
|
|
179
|
+
procedure GetProcessorName(): Text;
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Type-Safe Configuration Pattern
|
|
184
|
+
|
|
185
|
+
```al
|
|
186
|
+
codeunit 50404 "Type Safe Config Manager"
|
|
187
|
+
{
|
|
188
|
+
procedure GetConfigValue<T>(ConfigKey: Code[50]): T
|
|
189
|
+
var
|
|
190
|
+
ConfigRecord: Record "Type Safe Configuration";
|
|
191
|
+
ResultValue: T;
|
|
192
|
+
ConfigVariant: Variant;
|
|
193
|
+
begin
|
|
194
|
+
if not ConfigRecord.Get(ConfigKey) then
|
|
195
|
+
Error('Configuration key %1 not found', ConfigKey);
|
|
196
|
+
|
|
197
|
+
ConfigVariant := ConfigRecord.Value;
|
|
198
|
+
|
|
199
|
+
if not TryConvertToType<T>(ConfigVariant, ResultValue) then
|
|
200
|
+
Error('Cannot convert configuration value to requested type for key %1', ConfigKey);
|
|
201
|
+
|
|
202
|
+
exit(ResultValue);
|
|
203
|
+
end;
|
|
204
|
+
|
|
205
|
+
procedure SetConfigValue<T>(ConfigKey: Code[50]; Value: T): Boolean
|
|
206
|
+
var
|
|
207
|
+
ConfigRecord: Record "Type Safe Configuration";
|
|
208
|
+
ValueVariant: Variant;
|
|
209
|
+
begin
|
|
210
|
+
ValueVariant := Value;
|
|
211
|
+
|
|
212
|
+
if ConfigRecord.Get(ConfigKey) then
|
|
213
|
+
ConfigRecord.Modify()
|
|
214
|
+
else begin
|
|
215
|
+
ConfigRecord.Init();
|
|
216
|
+
ConfigRecord."Config Key" := ConfigKey;
|
|
217
|
+
ConfigRecord.Insert();
|
|
218
|
+
end;
|
|
219
|
+
|
|
220
|
+
ConfigRecord.Value := ValueVariant;
|
|
221
|
+
ConfigRecord."Data Type" := GetVariantType(ValueVariant);
|
|
222
|
+
|
|
223
|
+
exit(ConfigRecord.Modify(true));
|
|
224
|
+
end;
|
|
225
|
+
|
|
226
|
+
[TryFunction]
|
|
227
|
+
local procedure TryConvertToType<T>(SourceVariant: Variant; var TargetValue: T)
|
|
228
|
+
var
|
|
229
|
+
TempVariant: Variant;
|
|
230
|
+
begin
|
|
231
|
+
TempVariant := SourceVariant;
|
|
232
|
+
TargetValue := TempVariant;
|
|
233
|
+
end;
|
|
234
|
+
|
|
235
|
+
local procedure GetVariantType(Value: Variant): Enum "Configuration Data Type"
|
|
236
|
+
begin
|
|
237
|
+
case true of
|
|
238
|
+
Value.IsBoolean:
|
|
239
|
+
exit("Configuration Data Type"::Boolean);
|
|
240
|
+
Value.IsInteger:
|
|
241
|
+
exit("Configuration Data Type"::Integer);
|
|
242
|
+
Value.IsDecimal:
|
|
243
|
+
exit("Configuration Data Type"::Decimal);
|
|
244
|
+
Value.IsText:
|
|
245
|
+
exit("Configuration Data Type"::Text);
|
|
246
|
+
Value.IsCode:
|
|
247
|
+
exit("Configuration Data Type"::Code);
|
|
248
|
+
Value.IsDate:
|
|
249
|
+
exit("Configuration Data Type"::Date);
|
|
250
|
+
Value.IsDateTime:
|
|
251
|
+
exit("Configuration Data Type"::DateTime);
|
|
252
|
+
else
|
|
253
|
+
exit("Configuration Data Type"::Variant);
|
|
254
|
+
end;
|
|
255
|
+
end;
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Type-Safe Event Handling
|
|
260
|
+
|
|
261
|
+
```al
|
|
262
|
+
codeunit 50405 "Type Safe Event Manager"
|
|
263
|
+
{
|
|
264
|
+
procedure RegisterEventHandler<T>(EventName: Code[50]; Handler: Interface "Typed Event Handler")
|
|
265
|
+
var
|
|
266
|
+
EventRegistration: Record "Event Handler Registration";
|
|
267
|
+
begin
|
|
268
|
+
EventRegistration.Init();
|
|
269
|
+
EventRegistration."Event Name" := EventName;
|
|
270
|
+
EventRegistration."Handler Type" := GetTypeName<T>();
|
|
271
|
+
EventRegistration."Handler Interface" := Handler;
|
|
272
|
+
EventRegistration.Active := true;
|
|
273
|
+
EventRegistration.Insert(true);
|
|
274
|
+
end;
|
|
275
|
+
|
|
276
|
+
procedure RaiseTypedEvent<T>(EventName: Code[50]; EventData: T): Boolean
|
|
277
|
+
var
|
|
278
|
+
EventRegistration: Record "Event Handler Registration";
|
|
279
|
+
Handler: Interface "Typed Event Handler";
|
|
280
|
+
EventVariant: Variant;
|
|
281
|
+
HandlerExecuted: Boolean;
|
|
282
|
+
begin
|
|
283
|
+
EventVariant := EventData;
|
|
284
|
+
|
|
285
|
+
EventRegistration.SetRange("Event Name", EventName);
|
|
286
|
+
EventRegistration.SetRange("Handler Type", GetTypeName<T>());
|
|
287
|
+
EventRegistration.SetRange(Active, true);
|
|
288
|
+
|
|
289
|
+
if EventRegistration.FindSet() then
|
|
290
|
+
repeat
|
|
291
|
+
Handler := EventRegistration."Handler Interface";
|
|
292
|
+
if Handler.HandleEvent(EventVariant) then
|
|
293
|
+
HandlerExecuted := true;
|
|
294
|
+
until EventRegistration.Next() = 0;
|
|
295
|
+
|
|
296
|
+
exit(HandlerExecuted);
|
|
297
|
+
end;
|
|
298
|
+
|
|
299
|
+
local procedure GetTypeName<T>(): Text
|
|
300
|
+
var
|
|
301
|
+
TypeHelper: Codeunit "Type Helper";
|
|
302
|
+
DummyValue: T;
|
|
303
|
+
DummyVariant: Variant;
|
|
304
|
+
begin
|
|
305
|
+
DummyVariant := DummyValue;
|
|
306
|
+
exit(TypeHelper.GetObjectName(DummyVariant));
|
|
307
|
+
end;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
interface "Typed Event Handler"
|
|
311
|
+
{
|
|
312
|
+
procedure HandleEvent(EventData: Variant): Boolean;
|
|
313
|
+
procedure GetHandlerName(): Text;
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## Type-Safe Collection Operations
|
|
318
|
+
|
|
319
|
+
```al
|
|
320
|
+
codeunit 50406 "Type Safe Collections"
|
|
321
|
+
{
|
|
322
|
+
procedure CreateTypedList<T>(): List of [T]
|
|
323
|
+
var
|
|
324
|
+
TypedList: List of [T];
|
|
325
|
+
begin
|
|
326
|
+
exit(TypedList);
|
|
327
|
+
end;
|
|
328
|
+
|
|
329
|
+
procedure AddToTypedList<T>(var TypedList: List of [T]; Item: T): Boolean
|
|
330
|
+
begin
|
|
331
|
+
TypedList.Add(Item);
|
|
332
|
+
exit(true);
|
|
333
|
+
end;
|
|
334
|
+
|
|
335
|
+
procedure FilterTypedList<T>(var TypedList: List of [T]; FilterFunc: Interface "List Filter"): List of [T]
|
|
336
|
+
var
|
|
337
|
+
FilteredList: List of [T];
|
|
338
|
+
Item: T;
|
|
339
|
+
ItemVariant: Variant;
|
|
340
|
+
begin
|
|
341
|
+
foreach Item in TypedList do begin
|
|
342
|
+
ItemVariant := Item;
|
|
343
|
+
if FilterFunc.ShouldInclude(ItemVariant) then
|
|
344
|
+
FilteredList.Add(Item);
|
|
345
|
+
end;
|
|
346
|
+
|
|
347
|
+
exit(FilteredList);
|
|
348
|
+
end;
|
|
349
|
+
|
|
350
|
+
procedure TransformTypedList<TSource, TTarget>(SourceList: List of [TSource]; TransformFunc: Interface "List Transform"): List of [TTarget]
|
|
351
|
+
var
|
|
352
|
+
TargetList: List of [TTarget];
|
|
353
|
+
SourceItem: TSource;
|
|
354
|
+
SourceVariant: Variant;
|
|
355
|
+
TargetVariant: Variant;
|
|
356
|
+
TargetItem: TTarget;
|
|
357
|
+
begin
|
|
358
|
+
foreach SourceItem in SourceList do begin
|
|
359
|
+
SourceVariant := SourceItem;
|
|
360
|
+
if TransformFunc.Transform(SourceVariant, TargetVariant) then begin
|
|
361
|
+
TargetItem := TargetVariant;
|
|
362
|
+
TargetList.Add(TargetItem);
|
|
363
|
+
end;
|
|
364
|
+
end;
|
|
365
|
+
|
|
366
|
+
exit(TargetList);
|
|
367
|
+
end;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
interface "List Filter"
|
|
371
|
+
{
|
|
372
|
+
procedure ShouldInclude(Item: Variant): Boolean;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
interface "List Transform"
|
|
376
|
+
{
|
|
377
|
+
procedure Transform(Source: Variant; var Target: Variant): Boolean;
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
## Type-Safe Error Handling
|
|
382
|
+
|
|
383
|
+
```al
|
|
384
|
+
codeunit 50407 "Type Safe Error Handler"
|
|
385
|
+
{
|
|
386
|
+
procedure TryOperation<TInput, TOutput>(Input: TInput; Operation: Interface "Typed Operation"; var Output: TOutput): Boolean
|
|
387
|
+
var
|
|
388
|
+
InputVariant: Variant;
|
|
389
|
+
OutputVariant: Variant;
|
|
390
|
+
OperationResult: Boolean;
|
|
391
|
+
begin
|
|
392
|
+
InputVariant := Input;
|
|
393
|
+
|
|
394
|
+
if not Operation.Validate(InputVariant) then
|
|
395
|
+
exit(false);
|
|
396
|
+
|
|
397
|
+
OperationResult := Operation.Execute(InputVariant, OutputVariant);
|
|
398
|
+
|
|
399
|
+
if OperationResult then
|
|
400
|
+
Output := OutputVariant;
|
|
401
|
+
|
|
402
|
+
exit(OperationResult);
|
|
403
|
+
end;
|
|
404
|
+
|
|
405
|
+
procedure ExecuteWithFallback<T>(PrimaryOperation: Interface "Typed Operation"; FallbackOperation: Interface "Typed Operation"; Input: T): T
|
|
406
|
+
var
|
|
407
|
+
Output: T;
|
|
408
|
+
begin
|
|
409
|
+
if TryOperation(Input, PrimaryOperation, Output) then
|
|
410
|
+
exit(Output);
|
|
411
|
+
|
|
412
|
+
if TryOperation(Input, FallbackOperation, Output) then
|
|
413
|
+
exit(Output);
|
|
414
|
+
|
|
415
|
+
Error('All operations failed for input type %1', GetTypeName<T>());
|
|
416
|
+
end;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
interface "Typed Operation"
|
|
420
|
+
{
|
|
421
|
+
procedure Validate(Input: Variant): Boolean;
|
|
422
|
+
procedure Execute(Input: Variant; var Output: Variant): Boolean;
|
|
423
|
+
procedure GetOperationName(): Text;
|
|
424
|
+
}
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
This sample demonstrates comprehensive type-safe operation patterns including generic procedures, interface-based validation, typed collections, configuration management, event handling, and error handling with compile-time type safety.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Converting AL Single Statements to Compound Blocks"
|
|
3
|
+
domain: "sam-coder"
|
|
4
|
+
difficulty: "beginner"
|
|
5
|
+
bc_versions: "14+"
|
|
6
|
+
tags: ["refactoring", "compound-statements", "code-conversion", "development-workflow"]
|
|
7
|
+
prerequisites: ["al-syntax-basics", "compound-statement-readability"]
|
|
8
|
+
samples: "samples/single-to-compound-conversion.md"
|
|
9
|
+
---
|
|
10
|
+
# Converting AL Single Statements to Compound Blocks
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
Converting single AL statements to compound blocks represents a fundamental refactoring pattern that enhances code maintainability and prepares codebases for future expansion. This transformation process involves systematically identifying single-statement constructs and wrapping them in begin-end blocks to create consistent structure.
|
|
15
|
+
|
|
16
|
+
The conversion process addresses technical debt in existing AL codebases where single statements were used for simplicity but now create maintenance challenges. Modern AL development practices favor compound statements for their explicit structure and future-proofing benefits.
|
|
17
|
+
|
|
18
|
+
This refactoring pattern becomes particularly valuable during code review processes, team transitions, or when preparing legacy AL code for enhancement. The systematic conversion creates a foundation for reliable code evolution without introducing scope-related bugs.
|
|
19
|
+
|
|
20
|
+
## Conversion Methodology
|
|
21
|
+
|
|
22
|
+
### Systematic Identification
|
|
23
|
+
|
|
24
|
+
Begin conversion efforts by cataloging all single-statement constructs across the AL codebase. Focus on conditional statements, loop constructs, and exception handlers where single statements appear without compound block structure.
|
|
25
|
+
|
|
26
|
+
Use development environment search capabilities to locate patterns like if-then without corresponding begin-end blocks, while loops with single statements, and case branches containing only single operations.
|
|
27
|
+
|
|
28
|
+
Document the scope of conversion work to prioritize high-impact areas and coordinate conversion efforts across development team members. This systematic approach prevents duplicate work and ensures comprehensive coverage.
|
|
29
|
+
|
|
30
|
+
### Priority-Based Conversion
|
|
31
|
+
|
|
32
|
+
Start conversion efforts with frequently modified code sections where the compound statement benefits provide immediate value. Focus on procedures and triggers that undergo regular enhancement or maintenance activities.
|
|
33
|
+
|
|
34
|
+
Prioritize conversion in business logic implementations where requirements changes commonly add new statements to existing conditional or loop constructs. These areas benefit most from the future-proofing aspects of compound statements.
|
|
35
|
+
|
|
36
|
+
Consider the development team's current work to align conversion efforts with active development areas. This coordination maximizes the immediate benefits while minimizing disruption to ongoing feature development.
|
|
37
|
+
|
|
38
|
+
### Safe Transformation Process
|
|
39
|
+
|
|
40
|
+
Implement conversion changes through controlled refactoring sessions rather than bulk automated transformations. This approach allows verification of each change and prevents introduction of unintended side effects.
|
|
41
|
+
|
|
42
|
+
Test each conversion increment to ensure behavioral equivalence between single-statement and compound block implementations. Use existing unit tests or create focused test scenarios to validate conversion accuracy.
|
|
43
|
+
|
|
44
|
+
Apply version control branching strategies to isolate conversion work from feature development, allowing safe experimentation and easy rollback if issues arise during the transformation process.
|
|
45
|
+
|
|
46
|
+
## Development Environment Integration
|
|
47
|
+
|
|
48
|
+
### Editor Enhancement
|
|
49
|
+
|
|
50
|
+
Configure AL development environments to automatically suggest compound statement conversions during code editing. Many modern editors provide refactoring tools that can identify single-statement opportunities and offer conversion suggestions.
|
|
51
|
+
|
|
52
|
+
Set up code formatting rules that automatically insert begin-end blocks when creating new conditional or loop constructs. This proactive approach prevents the accumulation of single-statement constructs in new development.
|
|
53
|
+
|
|
54
|
+
Use editor extensions or plugins that highlight single-statement constructs during code review, making conversion opportunities visible without manual scanning.
|
|
55
|
+
|
|
56
|
+
### Automated Detection
|
|
57
|
+
|
|
58
|
+
Implement code analysis tools that identify single-statement patterns and generate conversion recommendations. These tools can scan entire AL projects and provide comprehensive reports on conversion opportunities.
|
|
59
|
+
|
|
60
|
+
Create custom linting rules that flag single-statement constructs as style violations, encouraging developers to use compound blocks consistently. Configure these rules with appropriate severity levels to balance enforcement with development workflow efficiency.
|
|
61
|
+
|
|
62
|
+
Integrate conversion detection into continuous integration processes to catch single-statement introductions before they enter the main codebase. This prevents the accumulation of inconsistent patterns.
|
|
63
|
+
|
|
64
|
+
### Template Integration
|
|
65
|
+
|
|
66
|
+
Update code templates and snippets to generate compound statements by default rather than single-statement alternatives. This proactive measure ensures new code follows compound statement patterns automatically.
|
|
67
|
+
|
|
68
|
+
Modify code generation tools and wizards to produce begin-end blocks consistently across all conditional and iterative constructs. This systematic approach eliminates the need for subsequent conversion work.
|
|
69
|
+
|
|
70
|
+
Share updated templates across development team members to ensure consistent adoption of compound statement patterns in all new development efforts.
|
|
71
|
+
|
|
72
|
+
## Team Collaboration Strategies
|
|
73
|
+
|
|
74
|
+
### Conversion Planning
|
|
75
|
+
|
|
76
|
+
Coordinate conversion efforts across development team members to prevent conflicts and ensure comprehensive coverage. Establish clear ownership of different code areas to avoid duplicate conversion work.
|
|
77
|
+
|
|
78
|
+
Schedule conversion activities during development lulls or maintenance windows to minimize impact on feature development timelines. Plan conversion work in manageable increments that fit within available development capacity.
|
|
79
|
+
|
|
80
|
+
Communicate conversion priorities and progress to keep team members informed about changing code patterns and ensure alignment with ongoing development activities.
|
|
81
|
+
|
|
82
|
+
### Knowledge Transfer
|
|
83
|
+
|
|
84
|
+
Provide training and documentation to help team members understand compound statement benefits and conversion techniques. Focus on practical examples that demonstrate the maintainability advantages.
|
|
85
|
+
|
|
86
|
+
Establish mentoring relationships between experienced developers and those new to compound statement patterns. This peer support accelerates adoption and ensures consistent application across the team.
|
|
87
|
+
|
|
88
|
+
Create conversion guidelines that document approved techniques and common pitfalls to avoid. Share these guidelines through team knowledge bases or development wikis.
|
|
89
|
+
|
|
90
|
+
### Quality Assurance
|
|
91
|
+
|
|
92
|
+
Implement peer review processes for conversion work to ensure accuracy and maintain code quality standards. Use code review sessions as teaching opportunities to reinforce compound statement benefits.
|
|
93
|
+
|
|
94
|
+
Establish testing protocols that verify conversion accuracy and prevent regression introduction during transformation activities. Create focused test scenarios that validate behavioral equivalence.
|
|
95
|
+
|
|
96
|
+
Monitor conversion quality metrics to identify areas where additional training or process refinement might improve outcomes. Track conversion accuracy and team adoption rates to measure progress.
|
|
97
|
+
|
|
98
|
+
## Common Conversion Scenarios
|
|
99
|
+
|
|
100
|
+
### Legacy Code Enhancement
|
|
101
|
+
|
|
102
|
+
Address legacy AL codebases that predominantly use single-statement patterns by implementing gradual conversion strategies. Focus on high-value areas where maintainability improvements provide immediate benefits.
|
|
103
|
+
|
|
104
|
+
Plan conversion work around scheduled maintenance activities or enhancement projects to maximize efficiency and minimize dedicated refactoring overhead.
|
|
105
|
+
|
|
106
|
+
Document legacy code patterns and conversion rationale to help future developers understand the evolution of coding standards within the organization.
|
|
107
|
+
|
|
108
|
+
### Code Review Integration
|
|
109
|
+
|
|
110
|
+
Incorporate conversion opportunities into regular code review processes, using review sessions to identify and address single-statement patterns as they arise.
|
|
111
|
+
|
|
112
|
+
Establish review guidelines that encourage compound statement adoption without creating adversarial review environments. Focus on educational benefits rather than strict enforcement.
|
|
113
|
+
|
|
114
|
+
Use review comments to explain compound statement benefits and provide conversion examples that demonstrate improved maintainability.
|
|
115
|
+
|
|
116
|
+
### New Developer Onboarding
|
|
117
|
+
|
|
118
|
+
Include compound statement conversion skills in new developer training programs to establish proper coding patterns from the beginning of team tenure.
|
|
119
|
+
|
|
120
|
+
Provide hands-on conversion exercises that give new developers experience with both identification and transformation techniques. Use real codebase examples to make training relevant.
|
|
121
|
+
|
|
122
|
+
Assign conversion tasks as learning opportunities for new team members, providing mentorship and feedback throughout the process.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Template Method Pattern in AL"
|
|
3
|
+
domain: "sam-coder"
|
|
4
|
+
difficulty: "intermediate"
|
|
5
|
+
bc_versions: "14+"
|
|
6
|
+
tags: ["template-method", "behavioral-patterns", "algorithm-structure", "inheritance"]
|
|
7
|
+
prerequisites: ["object-orientation-al", "inheritance-patterns", "virtual-methods"]
|
|
8
|
+
samples: "samples/template-method-pattern.md"
|
|
9
|
+
related_topics: ["business-process-template-patterns", "type-safe-operations-al"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Template Method Pattern in AL
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
The Template Method Pattern defines the skeleton of an algorithm in a base class, allowing subclasses to override specific steps without changing the algorithm's structure. In AL development, this pattern enables consistent process execution while providing flexibility for customization.
|
|
17
|
+
|
|
18
|
+
**Key Benefit**: Provides a stable algorithm framework that ensures consistent execution while enabling customization of specific steps through inheritance.
|
|
19
|
+
|
|
20
|
+
## Core Pattern Architecture
|
|
21
|
+
|
|
22
|
+
### Algorithm Skeleton Definition
|
|
23
|
+
Define the overall algorithm structure in a base codeunit or interface, establishing the sequence of operations and control flow.
|
|
24
|
+
|
|
25
|
+
### Extension Points
|
|
26
|
+
Identify specific steps in the algorithm that can be customized by subclasses while maintaining the overall algorithm integrity.
|
|
27
|
+
|
|
28
|
+
### Invariant Operations
|
|
29
|
+
Implement operations that remain constant across all algorithm implementations, providing stability and consistency.
|
|
30
|
+
|
|
31
|
+
## Implementation Strategies
|
|
32
|
+
|
|
33
|
+
### Virtual Method Framework
|
|
34
|
+
Use virtual methods in AL to create extension points that subclasses can override while maintaining the template algorithm structure.
|
|
35
|
+
|
|
36
|
+
### Interface-Based Templates
|
|
37
|
+
Design template patterns using interfaces to define algorithm contracts that implementing classes must fulfill.
|
|
38
|
+
|
|
39
|
+
### Event-Driven Templates
|
|
40
|
+
Integrate template methods with AL event systems to provide extension points without requiring inheritance.
|
|
41
|
+
|
|
42
|
+
## AL-Specific Patterns
|
|
43
|
+
|
|
44
|
+
### Codeunit Template Hierarchy
|
|
45
|
+
Create codeunit hierarchies where base codeunits define template algorithms and derived codeunits customize specific operations.
|
|
46
|
+
|
|
47
|
+
### Page Template Patterns
|
|
48
|
+
Implement page template patterns that provide consistent user interaction flows while allowing customization of specific behaviors.
|
|
49
|
+
|
|
50
|
+
### Report Template Framework
|
|
51
|
+
Design report templates that define consistent report generation algorithms while enabling customization of data processing and formatting.
|
|
52
|
+
|
|
53
|
+
## Advanced Template Techniques
|
|
54
|
+
|
|
55
|
+
### Multi-Phase Templates
|
|
56
|
+
Design template algorithms that support multiple phases of execution, enabling complex customization scenarios.
|
|
57
|
+
|
|
58
|
+
### Conditional Template Execution
|
|
59
|
+
Implement template methods that can conditionally execute different algorithm branches based on runtime conditions or configuration.
|
|
60
|
+
|
|
61
|
+
### Nested Template Patterns
|
|
62
|
+
Create nested template structures where template methods can invoke other template methods, enabling complex algorithm composition.
|
|
63
|
+
|
|
64
|
+
## Advanced Implementation
|
|
65
|
+
|
|
66
|
+
### Process Integration
|
|
67
|
+
Design templates for business processes, data operations, and workflow automation with consistent error handling.
|
|
68
|
+
|
|
69
|
+
### Performance & Validation
|
|
70
|
+
Optimize template efficiency, implement lazy evaluation, and provide consistent validation approaches.
|
|
71
|
+
|
|
72
|
+
## Implementation Guidelines
|
|
73
|
+
|
|
74
|
+
### Testing & Documentation
|
|
75
|
+
Validate template structure, test customizations, and provide comprehensive documentation with clear customization guidelines.
|
|
76
|
+
|
|
77
|
+
### Framework Integration
|
|
78
|
+
Integrate with existing Business Central frameworks and patterns for consistent implementation.
|
|
79
|
+
|
|
80
|
+
### Extension Integration
|
|
81
|
+
Design templates that work effectively with AL extension mechanisms and AppSource publishing requirements.
|
|
82
|
+
|
|
83
|
+
### Cross-Module Templates
|
|
84
|
+
Create template patterns that can work across different modules while maintaining consistent behavior.
|
|
85
|
+
|
|
86
|
+
## Best Practices
|
|
87
|
+
|
|
88
|
+
Keep algorithms focused, minimize extension points, document contracts, and implement comprehensive error handling.
|
|
89
|
+
|
|
90
|
+
## Common Pitfalls
|
|
91
|
+
|
|
92
|
+
Avoid template complexity and inflexible designs that reduce effectiveness and customization opportunities.
|
|
93
|
+
|
|
94
|
+
*Complete template method examples: samples/template-method-pattern.md*
|
|
95
|
+
*Business process templates: business-process-template-patterns.md*
|
|
96
|
+
*Type-safe implementations: type-safe-operations-al.md*
|