@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,280 @@
|
|
|
1
|
+
# Lonely Repeat Statement Pattern - AL Code Examples
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
The "Lonely Repeat Statement Pattern" refers to repeat-until loops that are difficult to read due to poor formatting, unclear conditions, or lack of proper structure. This sample demonstrates how to identify and fix these patterns in AL code.
|
|
5
|
+
|
|
6
|
+
## Problem Pattern: Lonely and Hard-to-Read Repeat Statements
|
|
7
|
+
|
|
8
|
+
### Example 1: Basic Formatting Issues
|
|
9
|
+
|
|
10
|
+
**Problematic Code:**
|
|
11
|
+
```al
|
|
12
|
+
procedure ProcessCustomerRecords()
|
|
13
|
+
var
|
|
14
|
+
Customer: Record Customer;
|
|
15
|
+
Counter: Integer;
|
|
16
|
+
begin
|
|
17
|
+
Customer.FindFirst();
|
|
18
|
+
repeat Customer.CalcFields("Sales (LCY)"); if Customer."Sales (LCY)" > 10000 then begin Counter += 1; Message('High value customer: %1', Customer.Name); end; until Customer.Next() = 0;
|
|
19
|
+
end;
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Improved Code:**
|
|
23
|
+
```al
|
|
24
|
+
procedure ProcessCustomerRecords()
|
|
25
|
+
var
|
|
26
|
+
Customer: Record Customer;
|
|
27
|
+
Counter: Integer;
|
|
28
|
+
begin
|
|
29
|
+
if Customer.FindFirst() then
|
|
30
|
+
repeat
|
|
31
|
+
Customer.CalcFields("Sales (LCY)");
|
|
32
|
+
if Customer."Sales (LCY)" > 10000 then begin
|
|
33
|
+
Counter += 1;
|
|
34
|
+
Message('High value customer: %1', Customer.Name);
|
|
35
|
+
end;
|
|
36
|
+
until Customer.Next() = 0;
|
|
37
|
+
end;
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Example 2: Complex Condition Handling
|
|
41
|
+
|
|
42
|
+
**Problematic Code:**
|
|
43
|
+
```al
|
|
44
|
+
procedure ValidateItemInventory()
|
|
45
|
+
var
|
|
46
|
+
Item: Record Item;
|
|
47
|
+
InventorySetup: Record "Inventory Setup";
|
|
48
|
+
IsValid: Boolean;
|
|
49
|
+
begin
|
|
50
|
+
Item.SetRange(Blocked, false);
|
|
51
|
+
Item.FindFirst();
|
|
52
|
+
repeat IsValid := true; Item.CalcFields(Inventory); if (Item.Inventory < Item."Reorder Point") and (Item."Reorder Point" > 0) and (Item."Replenishment System" = Item."Replenishment System"::Purchase) then IsValid := false; if not IsValid then Error('Item %1 needs reordering', Item."No."); until Item.Next() = 0;
|
|
53
|
+
end;
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Improved Code:**
|
|
57
|
+
```al
|
|
58
|
+
procedure ValidateItemInventory()
|
|
59
|
+
var
|
|
60
|
+
Item: Record Item;
|
|
61
|
+
NeedsReordering: Boolean;
|
|
62
|
+
begin
|
|
63
|
+
Item.SetRange(Blocked, false);
|
|
64
|
+
if Item.FindFirst() then
|
|
65
|
+
repeat
|
|
66
|
+
Item.CalcFields(Inventory);
|
|
67
|
+
|
|
68
|
+
NeedsReordering := (Item.Inventory < Item."Reorder Point") and
|
|
69
|
+
(Item."Reorder Point" > 0) and
|
|
70
|
+
(Item."Replenishment System" = Item."Replenishment System"::Purchase);
|
|
71
|
+
|
|
72
|
+
if NeedsReordering then
|
|
73
|
+
Error('Item %1 needs reordering', Item."No.");
|
|
74
|
+
until Item.Next() = 0;
|
|
75
|
+
end;
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Advanced Pattern Improvements
|
|
79
|
+
|
|
80
|
+
### Example 3: Nested Loop Clarity
|
|
81
|
+
|
|
82
|
+
**Problematic Code:**
|
|
83
|
+
```al
|
|
84
|
+
procedure RecalculateCustomerStatistics()
|
|
85
|
+
var
|
|
86
|
+
Customer: Record Customer;
|
|
87
|
+
SalesLine: Record "Sales Line";
|
|
88
|
+
TotalAmount: Decimal;
|
|
89
|
+
begin
|
|
90
|
+
Customer.FindFirst();
|
|
91
|
+
repeat TotalAmount := 0; SalesLine.SetRange("Sell-to Customer No.", Customer."No."); if SalesLine.FindFirst() then repeat TotalAmount += SalesLine."Line Amount"; until SalesLine.Next() = 0; Customer."Sales (LCY)" := TotalAmount; Customer.Modify(); until Customer.Next() = 0;
|
|
92
|
+
end;
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Improved Code:**
|
|
96
|
+
```al
|
|
97
|
+
procedure RecalculateCustomerStatistics()
|
|
98
|
+
var
|
|
99
|
+
Customer: Record Customer;
|
|
100
|
+
SalesLine: Record "Sales Line";
|
|
101
|
+
TotalAmount: Decimal;
|
|
102
|
+
begin
|
|
103
|
+
if Customer.FindFirst() then
|
|
104
|
+
repeat
|
|
105
|
+
TotalAmount := 0;
|
|
106
|
+
SalesLine.SetRange("Sell-to Customer No.", Customer."No.");
|
|
107
|
+
|
|
108
|
+
if SalesLine.FindFirst() then
|
|
109
|
+
repeat
|
|
110
|
+
TotalAmount += SalesLine."Line Amount";
|
|
111
|
+
until SalesLine.Next() = 0;
|
|
112
|
+
|
|
113
|
+
Customer."Sales (LCY)" := TotalAmount;
|
|
114
|
+
Customer.Modify();
|
|
115
|
+
until Customer.Next() = 0;
|
|
116
|
+
end;
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Example 4: Error Handling in Repeat Loops
|
|
120
|
+
|
|
121
|
+
**Problematic Code:**
|
|
122
|
+
```al
|
|
123
|
+
procedure PostSalesDocuments()
|
|
124
|
+
var
|
|
125
|
+
SalesHeader: Record "Sales Header";
|
|
126
|
+
SalesPost: Codeunit "Sales-Post";
|
|
127
|
+
begin
|
|
128
|
+
SalesHeader.SetRange("Document Type", SalesHeader."Document Type"::Order);
|
|
129
|
+
SalesHeader.SetRange(Status, SalesHeader.Status::Released);
|
|
130
|
+
SalesHeader.FindFirst();
|
|
131
|
+
repeat if not SalesPost.Run(SalesHeader) then Message('Error posting document %1', SalesHeader."No."); until SalesHeader.Next() = 0;
|
|
132
|
+
end;
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Improved Code:**
|
|
136
|
+
```al
|
|
137
|
+
procedure PostSalesDocuments()
|
|
138
|
+
var
|
|
139
|
+
SalesHeader: Record "Sales Header";
|
|
140
|
+
SalesPost: Codeunit "Sales-Post";
|
|
141
|
+
DocumentsProcessed: Integer;
|
|
142
|
+
DocumentsFailed: Integer;
|
|
143
|
+
begin
|
|
144
|
+
SalesHeader.SetRange("Document Type", SalesHeader."Document Type"::Order);
|
|
145
|
+
SalesHeader.SetRange(Status, SalesHeader.Status::Released);
|
|
146
|
+
|
|
147
|
+
if SalesHeader.FindFirst() then
|
|
148
|
+
repeat
|
|
149
|
+
Clear(SalesPost);
|
|
150
|
+
if SalesPost.Run(SalesHeader) then
|
|
151
|
+
DocumentsProcessed += 1
|
|
152
|
+
else begin
|
|
153
|
+
DocumentsFailed += 1;
|
|
154
|
+
Message('Error posting document %1: %2', SalesHeader."No.", GetLastErrorText());
|
|
155
|
+
end;
|
|
156
|
+
until SalesHeader.Next() = 0;
|
|
157
|
+
|
|
158
|
+
Message('Processing complete. Posted: %1, Failed: %2', DocumentsProcessed, DocumentsFailed);
|
|
159
|
+
end;
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Performance and Safety Patterns
|
|
163
|
+
|
|
164
|
+
### Example 5: Large Dataset Processing
|
|
165
|
+
|
|
166
|
+
**Problematic Code:**
|
|
167
|
+
```al
|
|
168
|
+
procedure ArchiveOldEntries()
|
|
169
|
+
var
|
|
170
|
+
GLEntry: Record "G/L Entry";
|
|
171
|
+
ArchiveEntry: Record "G/L Entry Archive";
|
|
172
|
+
begin
|
|
173
|
+
GLEntry.SetFilter("Posting Date", '<%1', CalcDate('-2Y', Today()));
|
|
174
|
+
GLEntry.FindFirst();
|
|
175
|
+
repeat ArchiveEntry.TransferFields(GLEntry); ArchiveEntry.Insert(); GLEntry.Delete(); until GLEntry.Next() = 0;
|
|
176
|
+
end;
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Improved Code:**
|
|
180
|
+
```al
|
|
181
|
+
procedure ArchiveOldEntries()
|
|
182
|
+
var
|
|
183
|
+
GLEntry: Record "G/L Entry";
|
|
184
|
+
ArchiveEntry: Record "G/L Entry Archive";
|
|
185
|
+
ProcessedCount: Integer;
|
|
186
|
+
BatchSize: Integer;
|
|
187
|
+
begin
|
|
188
|
+
BatchSize := 1000; // Process in batches for better performance
|
|
189
|
+
ProcessedCount := 0;
|
|
190
|
+
|
|
191
|
+
GLEntry.SetFilter("Posting Date", '<%1', CalcDate('-2Y', Today()));
|
|
192
|
+
|
|
193
|
+
if GLEntry.FindFirst() then
|
|
194
|
+
repeat
|
|
195
|
+
ArchiveEntry.TransferFields(GLEntry);
|
|
196
|
+
ArchiveEntry.Insert();
|
|
197
|
+
GLEntry.Delete();
|
|
198
|
+
|
|
199
|
+
ProcessedCount += 1;
|
|
200
|
+
|
|
201
|
+
// Commit periodically to avoid long transactions
|
|
202
|
+
if ProcessedCount mod BatchSize = 0 then begin
|
|
203
|
+
Commit();
|
|
204
|
+
Message('Processed %1 entries...', ProcessedCount);
|
|
205
|
+
end;
|
|
206
|
+
until GLEntry.Next() = 0;
|
|
207
|
+
|
|
208
|
+
Message('Archive complete. Total entries processed: %1', ProcessedCount);
|
|
209
|
+
end;
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Example 6: Conditional Processing with Early Exit
|
|
213
|
+
|
|
214
|
+
**Problematic Code:**
|
|
215
|
+
```al
|
|
216
|
+
procedure FindFirstAvailableItem(LocationCode: Code[10]): Code[20]
|
|
217
|
+
var
|
|
218
|
+
Item: Record Item;
|
|
219
|
+
ItemLedgerEntry: Record "Item Ledger Entry";
|
|
220
|
+
AvailableQty: Decimal;
|
|
221
|
+
begin
|
|
222
|
+
Item.FindFirst();
|
|
223
|
+
repeat Item.SetRange("Location Filter", LocationCode); Item.CalcFields(Inventory); if Item.Inventory > 0 then exit(Item."No."); until Item.Next() = 0;
|
|
224
|
+
end;
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**Improved Code:**
|
|
228
|
+
```al
|
|
229
|
+
procedure FindFirstAvailableItem(LocationCode: Code[10]): Code[20]
|
|
230
|
+
var
|
|
231
|
+
Item: Record Item;
|
|
232
|
+
begin
|
|
233
|
+
Item.SetRange(Blocked, false);
|
|
234
|
+
Item.SetRange(Type, Item.Type::Inventory);
|
|
235
|
+
|
|
236
|
+
if Item.FindFirst() then
|
|
237
|
+
repeat
|
|
238
|
+
Item.SetRange("Location Filter", LocationCode);
|
|
239
|
+
Item.CalcFields(Inventory);
|
|
240
|
+
|
|
241
|
+
if Item.Inventory > 0 then
|
|
242
|
+
exit(Item."No.");
|
|
243
|
+
until Item.Next() = 0;
|
|
244
|
+
|
|
245
|
+
// Return empty if no available item found
|
|
246
|
+
exit('');
|
|
247
|
+
end;
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Best Practices Summary
|
|
251
|
+
|
|
252
|
+
### Formatting Guidelines
|
|
253
|
+
1. **Always use proper indentation** for repeat-until blocks
|
|
254
|
+
2. **Place conditions on separate lines** for complex boolean expressions
|
|
255
|
+
3. **Use meaningful variable names** instead of inline calculations
|
|
256
|
+
4. **Add blank lines** to separate logical sections within loops
|
|
257
|
+
|
|
258
|
+
### Performance Considerations
|
|
259
|
+
1. **Process in batches** for large datasets to avoid transaction timeouts
|
|
260
|
+
2. **Use proper filters** before starting repeat loops to minimize iterations
|
|
261
|
+
3. **Calculate fields only when necessary** within the loop
|
|
262
|
+
4. **Consider using FindSet()** with ReadOnly parameter for read-only operations
|
|
263
|
+
|
|
264
|
+
### Error Handling
|
|
265
|
+
1. **Always check FindFirst() result** before starting repeat loop
|
|
266
|
+
2. **Handle errors gracefully** with appropriate user feedback
|
|
267
|
+
3. **Use Clear()** on codeunit variables before calling Run()
|
|
268
|
+
4. **Implement progress indicators** for long-running operations
|
|
269
|
+
|
|
270
|
+
### Code Readability
|
|
271
|
+
1. **Extract complex conditions** into well-named boolean variables
|
|
272
|
+
2. **Use early exit patterns** when searching for specific records
|
|
273
|
+
3. **Add comments** to explain business logic within loops
|
|
274
|
+
4. **Avoid deeply nested structures** by using helper procedures
|
|
275
|
+
|
|
276
|
+
## Related Patterns
|
|
277
|
+
- **FindSet Pattern**: Use `FindSet()` with `ReadOnly` parameter for better performance when only reading data
|
|
278
|
+
- **Batch Processing Pattern**: Process records in controlled batches with periodic commits
|
|
279
|
+
- **Error Accumulation Pattern**: Collect errors during processing and report them together
|
|
280
|
+
- **Progress Indication Pattern**: Provide user feedback during long-running repeat operations
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# Testability Code Smell Examples
|
|
2
|
+
|
|
3
|
+
## Code Smell #1: Direct BC Table Access
|
|
4
|
+
|
|
5
|
+
### ❌ Problematic Code
|
|
6
|
+
```al
|
|
7
|
+
procedure CalculateCustomerDiscount(CustomerNo: Code[20]; Amount: Decimal): Decimal
|
|
8
|
+
var
|
|
9
|
+
Customer: Record Customer;
|
|
10
|
+
CustomerPriceGroup: Record "Customer Price Group";
|
|
11
|
+
DiscountPct: Decimal;
|
|
12
|
+
begin
|
|
13
|
+
// Direct access to BC tables
|
|
14
|
+
Customer.Get(CustomerNo);
|
|
15
|
+
Customer.TestField("Customer Price Group");
|
|
16
|
+
|
|
17
|
+
CustomerPriceGroup.Get(Customer."Customer Price Group");
|
|
18
|
+
DiscountPct := CustomerPriceGroup."Discount %";
|
|
19
|
+
|
|
20
|
+
if Customer."Allow Line Disc." then
|
|
21
|
+
DiscountPct += 5;
|
|
22
|
+
|
|
23
|
+
exit(Amount * DiscountPct / 100);
|
|
24
|
+
end;
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Why It's Problematic
|
|
28
|
+
To test this, you need:
|
|
29
|
+
- A Customer record with specific fields populated
|
|
30
|
+
- A Customer Price Group record
|
|
31
|
+
- Proper relationships between them
|
|
32
|
+
|
|
33
|
+
Test becomes:
|
|
34
|
+
```al
|
|
35
|
+
[Test]
|
|
36
|
+
procedure Test_CustomerDiscount()
|
|
37
|
+
begin
|
|
38
|
+
// [GIVEN] Customer with price group
|
|
39
|
+
LibrarySales.CreateCustomer(Customer);
|
|
40
|
+
Customer."Allow Line Disc." := true;
|
|
41
|
+
Customer.Modify();
|
|
42
|
+
|
|
43
|
+
// [GIVEN] Price group with discount
|
|
44
|
+
CreateCustomerPriceGroup(PriceGroup);
|
|
45
|
+
PriceGroup."Discount %" := 10;
|
|
46
|
+
PriceGroup.Modify();
|
|
47
|
+
|
|
48
|
+
Customer."Customer Price Group" := PriceGroup.Code;
|
|
49
|
+
Customer.Modify();
|
|
50
|
+
|
|
51
|
+
// You're testing BC table relationships, not your discount logic!
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### ✅ Better: Separate Data Access from Logic
|
|
55
|
+
```al
|
|
56
|
+
// Interface for getting discount configuration
|
|
57
|
+
interface IDiscountConfiguration
|
|
58
|
+
{
|
|
59
|
+
procedure GetBaseDiscount(CustomerNo: Code[20]): Decimal;
|
|
60
|
+
procedure AllowsLineDiscount(CustomerNo: Code[20]): Boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Business logic - testable
|
|
64
|
+
procedure CalculateDiscount(Amount: Decimal; BaseDiscount: Decimal; AllowLineDiscount: Boolean): Decimal
|
|
65
|
+
var
|
|
66
|
+
TotalDiscount: Decimal;
|
|
67
|
+
begin
|
|
68
|
+
TotalDiscount := BaseDiscount;
|
|
69
|
+
if AllowLineDiscount then
|
|
70
|
+
TotalDiscount += 5;
|
|
71
|
+
exit(Amount * TotalDiscount / 100);
|
|
72
|
+
end;
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Code Smell #2: Tests Full of Unrelated GIVENs
|
|
78
|
+
|
|
79
|
+
### ❌ Problematic Test
|
|
80
|
+
```al
|
|
81
|
+
[Test]
|
|
82
|
+
procedure Test_CalculateShippingCost()
|
|
83
|
+
var
|
|
84
|
+
Customer: Record Customer;
|
|
85
|
+
Item: Record Item;
|
|
86
|
+
SalesHeader: Record "Sales Header";
|
|
87
|
+
SalesLine: Record "Sales Line";
|
|
88
|
+
ShippingAgent: Record "Shipping Agent";
|
|
89
|
+
ShippingService: Record "Shipping Agent Services";
|
|
90
|
+
begin
|
|
91
|
+
// [GIVEN] Customer
|
|
92
|
+
LibrarySales.CreateCustomer(Customer);
|
|
93
|
+
|
|
94
|
+
// [GIVEN] Shipping Agent with service
|
|
95
|
+
LibraryInventory.CreateShippingAgent(ShippingAgent);
|
|
96
|
+
LibraryInventory.CreateShippingAgentService(ShippingAgent.Code, ShippingService);
|
|
97
|
+
ShippingService."Shipping Cost" := 10;
|
|
98
|
+
ShippingService.Modify();
|
|
99
|
+
|
|
100
|
+
// [GIVEN] Item with weight
|
|
101
|
+
LibraryInventory.CreateItem(Item);
|
|
102
|
+
Item."Gross Weight" := 5;
|
|
103
|
+
Item.Modify();
|
|
104
|
+
|
|
105
|
+
// [GIVEN] Sales Order
|
|
106
|
+
LibrarySales.CreateSalesHeader(SalesHeader, SalesHeader."Document Type"::Order, Customer."No.");
|
|
107
|
+
SalesHeader."Shipping Agent Code" := ShippingAgent.Code;
|
|
108
|
+
SalesHeader."Shipping Agent Service Code" := ShippingService.Code;
|
|
109
|
+
SalesHeader.Modify();
|
|
110
|
+
|
|
111
|
+
// [GIVEN] Sales Line
|
|
112
|
+
LibrarySales.CreateSalesLine(SalesLine, SalesHeader, SalesLine.Type::Item, Item."No.", 10);
|
|
113
|
+
|
|
114
|
+
// [WHEN] Calculate shipping
|
|
115
|
+
ShippingCalculator.Calculate(SalesHeader);
|
|
116
|
+
|
|
117
|
+
// [THEN] Cost is correct
|
|
118
|
+
SalesHeader.Find();
|
|
119
|
+
Assert.AreEqual(50, SalesHeader."Shipping Cost", 'Expected 5kg * 10 units * $1/kg');
|
|
120
|
+
end;
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Why It's Problematic
|
|
124
|
+
- 25 lines of GIVEN for 2 lines of WHEN/THEN
|
|
125
|
+
- Most GIVENs satisfy BC table requirements, not business logic
|
|
126
|
+
- If BC changes Customer or Item structure, test breaks
|
|
127
|
+
- Slow due to database operations
|
|
128
|
+
|
|
129
|
+
### ✅ Better: Test the Calculation Directly
|
|
130
|
+
```al
|
|
131
|
+
[Test]
|
|
132
|
+
procedure Test_CalculateShippingCost()
|
|
133
|
+
var
|
|
134
|
+
Calculator: Codeunit "Shipping Calculator";
|
|
135
|
+
Weight: Decimal;
|
|
136
|
+
CostPerKg: Decimal;
|
|
137
|
+
ExpectedCost: Decimal;
|
|
138
|
+
begin
|
|
139
|
+
// [GIVEN] Known weight and cost rate
|
|
140
|
+
Weight := 50; // 5kg * 10 units
|
|
141
|
+
CostPerKg := 1;
|
|
142
|
+
|
|
143
|
+
// [WHEN] Calculate shipping cost
|
|
144
|
+
ActualCost := Calculator.CalculateCost(Weight, CostPerKg);
|
|
145
|
+
|
|
146
|
+
// [THEN] Cost is weight * rate
|
|
147
|
+
Assert.AreEqual(50, ActualCost, 'Weight * CostPerKg');
|
|
148
|
+
end;
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Code Smell #3: Assertions Testing BC Behavior
|
|
154
|
+
|
|
155
|
+
### ❌ Problematic Test
|
|
156
|
+
```al
|
|
157
|
+
[Test]
|
|
158
|
+
procedure Test_CurrencyConversion()
|
|
159
|
+
begin
|
|
160
|
+
// [GIVEN] Currencies and exchange rates
|
|
161
|
+
LibraryERM.CreateCurrency(FromCurrency);
|
|
162
|
+
LibraryERM.CreateCurrency(ToCurrency);
|
|
163
|
+
LibraryERM.CreateExchangeRate(FromCurrency.Code, WorkDate(), 10, 10);
|
|
164
|
+
LibraryERM.CreateExchangeRate(ToCurrency.Code, WorkDate(), 0.1, 0.1);
|
|
165
|
+
|
|
166
|
+
// [WHEN] Convert 1 unit
|
|
167
|
+
Amount := Converter.Convert(1, FromCurrency.Code, ToCurrency.Code);
|
|
168
|
+
|
|
169
|
+
// [THEN] Amount is converted correctly
|
|
170
|
+
Assert.AreEqual(0.01, Amount, 'Conversion incorrect');
|
|
171
|
+
// ^^^ Do you even know WHY this should be 0.01?
|
|
172
|
+
end;
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Why It's Problematic
|
|
176
|
+
- The expected value (0.01) comes from BC's calculation, not your knowledge
|
|
177
|
+
- You're testing BC's exchange rate math, not your code
|
|
178
|
+
- If BC changes rounding rules, your test breaks (but your code might be fine)
|
|
179
|
+
|
|
180
|
+
### ✅ Better: Use a Stub with Known Values
|
|
181
|
+
```al
|
|
182
|
+
[Test]
|
|
183
|
+
procedure Test_ConversionProcessFlow()
|
|
184
|
+
var
|
|
185
|
+
StubConverter: Codeunit "Stub Currency Converter";
|
|
186
|
+
SpyLogger: Codeunit "Spy Logger";
|
|
187
|
+
begin
|
|
188
|
+
// [GIVEN] Converter that returns known value
|
|
189
|
+
StubConverter.SetReturnValue(42);
|
|
190
|
+
|
|
191
|
+
// [WHEN] Conversion performed
|
|
192
|
+
Amount := MyProcess.Convert(100, 'USD', 'EUR', StubConverter, SpyLogger);
|
|
193
|
+
|
|
194
|
+
// [THEN] Process returns converter's result
|
|
195
|
+
Assert.AreEqual(42, Amount, 'Should return converter result');
|
|
196
|
+
|
|
197
|
+
// [THEN] Logger captured correct input
|
|
198
|
+
Assert.AreEqual(100, SpyLogger.GetCapturedInputAmount(), 'Input logged');
|
|
199
|
+
end;
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Code Smell #4: DeleteAll in Test Setup
|
|
205
|
+
|
|
206
|
+
### ❌ Problematic Test
|
|
207
|
+
```al
|
|
208
|
+
[Test]
|
|
209
|
+
procedure Test_CreateLogEntry()
|
|
210
|
+
var
|
|
211
|
+
IntegrationLog: Record "Integration Log";
|
|
212
|
+
begin
|
|
213
|
+
// [GIVEN] No existing entries
|
|
214
|
+
IntegrationLog.DeleteAll(); // ❌ Modifying shared state
|
|
215
|
+
|
|
216
|
+
// [WHEN] Process runs
|
|
217
|
+
IntegrationProcess.Run();
|
|
218
|
+
|
|
219
|
+
// [THEN] One entry created
|
|
220
|
+
Assert.AreEqual(1, IntegrationLog.Count(), 'Expected one entry');
|
|
221
|
+
end;
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Why It's Problematic
|
|
225
|
+
- Modifies database state that other tests might depend on
|
|
226
|
+
- "No existing entries" is NOT a realistic business scenario
|
|
227
|
+
- Test depends on counting records, not verifying behavior
|
|
228
|
+
|
|
229
|
+
### ✅ Better: Use a Spy Logger
|
|
230
|
+
```al
|
|
231
|
+
[Test]
|
|
232
|
+
procedure Test_ProcessLogsExecution()
|
|
233
|
+
var
|
|
234
|
+
SpyLogger: Codeunit "Spy Logger";
|
|
235
|
+
begin
|
|
236
|
+
// [WHEN] Process runs with spy logger
|
|
237
|
+
IntegrationProcess.Run(SpyLogger);
|
|
238
|
+
|
|
239
|
+
// [THEN] Logger was invoked
|
|
240
|
+
Assert.IsTrue(SpyLogger.WasInvoked(), 'Should log execution');
|
|
241
|
+
Assert.AreEqual('IntegrationProcess', SpyLogger.GetLastOperation(), 'Operation name');
|
|
242
|
+
end;
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Quick Reference: Smells and Fixes
|
|
248
|
+
|
|
249
|
+
| Smell | Symptom | Fix |
|
|
250
|
+
|-------|---------|-----|
|
|
251
|
+
| Direct BC table access | Can't test without database | Interface abstraction |
|
|
252
|
+
| Too many GIVENs | Test setup >> test logic | Dependency injection |
|
|
253
|
+
| Asserting BC values | You calculated expected from BC | Stub with known values |
|
|
254
|
+
| DeleteAll in setup | Cleaning shared state | Spy/Mock instead |
|
|
255
|
+
| Setup switch | `case Setup.Type of` | Interface polymorphism |
|
|
256
|
+
| Mixed data + logic | Single proc does both | Separate into layers |
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Testability Code Smells"
|
|
3
|
+
domain: "roger-reviewer"
|
|
4
|
+
difficulty: "intermediate"
|
|
5
|
+
bc_versions: "18+"
|
|
6
|
+
tags: ["code-review", "testability", "code-smells", "tight-coupling", "dependencies"]
|
|
7
|
+
samples: "samples/testability-code-smells.md"
|
|
8
|
+
related_topics:
|
|
9
|
+
- "../alex-architect/testability-design-patterns.md"
|
|
10
|
+
- "../quinn-tester/isolation-testing-patterns.md"
|
|
11
|
+
source: "Adapted from Vjeko.com: Testing in isolation (Dec 2023)"
|
|
12
|
+
---
|
|
13
|
+
# Testability Code Smells
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
Code that cannot be tested in isolation has recognizable patterns—"code smells" that indicate tight coupling. Identifying these during review catches testability issues before they become embedded.
|
|
18
|
+
|
|
19
|
+
**Core Principle**: If testing requires extensive database setup unrelated to the code's purpose, that code has testability problems.
|
|
20
|
+
|
|
21
|
+
## Code Smell #1: Direct BC Table Access in Business Logic
|
|
22
|
+
|
|
23
|
+
Business logic directly references BC base app or system tables. Testing requires creating those records—you're testing BC's table structure, not your logic.
|
|
24
|
+
|
|
25
|
+
## Code Smell #2: Hardcoded External Service Calls
|
|
26
|
+
|
|
27
|
+
HTTP clients, file operations, or external services directly in business logic. Cannot test without network access; tests hit real systems; flaky due to availability.
|
|
28
|
+
|
|
29
|
+
## Code Smell #3: Tests Full of Unrelated GIVENs
|
|
30
|
+
|
|
31
|
+
Test setup creates data the business logic doesn't directly need. Most GIVENs exist to satisfy BC dependencies, not your logic. Test obscures what's actually being tested.
|
|
32
|
+
|
|
33
|
+
## Code Smell #4: Assertions Testing BC Behavior
|
|
34
|
+
|
|
35
|
+
Test assertions validate BC functionality rather than custom logic. You don't know if the expected value is correct—you're trusting BC's calculation.
|
|
36
|
+
|
|
37
|
+
## Code Smell #5: Setup Switch Instead of Abstraction
|
|
38
|
+
|
|
39
|
+
Configuration-driven branching between implementations (`case Setup.Type of`). Business logic knows about all implementations; adding new ones requires modifying logic. This is MORE coupling, not less.
|
|
40
|
+
|
|
41
|
+
## Code Smell #6: DeleteAll in Test Setup
|
|
42
|
+
|
|
43
|
+
Tests that clean tables to ensure predictable state. Modifies shared state; "no entries" isn't a realistic GIVEN; indicates coupling to storage, not logic.
|
|
44
|
+
|
|
45
|
+
## Code Smell #7: Mixed Data Access and Business Logic
|
|
46
|
+
|
|
47
|
+
Single procedure that retrieves data AND processes it. Cannot test logic without database; cannot test with specific edge cases.
|
|
48
|
+
|
|
49
|
+
## Quick Review Checklist
|
|
50
|
+
|
|
51
|
+
| Question | If Yes → |
|
|
52
|
+
|----------|----------|
|
|
53
|
+
| Does business logic directly access BC tables? | Consider abstraction |
|
|
54
|
+
| Does it call external services directly? | Wrap in interface |
|
|
55
|
+
| Would testing require unrelated BC records? | Dependencies too tight |
|
|
56
|
+
| Are tests asserting BC behavior? | Missing test doubles |
|
|
57
|
+
| Does a switch select implementations? | Use interface instead |
|
|
58
|
+
| Do tests DeleteAll before running? | Test coupled to storage |
|
|
59
|
+
|
|
60
|
+
## Handoff Guidance
|
|
61
|
+
|
|
62
|
+
- **Architectural redesign** → Alex Architect
|
|
63
|
+
- **Implementing test doubles** → Quinn Tester
|
|
64
|
+
- **Interface design patterns** → Alex Architect
|
|
65
|
+
|
|
66
|
+
See samples for code examples of each smell and its fix.
|
|
67
|
+
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "AL Formatting Consistency Patterns"
|
|
3
|
+
domain: "sam-coder"
|
|
4
|
+
difficulty: "intermediate"
|
|
5
|
+
bc_versions: "14+"
|
|
6
|
+
tags: ["formatting", "consistency", "code-standards"]
|
|
7
|
+
type: "improvement-pattern"
|
|
8
|
+
category: "code-quality"
|
|
9
|
+
pattern_type: "good"
|
|
10
|
+
severity: "medium"
|
|
11
|
+
impact_level: "medium"
|
|
12
|
+
improvement_suggestion: "Apply consistent formatting patterns across all AL code to improve maintainability"
|
|
13
|
+
implementation_steps: ["establish-formatting-standards", "apply-consistent-patterns", "validate-uniformity"]
|
|
14
|
+
validation_criteria: ["consistent-formatting-application", "improved-code-uniformity"]
|
|
15
|
+
technical_areas: ["al-code"]
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# AL Formatting Consistency Patterns
|
|
19
|
+
|
|
20
|
+
## Overview
|
|
21
|
+
|
|
22
|
+
Consistent formatting patterns across AL code improve maintainability, reduce cognitive load, and enhance team collaboration. Establishing and applying uniform formatting standards creates professional, readable code that supports effective development workflows.
|
|
23
|
+
|
|
24
|
+
**Key Principle**: Apply consistent formatting patterns uniformly across all AL objects to create predictable, maintainable code structure.
|
|
25
|
+
|
|
26
|
+
## Strategic Framework
|
|
27
|
+
|
|
28
|
+
### Consistency Benefits
|
|
29
|
+
- **Reduced Cognitive Load**: Predictable formatting reduces mental effort
|
|
30
|
+
- **Improved Collaboration**: Team members can focus on logic rather than style
|
|
31
|
+
- **Enhanced Maintainability**: Consistent patterns support easier code updates
|
|
32
|
+
- **Professional Quality**: Uniform appearance reflects development maturity
|
|
33
|
+
|
|
34
|
+
### Code Quality Impact
|
|
35
|
+
Consistent formatting directly impacts code quality by making code easier to read, review, and maintain. It supports effective development practices and reduces errors.
|
|
36
|
+
|
|
37
|
+
## Architecture Focus
|
|
38
|
+
|
|
39
|
+
### Formatting Domains
|
|
40
|
+
- **Indentation Standards**: Consistent spacing and alignment patterns
|
|
41
|
+
- **Keyword Formatting**: Uniform keyword placement and casing
|
|
42
|
+
- **Comment Styles**: Standardized documentation formatting
|
|
43
|
+
- **Expression Layout**: Consistent operator and expression formatting
|
|
44
|
+
|
|
45
|
+
### Pattern Application
|
|
46
|
+
Establish comprehensive formatting standards that cover all aspects of AL code appearance and apply them consistently across entire codebase.
|
|
47
|
+
|
|
48
|
+
## Best Practices
|
|
49
|
+
|
|
50
|
+
### Standards Development
|
|
51
|
+
- **Comprehensive guidelines** covering all AL language elements
|
|
52
|
+
- **Team agreement** on formatting preferences and standards
|
|
53
|
+
- **Tool integration** for automated formatting enforcement
|
|
54
|
+
- **Regular validation** of consistency across codebase
|
|
55
|
+
- **Documentation** of formatting decisions and rationale
|
|
56
|
+
|
|
57
|
+
### Implementation Strategy
|
|
58
|
+
Use automated formatting tools where possible, establish clear team guidelines for manual formatting decisions, and regularly review code for consistency compliance.
|
|
59
|
+
|
|
60
|
+
### Maintenance Approach
|
|
61
|
+
Integrate formatting standards into development workflow through code review processes, automated validation, and team training on consistency importance.
|
|
62
|
+
|
|
63
|
+
## Anti-Patterns
|
|
64
|
+
|
|
65
|
+
### Avoid These Approaches
|
|
66
|
+
- **Mixed formatting styles** within single project
|
|
67
|
+
- **Inconsistent indentation** across AL objects
|
|
68
|
+
- **Random keyword casing** without standards
|
|
69
|
+
- **Varied comment formatting** creating visual inconsistency
|
|
70
|
+
- **No formatting guidelines** leading to style conflicts
|
|
71
|
+
|
|
72
|
+
Inconsistent formatting creates unnecessary cognitive overhead and makes code harder to maintain and review effectively.
|
|
73
|
+
|
|
74
|
+
*Related patterns: al-readability-optimization.md, al-blank-line-organization.md*
|
|
75
|
+
*Cross-references: See samples in other formatting topics for consistency examples*
|