sfcc-dev-mcp 1.0.15 → 1.0.19
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/.github/ISSUE_TEMPLATE/bug_report.yml +3 -1
- package/.github/ISSUE_TEMPLATE/documentation.yml +2 -2
- package/.github/ISSUE_TEMPLATE/question.yml +1 -1
- package/.github/PULL_REQUEST_TEMPLATE/documentation.md +1 -1
- package/.github/PULL_REQUEST_TEMPLATE/new_tool.md +1 -1
- package/.github/agents/official-docs-researcher.agent.md +56 -0
- package/.github/instructions/mcp-node-tests.instructions.md +12 -916
- package/.github/instructions/mcp-yml-tests.instructions.md +14 -742
- package/.github/pull_request_template.md +1 -1
- package/.github/skills/agent-authoring/SKILL.md +66 -0
- package/.github/skills/mcp-log-debugging/SKILL.md +69 -0
- package/.github/skills/mcp-programmatic-testing/SKILL.md +142 -0
- package/.github/skills/mcp-yaml-testing/SKILL.md +136 -0
- package/.github/skills/salesforce-developer-site-scraper/SKILL.md +102 -0
- package/.github/skills/salesforce-developer-site-scraper/scripts/scrape-to-markdown.js +205 -0
- package/.github/skills/salesforce-help-site-scraper/SKILL.md +84 -0
- package/.github/skills/salesforce-help-site-scraper/scripts/scrape-help-to-markdown.js +212 -0
- package/.github/skills/skill-authoring/SKILL.md +228 -0
- package/.github/skills/skill-authoring/references/PATTERNS.md +384 -0
- package/.github/workflows/ci.yml +3 -3
- package/.github/workflows/deploy-pages.yml +9 -19
- package/.github/workflows/publish.yml +5 -2
- package/.github/workflows/update-docs.yml +1 -1
- package/AGENTS.md +140 -286
- package/CONTRIBUTING.md +10 -22
- package/README.md +48 -16
- package/ai-instructions/{github-copilot/copilot-instructions.md → AGENTS.md} +99 -127
- package/ai-instructions/skills/sfcc-caching/SKILL.md +89 -0
- package/{dist/docs/best-practices/cartridge_creation.md → ai-instructions/skills/sfcc-cartridge-development/SKILL.md} +31 -7
- package/ai-instructions/skills/sfcc-forms-development/SKILL.md +261 -0
- package/ai-instructions/skills/sfcc-forms-development/references/ARCHITECTURE-SGJC-SFRA.md +143 -0
- package/ai-instructions/skills/sfcc-forms-development/references/FORM-XML-CHEATSHEET.md +127 -0
- package/ai-instructions/skills/sfcc-fraud-prevention/SKILL.md +95 -0
- package/ai-instructions/skills/sfcc-hooks-registration/SKILL.md +39 -0
- package/ai-instructions/skills/sfcc-isml-development/SKILL.md +370 -0
- package/ai-instructions/skills/sfcc-isml-development/references/REMOTE-INCLUDES.md +116 -0
- package/ai-instructions/skills/sfcc-isml-development/references/SFRA-LAYOUTS.md +50 -0
- package/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CART-ACCOUNT-AUTH.md +45 -0
- package/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CATALOG.md +85 -0
- package/ai-instructions/skills/sfcc-isml-development/references/SFRA-STRUCTURE-COMPONENTS.md +63 -0
- package/ai-instructions/skills/sfcc-isml-development/references/UTILITIES-EXPRESSIONS.md +159 -0
- package/ai-instructions/skills/sfcc-isml-development/references/sfra-base-templates-architecture.md +13 -0
- package/ai-instructions/skills/sfcc-job-development/SKILL.md +334 -0
- package/ai-instructions/skills/sfcc-job-development/references/CHUNK-ORIENTED.md +393 -0
- package/ai-instructions/skills/sfcc-job-development/references/STEPTYPES-JSON.md +271 -0
- package/ai-instructions/skills/sfcc-job-development/references/TASK-ORIENTED.md +257 -0
- package/ai-instructions/skills/sfcc-localization/SKILL.md +92 -0
- package/ai-instructions/skills/sfcc-localization/references/CONTROLLERS.md +63 -0
- package/ai-instructions/skills/sfcc-localization/references/FORMATTING.md +29 -0
- package/ai-instructions/skills/sfcc-localization/references/FORMS-LOCALIZATION.md +33 -0
- package/ai-instructions/skills/sfcc-localization/references/JAVASCRIPT-LOCALIZATION.md +41 -0
- package/ai-instructions/skills/sfcc-localization/references/LOCALE-SWITCHING.md +35 -0
- package/ai-instructions/skills/sfcc-localization/references/PATTERNS.md +740 -0
- package/ai-instructions/skills/sfcc-localization/references/PROPERTIES-ENCODING.md +25 -0
- package/ai-instructions/skills/sfcc-localization/references/RESOURCE-BUNDLES.md +67 -0
- package/ai-instructions/skills/sfcc-localization/references/STATIC-FILES.md +23 -0
- package/ai-instructions/skills/sfcc-localization/references/TESTING.md +21 -0
- package/{docs/best-practices/localserviceregistry.md → ai-instructions/skills/sfcc-localserviceregistry/SKILL.md} +65 -31
- package/ai-instructions/skills/sfcc-logging/SKILL.md +352 -0
- package/ai-instructions/skills/sfcc-logging/references/LOG-FILES.md +282 -0
- package/{docs/best-practices/ocapi_hooks.md → ai-instructions/skills/sfcc-ocapi-hooks/SKILL.md} +51 -16
- package/ai-instructions/skills/sfcc-ocapi-scapi-slas/SKILL.md +108 -0
- package/ai-instructions/skills/sfcc-page-designer/SKILL.md +353 -0
- package/ai-instructions/skills/sfcc-page-designer/references/ATTRIBUTE-TYPES.md +436 -0
- package/ai-instructions/skills/sfcc-page-designer/references/META-DEFINITIONS.md +322 -0
- package/{dist/docs/best-practices/performance.md → ai-instructions/skills/sfcc-performance/SKILL.md} +35 -3
- package/ai-instructions/skills/sfcc-platform-limits/SKILL.md +89 -0
- package/ai-instructions/skills/sfcc-scapi-custom-endpoints/SKILL.md +237 -0
- package/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/AUTHENTICATION.md +214 -0
- package/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/URL-MAPPING.md +253 -0
- package/{docs/best-practices/scapi_hooks.md → ai-instructions/skills/sfcc-scapi-hooks/SKILL.md} +44 -17
- package/ai-instructions/skills/sfcc-script-evaluation/SKILL.md +380 -0
- package/{docs/best-practices/security.md → ai-instructions/skills/sfcc-security/SKILL.md} +12 -3
- package/ai-instructions/skills/sfcc-sfra-client-side-js/SKILL.md +270 -0
- package/ai-instructions/skills/sfcc-sfra-client-side-js/references/AJAX-CSRF-VALIDATION.md +285 -0
- package/ai-instructions/skills/sfcc-sfra-client-side-js/references/BASE-MODULE-INDEX.md +206 -0
- package/ai-instructions/skills/sfcc-sfra-client-side-js/references/EXTENSION-PATTERNS.md +165 -0
- package/ai-instructions/skills/sfcc-sfra-client-side-js/references/PLUGIN-PATTERNS.md +185 -0
- package/ai-instructions/skills/sfcc-sfra-controllers/SKILL.md +347 -0
- package/ai-instructions/skills/sfcc-sfra-controllers/references/MIDDLEWARE-REFERENCE.md +257 -0
- package/ai-instructions/skills/sfcc-sfra-controllers/references/REMOTE-INCLUDES.md +193 -0
- package/{dist/docs/best-practices/sfra_controllers.md → ai-instructions/skills/sfcc-sfra-controllers/references/standard-sfra-controllers.md} +0 -670
- package/ai-instructions/skills/sfcc-sfra-models/SKILL.md +322 -0
- package/ai-instructions/skills/sfcc-sfra-models/references/MODEL-PATTERNS.md +530 -0
- package/ai-instructions/skills/sfcc-sfra-models/references/MODEL-STRUCTURE.md +234 -0
- package/ai-instructions/skills/sfcc-sfra-models/references/TESTING-SECURITY.md +417 -0
- package/{dist/docs/best-practices/sfra_scss.md → ai-instructions/skills/sfcc-sfra-scss/SKILL.md} +5 -0
- package/ai-instructions/skills/sfcc-webdav-workflows/SKILL.md +111 -0
- package/dist/ai-instructions/AGENTS.md +628 -0
- package/dist/ai-instructions/skills/sfcc-caching/SKILL.md +89 -0
- package/{docs/best-practices/cartridge_creation.md → dist/ai-instructions/skills/sfcc-cartridge-development/SKILL.md} +31 -7
- package/dist/ai-instructions/skills/sfcc-forms-development/SKILL.md +261 -0
- package/dist/ai-instructions/skills/sfcc-forms-development/references/ARCHITECTURE-SGJC-SFRA.md +143 -0
- package/dist/ai-instructions/skills/sfcc-forms-development/references/FORM-XML-CHEATSHEET.md +127 -0
- package/dist/ai-instructions/skills/sfcc-fraud-prevention/SKILL.md +95 -0
- package/dist/ai-instructions/skills/sfcc-hooks-registration/SKILL.md +39 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/SKILL.md +370 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/REMOTE-INCLUDES.md +116 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-LAYOUTS.md +50 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CART-ACCOUNT-AUTH.md +45 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CATALOG.md +85 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-STRUCTURE-COMPONENTS.md +63 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/UTILITIES-EXPRESSIONS.md +159 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/sfra-base-templates-architecture.md +13 -0
- package/dist/ai-instructions/skills/sfcc-job-development/SKILL.md +334 -0
- package/dist/ai-instructions/skills/sfcc-job-development/references/CHUNK-ORIENTED.md +393 -0
- package/dist/ai-instructions/skills/sfcc-job-development/references/STEPTYPES-JSON.md +271 -0
- package/dist/ai-instructions/skills/sfcc-job-development/references/TASK-ORIENTED.md +257 -0
- package/dist/ai-instructions/skills/sfcc-localization/SKILL.md +92 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/CONTROLLERS.md +63 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/FORMATTING.md +29 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/FORMS-LOCALIZATION.md +33 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/JAVASCRIPT-LOCALIZATION.md +41 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/LOCALE-SWITCHING.md +35 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/PATTERNS.md +740 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/PROPERTIES-ENCODING.md +25 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/RESOURCE-BUNDLES.md +67 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/STATIC-FILES.md +23 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/TESTING.md +21 -0
- package/dist/{docs/best-practices/localserviceregistry.md → ai-instructions/skills/sfcc-localserviceregistry/SKILL.md} +65 -31
- package/dist/ai-instructions/skills/sfcc-logging/SKILL.md +352 -0
- package/dist/ai-instructions/skills/sfcc-logging/references/LOG-FILES.md +282 -0
- package/dist/{docs/best-practices/ocapi_hooks.md → ai-instructions/skills/sfcc-ocapi-hooks/SKILL.md} +51 -16
- package/dist/ai-instructions/skills/sfcc-ocapi-scapi-slas/SKILL.md +108 -0
- package/dist/ai-instructions/skills/sfcc-page-designer/SKILL.md +353 -0
- package/dist/ai-instructions/skills/sfcc-page-designer/references/ATTRIBUTE-TYPES.md +436 -0
- package/dist/ai-instructions/skills/sfcc-page-designer/references/META-DEFINITIONS.md +322 -0
- package/{docs/best-practices/performance.md → dist/ai-instructions/skills/sfcc-performance/SKILL.md} +35 -3
- package/dist/ai-instructions/skills/sfcc-platform-limits/SKILL.md +89 -0
- package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/SKILL.md +237 -0
- package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/AUTHENTICATION.md +214 -0
- package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/URL-MAPPING.md +253 -0
- package/dist/{docs/best-practices/scapi_hooks.md → ai-instructions/skills/sfcc-scapi-hooks/SKILL.md} +44 -17
- package/dist/ai-instructions/skills/sfcc-script-evaluation/SKILL.md +380 -0
- package/dist/{docs/best-practices/security.md → ai-instructions/skills/sfcc-security/SKILL.md} +12 -3
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/SKILL.md +270 -0
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/AJAX-CSRF-VALIDATION.md +285 -0
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/BASE-MODULE-INDEX.md +206 -0
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/EXTENSION-PATTERNS.md +165 -0
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/PLUGIN-PATTERNS.md +185 -0
- package/dist/ai-instructions/skills/sfcc-sfra-controllers/SKILL.md +347 -0
- package/dist/ai-instructions/skills/sfcc-sfra-controllers/references/MIDDLEWARE-REFERENCE.md +257 -0
- package/dist/ai-instructions/skills/sfcc-sfra-controllers/references/REMOTE-INCLUDES.md +193 -0
- package/{docs/best-practices/sfra_controllers.md → dist/ai-instructions/skills/sfcc-sfra-controllers/references/standard-sfra-controllers.md} +0 -670
- package/dist/ai-instructions/skills/sfcc-sfra-models/SKILL.md +322 -0
- package/dist/ai-instructions/skills/sfcc-sfra-models/references/MODEL-PATTERNS.md +530 -0
- package/dist/ai-instructions/skills/sfcc-sfra-models/references/MODEL-STRUCTURE.md +234 -0
- package/dist/ai-instructions/skills/sfcc-sfra-models/references/TESTING-SECURITY.md +417 -0
- package/{docs/best-practices/sfra_scss.md → dist/ai-instructions/skills/sfcc-sfra-scss/SKILL.md} +5 -0
- package/dist/ai-instructions/skills/sfcc-webdav-workflows/SKILL.md +111 -0
- package/dist/clients/agent-instructions-client.d.ts +66 -0
- package/dist/clients/agent-instructions-client.d.ts.map +1 -0
- package/dist/clients/agent-instructions-client.js +277 -0
- package/dist/clients/agent-instructions-client.js.map +1 -0
- package/dist/clients/base/abstract-documentation-client.d.ts +146 -0
- package/dist/clients/base/abstract-documentation-client.d.ts.map +1 -0
- package/dist/clients/base/abstract-documentation-client.js +265 -0
- package/dist/clients/base/abstract-documentation-client.js.map +1 -0
- package/dist/clients/base/oauth-token.d.ts +18 -0
- package/dist/clients/base/oauth-token.d.ts.map +1 -1
- package/dist/clients/base/oauth-token.js +45 -2
- package/dist/clients/base/oauth-token.js.map +1 -1
- package/dist/clients/cartridge/cartridge-generation-client.d.ts +59 -0
- package/dist/clients/cartridge/cartridge-generation-client.d.ts.map +1 -0
- package/dist/clients/cartridge/cartridge-generation-client.js +224 -0
- package/dist/clients/cartridge/cartridge-generation-client.js.map +1 -0
- package/dist/clients/cartridge/cartridge-structure.d.ts +17 -0
- package/dist/clients/cartridge/cartridge-structure.d.ts.map +1 -0
- package/dist/clients/cartridge/cartridge-structure.js +33 -0
- package/dist/clients/cartridge/cartridge-structure.js.map +1 -0
- package/dist/clients/cartridge/cartridge-templates.d.ts +22 -0
- package/dist/clients/cartridge/cartridge-templates.d.ts.map +1 -0
- package/dist/clients/cartridge/cartridge-templates.js +225 -0
- package/dist/clients/cartridge/cartridge-templates.js.map +1 -0
- package/dist/clients/cartridge/index.d.ts +7 -0
- package/dist/clients/cartridge/index.d.ts.map +1 -0
- package/dist/clients/cartridge/index.js +7 -0
- package/dist/clients/cartridge/index.js.map +1 -0
- package/dist/clients/docs/documentation-scanner.d.ts +5 -2
- package/dist/clients/docs/documentation-scanner.d.ts.map +1 -1
- package/dist/clients/docs/documentation-scanner.js +38 -23
- package/dist/clients/docs/documentation-scanner.js.map +1 -1
- package/dist/clients/docs-client.d.ts +13 -4
- package/dist/clients/docs-client.d.ts.map +1 -1
- package/dist/clients/docs-client.js +44 -11
- package/dist/clients/docs-client.js.map +1 -1
- package/dist/clients/isml-client.d.ts +71 -0
- package/dist/clients/isml-client.d.ts.map +1 -0
- package/dist/clients/isml-client.js +252 -0
- package/dist/clients/isml-client.js.map +1 -0
- package/dist/clients/ocapi/code-versions-client.d.ts.map +1 -1
- package/dist/clients/ocapi/code-versions-client.js +6 -1
- package/dist/clients/ocapi/code-versions-client.js.map +1 -1
- package/dist/clients/ocapi-client.d.ts +9 -101
- package/dist/clients/ocapi-client.d.ts.map +1 -1
- package/dist/clients/ocapi-client.js +11 -93
- package/dist/clients/ocapi-client.js.map +1 -1
- package/dist/clients/script-debugger/index.d.ts +5 -0
- package/dist/clients/script-debugger/index.d.ts.map +1 -0
- package/dist/clients/script-debugger/index.js +5 -0
- package/dist/clients/script-debugger/index.js.map +1 -0
- package/dist/clients/script-debugger/script-debugger-client.d.ts +147 -0
- package/dist/clients/script-debugger/script-debugger-client.d.ts.map +1 -0
- package/dist/clients/script-debugger/script-debugger-client.js +591 -0
- package/dist/clients/script-debugger/script-debugger-client.js.map +1 -0
- package/dist/clients/sfra-client.d.ts +13 -62
- package/dist/clients/sfra-client.d.ts.map +1 -1
- package/dist/clients/sfra-client.js +105 -326
- package/dist/clients/sfra-client.js.map +1 -1
- package/dist/config/configuration-factory.d.ts +1 -1
- package/dist/config/configuration-factory.d.ts.map +1 -1
- package/dist/config/configuration-factory.js +5 -1
- package/dist/config/configuration-factory.js.map +1 -1
- package/dist/config/dw-json-loader.d.ts +7 -0
- package/dist/config/dw-json-loader.d.ts.map +1 -1
- package/dist/config/dw-json-loader.js +92 -15
- package/dist/config/dw-json-loader.js.map +1 -1
- package/dist/config/workspace-roots.d.ts +143 -0
- package/dist/config/workspace-roots.d.ts.map +1 -0
- package/dist/config/workspace-roots.js +448 -0
- package/dist/config/workspace-roots.js.map +1 -0
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +3 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/core/handlers/abstract-client-handler.d.ts +52 -0
- package/dist/core/handlers/abstract-client-handler.d.ts.map +1 -0
- package/dist/core/handlers/abstract-client-handler.js +51 -0
- package/dist/core/handlers/abstract-client-handler.js.map +1 -0
- package/dist/core/handlers/agent-instructions-handler.d.ts +17 -0
- package/dist/core/handlers/agent-instructions-handler.d.ts.map +1 -0
- package/dist/core/handlers/agent-instructions-handler.js +38 -0
- package/dist/core/handlers/agent-instructions-handler.js.map +1 -0
- package/dist/core/handlers/base-handler.d.ts +3 -68
- package/dist/core/handlers/base-handler.d.ts.map +1 -1
- package/dist/core/handlers/base-handler.js +11 -84
- package/dist/core/handlers/base-handler.js.map +1 -1
- package/dist/core/handlers/cartridge-handler.d.ts +10 -11
- package/dist/core/handlers/cartridge-handler.d.ts.map +1 -1
- package/dist/core/handlers/cartridge-handler.js +10 -28
- package/dist/core/handlers/cartridge-handler.js.map +1 -1
- package/dist/core/handlers/client-factory.d.ts +12 -2
- package/dist/core/handlers/client-factory.d.ts.map +1 -1
- package/dist/core/handlers/client-factory.js +28 -1
- package/dist/core/handlers/client-factory.js.map +1 -1
- package/dist/core/handlers/code-version-handler.d.ts +11 -11
- package/dist/core/handlers/code-version-handler.d.ts.map +1 -1
- package/dist/core/handlers/code-version-handler.js +13 -27
- package/dist/core/handlers/code-version-handler.js.map +1 -1
- package/dist/core/handlers/docs-handler.d.ts +6 -12
- package/dist/core/handlers/docs-handler.d.ts.map +1 -1
- package/dist/core/handlers/docs-handler.js +11 -36
- package/dist/core/handlers/docs-handler.js.map +1 -1
- package/dist/core/handlers/isml-handler.d.ts +11 -0
- package/dist/core/handlers/isml-handler.d.ts.map +1 -0
- package/dist/core/handlers/isml-handler.js +18 -0
- package/dist/core/handlers/isml-handler.js.map +1 -0
- package/dist/core/handlers/job-log-handler.d.ts +8 -7
- package/dist/core/handlers/job-log-handler.d.ts.map +1 -1
- package/dist/core/handlers/job-log-handler.js +14 -5
- package/dist/core/handlers/job-log-handler.js.map +1 -1
- package/dist/core/handlers/log-handler.d.ts +8 -7
- package/dist/core/handlers/log-handler.d.ts.map +1 -1
- package/dist/core/handlers/log-handler.js +14 -5
- package/dist/core/handlers/log-handler.js.map +1 -1
- package/dist/core/handlers/script-debugger-handler.d.ts +18 -0
- package/dist/core/handlers/script-debugger-handler.d.ts.map +1 -0
- package/dist/core/handlers/script-debugger-handler.js +31 -0
- package/dist/core/handlers/script-debugger-handler.js.map +1 -0
- package/dist/core/handlers/sfra-handler.d.ts +6 -12
- package/dist/core/handlers/sfra-handler.d.ts.map +1 -1
- package/dist/core/handlers/sfra-handler.js +11 -36
- package/dist/core/handlers/sfra-handler.js.map +1 -1
- package/dist/core/handlers/simple-client-handler.d.ts +41 -0
- package/dist/core/handlers/simple-client-handler.d.ts.map +1 -0
- package/dist/core/handlers/simple-client-handler.js +49 -0
- package/dist/core/handlers/simple-client-handler.js.map +1 -0
- package/dist/core/handlers/system-object-handler.d.ts +11 -11
- package/dist/core/handlers/system-object-handler.d.ts.map +1 -1
- package/dist/core/handlers/system-object-handler.js +13 -27
- package/dist/core/handlers/system-object-handler.js.map +1 -1
- package/dist/core/handlers/validation-helpers.d.ts +22 -24
- package/dist/core/handlers/validation-helpers.d.ts.map +1 -1
- package/dist/core/handlers/validation-helpers.js +89 -39
- package/dist/core/handlers/validation-helpers.js.map +1 -1
- package/dist/core/instruction-advisor.d.ts +28 -0
- package/dist/core/instruction-advisor.d.ts.map +1 -0
- package/dist/core/instruction-advisor.js +114 -0
- package/dist/core/instruction-advisor.js.map +1 -0
- package/dist/core/server.d.ts +25 -0
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +151 -11
- package/dist/core/server.js.map +1 -1
- package/dist/core/tool-definitions.d.ts +6 -854
- package/dist/core/tool-definitions.d.ts.map +1 -1
- package/dist/core/tool-definitions.js +8 -1064
- package/dist/core/tool-definitions.js.map +1 -1
- package/dist/core/tool-schemas/agent-instruction-tools.d.ts +77 -0
- package/dist/core/tool-schemas/agent-instruction-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/agent-instruction-tools.js +72 -0
- package/dist/core/tool-schemas/agent-instruction-tools.js.map +1 -0
- package/dist/core/tool-schemas/cartridge-tools.d.ts +27 -0
- package/dist/core/tool-schemas/cartridge-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/cartridge-tools.js +29 -0
- package/dist/core/tool-schemas/cartridge-tools.js.map +1 -0
- package/dist/core/tool-schemas/code-version-tools.d.ts +28 -0
- package/dist/core/tool-schemas/code-version-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/code-version-tools.js +28 -0
- package/dist/core/tool-schemas/code-version-tools.js.map +1 -0
- package/dist/core/tool-schemas/documentation-tools.d.ts +139 -0
- package/dist/core/tool-schemas/documentation-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/documentation-tools.js +104 -0
- package/dist/core/tool-schemas/documentation-tools.js.map +1 -0
- package/dist/core/tool-schemas/index.d.ts +17 -0
- package/dist/core/tool-schemas/index.d.ts.map +1 -0
- package/dist/core/tool-schemas/index.js +19 -0
- package/dist/core/tool-schemas/index.js.map +1 -0
- package/dist/core/tool-schemas/isml-tools.d.ts +98 -0
- package/dist/core/tool-schemas/isml-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/isml-tools.js +89 -0
- package/dist/core/tool-schemas/isml-tools.js.map +1 -0
- package/dist/core/tool-schemas/log-tools.d.ts +221 -0
- package/dist/core/tool-schemas/log-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/log-tools.js +180 -0
- package/dist/core/tool-schemas/log-tools.js.map +1 -0
- package/dist/core/tool-schemas/script-debugger-tools.d.ts +44 -0
- package/dist/core/tool-schemas/script-debugger-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/script-debugger-tools.js +83 -0
- package/dist/core/tool-schemas/script-debugger-tools.js.map +1 -0
- package/dist/core/tool-schemas/sfra-tools.d.ts +63 -0
- package/dist/core/tool-schemas/sfra-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/sfra-tools.js +65 -0
- package/dist/core/tool-schemas/sfra-tools.js.map +1 -0
- package/dist/core/tool-schemas/shared-schemas.d.ts +350 -0
- package/dist/core/tool-schemas/shared-schemas.d.ts.map +1 -0
- package/dist/core/tool-schemas/shared-schemas.js +153 -0
- package/dist/core/tool-schemas/shared-schemas.js.map +1 -0
- package/dist/core/tool-schemas/system-object-tools.d.ts +511 -0
- package/dist/core/tool-schemas/system-object-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/system-object-tools.js +126 -0
- package/dist/core/tool-schemas/system-object-tools.js.map +1 -0
- package/dist/docs/dw_net/HTTPClient.md +46 -2
- package/dist/docs/dw_net/HTTPClientLoggingConfig.md +296 -0
- package/dist/docs/dw_order/Basket.md +7 -7
- package/dist/docs/dw_order/BasketMgr.md +22 -6
- package/dist/docs/dw_order.hooks/BasketMergeHooks.md +42 -0
- package/dist/docs/dw_svc/ServiceCallback.md +2 -2
- package/dist/docs/isml/isactivedatacontext.md +382 -0
- package/dist/docs/isml/isactivedatahead.md +566 -0
- package/dist/docs/isml/isanalyticsoff.md +537 -0
- package/dist/docs/isml/isapplepay.md +667 -0
- package/dist/docs/isml/isbreak.md +687 -0
- package/dist/docs/isml/isbuynow.md +682 -0
- package/dist/docs/isml/iscache.md +802 -0
- package/dist/docs/isml/iscomment.md +794 -0
- package/dist/docs/isml/iscomponent.md +797 -0
- package/dist/docs/isml/iscontent.md +594 -0
- package/dist/docs/isml/iscontinue.md +563 -0
- package/dist/docs/isml/iscookie.md +798 -0
- package/dist/docs/isml/isdecorate.md +818 -0
- package/dist/docs/isml/isif.md +737 -0
- package/dist/docs/isml/isinclude.md +874 -0
- package/dist/docs/isml/isloop.md +377 -0
- package/dist/docs/isml/ismodule.md +844 -0
- package/dist/docs/isml/isnext.md +672 -0
- package/dist/docs/isml/isobject.md +760 -0
- package/dist/docs/isml/ispayment.md +577 -0
- package/dist/docs/isml/ispaymentmessages.md +664 -0
- package/dist/docs/isml/isprint.md +875 -0
- package/dist/docs/isml/isredirect.md +716 -0
- package/dist/docs/isml/isremove.md +725 -0
- package/dist/docs/isml/isreplace.md +783 -0
- package/dist/docs/isml/isscript.md +859 -0
- package/dist/docs/isml/isselect.md +908 -0
- package/dist/docs/isml/isset.md +585 -0
- package/dist/docs/isml/isslot.md +824 -0
- package/dist/docs/isml/isstatus.md +711 -0
- package/dist/main.d.ts +16 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +60 -28
- package/dist/main.js.map +1 -1
- package/dist/services/index.d.ts +4 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -2
- package/dist/services/index.js.map +1 -1
- package/dist/tool-configs/agent-instructions-tool-config.d.ts +6 -0
- package/dist/tool-configs/agent-instructions-tool-config.d.ts.map +1 -0
- package/dist/tool-configs/agent-instructions-tool-config.js +74 -0
- package/dist/tool-configs/agent-instructions-tool-config.js.map +1 -0
- package/dist/tool-configs/code-version-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/code-version-tool-config.js +0 -5
- package/dist/tool-configs/code-version-tool-config.js.map +1 -1
- package/dist/tool-configs/docs-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/docs-tool-config.js +0 -7
- package/dist/tool-configs/docs-tool-config.js.map +1 -1
- package/dist/tool-configs/isml-tool-config.d.ts +11 -0
- package/dist/tool-configs/isml-tool-config.d.ts.map +1 -0
- package/dist/tool-configs/isml-tool-config.js +77 -0
- package/dist/tool-configs/isml-tool-config.js.map +1 -0
- package/dist/tool-configs/job-log-tool-config.d.ts +1 -2
- package/dist/tool-configs/job-log-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/job-log-tool-config.js +11 -15
- package/dist/tool-configs/job-log-tool-config.js.map +1 -1
- package/dist/tool-configs/log-tool-config.d.ts +1 -2
- package/dist/tool-configs/log-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/log-tool-config.js +35 -51
- package/dist/tool-configs/log-tool-config.js.map +1 -1
- package/dist/tool-configs/script-debugger-tool-config.d.ts +11 -0
- package/dist/tool-configs/script-debugger-tool-config.d.ts.map +1 -0
- package/dist/tool-configs/script-debugger-tool-config.js +35 -0
- package/dist/tool-configs/script-debugger-tool-config.js.map +1 -0
- package/dist/tool-configs/sfra-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/sfra-tool-config.js +0 -11
- package/dist/tool-configs/sfra-tool-config.js.map +1 -1
- package/dist/tool-configs/system-object-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/system-object-tool-config.js +0 -5
- package/dist/tool-configs/system-object-tool-config.js.map +1 -1
- package/dist/types/types.d.ts +2 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/utils/cache.d.ts +12 -10
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +47 -47
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/category-utils.d.ts +31 -0
- package/dist/utils/category-utils.d.ts.map +1 -0
- package/dist/utils/category-utils.js +45 -0
- package/dist/utils/category-utils.js.map +1 -0
- package/dist/utils/log-tool-constants.d.ts +16 -13
- package/dist/utils/log-tool-constants.d.ts.map +1 -1
- package/dist/utils/log-tool-constants.js +10 -11
- package/dist/utils/log-tool-constants.js.map +1 -1
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +35 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/markdown-utils.d.ts +60 -0
- package/dist/utils/markdown-utils.d.ts.map +1 -0
- package/dist/utils/markdown-utils.js +206 -0
- package/dist/utils/markdown-utils.js.map +1 -0
- package/dist/utils/path-resolver.d.ts +12 -4
- package/dist/utils/path-resolver.d.ts.map +1 -1
- package/dist/utils/path-resolver.js +22 -8
- package/dist/utils/path-resolver.js.map +1 -1
- package/dist/utils/path-validation.d.ts +40 -0
- package/dist/utils/path-validation.d.ts.map +1 -0
- package/dist/utils/path-validation.js +84 -0
- package/dist/utils/path-validation.js.map +1 -0
- package/docs/dw_net/HTTPClient.md +46 -2
- package/docs/dw_net/HTTPClientLoggingConfig.md +296 -0
- package/docs/dw_order/Basket.md +7 -7
- package/docs/dw_order/BasketMgr.md +22 -6
- package/docs/dw_order.hooks/BasketMergeHooks.md +42 -0
- package/docs/dw_svc/ServiceCallback.md +2 -2
- package/docs/isml/isactivedatacontext.md +382 -0
- package/docs/isml/isactivedatahead.md +566 -0
- package/docs/isml/isanalyticsoff.md +537 -0
- package/docs/isml/isapplepay.md +667 -0
- package/docs/isml/isbreak.md +687 -0
- package/docs/isml/isbuynow.md +682 -0
- package/docs/isml/iscache.md +802 -0
- package/docs/isml/iscomment.md +794 -0
- package/docs/isml/iscomponent.md +797 -0
- package/docs/isml/iscontent.md +594 -0
- package/docs/isml/iscontinue.md +563 -0
- package/docs/isml/iscookie.md +798 -0
- package/docs/isml/isdecorate.md +818 -0
- package/docs/isml/isif.md +737 -0
- package/docs/isml/isinclude.md +874 -0
- package/docs/isml/isloop.md +377 -0
- package/docs/isml/ismodule.md +844 -0
- package/docs/isml/isnext.md +672 -0
- package/docs/isml/isobject.md +760 -0
- package/docs/isml/ispayment.md +577 -0
- package/docs/isml/ispaymentmessages.md +664 -0
- package/docs/isml/isprint.md +875 -0
- package/docs/isml/isredirect.md +716 -0
- package/docs/isml/isremove.md +725 -0
- package/docs/isml/isreplace.md +783 -0
- package/docs/isml/isscript.md +859 -0
- package/docs/isml/isselect.md +908 -0
- package/docs/isml/isset.md +585 -0
- package/docs/isml/isslot.md +824 -0
- package/docs/isml/isstatus.md +711 -0
- package/docs-site-v2/.vitepress/config.mts +190 -0
- package/docs-site-v2/.vitepress/theme/components/AssistantTabs.vue +96 -0
- package/docs-site-v2/.vitepress/theme/components/Callout.vue +10 -0
- package/docs-site-v2/.vitepress/theme/components/Collapsible.vue +14 -0
- package/docs-site-v2/.vitepress/theme/components/DwJsonBuilder.vue +82 -0
- package/docs-site-v2/.vitepress/theme/components/HomeSections.vue +552 -0
- package/docs-site-v2/.vitepress/theme/components/InstructionFilesTabs.vue +87 -0
- package/docs-site-v2/.vitepress/theme/components/ModeTabs.vue +70 -0
- package/docs-site-v2/.vitepress/theme/components/NewcomerCTA.vue +14 -0
- package/docs-site-v2/.vitepress/theme/components/QuickStartCards.vue +20 -0
- package/docs-site-v2/.vitepress/theme/components/QuickStartHero.vue +20 -0
- package/docs-site-v2/.vitepress/theme/components/SkillsList.vue +48 -0
- package/docs-site-v2/.vitepress/theme/components/ToolExplorer.vue +85 -0
- package/docs-site-v2/.vitepress/theme/custom.css +1373 -0
- package/docs-site-v2/.vitepress/theme/index.ts +39 -0
- package/docs-site-v2/data/skills.ts +147 -0
- package/docs-site-v2/data/tools.ts +490 -0
- package/docs-site-v2/development/index.md +151 -0
- package/docs-site-v2/examples/index.md +333 -0
- package/docs-site-v2/features/index.md +144 -0
- package/docs-site-v2/guide/ai-interfaces.md +58 -0
- package/docs-site-v2/guide/configuration.md +208 -0
- package/docs-site-v2/guide/index.md +50 -0
- package/docs-site-v2/index.md +32 -0
- package/docs-site-v2/package-lock.json +2511 -0
- package/docs-site-v2/package.json +15 -0
- package/docs-site-v2/public/android-chrome-192x192.png +0 -0
- package/docs-site-v2/public/android-chrome-512x512.png +0 -0
- package/docs-site-v2/public/apple-touch-icon.png +0 -0
- package/docs-site-v2/public/favicon-16x16.png +0 -0
- package/docs-site-v2/public/favicon-32x32.png +0 -0
- package/docs-site-v2/public/favicon.ico +0 -0
- package/docs-site-v2/public/index.css +4174 -0
- package/docs-site-v2/public/llms.txt +44 -0
- package/docs-site-v2/public/logo-dark.svg +8 -0
- package/docs-site-v2/public/logo.svg +8 -0
- package/{docs-site → docs-site-v2}/public/robots.txt +1 -6
- package/{docs-site → docs-site-v2}/public/site.webmanifest +1 -1
- package/{docs-site → docs-site-v2}/public/sitemap.xml +33 -12
- package/docs-site-v2/script-debugger/index.md +105 -0
- package/docs-site-v2/scripts/generate-llms.js +71 -0
- package/docs-site-v2/scripts/generate-sitemap.js +97 -0
- package/docs-site-v2/security/index.md +115 -0
- package/docs-site-v2/skills/index.md +40 -0
- package/docs-site-v2/tools/index.md +36 -0
- package/docs-site-v2/troubleshooting/index.md +204 -0
- package/eslint.config.js +3 -1
- package/memories/repo/docs-site-v2-build.json +11 -0
- package/package.json +18 -14
- package/scripts/validate-server-json.js +68 -0
- package/server.json +4 -6
- package/src/clients/agent-instructions-client.ts +370 -0
- package/src/clients/base/abstract-documentation-client.ts +405 -0
- package/src/clients/base/oauth-token.ts +52 -2
- package/src/clients/cartridge/cartridge-generation-client.ts +302 -0
- package/src/clients/cartridge/cartridge-structure.ts +37 -0
- package/src/clients/cartridge/cartridge-templates.ts +246 -0
- package/src/clients/cartridge/index.ts +6 -0
- package/src/clients/docs/documentation-scanner.ts +44 -28
- package/src/clients/docs-client.ts +54 -14
- package/src/clients/isml-client.ts +353 -0
- package/src/clients/ocapi/code-versions-client.ts +7 -1
- package/src/clients/ocapi-client.ts +11 -166
- package/src/clients/script-debugger/index.ts +5 -0
- package/src/clients/script-debugger/script-debugger-client.ts +754 -0
- package/src/clients/sfra-client.ts +134 -397
- package/src/config/configuration-factory.ts +6 -1
- package/src/config/dw-json-loader.ts +96 -15
- package/src/config/workspace-roots.ts +540 -0
- package/src/constants/index.ts +1 -0
- package/src/core/handlers/abstract-client-handler.ts +85 -0
- package/src/core/handlers/agent-instructions-handler.ts +48 -0
- package/src/core/handlers/base-handler.ts +17 -127
- package/src/core/handlers/cartridge-handler.ts +13 -33
- package/src/core/handlers/client-factory.ts +32 -2
- package/src/core/handlers/code-version-handler.ts +17 -32
- package/src/core/handlers/docs-handler.ts +12 -44
- package/src/core/handlers/isml-handler.ts +19 -0
- package/src/core/handlers/job-log-handler.ts +19 -8
- package/src/core/handlers/log-handler.ts +19 -8
- package/src/core/handlers/script-debugger-handler.ts +46 -0
- package/src/core/handlers/sfra-handler.ts +12 -44
- package/src/core/handlers/simple-client-handler.ts +78 -0
- package/src/core/handlers/system-object-handler.ts +17 -32
- package/src/core/handlers/validation-helpers.ts +87 -47
- package/src/core/instruction-advisor.ts +122 -0
- package/src/core/server.ts +178 -13
- package/src/core/tool-definitions.ts +25 -1071
- package/src/core/tool-schemas/agent-instruction-tools.ts +72 -0
- package/src/core/tool-schemas/cartridge-tools.ts +29 -0
- package/src/core/tool-schemas/code-version-tools.ts +28 -0
- package/src/core/tool-schemas/documentation-tools.ts +104 -0
- package/src/core/tool-schemas/index.ts +27 -0
- package/src/core/tool-schemas/isml-tools.ts +89 -0
- package/src/core/tool-schemas/log-tools.ts +196 -0
- package/src/core/tool-schemas/script-debugger-tools.ts +83 -0
- package/src/core/tool-schemas/sfra-tools.ts +65 -0
- package/src/core/tool-schemas/shared-schemas.ts +158 -0
- package/src/core/tool-schemas/system-object-tools.ts +127 -0
- package/src/main.ts +63 -30
- package/src/services/index.ts +4 -10
- package/src/tool-configs/agent-instructions-tool-config.ts +83 -0
- package/src/tool-configs/cartridge-tool-config.ts +1 -1
- package/src/tool-configs/code-version-tool-config.ts +0 -5
- package/src/tool-configs/docs-tool-config.ts +0 -7
- package/src/tool-configs/isml-tool-config.ts +87 -0
- package/src/tool-configs/job-log-tool-config.ts +18 -17
- package/src/tool-configs/log-tool-config.ts +49 -64
- package/src/tool-configs/script-debugger-tool-config.ts +69 -0
- package/src/tool-configs/sfra-tool-config.ts +0 -11
- package/src/tool-configs/system-object-tool-config.ts +0 -5
- package/src/types/types.ts +2 -0
- package/src/utils/cache.ts +49 -54
- package/src/utils/category-utils.ts +70 -0
- package/src/utils/log-tool-constants.ts +25 -17
- package/src/utils/logger.ts +38 -1
- package/src/utils/markdown-utils.ts +280 -0
- package/src/utils/path-resolver.ts +25 -9
- package/src/utils/path-validation.ts +113 -0
- package/tests/base-handler.test.ts +1 -1
- package/tests/cache.test.ts +2 -2
- package/tests/cartridge-handler.test.ts +4 -4
- package/tests/client-factory.test.ts +1 -1
- package/tests/code-version-handler.test.ts +3 -3
- package/tests/docs-handler.test.ts +2 -2
- package/tests/documentation-scanner.test.ts +4 -4
- package/tests/isml-client.test.ts +463 -0
- package/tests/isml-handler.test.ts +375 -0
- package/tests/job-log-handler.test.ts +1 -1
- package/tests/log-handler.test.ts +8 -8
- package/tests/log-validation.test.ts +149 -0
- package/tests/mcp/README.md +22 -18
- package/tests/mcp/node/activate-code-version-advanced.full-mode.programmatic.test.js +30 -12
- package/tests/mcp/node/evaluate-script.full-mode.programmatic.test.js +387 -0
- package/tests/mcp/node/generate-cartridge-structure.docs-only.programmatic.test.js +14 -8
- package/tests/mcp/node/get-isml-categories.programmatic.test.js +278 -0
- package/tests/mcp/node/get-isml-element.programmatic.test.js +278 -0
- package/tests/mcp/node/get-isml-elements-by-category.programmatic.test.js +363 -0
- package/tests/mcp/node/get-sfra-categories.docs-only.programmatic.test.js +24 -24
- package/tests/mcp/node/get-sfra-document.programmatic.test.js +4 -2
- package/tests/mcp/node/list-isml-elements.programmatic.test.js +311 -0
- package/tests/mcp/node/list-sfcc-classes.docs-only.programmatic.test.js +2 -33
- package/tests/mcp/node/search-isml-elements.programmatic.test.js +325 -0
- package/tests/mcp/node/search-sfcc-classes.docs-only.programmatic.test.js +5 -9
- package/tests/mcp/node/search-sfcc-methods.docs-only.programmatic.test.js +7 -9
- package/tests/mcp/node/tools.docs-only.programmatic.test.js +42 -65
- package/tests/mcp/node/tools.full-mode.programmatic.test.js +7 -8
- package/tests/mcp/yaml/activate-code-version.full-mode.test.mcp.yml +2 -2
- package/tests/mcp/yaml/evaluate-script.full-mode.test.mcp.yml +281 -0
- package/tests/mcp/yaml/get-isml-categories.docs-only.test.mcp.yml +330 -0
- package/tests/mcp/yaml/get-isml-element.docs-only.test.mcp.yml +294 -0
- package/tests/mcp/yaml/get-isml-elements-by-category.docs-only.test.mcp.yml +334 -0
- package/tests/mcp/yaml/get-sfcc-class-info.docs-only.test.mcp.yml +2 -2
- package/tests/mcp/yaml/get-sfra-categories.docs-only.test.mcp.yml +13 -13
- package/tests/mcp/yaml/get-sfra-categories.full-mode.test.mcp.yml +13 -13
- package/tests/mcp/yaml/get-system-object-definitions.docs-only.test.mcp.yml +1 -16
- package/tests/mcp/yaml/list-isml-elements.docs-only.test.mcp.yml +212 -0
- package/tests/mcp/yaml/search-isml-elements.docs-only.test.mcp.yml +312 -0
- package/tests/mcp/yaml/search-sfcc-classes.docs-only.test.mcp.yml +1 -1
- package/tests/mcp/yaml/search-sfcc-classes.full-mode.test.mcp.yml +1 -1
- package/tests/mcp/yaml/search-site-preferences.docs-only.test.mcp.yml +1 -1
- package/tests/mcp/yaml/tools.docs-only.test.mcp.yml +3 -57
- package/tests/mcp/yaml/tools.full-mode.test.mcp.yml +3 -3
- package/tests/oauth-token.test.ts +107 -12
- package/tests/ocapi-client.test.ts +53 -106
- package/tests/script-debugger-client.test.ts +430 -0
- package/tests/servers/sfcc-mock-server/src/app.js +15 -0
- package/tests/servers/sfcc-mock-server/src/routes/cartridge-webdav.js +258 -0
- package/tests/servers/sfcc-mock-server/src/routes/ocapi/debugger-handler.js +396 -0
- package/tests/servers/sfcc-mock-server/src/routes/ocapi.js +5 -0
- package/tests/servers/sfcc-mock-server/src/routes/storefront.js +86 -0
- package/tests/servers/sfcc-mock-server/src/routes/webdav.js +6 -4
- package/tests/validation-helpers.test.ts +0 -31
- package/tests/workspace-roots.test.ts +227 -0
- package/ai-instructions/claude-desktop/claude_custom_instructions.md +0 -321
- package/ai-instructions/cursor/.cursor/rules/debugging-workflows.mdc +0 -171
- package/ai-instructions/cursor/.cursor/rules/hooks-development.mdc +0 -168
- package/ai-instructions/cursor/.cursor/rules/isml-templates.mdc +0 -209
- package/ai-instructions/cursor/.cursor/rules/job-framework.mdc +0 -379
- package/ai-instructions/cursor/.cursor/rules/performance-optimization.mdc +0 -215
- package/ai-instructions/cursor/.cursor/rules/scapi-endpoints.mdc +0 -98
- package/ai-instructions/cursor/.cursor/rules/security-patterns.mdc +0 -375
- package/ai-instructions/cursor/.cursor/rules/sfcc-development.mdc +0 -144
- package/ai-instructions/cursor/.cursor/rules/sfra-controllers.mdc +0 -376
- package/ai-instructions/cursor/.cursor/rules/sfra-models.mdc +0 -412
- package/ai-instructions/cursor/.cursor/rules/system-objects.mdc +0 -383
- package/ai-instructions/cursor/.cursor/rules/testing-patterns.mdc +0 -418
- package/dist/clients/best-practices-client.d.ts +0 -57
- package/dist/clients/best-practices-client.d.ts.map +0 -1
- package/dist/clients/best-practices-client.js +0 -288
- package/dist/clients/best-practices-client.js.map +0 -1
- package/dist/clients/cartridge-generation-client.d.ts +0 -57
- package/dist/clients/cartridge-generation-client.d.ts.map +0 -1
- package/dist/clients/cartridge-generation-client.js +0 -384
- package/dist/clients/cartridge-generation-client.js.map +0 -1
- package/dist/clients/logs/index.d.ts +0 -13
- package/dist/clients/logs/index.d.ts.map +0 -1
- package/dist/clients/logs/index.js +0 -15
- package/dist/clients/logs/index.js.map +0 -1
- package/dist/clients/logs/log-analyzer.d.ts +0 -55
- package/dist/clients/logs/log-analyzer.d.ts.map +0 -1
- package/dist/clients/logs/log-analyzer.js +0 -228
- package/dist/clients/logs/log-analyzer.js.map +0 -1
- package/dist/clients/logs/log-client.d.ts +0 -87
- package/dist/clients/logs/log-client.d.ts.map +0 -1
- package/dist/clients/logs/log-client.js +0 -418
- package/dist/clients/logs/log-client.js.map +0 -1
- package/dist/clients/logs/log-constants.d.ts +0 -37
- package/dist/clients/logs/log-constants.d.ts.map +0 -1
- package/dist/clients/logs/log-constants.js +0 -37
- package/dist/clients/logs/log-constants.js.map +0 -1
- package/dist/clients/logs/log-file-discovery.d.ts +0 -62
- package/dist/clients/logs/log-file-discovery.d.ts.map +0 -1
- package/dist/clients/logs/log-file-discovery.js +0 -238
- package/dist/clients/logs/log-file-discovery.js.map +0 -1
- package/dist/clients/logs/log-file-reader.d.ts +0 -53
- package/dist/clients/logs/log-file-reader.d.ts.map +0 -1
- package/dist/clients/logs/log-file-reader.js +0 -194
- package/dist/clients/logs/log-file-reader.js.map +0 -1
- package/dist/clients/logs/log-formatter.d.ts +0 -90
- package/dist/clients/logs/log-formatter.d.ts.map +0 -1
- package/dist/clients/logs/log-formatter.js +0 -189
- package/dist/clients/logs/log-formatter.js.map +0 -1
- package/dist/clients/logs/log-processor.d.ts +0 -91
- package/dist/clients/logs/log-processor.d.ts.map +0 -1
- package/dist/clients/logs/log-processor.js +0 -328
- package/dist/clients/logs/log-processor.js.map +0 -1
- package/dist/clients/logs/log-types.d.ts +0 -69
- package/dist/clients/logs/log-types.d.ts.map +0 -1
- package/dist/clients/logs/log-types.js +0 -5
- package/dist/clients/logs/log-types.js.map +0 -1
- package/dist/clients/logs/webdav-client-manager.d.ts +0 -28
- package/dist/clients/logs/webdav-client-manager.d.ts.map +0 -1
- package/dist/clients/logs/webdav-client-manager.js +0 -77
- package/dist/clients/logs/webdav-client-manager.js.map +0 -1
- package/dist/core/handlers/abstract-log-tool-handler.d.ts +0 -35
- package/dist/core/handlers/abstract-log-tool-handler.d.ts.map +0 -1
- package/dist/core/handlers/abstract-log-tool-handler.js +0 -46
- package/dist/core/handlers/abstract-log-tool-handler.js.map +0 -1
- package/dist/core/handlers/best-practices-handler.d.ts +0 -17
- package/dist/core/handlers/best-practices-handler.d.ts.map +0 -1
- package/dist/core/handlers/best-practices-handler.js +0 -43
- package/dist/core/handlers/best-practices-handler.js.map +0 -1
- package/dist/core/handlers/job-log-tool-config.d.ts +0 -8
- package/dist/core/handlers/job-log-tool-config.d.ts.map +0 -1
- package/dist/core/handlers/job-log-tool-config.js +0 -76
- package/dist/core/handlers/job-log-tool-config.js.map +0 -1
- package/dist/core/handlers/log-tool-config.d.ts +0 -8
- package/dist/core/handlers/log-tool-config.d.ts.map +0 -1
- package/dist/core/handlers/log-tool-config.js +0 -73
- package/dist/core/handlers/log-tool-config.js.map +0 -1
- package/dist/docs/best-practices/isml_templates.md +0 -1933
- package/dist/docs/best-practices/job_framework.md +0 -1173
- package/dist/docs/best-practices/scapi_custom_endpoint.md +0 -963
- package/dist/docs/best-practices/sfra_client_side_js.md +0 -736
- package/dist/docs/best-practices/sfra_models.md +0 -1142
- package/dist/tool-configs/best-practices-tool-config.d.ts +0 -11
- package/dist/tool-configs/best-practices-tool-config.d.ts.map +0 -1
- package/dist/tool-configs/best-practices-tool-config.js +0 -59
- package/dist/tool-configs/best-practices-tool-config.js.map +0 -1
- package/dist/utils/job-log-tool-config.d.ts +0 -8
- package/dist/utils/job-log-tool-config.d.ts.map +0 -1
- package/dist/utils/job-log-tool-config.js +0 -76
- package/dist/utils/job-log-tool-config.js.map +0 -1
- package/dist/utils/job-log-utils.d.ts +0 -34
- package/dist/utils/job-log-utils.d.ts.map +0 -1
- package/dist/utils/job-log-utils.js +0 -60
- package/dist/utils/job-log-utils.js.map +0 -1
- package/dist/utils/log-cache.d.ts +0 -53
- package/dist/utils/log-cache.d.ts.map +0 -1
- package/dist/utils/log-cache.js +0 -114
- package/dist/utils/log-cache.js.map +0 -1
- package/dist/utils/log-tool-config.d.ts +0 -8
- package/dist/utils/log-tool-config.d.ts.map +0 -1
- package/dist/utils/log-tool-config.js +0 -73
- package/dist/utils/log-tool-config.js.map +0 -1
- package/dist/utils/log-tool-utils.d.ts +0 -39
- package/dist/utils/log-tool-utils.d.ts.map +0 -1
- package/dist/utils/log-tool-utils.js +0 -94
- package/dist/utils/log-tool-utils.js.map +0 -1
- package/docs/best-practices/isml_templates.md +0 -1933
- package/docs/best-practices/job_framework.md +0 -1173
- package/docs/best-practices/scapi_custom_endpoint.md +0 -963
- package/docs/best-practices/sfra_client_side_js.md +0 -736
- package/docs/best-practices/sfra_models.md +0 -1142
- package/docs-site/App.tsx +0 -103
- package/docs-site/README.md +0 -113
- package/docs-site/components/Badge.tsx +0 -38
- package/docs-site/components/BreadcrumbSchema.tsx +0 -34
- package/docs-site/components/CodeBlock.tsx +0 -132
- package/docs-site/components/Collapsible.tsx +0 -40
- package/docs-site/components/ConfigBuilder.tsx +0 -118
- package/docs-site/components/ConfigHero.tsx +0 -19
- package/docs-site/components/ConfigModeTabs.tsx +0 -42
- package/docs-site/components/Layout.tsx +0 -174
- package/docs-site/components/LightCodeContainer.tsx +0 -44
- package/docs-site/components/NewcomerCTA.tsx +0 -57
- package/docs-site/components/NextStepsStrip.tsx +0 -23
- package/docs-site/components/OnThisPage.tsx +0 -91
- package/docs-site/components/SEO.tsx +0 -79
- package/docs-site/components/Search.tsx +0 -207
- package/docs-site/components/Sidebar.tsx +0 -96
- package/docs-site/components/StructuredData.tsx +0 -72
- package/docs-site/components/ToolCard.tsx +0 -84
- package/docs-site/components/ToolFilters.tsx +0 -39
- package/docs-site/components/Typography.tsx +0 -30
- package/docs-site/components/VersionBadge.tsx +0 -18
- package/docs-site/components/icons.tsx +0 -37
- package/docs-site/constants.tsx +0 -34
- package/docs-site/index.html +0 -62
- package/docs-site/main.tsx +0 -16
- package/docs-site/metadata.json +0 -5
- package/docs-site/package-lock.json +0 -3966
- package/docs-site/package.json +0 -35
- package/docs-site/pages/AIInterfacesPage.tsx +0 -610
- package/docs-site/pages/ConfigurationPage.tsx +0 -315
- package/docs-site/pages/DevelopmentPage.tsx +0 -607
- package/docs-site/pages/ExamplesPage.tsx +0 -558
- package/docs-site/pages/FeaturesPage.tsx +0 -353
- package/docs-site/pages/HomePage.tsx +0 -1046
- package/docs-site/pages/SecurityPage.tsx +0 -372
- package/docs-site/pages/ToolsPage.tsx +0 -205
- package/docs-site/pages/TroubleshootingPage.tsx +0 -590
- package/docs-site/postcss.config.js +0 -6
- package/docs-site/public/.well-known/security.txt +0 -6
- package/docs-site/public/android-chrome-192x192.png +0 -0
- package/docs-site/public/android-chrome-512x512.png +0 -0
- package/docs-site/public/apple-touch-icon.png +0 -0
- package/docs-site/public/favicon-16x16.png +0 -0
- package/docs-site/public/favicon-32x32.png +0 -0
- package/docs-site/public/favicon.ico +0 -0
- package/docs-site/public/llms.txt +0 -47
- package/docs-site/scripts/generate-search-index.js +0 -323
- package/docs-site/scripts/generate-sitemap.js +0 -156
- package/docs-site/scripts/search-dev.js +0 -112
- package/docs-site/src/styles/input.css +0 -248
- package/docs-site/src/styles/prism-theme.css +0 -124
- package/docs-site/tailwind.config.js +0 -70
- package/docs-site/tsconfig.json +0 -29
- package/docs-site/types.ts +0 -16
- package/docs-site/utils/search.ts +0 -132
- package/docs-site/utils/toolsData.ts +0 -116
- package/docs-site/vite.config.ts +0 -63
- package/src/clients/best-practices-client.ts +0 -332
- package/src/clients/cartridge-generation-client.ts +0 -507
- package/src/clients/logs/index.ts +0 -18
- package/src/clients/logs/log-analyzer.ts +0 -289
- package/src/clients/logs/log-client.ts +0 -540
- package/src/clients/logs/log-constants.ts +0 -53
- package/src/clients/logs/log-file-discovery.ts +0 -299
- package/src/clients/logs/log-file-reader.ts +0 -227
- package/src/clients/logs/log-formatter.ts +0 -258
- package/src/clients/logs/log-processor.ts +0 -402
- package/src/clients/logs/log-types.ts +0 -80
- package/src/clients/logs/webdav-client-manager.ts +0 -93
- package/src/core/handlers/abstract-log-tool-handler.ts +0 -64
- package/src/core/handlers/best-practices-handler.ts +0 -55
- package/src/core/handlers/job-log-tool-config.ts +0 -89
- package/src/core/handlers/log-tool-config.ts +0 -98
- package/src/tool-configs/best-practices-tool-config.ts +0 -68
- package/src/utils/job-log-tool-config.ts +0 -89
- package/src/utils/job-log-utils.ts +0 -78
- package/src/utils/log-cache.ts +0 -134
- package/src/utils/log-tool-config.ts +0 -98
- package/src/utils/log-tool-utils.ts +0 -122
- package/tests/best-practices-handler.test.ts +0 -236
- package/tests/job-log-utils.test.ts +0 -182
- package/tests/mcp/node/get-available-best-practice-guides.docs-only.programmatic.test.js +0 -516
- package/tests/mcp/node/get-best-practice-guide.docs-only.programmatic.test.js +0 -733
- package/tests/mcp/node/get-hook-reference.docs-only.programmatic.test.js +0 -185
- package/tests/mcp/node/search-best-practices.docs-only.programmatic.test.js +0 -836
- package/tests/mcp/yaml/get-available-best-practice-guides.docs-only.test.mcp.yml +0 -885
- package/tests/mcp/yaml/get-available-best-practice-guides.full-mode.test.mcp.yml +0 -885
- package/tests/mcp/yaml/get-best-practice-guide.docs-only.test.mcp.yml +0 -462
- package/tests/mcp/yaml/get-best-practice-guide.full-mode.test.mcp.yml +0 -462
- package/tests/mcp/yaml/get-hook-reference.docs-only.test.mcp.yml +0 -321
- package/tests/mcp/yaml/get-hook-reference.full-mode.test.mcp.yml +0 -321
- package/tests/mcp/yaml/search-best-practices.docs-only.test.mcp.yml +0 -655
- package/tests/mcp/yaml/search-best-practices.full-mode.test.mcp.yml +0 -655
- /package/{docs-site → docs-site-v2}/public/404.html +0 -0
- /package/{docs-site → docs-site-v2}/public/explain-product-pricing-methods-no-mcp.png +0 -0
- /package/{docs-site → docs-site-v2}/public/explain-product-pricing-methods.png +0 -0
|
@@ -1,673 +1,3 @@
|
|
|
1
|
-
# Salesforce B2C Commerce SFRA Controllers: Best Practices & Examples
|
|
2
|
-
|
|
3
|
-
This guide provides a condensed overview of best practices and code patterns for developing controllers within the Salesforce B2C Commerce Storefront Reference Architecture (SFRA).
|
|
4
|
-
|
|
5
|
-
**IMPORTANT**: Before developing SFRA controllers, consult the **Performance and Stability Best Practices** guide from this MCP server. Review the storefront development guidelines, index-friendly APIs, and critical page performance requirements to ensure your controllers follow SFCC performance standards and avoid database-intensive operations.
|
|
6
|
-
|
|
7
|
-
## 🚀 Enhanced SFRA Documentation Access
|
|
8
|
-
|
|
9
|
-
This MCP server provides comprehensive access to SFRA documentation through enhanced tools that can help you understand SFRA architecture and develop better controllers:
|
|
10
|
-
|
|
11
|
-
### **Essential SFRA Documentation Tools**
|
|
12
|
-
|
|
13
|
-
1. **`get_sfra_categories`** - Discover all available SFRA documentation categories
|
|
14
|
-
2. **`get_sfra_documents_by_category`** - Explore documents by functional area (core, product, order, customer, pricing, store)
|
|
15
|
-
3. **`get_sfra_document`** - Get detailed information about specific SFRA classes or models
|
|
16
|
-
4. **`search_sfra_documentation`** - Find specific functionality across all SFRA documentation
|
|
17
|
-
|
|
18
|
-
### **Recommended Documentation Workflow for Controller Development**
|
|
19
|
-
|
|
20
|
-
Before writing SFRA controllers, use these tools to understand the available functionality:
|
|
21
|
-
|
|
22
|
-
```javascript
|
|
23
|
-
// 1. Explore core SFRA classes essential for controllers
|
|
24
|
-
get_sfra_documents_by_category("core")
|
|
25
|
-
// Returns: server, request, response, querystring, render
|
|
26
|
-
|
|
27
|
-
// 2. Get detailed Server class documentation
|
|
28
|
-
get_sfra_document("server")
|
|
29
|
-
// Comprehensive server.js documentation with middleware patterns
|
|
30
|
-
|
|
31
|
-
// 3. Understand Request and Response objects
|
|
32
|
-
get_sfra_document("request")
|
|
33
|
-
get_sfra_document("response")
|
|
34
|
-
|
|
35
|
-
// 4. For product controllers, explore product models
|
|
36
|
-
get_sfra_documents_by_category("product")
|
|
37
|
-
// Returns: product-full, product-bundle, product-tile, product-search, product-line-items
|
|
38
|
-
|
|
39
|
-
// 5. For cart/checkout controllers, explore order models
|
|
40
|
-
get_sfra_documents_by_category("order")
|
|
41
|
-
// Returns: cart, order, billing, shipping, payment, totals
|
|
42
|
-
|
|
43
|
-
// 6. Search for specific functionality
|
|
44
|
-
search_sfra_documentation("middleware")
|
|
45
|
-
search_sfra_documentation("validation")
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### **SFRA Model Documentation for Controller Development**
|
|
49
|
-
|
|
50
|
-
The enhanced documentation system provides access to comprehensive model documentation that's essential for controller development:
|
|
51
|
-
|
|
52
|
-
- **Product Models**: `product-full`, `product-bundle`, `product-tile` - Understanding product data structures
|
|
53
|
-
- **Cart Models**: `cart`, `billing`, `shipping`, `payment`, `totals` - Essential for checkout controllers
|
|
54
|
-
- **Customer Models**: `account`, `address` - For customer management controllers
|
|
55
|
-
- **Pricing Models**: `price-default`, `price-range`, `price-tiered` - For pricing logic in controllers
|
|
56
|
-
|
|
57
|
-
Always consult the relevant model documentation before implementing controller logic to understand available properties and methods.
|
|
58
|
-
|
|
59
|
-
## Core Concepts
|
|
60
|
-
|
|
61
|
-
### MVC Pattern & Cartridge Path
|
|
62
|
-
|
|
63
|
-
SFRA uses a Model-View-Controller (MVC) pattern to enforce separation of concerns.
|
|
64
|
-
|
|
65
|
-
- **Controller** (`/controllers`): Handles user requests, calls models for data, and determines which view to render.
|
|
66
|
-
- **Model** (`/models`): Contains business logic, interacts with the B2C Commerce Script API, and returns pure JSON objects to the controller.
|
|
67
|
-
- **View** (`/templates`): ISML templates responsible only for rendering data (pdict) provided by the controller. Business logic in templates is an anti-pattern.
|
|
68
|
-
|
|
69
|
-
**Cartridge Path**: A colon-separated list of cartridges that dictates the code execution order. Custom cartridges must be placed before the `app_storefront_base` cartridge to override or extend functionality.
|
|
70
|
-
|
|
71
|
-
> **Never edit the `app_storefront_base` cartridge directly.**
|
|
72
|
-
|
|
73
|
-
## Routing & Middleware
|
|
74
|
-
|
|
75
|
-
SFRA's routing is inspired by Express.js, using a chain of middleware functions to process requests.
|
|
76
|
-
|
|
77
|
-
- **Endpoint Syntax**: URLs map to Controller-RouteName (e.g., `Home-Show` maps to the `Show` route in `Home.js`).
|
|
78
|
-
- **server Object**: The core of routing, required in every controller (`var server = require('server');`). It provides methods like `get`, `post`, `append`, etc., to define and modify routes.
|
|
79
|
-
|
|
80
|
-
### Storefront URL Patterns
|
|
81
|
-
|
|
82
|
-
SFRA storefront URLs follow a predictable pattern that maps directly to your controller and route structure:
|
|
83
|
-
|
|
84
|
-
```
|
|
85
|
-
https://{instance-hostname}/on/demandware.store/Sites-{site-id}-Site/{locale}/{Controller-Route}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
**URL Components:**
|
|
89
|
-
- **Instance Hostname**: Your SFCC instance domain (e.g., `your-instance.dx.commercecloud.salesforce.com`)
|
|
90
|
-
- **Site ID**: The site identifier configured in Business Manager (e.g., `RefArchGlobal`)
|
|
91
|
-
- **Locale**: Language and region code, format depends on site configuration
|
|
92
|
-
- **Controller-Route**: Maps to your controller file and route method
|
|
93
|
-
|
|
94
|
-
#### URL Examples
|
|
95
|
-
|
|
96
|
-
**Standard locale in path:**
|
|
97
|
-
```
|
|
98
|
-
https://your-instance.dx.commercecloud.salesforce.com/on/demandware.store/Sites-RefArchGlobal-Site/en_GB/Home-Show
|
|
99
|
-
https://your-instance.dx.commercecloud.salesforce.com/on/demandware.store/Sites-RefArchGlobal-Site/en_US/Product-Show?pid=12345
|
|
100
|
-
https://your-instance.dx.commercecloud.salesforce.com/on/demandware.store/Sites-RefArchGlobal-Site/fr_FR/Account-Login
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
**Locale as query parameter (alternative configuration):**
|
|
104
|
-
```
|
|
105
|
-
https://your-instance.dx.commercecloud.salesforce.com/on/demandware.store/Sites-RefArchGlobal-Site/Home-Show?lang=en_GB
|
|
106
|
-
https://your-instance.dx.commercecloud.salesforce.com/on/demandware.store/Sites-RefArchGlobal-Site/jsPDF-Test?lang=en_GB
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
#### Controller Mapping Examples
|
|
110
|
-
|
|
111
|
-
| URL | Controller File | Route Method |
|
|
112
|
-
|-----|----------------|--------------|
|
|
113
|
-
| `/Home-Show` | `controllers/Home.js` | `server.get('Show', ...)` |
|
|
114
|
-
| `/Product-Show` | `controllers/Product.js` | `server.get('Show', ...)` |
|
|
115
|
-
| `/Cart-AddProduct` | `controllers/Cart.js` | `server.post('AddProduct', ...)` |
|
|
116
|
-
| `/Account-Login` | `controllers/Account.js` | `server.get('Login', ...)` |
|
|
117
|
-
| `/CheckoutServices-SubmitPayment` | `controllers/CheckoutServices.js` | `server.post('SubmitPayment', ...)` |
|
|
118
|
-
|
|
119
|
-
**Important Notes:**
|
|
120
|
-
- The locale format (`en_GB` in path vs `?lang=en_GB` parameter) depends on your site's locale configuration in Business Manager
|
|
121
|
-
- Custom controllers follow the same pattern: if you create `controllers/MyCustom.js` with route `Test`, it's accessible at `/MyCustom-Test`
|
|
122
|
-
- Route names are case-sensitive and must match exactly what you define in your controller
|
|
123
|
-
|
|
124
|
-
### Middleware Chain (req, res, next)
|
|
125
|
-
|
|
126
|
-
Each route is a series of functions:
|
|
127
|
-
|
|
128
|
-
- **req**: The request object, containing query strings (`req.querystring`), form data (`req.form`), etc.
|
|
129
|
-
- **res**: The response object, used to render templates (`res.render()`), return JSON (`res.json()`), or modify view data (`res.setViewData()`).
|
|
130
|
-
- **next()**: A callback that passes control to the next function in the chain. It must be called to avoid a request timeout, unless the function terminates the request (e.g., with `res.render()`).
|
|
131
|
-
|
|
132
|
-
## Controller Extension APIs
|
|
133
|
-
|
|
134
|
-
The primary goal is to customize functionality without modifying base code. Always start by importing the base controller: `var page = module.superModule;`.
|
|
135
|
-
|
|
136
|
-
| Method | Use Case | Description |
|
|
137
|
-
|--------|----------|-------------|
|
|
138
|
-
| `server.append()` | **Most Common**. Add or modify data for the view after base logic runs. | Adds middleware to the end of the route's chain. Ideal for using `res.getViewData()` to get base data, modifying it, and using `res.setViewData()` to pass it to the template. |
|
|
139
|
-
| `server.prepend()` | Perform validation or setup before base logic runs. | Adds middleware to the beginning of the route's chain. Useful for permission checks or preparing data the base controller needs. |
|
|
140
|
-
| `server.replace()` | Fundamentally change a route's behavior or prevent base logic from running. | Discards the original middleware chain and replaces it with a new one. Use this for state-changing actions like payment calls to avoid double execution. |
|
|
141
|
-
|
|
142
|
-
> **Critical Rule**: Never use `server.append` for routes that perform state-changing actions (e.g., payment authorizations, inventory updates). The base logic will execute first, and your appended logic will run second, potentially causing duplicate transactions. Use `server.replace` for these scenarios.
|
|
143
|
-
|
|
144
|
-
## Built-in SFRA Middlewares
|
|
145
|
-
|
|
146
|
-
SFRA provides several pre-built middleware functions in `app_storefront_base/cartridge/scripts/middleware/` that handle common functionality. These middlewares follow the standard `(req, res, next)` pattern and can be chained together.
|
|
147
|
-
|
|
148
|
-
### Cache Middlewares (`cache.js`)
|
|
149
|
-
|
|
150
|
-
These middlewares set appropriate cache headers for different types of content:
|
|
151
|
-
|
|
152
|
-
#### `applyDefaultCache`
|
|
153
|
-
Sets standard 24-hour cache for general content.
|
|
154
|
-
```javascript
|
|
155
|
-
var cache = require('*/cartridge/scripts/middleware/cache');
|
|
156
|
-
|
|
157
|
-
server.get('Show', cache.applyDefaultCache, function (req, res, next) {
|
|
158
|
-
// Your controller logic here
|
|
159
|
-
// Page will be cached for 24 hours
|
|
160
|
-
next();
|
|
161
|
-
});
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
#### `applyPromotionSensitiveCache`
|
|
165
|
-
Sets 24-hour cache with personalization flag for promotion-sensitive pages.
|
|
166
|
-
```javascript
|
|
167
|
-
server.get('ProductList', cache.applyPromotionSensitiveCache, function (req, res, next) {
|
|
168
|
-
// Page cached for 24 hours but marked as personalized
|
|
169
|
-
// Useful for pages that show different content based on promotions
|
|
170
|
-
next();
|
|
171
|
-
});
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
#### `applyShortPromotionSensitiveCache`
|
|
175
|
-
Sets 1-hour cache with personalization for highly dynamic promotional content.
|
|
176
|
-
```javascript
|
|
177
|
-
server.get('FlashSale', cache.applyShortPromotionSensitiveCache, function (req, res, next) {
|
|
178
|
-
// Short cache for time-sensitive promotional content
|
|
179
|
-
next();
|
|
180
|
-
});
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
#### `applyInventorySensitiveCache`
|
|
184
|
-
Sets 30-minute cache for inventory-dependent pages.
|
|
185
|
-
```javascript
|
|
186
|
-
server.get('ProductAvailability', cache.applyInventorySensitiveCache, function (req, res, next) {
|
|
187
|
-
// Short cache for pages that depend on inventory levels
|
|
188
|
-
next();
|
|
189
|
-
});
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
### CSRF Protection (`csrf.js`)
|
|
193
|
-
|
|
194
|
-
Critical security middlewares for preventing Cross-Site Request Forgery attacks:
|
|
195
|
-
|
|
196
|
-
#### `generateToken`
|
|
197
|
-
Generates and adds CSRF token to view data. Required for forms that will be submitted via POST.
|
|
198
|
-
```javascript
|
|
199
|
-
var csrfProtection = require('*/cartridge/scripts/middleware/csrf');
|
|
200
|
-
|
|
201
|
-
server.get('ShowForm', csrfProtection.generateToken, function (req, res, next) {
|
|
202
|
-
res.render('myForm', {
|
|
203
|
-
// csrf token automatically available in pdict.csrf
|
|
204
|
-
});
|
|
205
|
-
next();
|
|
206
|
-
});
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
#### `validateRequest`
|
|
210
|
-
Validates CSRF token for standard form submissions. Logs out user and redirects on failure.
|
|
211
|
-
```javascript
|
|
212
|
-
server.post('SubmitForm', csrfProtection.validateRequest, function (req, res, next) {
|
|
213
|
-
// Process form submission - token has been validated
|
|
214
|
-
next();
|
|
215
|
-
});
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
#### `validateAjaxRequest`
|
|
219
|
-
Validates CSRF token for AJAX requests. Redirects to AJAX-specific error page on failure.
|
|
220
|
-
```javascript
|
|
221
|
-
server.post('AjaxSubmit', csrfProtection.validateAjaxRequest, function (req, res, next) {
|
|
222
|
-
// Process AJAX form submission
|
|
223
|
-
res.json({ success: true });
|
|
224
|
-
next();
|
|
225
|
-
});
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
#### CRITICAL: CSRF Middleware Automation
|
|
229
|
-
|
|
230
|
-
**❌ COMMON MISTAKE**: Manually adding CSRF tokens to viewData
|
|
231
|
-
|
|
232
|
-
```javascript
|
|
233
|
-
// ❌ WRONG - Don't do this in SFRA controllers!
|
|
234
|
-
server.get('ShowForm', csrfProtection.generateToken, function(req, res, next) {
|
|
235
|
-
res.render('myForm', {
|
|
236
|
-
csrf: res.getViewData().csrf, // ❌ Redundant
|
|
237
|
-
// OR
|
|
238
|
-
csrf: {
|
|
239
|
-
tokenName: req.csrf.tokenName, // ❌ Redundant
|
|
240
|
-
token: req.csrf.token // ❌ Redundant
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
});
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
**✅ CORRECT APPROACH**: Let middleware handle it automatically
|
|
247
|
-
|
|
248
|
-
```javascript
|
|
249
|
-
// ✅ CORRECT - Middleware automatically adds CSRF to pdict
|
|
250
|
-
server.get('ShowForm', csrfProtection.generateToken, function(req, res, next) {
|
|
251
|
-
res.render('myForm', {
|
|
252
|
-
// No need to manually add CSRF - middleware does this
|
|
253
|
-
pageTitle: 'My Form',
|
|
254
|
-
otherData: 'value'
|
|
255
|
-
});
|
|
256
|
-
// pdict.csrf.tokenName and pdict.csrf.token are automatically available
|
|
257
|
-
next();
|
|
258
|
-
});
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
**How CSRF Middleware Works in SFRA:**
|
|
262
|
-
- `csrfProtection.generateToken` automatically adds `csrf.tokenName` and `csrf.token` to viewData
|
|
263
|
-
- Templates access tokens directly via `${pdict.csrf.tokenName}` and `${pdict.csrf.token}`
|
|
264
|
-
- `csrfProtection.validateRequest` and `validateAjaxRequest` handle validation automatically
|
|
265
|
-
- **Never manually add CSRF data to viewData** - it's redundant and can cause issues
|
|
266
|
-
|
|
267
|
-
### User Authentication (`userLoggedIn.js`)
|
|
268
|
-
|
|
269
|
-
Middlewares for protecting routes that require authentication:
|
|
270
|
-
|
|
271
|
-
#### `validateLoggedIn`
|
|
272
|
-
Ensures user is logged in, redirects to login page if not. Preserves query parameters.
|
|
273
|
-
```javascript
|
|
274
|
-
var userLoggedIn = require('*/cartridge/scripts/middleware/userLoggedIn');
|
|
275
|
-
|
|
276
|
-
server.get('AccountDashboard', userLoggedIn.validateLoggedIn, function (req, res, next) {
|
|
277
|
-
// User is guaranteed to be logged in here
|
|
278
|
-
next();
|
|
279
|
-
});
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
#### `validateLoggedInAjax`
|
|
283
|
-
AJAX-friendly version that returns JSON response instead of redirecting.
|
|
284
|
-
```javascript
|
|
285
|
-
server.post('UpdateProfile', userLoggedIn.validateLoggedInAjax, function (req, res, next) {
|
|
286
|
-
var viewData = res.getViewData();
|
|
287
|
-
if (viewData.loggedin) {
|
|
288
|
-
// Process the request
|
|
289
|
-
res.json({ success: true });
|
|
290
|
-
} else {
|
|
291
|
-
// viewData.redirectUrl contains login URL for client-side redirect
|
|
292
|
-
res.json({
|
|
293
|
-
success: false,
|
|
294
|
-
redirectUrl: viewData.redirectUrl
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
next();
|
|
298
|
-
});
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
### Consent Tracking (`consentTracking.js`)
|
|
302
|
-
|
|
303
|
-
Handles privacy consent management and tracking permissions:
|
|
304
|
-
|
|
305
|
-
#### `consent`
|
|
306
|
-
Manages tracking consent state and generates CSRF tokens when needed.
|
|
307
|
-
```javascript
|
|
308
|
-
var consentTracking = require('*/cartridge/scripts/middleware/consentTracking');
|
|
309
|
-
|
|
310
|
-
server.get('Home', consentTracking.consent, function (req, res, next) {
|
|
311
|
-
// Consent status available in pdict.tracking_consent
|
|
312
|
-
// Can be: true (consented), false (declined), null (not set)
|
|
313
|
-
next();
|
|
314
|
-
});
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
### Page Metadata (`pageMetaData.js`)
|
|
318
|
-
|
|
319
|
-
Processes and computes page metadata for SEO:
|
|
320
|
-
|
|
321
|
-
#### `computedPageMetaData`
|
|
322
|
-
Consolidates page metadata from various sources into a single object.
|
|
323
|
-
```javascript
|
|
324
|
-
var pageMetaData = require('*/cartridge/scripts/middleware/pageMetaData');
|
|
325
|
-
|
|
326
|
-
server.get('ProductDetail', pageMetaData.computedPageMetaData, function (req, res, next) {
|
|
327
|
-
// Computed metadata available in pdict.CurrentPageMetaData
|
|
328
|
-
// Includes title, description, keywords, and pageMetaTags array
|
|
329
|
-
next();
|
|
330
|
-
});
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
### Middleware Chaining Examples
|
|
334
|
-
|
|
335
|
-
#### Complete Product Detail Page
|
|
336
|
-
```javascript
|
|
337
|
-
var server = require('server');
|
|
338
|
-
var cache = require('*/cartridge/scripts/middleware/cache');
|
|
339
|
-
var consentTracking = require('*/cartridge/scripts/middleware/consentTracking');
|
|
340
|
-
var pageMetaData = require('*/cartridge/scripts/middleware/pageMetaData');
|
|
341
|
-
|
|
342
|
-
server.get('Show',
|
|
343
|
-
cache.applyPromotionSensitiveCache,
|
|
344
|
-
consentTracking.consent,
|
|
345
|
-
pageMetaData.computedPageMetaData,
|
|
346
|
-
function (req, res, next) {
|
|
347
|
-
// All middleware has executed:
|
|
348
|
-
// - Page cached for 24 hours with personalization
|
|
349
|
-
// - Consent tracking set up
|
|
350
|
-
// - Page metadata computed
|
|
351
|
-
// - CSRF token generated (by consent middleware)
|
|
352
|
-
|
|
353
|
-
var pid = req.querystring.pid;
|
|
354
|
-
// Product logic here...
|
|
355
|
-
next();
|
|
356
|
-
}
|
|
357
|
-
);
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
#### Secure Form Submission
|
|
361
|
-
```javascript
|
|
362
|
-
var csrfProtection = require('*/cartridge/scripts/middleware/csrf');
|
|
363
|
-
var userLoggedIn = require('*/cartridge/scripts/middleware/userLoggedIn');
|
|
364
|
-
|
|
365
|
-
// Show form
|
|
366
|
-
server.get('ShowContactForm',
|
|
367
|
-
userLoggedIn.validateLoggedIn,
|
|
368
|
-
csrfProtection.generateToken,
|
|
369
|
-
function (req, res, next) {
|
|
370
|
-
res.render('contactForm');
|
|
371
|
-
next();
|
|
372
|
-
}
|
|
373
|
-
);
|
|
374
|
-
|
|
375
|
-
// Process form
|
|
376
|
-
server.post('SubmitContactForm',
|
|
377
|
-
userLoggedIn.validateLoggedIn,
|
|
378
|
-
csrfProtection.validateRequest,
|
|
379
|
-
function (req, res, next) {
|
|
380
|
-
// User authenticated and CSRF validated
|
|
381
|
-
// Process form safely
|
|
382
|
-
next();
|
|
383
|
-
}
|
|
384
|
-
);
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
### Custom Middleware Best Practices
|
|
388
|
-
|
|
389
|
-
When creating custom middleware:
|
|
390
|
-
|
|
391
|
-
1. **Follow the Pattern**: Always accept `(req, res, next)` parameters
|
|
392
|
-
2. **Call next()**: Always call `next()` unless terminating the request
|
|
393
|
-
3. **Handle Errors**: Use try-catch and pass errors to `next(error)`
|
|
394
|
-
4. **Set View Data**: Use `res.setViewData()` to pass data to templates
|
|
395
|
-
5. **Check Existing Data**: Use `res.getViewData()` to avoid overwriting existing data
|
|
396
|
-
|
|
397
|
-
```javascript
|
|
398
|
-
// Custom middleware example
|
|
399
|
-
function customMiddleware(req, res, next) {
|
|
400
|
-
try {
|
|
401
|
-
var viewData = res.getViewData() || {};
|
|
402
|
-
viewData.customProperty = 'customValue';
|
|
403
|
-
res.setViewData(viewData);
|
|
404
|
-
next();
|
|
405
|
-
} catch (error) {
|
|
406
|
-
next(error);
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
## Remote Include Architecture (Controller Perspective)
|
|
412
|
-
|
|
413
|
-
Remote includes bridge controller design, caching, and security. Each `<isinclude url="...">` triggers a secondary request whose lifecycle is independent of the parent page.
|
|
414
|
-
|
|
415
|
-
### 1. Execution Model Recap
|
|
416
|
-
1. Parent controller builds main page (may be fully cached)
|
|
417
|
-
2. Application Server streams HTML with remote include placeholders
|
|
418
|
-
3. Web Adapter detects placeholders → performs new HTTP requests to each include URL
|
|
419
|
-
4. Include controller runs with `req.includeRequest === true`
|
|
420
|
-
5. Web Adapter stitches fragment responses into final payload
|
|
421
|
-
|
|
422
|
-
### 2. Mandatory Middleware Ordering
|
|
423
|
-
Always begin remote include routes with the gatekeeper:
|
|
424
|
-
```javascript
|
|
425
|
-
server.get('MiniCart',
|
|
426
|
-
server.middleware.include, // Ensures only include-origin requests allowed
|
|
427
|
-
/* cache or auth middleware here */
|
|
428
|
-
function (req, res, next) {
|
|
429
|
-
// Build fragment model – NO parent pdict access
|
|
430
|
-
res.render('components/header/miniCart');
|
|
431
|
-
return next();
|
|
432
|
-
}
|
|
433
|
-
);
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
Add authentication right AFTER the gatekeeper if user‑specific:
|
|
437
|
-
```javascript
|
|
438
|
-
server.get('AccountSummary',
|
|
439
|
-
server.middleware.include,
|
|
440
|
-
userLoggedIn.validateLoggedIn,
|
|
441
|
-
cache.applyShortPromotionSensitiveCache,
|
|
442
|
-
function (req, res, next) {
|
|
443
|
-
res.render('account/summary');
|
|
444
|
-
next();
|
|
445
|
-
}
|
|
446
|
-
);
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
### 3. Data Passing Constraints
|
|
450
|
-
Include controllers cannot see parent `pdict`. All inputs must be query parameters defined in the template:
|
|
451
|
-
```isml
|
|
452
|
-
<isinclude url="${URLUtils.url('PromoSlot-Include', 'slotId', 'hp_banner_1')}" />
|
|
453
|
-
```
|
|
454
|
-
Avoid volatile params that reduce cache hits (e.g., timestamps, indexes, random tokens).
|
|
455
|
-
|
|
456
|
-
### 4. Caching Strategy Patterns
|
|
457
|
-
| Fragment | Typical TTL | Notes |
|
|
458
|
-
|----------|------------|-------|
|
|
459
|
-
| MiniCart | 0 (uncached) | Basket must reflect real-time state |
|
|
460
|
-
| Personalized Banner | 5–15m | Balance freshness vs recompute cost |
|
|
461
|
-
| Static Navigation | 12–24h | Rarely changes; high CDN / app cache hit rate |
|
|
462
|
-
| Inventory Badge | 1–5m | Short TTL isolates volatility |
|
|
463
|
-
|
|
464
|
-
### 5. Performance Guardrails
|
|
465
|
-
| Concern | Guidance |
|
|
466
|
-
|---------|----------|
|
|
467
|
-
| Count per page | Target < 20 (soft). Overuse causes waterfall latency. |
|
|
468
|
-
| Nesting depth | Keep ≤ 2. Depth 3+ complicates tracing & raises miss amplification. |
|
|
469
|
-
| Fragment size | Keep payload lean (<10KB ideal) – remote includes are for targeted data. |
|
|
470
|
-
| Parallelism | Web Adapter fetches includes concurrently; slowest fragment = page delay. Optimize worst offender first. |
|
|
471
|
-
|
|
472
|
-
### 6. Observability & Tracing
|
|
473
|
-
Search logs by extended request ID pattern: `baseId-depth-index`.
|
|
474
|
-
Example sequence: `Qx1Ab-0-00` (page) → `Qx1Ab-1-01` (first fragment) → `Qx1Ab-2-03` (nested fragment).
|
|
475
|
-
|
|
476
|
-
Add structured logging:
|
|
477
|
-
```javascript
|
|
478
|
-
Logger.info('Include {0} depth={1} start', request.httpPath, request.requestID);
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
### 7. Security Checklist
|
|
482
|
-
```text
|
|
483
|
-
[ ] server.middleware.include first
|
|
484
|
-
[ ] Auth middleware if user-specific data
|
|
485
|
-
[ ] No PII in query params
|
|
486
|
-
[ ] Explicit cache middleware (or intentional no-cache)
|
|
487
|
-
[ ] Fragment output sanitized (no raw user input)
|
|
488
|
-
[ ] Error handling returns safe minimal content
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
If any box unchecked → treat as deployment blocker.
|
|
492
|
-
|
|
493
|
-
### 8. Anti‑Patterns & Refactors
|
|
494
|
-
| Anti‑Pattern | Risk | Refactor |
|
|
495
|
-
|--------------|------|----------|
|
|
496
|
-
| Remote include per search result | N network calls, poor TTFB | Single controller renders list with local includes |
|
|
497
|
-
| Passing large serialized JSON in query | URL length + logging exposure | Use lightweight ID → lookup inside fragment |
|
|
498
|
-
| Relying on parent csrf/viewData | Undefined behavior, security gaps | Regenerate context in fragment |
|
|
499
|
-
| Deep chain (>2 levels) | Hard to debug, compounded latency | Flatten – merge sibling fragments |
|
|
500
|
-
|
|
501
|
-
### 9. Example: Structured Composite Page
|
|
502
|
-
Home page shell (24h cache) + fragments:
|
|
503
|
-
- `MiniCart` (0 TTL)
|
|
504
|
-
- `PromoBanner` (15m)
|
|
505
|
-
- `CategoryRefinements` (1h)
|
|
506
|
-
Each can be independently invalidated without purging page shell cache.
|
|
507
|
-
|
|
508
|
-
### 10. Decision Flow
|
|
509
|
-
```text
|
|
510
|
-
Need different TTL? ── no ─▶ Local include
|
|
511
|
-
│
|
|
512
|
-
yes
|
|
513
|
-
Is data easily param encoded? ── no ─▶ Controller aggregation instead
|
|
514
|
-
│
|
|
515
|
-
yes
|
|
516
|
-
Contains sensitive data? ── yes ─▶ Add auth middleware
|
|
517
|
-
│
|
|
518
|
-
(Proceed) Remote include
|
|
519
|
-
```
|
|
520
|
-
|
|
521
|
-
---
|
|
522
|
-
|
|
523
|
-
## Code Examples
|
|
524
|
-
|
|
525
|
-
### 1. Basic Controller: Hello World
|
|
526
|
-
|
|
527
|
-
**File**: `cartridges/my_cartridge/cartridge/controllers/Hello.js`
|
|
528
|
-
|
|
529
|
-
```javascript
|
|
530
|
-
'use strict';
|
|
531
|
-
var server = require('server');
|
|
532
|
-
|
|
533
|
-
server.get('Show', function (req, res, next) {
|
|
534
|
-
res.print('<h1>Hello World!</h1>');
|
|
535
|
-
next();
|
|
536
|
-
});
|
|
537
|
-
|
|
538
|
-
module.exports = server.exports();
|
|
539
|
-
```
|
|
540
|
-
|
|
541
|
-
**Access via URL**: `.../default/Hello-Show`
|
|
542
|
-
|
|
543
|
-
### 2. Rendering an ISML Template with Data
|
|
544
|
-
|
|
545
|
-
```javascript
|
|
546
|
-
'use strict';
|
|
547
|
-
var server = require('server');
|
|
548
|
-
var ProductFactory = require('*/cartridge/scripts/factories/product');
|
|
549
|
-
|
|
550
|
-
server.get('Show', function (req, res, next) {
|
|
551
|
-
var product = ProductFactory.get({ pid: req.querystring.pid });
|
|
552
|
-
res.render('product/productDetails', {
|
|
553
|
-
product: product // This object becomes 'pdict' in the template
|
|
554
|
-
});
|
|
555
|
-
next();
|
|
556
|
-
});
|
|
557
|
-
|
|
558
|
-
module.exports = server.exports();
|
|
559
|
-
```
|
|
560
|
-
|
|
561
|
-
The `product/productDetails.isml` template can then access `${pdict.product.productName}`.
|
|
562
|
-
|
|
563
|
-
### 3. Returning JSON for an AJAX Call
|
|
564
|
-
|
|
565
|
-
```javascript
|
|
566
|
-
'use strict';
|
|
567
|
-
var server = require('server');
|
|
568
|
-
var CartModel = require('*/cartridge/models/cart');
|
|
569
|
-
var BasketMgr = require('dw/order/BasketMgr');
|
|
570
|
-
|
|
571
|
-
server.get('GetCart', function (req, res, next) {
|
|
572
|
-
var basket = BasketMgr.getCurrentBasket();
|
|
573
|
-
var cart = new CartModel(basket);
|
|
574
|
-
res.json(cart); // Serializes the 'cart' object to JSON
|
|
575
|
-
next();
|
|
576
|
-
});
|
|
577
|
-
|
|
578
|
-
module.exports = server.exports();
|
|
579
|
-
```
|
|
580
|
-
|
|
581
|
-
The `res.json()` method is the standard way to create API endpoints for client-side JavaScript.
|
|
582
|
-
|
|
583
|
-
### 4. Extending a Base Controller (Product-Show)
|
|
584
|
-
|
|
585
|
-
**File**: `cartridges/my_cartridge/cartridge/controllers/Product.js`
|
|
586
|
-
|
|
587
|
-
```javascript
|
|
588
|
-
'use strict';
|
|
589
|
-
var server = require('server');
|
|
590
|
-
var page = module.superModule; // Get the base controller
|
|
591
|
-
server.extend(page);
|
|
592
|
-
|
|
593
|
-
// Add a new step to the end of the 'Show' route
|
|
594
|
-
server.append('Show', function (req, res, next) {
|
|
595
|
-
var viewData = res.getViewData(); // Get data prepared by the base controller
|
|
596
|
-
|
|
597
|
-
// Add custom property
|
|
598
|
-
viewData.exampleData = 'This is custom data!';
|
|
599
|
-
|
|
600
|
-
res.setViewData(viewData); // Pass modified data to the template
|
|
601
|
-
next();
|
|
602
|
-
});
|
|
603
|
-
|
|
604
|
-
module.exports = server.exports();
|
|
605
|
-
```
|
|
606
|
-
|
|
607
|
-
This non-intrusively adds `exampleData` to the pdict object on the Product Detail Page.
|
|
608
|
-
|
|
609
|
-
### 5. Handling a Form Submission with CSRF Protection
|
|
610
|
-
|
|
611
|
-
```javascript
|
|
612
|
-
'use strict';
|
|
613
|
-
var server = require('server');
|
|
614
|
-
var csrfProtection = require('*/cartridge/scripts/middleware/csrf');
|
|
615
|
-
|
|
616
|
-
// Route to display the form
|
|
617
|
-
server.get('ShowForm', csrfProtection.generateToken, function (req, res, next) {
|
|
618
|
-
//... logic to render form...
|
|
619
|
-
res.render('myFormTemplate', {
|
|
620
|
-
// ✅ CORRECT: No need to manually pass CSRF - middleware handles this
|
|
621
|
-
formData: someData
|
|
622
|
-
});
|
|
623
|
-
// CSRF token automatically available as pdict.csrf.tokenName and pdict.csrf.token
|
|
624
|
-
next();
|
|
625
|
-
});
|
|
626
|
-
|
|
627
|
-
// Route to handle the submission
|
|
628
|
-
server.post('SubmitForm', csrfProtection.validateRequest, function (req, res, next) {
|
|
629
|
-
var myForm = server.forms.getForm('myForm');
|
|
630
|
-
if (myForm.valid) {
|
|
631
|
-
// Process valid form
|
|
632
|
-
res.json({ success: true });
|
|
633
|
-
} else {
|
|
634
|
-
// Handle invalid form
|
|
635
|
-
res.json({ success: false, error: 'Invalid form data' });
|
|
636
|
-
}
|
|
637
|
-
next();
|
|
638
|
-
});
|
|
639
|
-
|
|
640
|
-
module.exports = server.exports();
|
|
641
|
-
```
|
|
642
|
-
|
|
643
|
-
The template must include a hidden input for the CSRF token: `<input type="hidden" name="${pdict.csrf.tokenName}" value="${pdict.csrf.token}"/>`
|
|
644
|
-
|
|
645
|
-
## Key Best Practices
|
|
646
|
-
|
|
647
|
-
### Security
|
|
648
|
-
|
|
649
|
-
- Always use the `csrfProtection` middleware for any POST request that changes state.
|
|
650
|
-
- Enforce HTTPS for sensitive routes using `server.middleware.https`.
|
|
651
|
-
- Apply the principle of least privilege for user access control.
|
|
652
|
-
|
|
653
|
-
### Performance
|
|
654
|
-
|
|
655
|
-
- Use page caching via `res.cacheExpiration(hours)` or the cache middleware.
|
|
656
|
-
- Lazy load modules by placing `require()` statements inside the route functions where they are used, not at the top of the file. This reduces initial load time.
|
|
657
|
-
- Offload long-running tasks to asynchronous Jobs instead of running them in a synchronous controller request.
|
|
658
|
-
|
|
659
|
-
### Error Handling
|
|
660
|
-
|
|
661
|
-
- Wrap potentially failing code (especially Script API calls) in `try...catch` blocks.
|
|
662
|
-
- Leverage the global `Error.js` controller for uncaught exceptions. It correctly handles both page renders and AJAX JSON responses.
|
|
663
|
-
- Log detailed errors for developers but show user-friendly messages on the storefront.
|
|
664
|
-
|
|
665
|
-
### Testing
|
|
666
|
-
|
|
667
|
-
- Controllers should be tested with integration tests, not unit tests.
|
|
668
|
-
- Use a stack of Mocha, Chai, and request-promise to make HTTP requests to controller endpoints on a sandbox and assert the response.
|
|
669
|
-
- It is mandatory to provide integration tests for controllers that return JSON.
|
|
670
|
-
|
|
671
1
|
## Standard SFRA Controllers
|
|
672
2
|
|
|
673
3
|
SFRA provides a comprehensive set of base controllers that handle core ecommerce functionality. Understanding these controllers is essential for customization and extension. Each controller returns specific model structures that provide data to templates and AJAX responses.
|