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
|
@@ -0,0 +1,908 @@
|
|
|
1
|
+
# ISML isselect Element
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The `<isselect>` element generates HTML drop-down list boxes (select elements) in forms. It provides a convenient way to create select lists from iterators or collections, automatically handling the generation of `<select>` and `<option>` HTML tags with proper encoding and preselection support.
|
|
6
|
+
|
|
7
|
+
**Key Features:** Automatic HTML select/option generation, iterator-based list population, conditional preselection, automatic encoding, separation of display text from submitted values.
|
|
8
|
+
|
|
9
|
+
**Note:** `<isselect>` replaces the HTML `<select>` tag and its supporting `<option>` tags, providing ISML-specific enhancements.
|
|
10
|
+
|
|
11
|
+
## Syntax
|
|
12
|
+
|
|
13
|
+
```isml
|
|
14
|
+
<isselect
|
|
15
|
+
name = simple_name // required
|
|
16
|
+
iterator = loop_var // required
|
|
17
|
+
description = box_text // required
|
|
18
|
+
value = text_value // required
|
|
19
|
+
condition = "true" | "false" // optional
|
|
20
|
+
encoding = "on" | "off" // optional (default: "on")
|
|
21
|
+
/>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Required Attributes
|
|
25
|
+
|
|
26
|
+
### name
|
|
27
|
+
|
|
28
|
+
**Type:** String or Expression
|
|
29
|
+
**Required:** Yes
|
|
30
|
+
|
|
31
|
+
Specifies the name for the list box. This name is used when the browser sends the user's selection as a key-value pair to the server.
|
|
32
|
+
|
|
33
|
+
**Important:** The specified name must match the input parameter required by the controller or pipeline that processes the form values.
|
|
34
|
+
|
|
35
|
+
**Examples:**
|
|
36
|
+
```isml
|
|
37
|
+
<!-- Fixed name -->
|
|
38
|
+
<isselect name="country" ... />
|
|
39
|
+
|
|
40
|
+
<!-- Expression-based name -->
|
|
41
|
+
<isselect name="${pdict.fieldName}" ... />
|
|
42
|
+
|
|
43
|
+
<!-- Common names -->
|
|
44
|
+
<isselect name="paymentMethod" ... />
|
|
45
|
+
<isselect name="shippingMethod" ... />
|
|
46
|
+
<isselect name="stateCode" ... />
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### iterator
|
|
50
|
+
|
|
51
|
+
**Type:** Expression (Iterator or Collection)
|
|
52
|
+
**Required:** Yes
|
|
53
|
+
|
|
54
|
+
Specifies the iterator or collection whose elements will be added to the list box. Each element in the iterator becomes an option in the select list.
|
|
55
|
+
|
|
56
|
+
**Data Types:**
|
|
57
|
+
- Iterator
|
|
58
|
+
- Array
|
|
59
|
+
- Collection
|
|
60
|
+
- List
|
|
61
|
+
|
|
62
|
+
**Examples:**
|
|
63
|
+
```isml
|
|
64
|
+
<!-- Iterator -->
|
|
65
|
+
<isselect iterator="${pdict.countries}" ... />
|
|
66
|
+
|
|
67
|
+
<!-- Array -->
|
|
68
|
+
<isselect iterator="${pdict.stateList}" ... />
|
|
69
|
+
|
|
70
|
+
<!-- Collection from API -->
|
|
71
|
+
<isselect iterator="${pdict.shippingMethods}" ... />
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### description
|
|
75
|
+
|
|
76
|
+
**Type:** Expression
|
|
77
|
+
**Required:** Yes
|
|
78
|
+
|
|
79
|
+
Specifies the text that is displayed in the drop-down list box for each option. This is the user-visible text.
|
|
80
|
+
|
|
81
|
+
**Examples:**
|
|
82
|
+
```isml
|
|
83
|
+
<!-- Display country name -->
|
|
84
|
+
<isselect description="${iterator.displayValue}" ... />
|
|
85
|
+
|
|
86
|
+
<!-- Display formatted text -->
|
|
87
|
+
<isselect description="${iterator.name + ' (' + iterator.code + ')'}" ... />
|
|
88
|
+
|
|
89
|
+
<!-- Display localized text -->
|
|
90
|
+
<isselect description="${Resource.msg(iterator.id, 'forms', null)}" ... />
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### value
|
|
94
|
+
|
|
95
|
+
**Type:** Expression
|
|
96
|
+
**Required:** Yes
|
|
97
|
+
|
|
98
|
+
Specifies the value sent back by the browser to the server as the value of the key-value pair when the form is submitted. This allows you to use internal identifiers (like IDs or codes) while displaying user-friendly text.
|
|
99
|
+
|
|
100
|
+
**Purpose:** Separate internal value from display text (e.g., return product ID instead of product name).
|
|
101
|
+
|
|
102
|
+
**Storage:** The string specified by `value` is stored in the pipeline dictionary with the key determined by the `name` attribute.
|
|
103
|
+
|
|
104
|
+
**Examples:**
|
|
105
|
+
```isml
|
|
106
|
+
<!-- Return country code instead of country name -->
|
|
107
|
+
<isselect
|
|
108
|
+
value="${iterator.countryCode}"
|
|
109
|
+
description="${iterator.displayValue}"
|
|
110
|
+
... />
|
|
111
|
+
|
|
112
|
+
<!-- Return payment method ID -->
|
|
113
|
+
<isselect
|
|
114
|
+
value="${iterator.ID}"
|
|
115
|
+
description="${iterator.name}"
|
|
116
|
+
... />
|
|
117
|
+
|
|
118
|
+
<!-- Return UUID -->
|
|
119
|
+
<isselect
|
|
120
|
+
value="${iterator.UUID}"
|
|
121
|
+
description="${iterator.description}"
|
|
122
|
+
... />
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Optional Attributes
|
|
126
|
+
|
|
127
|
+
### condition
|
|
128
|
+
|
|
129
|
+
**Type:** Expression (Boolean)
|
|
130
|
+
**Allowed Data Type:** Expression only (string literals not allowed)
|
|
131
|
+
**Optional:** Yes
|
|
132
|
+
|
|
133
|
+
Determines which list element is preselected when the form loads. If the condition evaluates to `true` for an element, that element is marked as selected.
|
|
134
|
+
|
|
135
|
+
**Important:** Ensure only **one** list element matches the condition to avoid undefined browser behavior.
|
|
136
|
+
|
|
137
|
+
**HTML Equivalent:** This corresponds to the `selected` attribute of the HTML `<option>` tag.
|
|
138
|
+
|
|
139
|
+
**Examples:**
|
|
140
|
+
```isml
|
|
141
|
+
<!-- Preselect current country -->
|
|
142
|
+
<isselect
|
|
143
|
+
condition="${iterator.countryCode == pdict.currentCountry}"
|
|
144
|
+
... />
|
|
145
|
+
|
|
146
|
+
<!-- Preselect default payment method -->
|
|
147
|
+
<isselect
|
|
148
|
+
condition="${iterator.ID == pdict.defaultPaymentMethod}"
|
|
149
|
+
... />
|
|
150
|
+
|
|
151
|
+
<!-- Preselect based on session data -->
|
|
152
|
+
<isselect
|
|
153
|
+
condition="${iterator.value == session.custom.selectedValue}"
|
|
154
|
+
... />
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### encoding
|
|
158
|
+
|
|
159
|
+
**Type:** String or Expression
|
|
160
|
+
**Allowed Values:** `"on"`, `"off"`
|
|
161
|
+
**Default:** `"on"`
|
|
162
|
+
**Optional:** Yes
|
|
163
|
+
|
|
164
|
+
Controls automatic HTML encoding of the output. When enabled, special characters are converted to their HTML entity equivalents.
|
|
165
|
+
|
|
166
|
+
**Encoding Behavior:**
|
|
167
|
+
- `"on"` (default): Converts special characters (`<`, `>`, `&`, `"`) and HTML 3.2 named characters (Unicode 160-255) to HTML entities
|
|
168
|
+
- `"off"`: Disables automatic encoding (use with caution)
|
|
169
|
+
|
|
170
|
+
**Example Conversions:**
|
|
171
|
+
- `>` → `>`
|
|
172
|
+
- `<` → `<`
|
|
173
|
+
- `&` → `&`
|
|
174
|
+
- `"` → `"`
|
|
175
|
+
|
|
176
|
+
**Examples:**
|
|
177
|
+
```isml
|
|
178
|
+
<!-- Default: Encoding enabled -->
|
|
179
|
+
<isselect encoding="on" ... />
|
|
180
|
+
|
|
181
|
+
<!-- Disable encoding (if content is already encoded) -->
|
|
182
|
+
<isselect encoding="off" ... />
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Purpose
|
|
186
|
+
|
|
187
|
+
The `<isselect>` element serves to:
|
|
188
|
+
|
|
189
|
+
1. **Simplify Form Creation:** Replace verbose HTML `<select>` and `<option>` tags with a single ISML tag
|
|
190
|
+
2. **Iterator Integration:** Automatically generate options from collections and iterators
|
|
191
|
+
3. **Automatic Encoding:** Protect against XSS attacks with automatic HTML encoding
|
|
192
|
+
4. **Value Separation:** Display user-friendly text while submitting internal values
|
|
193
|
+
5. **Preselection:** Easily preselect options based on conditions
|
|
194
|
+
6. **Form Processing:** Ensure proper integration with B2C Commerce form processing
|
|
195
|
+
|
|
196
|
+
## How It Works
|
|
197
|
+
|
|
198
|
+
### ISML to HTML Conversion
|
|
199
|
+
|
|
200
|
+
```isml
|
|
201
|
+
<!-- ISML Code -->
|
|
202
|
+
<isselect
|
|
203
|
+
name="country"
|
|
204
|
+
iterator="${pdict.countries}"
|
|
205
|
+
description="${iterator.displayValue}"
|
|
206
|
+
value="${iterator.countryCode}"
|
|
207
|
+
condition="${iterator.countryCode == 'US'}"
|
|
208
|
+
/>
|
|
209
|
+
|
|
210
|
+
<!-- Generated HTML -->
|
|
211
|
+
<select name="country">
|
|
212
|
+
<option value="US" selected>United States</option>
|
|
213
|
+
<option value="CA">Canada</option>
|
|
214
|
+
<option value="MX">Mexico</option>
|
|
215
|
+
<option value="UK">United Kingdom</option>
|
|
216
|
+
</select>
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Form Submission
|
|
220
|
+
|
|
221
|
+
When the user selects an option and submits the form:
|
|
222
|
+
|
|
223
|
+
1. **Browser sends:** `country=CA` (if user selects Canada)
|
|
224
|
+
2. **Server receives:** Key-value pair in request parameters
|
|
225
|
+
3. **Access in controller:** `request.httpParameterMap.country.stringValue` → `"CA"`
|
|
226
|
+
4. **Access in template:** `pdict.CurrentForms.form.country.value` → `"CA"`
|
|
227
|
+
|
|
228
|
+
## Common Use Cases
|
|
229
|
+
|
|
230
|
+
### Country Selection
|
|
231
|
+
|
|
232
|
+
```isml
|
|
233
|
+
<form action="${URLUtils.url('Address-Save')}" method="post">
|
|
234
|
+
<label for="country">Country:</label>
|
|
235
|
+
<isselect
|
|
236
|
+
name="country"
|
|
237
|
+
iterator="${pdict.countries}"
|
|
238
|
+
description="${iterator.displayValue}"
|
|
239
|
+
value="${iterator.countryCode}"
|
|
240
|
+
condition="${iterator.countryCode == pdict.currentAddress.countryCode}"
|
|
241
|
+
/>
|
|
242
|
+
|
|
243
|
+
<button type="submit">Save Address</button>
|
|
244
|
+
</form>
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### State/Province Selection
|
|
248
|
+
|
|
249
|
+
```isml
|
|
250
|
+
<form action="${URLUtils.url('Address-Save')}" method="post">
|
|
251
|
+
<label for="state">State:</label>
|
|
252
|
+
<isselect
|
|
253
|
+
name="state"
|
|
254
|
+
iterator="${pdict.states}"
|
|
255
|
+
description="${iterator.displayValue}"
|
|
256
|
+
value="${iterator.code}"
|
|
257
|
+
condition="${iterator.code == pdict.currentAddress.stateCode}"
|
|
258
|
+
/>
|
|
259
|
+
</form>
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Payment Method Selection
|
|
263
|
+
|
|
264
|
+
```isml
|
|
265
|
+
<form action="${URLUtils.url('Checkout-SubmitPayment')}" method="post">
|
|
266
|
+
<label for="paymentMethod">Payment Method:</label>
|
|
267
|
+
<isselect
|
|
268
|
+
name="paymentMethod"
|
|
269
|
+
iterator="${pdict.applicablePaymentMethods}"
|
|
270
|
+
description="${iterator.name}"
|
|
271
|
+
value="${iterator.ID}"
|
|
272
|
+
condition="${iterator.ID == pdict.selectedPaymentMethodID}"
|
|
273
|
+
/>
|
|
274
|
+
|
|
275
|
+
<button type="submit">Continue to Review</button>
|
|
276
|
+
</form>
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Shipping Method Selection
|
|
280
|
+
|
|
281
|
+
```isml
|
|
282
|
+
<form action="${URLUtils.url('Checkout-SelectShippingMethod')}" method="post">
|
|
283
|
+
<label for="shippingMethod">Shipping Method:</label>
|
|
284
|
+
<isselect
|
|
285
|
+
name="shippingMethodID"
|
|
286
|
+
iterator="${pdict.applicableShippingMethods}"
|
|
287
|
+
description="${iterator.displayName + ' - ' + iterator.shippingCost.formatted}"
|
|
288
|
+
value="${iterator.ID}"
|
|
289
|
+
condition="${iterator.ID == pdict.basket.defaultShipment.shippingMethodID}"
|
|
290
|
+
/>
|
|
291
|
+
|
|
292
|
+
<button type="submit">Select Shipping</button>
|
|
293
|
+
</form>
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Product Variant Selection (Size)
|
|
297
|
+
|
|
298
|
+
```isml
|
|
299
|
+
<form action="${URLUtils.url('Product-Variation')}" method="post">
|
|
300
|
+
<label for="size">Size:</label>
|
|
301
|
+
<isselect
|
|
302
|
+
name="dwvar_${pdict.product.ID}_size"
|
|
303
|
+
iterator="${pdict.product.variationModel.getProductVariationAttribute('size').values}"
|
|
304
|
+
description="${iterator.displayValue}"
|
|
305
|
+
value="${iterator.value}"
|
|
306
|
+
condition="${iterator.value == pdict.product.variationModel.getSelectedValue('size').value}"
|
|
307
|
+
/>
|
|
308
|
+
</form>
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### Sort Order Selection
|
|
312
|
+
|
|
313
|
+
```isml
|
|
314
|
+
<form action="${URLUtils.url('Search-Show')}" method="get">
|
|
315
|
+
<label for="sort">Sort By:</label>
|
|
316
|
+
<isselect
|
|
317
|
+
name="srule"
|
|
318
|
+
iterator="${pdict.sortingRules}"
|
|
319
|
+
description="${iterator.displayName}"
|
|
320
|
+
value="${iterator.ID}"
|
|
321
|
+
condition="${iterator.ID == pdict.currentSortingRule}"
|
|
322
|
+
/>
|
|
323
|
+
|
|
324
|
+
<button type="submit">Apply</button>
|
|
325
|
+
</form>
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Quantity Selection
|
|
329
|
+
|
|
330
|
+
```isml
|
|
331
|
+
<form action="${URLUtils.url('Cart-UpdateQuantity')}" method="post">
|
|
332
|
+
<label for="quantity">Quantity:</label>
|
|
333
|
+
<isselect
|
|
334
|
+
name="quantity"
|
|
335
|
+
iterator="${[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}"
|
|
336
|
+
description="${iterator}"
|
|
337
|
+
value="${iterator}"
|
|
338
|
+
condition="${iterator == pdict.lineItem.quantity}"
|
|
339
|
+
/>
|
|
340
|
+
|
|
341
|
+
<button type="submit">Update</button>
|
|
342
|
+
</form>
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### Year Selection (Credit Card Expiry)
|
|
346
|
+
|
|
347
|
+
```isml
|
|
348
|
+
<isscript>
|
|
349
|
+
var currentYear = new Date().getFullYear();
|
|
350
|
+
var years = [];
|
|
351
|
+
for (var i = 0; i < 10; i++) {
|
|
352
|
+
years.push(currentYear + i);
|
|
353
|
+
}
|
|
354
|
+
</isscript>
|
|
355
|
+
|
|
356
|
+
<form action="${URLUtils.url('PaymentInstruments-SaveCard')}" method="post">
|
|
357
|
+
<label for="expiryYear">Expiry Year:</label>
|
|
358
|
+
<isselect
|
|
359
|
+
name="expirationYear"
|
|
360
|
+
iterator="${years}"
|
|
361
|
+
description="${iterator}"
|
|
362
|
+
value="${iterator}"
|
|
363
|
+
condition="${iterator == pdict.currentCard.expirationYear}"
|
|
364
|
+
/>
|
|
365
|
+
</form>
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Month Selection
|
|
369
|
+
|
|
370
|
+
```isml
|
|
371
|
+
<isscript>
|
|
372
|
+
var months = [
|
|
373
|
+
{value: '01', name: 'January'},
|
|
374
|
+
{value: '02', name: 'February'},
|
|
375
|
+
{value: '03', name: 'March'},
|
|
376
|
+
{value: '04', name: 'April'},
|
|
377
|
+
{value: '05', name: 'May'},
|
|
378
|
+
{value: '06', name: 'June'},
|
|
379
|
+
{value: '07', name: 'July'},
|
|
380
|
+
{value: '08', name: 'August'},
|
|
381
|
+
{value: '09', name: 'September'},
|
|
382
|
+
{value: '10', name: 'October'},
|
|
383
|
+
{value: '11', name: 'November'},
|
|
384
|
+
{value: '12', name: 'December'}
|
|
385
|
+
];
|
|
386
|
+
</isscript>
|
|
387
|
+
|
|
388
|
+
<label for="expiryMonth">Expiry Month:</label>
|
|
389
|
+
<isselect
|
|
390
|
+
name="expirationMonth"
|
|
391
|
+
iterator="${months}"
|
|
392
|
+
description="${iterator.name}"
|
|
393
|
+
value="${iterator.value}"
|
|
394
|
+
condition="${iterator.value == pdict.currentCard.expirationMonth}"
|
|
395
|
+
/>
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
### Locale/Language Selection
|
|
399
|
+
|
|
400
|
+
```isml
|
|
401
|
+
<form action="${URLUtils.url('Page-SetLocale')}" method="post">
|
|
402
|
+
<label for="locale">Language:</label>
|
|
403
|
+
<isselect
|
|
404
|
+
name="locale"
|
|
405
|
+
iterator="${pdict.availableLocales}"
|
|
406
|
+
description="${iterator.displayName}"
|
|
407
|
+
value="${iterator.ID}"
|
|
408
|
+
condition="${iterator.ID == request.locale}"
|
|
409
|
+
/>
|
|
410
|
+
|
|
411
|
+
<button type="submit">Change Language</button>
|
|
412
|
+
</form>
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
### Currency Selection
|
|
416
|
+
|
|
417
|
+
```isml
|
|
418
|
+
<form action="${URLUtils.url('Page-SetCurrency')}" method="post">
|
|
419
|
+
<label for="currency">Currency:</label>
|
|
420
|
+
<isselect
|
|
421
|
+
name="currencyCode"
|
|
422
|
+
iterator="${pdict.currencies}"
|
|
423
|
+
description="${iterator.currencyCode + ' - ' + iterator.name}"
|
|
424
|
+
value="${iterator.currencyCode}"
|
|
425
|
+
condition="${iterator.currencyCode == session.currency.currencyCode}"
|
|
426
|
+
/>
|
|
427
|
+
|
|
428
|
+
<button type="submit">Change Currency</button>
|
|
429
|
+
</form>
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### Advanced: Formatted Description
|
|
433
|
+
|
|
434
|
+
```isml
|
|
435
|
+
<form action="${URLUtils.url('Product-Show')}" method="get">
|
|
436
|
+
<label for="product">Select Product:</label>
|
|
437
|
+
<isselect
|
|
438
|
+
name="pid"
|
|
439
|
+
iterator="${pdict.products}"
|
|
440
|
+
description="${iterator.name + ' - ' + iterator.price.sales.formatted + (iterator.available ? ' (In Stock)' : ' (Out of Stock)')}"
|
|
441
|
+
value="${iterator.ID}"
|
|
442
|
+
condition="${iterator.ID == pdict.currentProductID}"
|
|
443
|
+
/>
|
|
444
|
+
</form>
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
## Best Practices
|
|
448
|
+
|
|
449
|
+
### 1. Match Name to Form Field
|
|
450
|
+
|
|
451
|
+
Ensure the `name` attribute matches the expected form field in your controller:
|
|
452
|
+
|
|
453
|
+
```javascript
|
|
454
|
+
// Controller expects 'shippingMethodID'
|
|
455
|
+
server.post('SelectShipping', function (req, res, next) {
|
|
456
|
+
var shippingMethodID = req.form.shippingMethodID; // Must match isselect name
|
|
457
|
+
// Process shipping method...
|
|
458
|
+
});
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
```isml
|
|
462
|
+
<!-- Template: name matches controller expectation -->
|
|
463
|
+
<isselect name="shippingMethodID" ... />
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### 2. Use Clear, Descriptive Text
|
|
467
|
+
|
|
468
|
+
Make descriptions user-friendly and informative:
|
|
469
|
+
|
|
470
|
+
```isml
|
|
471
|
+
<!-- Good: Clear, helpful descriptions -->
|
|
472
|
+
<isselect
|
|
473
|
+
description="${iterator.name + ' - ' + iterator.estimatedDelivery + ' - ' + iterator.cost}"
|
|
474
|
+
... />
|
|
475
|
+
|
|
476
|
+
<!-- Less helpful: Minimal description -->
|
|
477
|
+
<isselect
|
|
478
|
+
description="${iterator.name}"
|
|
479
|
+
... />
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
### 3. Ensure Unique Condition Matches
|
|
483
|
+
|
|
484
|
+
Only one option should match the condition:
|
|
485
|
+
|
|
486
|
+
```isml
|
|
487
|
+
<!-- Good: Unique match -->
|
|
488
|
+
<isselect
|
|
489
|
+
condition="${iterator.ID == pdict.selectedID}"
|
|
490
|
+
... />
|
|
491
|
+
|
|
492
|
+
<!-- Bad: Multiple matches possible -->
|
|
493
|
+
<isselect
|
|
494
|
+
condition="${iterator.available == true}" <!-- Many items could match -->
|
|
495
|
+
... />
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
### 4. Provide Default Selection
|
|
499
|
+
|
|
500
|
+
Always preselect a sensible default option:
|
|
501
|
+
|
|
502
|
+
```isml
|
|
503
|
+
<!-- Good: Default selection -->
|
|
504
|
+
<isselect
|
|
505
|
+
condition="${iterator.isDefault || (iterator.code == pdict.currentCountry)}"
|
|
506
|
+
... />
|
|
507
|
+
|
|
508
|
+
<!-- Less user-friendly: No default selection -->
|
|
509
|
+
<isselect
|
|
510
|
+
<!-- No condition - user must select -->
|
|
511
|
+
... />
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
### 5. Use Value for Internal IDs
|
|
515
|
+
|
|
516
|
+
Use `value` for internal identifiers, `description` for display:
|
|
517
|
+
|
|
518
|
+
```isml
|
|
519
|
+
<!-- Good: Separate value and description -->
|
|
520
|
+
<isselect
|
|
521
|
+
value="${iterator.ID}" <!-- Internal ID -->
|
|
522
|
+
description="${iterator.name}" <!-- Display text -->
|
|
523
|
+
... />
|
|
524
|
+
|
|
525
|
+
<!-- Avoid: Same for both -->
|
|
526
|
+
<isselect
|
|
527
|
+
value="${iterator.name}"
|
|
528
|
+
description="${iterator.name}"
|
|
529
|
+
... />
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### 6. Add Accessibility Attributes
|
|
533
|
+
|
|
534
|
+
Wrap in proper form structure with labels:
|
|
535
|
+
|
|
536
|
+
```isml
|
|
537
|
+
<!-- Good: Accessible form structure -->
|
|
538
|
+
<div class="form-group">
|
|
539
|
+
<label for="country" class="form-label">Country: <span class="required">*</span></label>
|
|
540
|
+
<isselect
|
|
541
|
+
name="country"
|
|
542
|
+
iterator="${pdict.countries}"
|
|
543
|
+
description="${iterator.displayValue}"
|
|
544
|
+
value="${iterator.countryCode}"
|
|
545
|
+
condition="${iterator.countryCode == pdict.currentCountry}"
|
|
546
|
+
/>
|
|
547
|
+
<small class="form-text">Select your country</small>
|
|
548
|
+
</div>
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
### 7. Handle Empty Iterators
|
|
552
|
+
|
|
553
|
+
Check for empty collections before rendering:
|
|
554
|
+
|
|
555
|
+
```isml
|
|
556
|
+
<isif condition="${pdict.countries && pdict.countries.length > 0}">
|
|
557
|
+
<isselect
|
|
558
|
+
name="country"
|
|
559
|
+
iterator="${pdict.countries}"
|
|
560
|
+
description="${iterator.displayValue}"
|
|
561
|
+
value="${iterator.countryCode}"
|
|
562
|
+
/>
|
|
563
|
+
<iselse>
|
|
564
|
+
<p class="error">No countries available</p>
|
|
565
|
+
</isif>
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
### 8. Use Encoding by Default
|
|
569
|
+
|
|
570
|
+
Keep encoding enabled unless you have a specific reason to disable it:
|
|
571
|
+
|
|
572
|
+
```isml
|
|
573
|
+
<!-- Good: Encoding enabled (default) -->
|
|
574
|
+
<isselect
|
|
575
|
+
description="${iterator.name}"
|
|
576
|
+
encoding="on"
|
|
577
|
+
... />
|
|
578
|
+
|
|
579
|
+
<!-- Only disable if content is pre-encoded -->
|
|
580
|
+
<isselect
|
|
581
|
+
description="${iterator.preEncodedHTML}"
|
|
582
|
+
encoding="off"
|
|
583
|
+
... />
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
## Form Integration Patterns
|
|
587
|
+
|
|
588
|
+
### Pattern 1: Simple Selection Form
|
|
589
|
+
|
|
590
|
+
```isml
|
|
591
|
+
<form action="${URLUtils.url('Account-SaveProfile')}" method="post">
|
|
592
|
+
<fieldset>
|
|
593
|
+
<legend>Personal Information</legend>
|
|
594
|
+
|
|
595
|
+
<div class="form-group">
|
|
596
|
+
<label for="country">Country</label>
|
|
597
|
+
<isselect
|
|
598
|
+
name="country"
|
|
599
|
+
iterator="${pdict.countries}"
|
|
600
|
+
description="${iterator.displayValue}"
|
|
601
|
+
value="${iterator.countryCode}"
|
|
602
|
+
condition="${iterator.countryCode == pdict.profile.countryCode}"
|
|
603
|
+
/>
|
|
604
|
+
</div>
|
|
605
|
+
|
|
606
|
+
<button type="submit">Save</button>
|
|
607
|
+
</fieldset>
|
|
608
|
+
</form>
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
### Pattern 2: Dependent Selects (Country → State)
|
|
612
|
+
|
|
613
|
+
```isml
|
|
614
|
+
<form action="${URLUtils.url('Address-Save')}" method="post">
|
|
615
|
+
<!-- Country selection -->
|
|
616
|
+
<div class="form-group">
|
|
617
|
+
<label for="country">Country</label>
|
|
618
|
+
<isselect
|
|
619
|
+
name="country"
|
|
620
|
+
iterator="${pdict.countries}"
|
|
621
|
+
description="${iterator.displayValue}"
|
|
622
|
+
value="${iterator.countryCode}"
|
|
623
|
+
condition="${iterator.countryCode == pdict.address.countryCode}"
|
|
624
|
+
/>
|
|
625
|
+
</div>
|
|
626
|
+
|
|
627
|
+
<!-- State selection (dependent on country) -->
|
|
628
|
+
<div class="form-group" data-country-dependent="true">
|
|
629
|
+
<label for="state">State/Province</label>
|
|
630
|
+
<isselect
|
|
631
|
+
name="state"
|
|
632
|
+
iterator="${pdict.states}"
|
|
633
|
+
description="${iterator.displayValue}"
|
|
634
|
+
value="${iterator.code}"
|
|
635
|
+
condition="${iterator.code == pdict.address.stateCode}"
|
|
636
|
+
/>
|
|
637
|
+
</div>
|
|
638
|
+
|
|
639
|
+
<button type="submit">Save Address</button>
|
|
640
|
+
</form>
|
|
641
|
+
|
|
642
|
+
<script>
|
|
643
|
+
// JavaScript to update states when country changes
|
|
644
|
+
document.querySelector('[name="country"]').addEventListener('change', function() {
|
|
645
|
+
// AJAX call to update state list
|
|
646
|
+
});
|
|
647
|
+
</script>
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
### Pattern 3: Multi-Select Form
|
|
651
|
+
|
|
652
|
+
```isml
|
|
653
|
+
<form action="${URLUtils.url('Checkout-Submit')}" method="post">
|
|
654
|
+
<!-- Shipping method -->
|
|
655
|
+
<div class="form-group">
|
|
656
|
+
<label for="shippingMethod">Shipping Method</label>
|
|
657
|
+
<isselect
|
|
658
|
+
name="shippingMethodID"
|
|
659
|
+
iterator="${pdict.shippingMethods}"
|
|
660
|
+
description="${iterator.displayName + ' - ' + iterator.shippingCost.formatted}"
|
|
661
|
+
value="${iterator.ID}"
|
|
662
|
+
condition="${iterator.ID == pdict.currentShippingMethodID}"
|
|
663
|
+
/>
|
|
664
|
+
</div>
|
|
665
|
+
|
|
666
|
+
<!-- Payment method -->
|
|
667
|
+
<div class="form-group">
|
|
668
|
+
<label for="paymentMethod">Payment Method</label>
|
|
669
|
+
<isselect
|
|
670
|
+
name="paymentMethodID"
|
|
671
|
+
iterator="${pdict.paymentMethods}"
|
|
672
|
+
description="${iterator.name}"
|
|
673
|
+
value="${iterator.ID}"
|
|
674
|
+
condition="${iterator.ID == pdict.currentPaymentMethodID}"
|
|
675
|
+
/>
|
|
676
|
+
</div>
|
|
677
|
+
|
|
678
|
+
<button type="submit">Place Order</button>
|
|
679
|
+
</form>
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
## Comparison with HTML Select
|
|
683
|
+
|
|
684
|
+
| Feature | `<isselect>` | HTML `<select>` |
|
|
685
|
+
|---------|--------------|-----------------|
|
|
686
|
+
| Syntax | Single self-closing tag | Multiple tags (select + options) |
|
|
687
|
+
| Options | Auto-generated from iterator | Manual option tags |
|
|
688
|
+
| Encoding | Automatic (default on) | Manual |
|
|
689
|
+
| Preselection | Via condition attribute | Via selected attribute on option |
|
|
690
|
+
| ISML Integration | Native | Requires loops and conditions |
|
|
691
|
+
|
|
692
|
+
**Example Comparison:**
|
|
693
|
+
|
|
694
|
+
```isml
|
|
695
|
+
<!-- isselect: Concise -->
|
|
696
|
+
<isselect
|
|
697
|
+
name="country"
|
|
698
|
+
iterator="${pdict.countries}"
|
|
699
|
+
description="${iterator.name}"
|
|
700
|
+
value="${iterator.code}"
|
|
701
|
+
condition="${iterator.code == 'US'}"
|
|
702
|
+
/>
|
|
703
|
+
|
|
704
|
+
<!-- HTML select: Verbose -->
|
|
705
|
+
<select name="country">
|
|
706
|
+
<isloop items="${pdict.countries}" var="country">
|
|
707
|
+
<option value="${country.code}" <isif condition="${country.code == 'US'}">selected</isif>>
|
|
708
|
+
${country.name}
|
|
709
|
+
</option>
|
|
710
|
+
</isloop>
|
|
711
|
+
</select>
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
## Common Errors and Troubleshooting
|
|
715
|
+
|
|
716
|
+
### No Options Appearing
|
|
717
|
+
|
|
718
|
+
**Symptom:** Select box is empty.
|
|
719
|
+
|
|
720
|
+
**Causes:**
|
|
721
|
+
1. Iterator is empty or null
|
|
722
|
+
2. Iterator attribute has wrong path
|
|
723
|
+
3. Description or value expressions are invalid
|
|
724
|
+
|
|
725
|
+
**Solution:**
|
|
726
|
+
```isml
|
|
727
|
+
<!-- Check iterator exists and has items -->
|
|
728
|
+
<isif condition="${pdict.countries && pdict.countries.length > 0}">
|
|
729
|
+
<isselect
|
|
730
|
+
name="country"
|
|
731
|
+
iterator="${pdict.countries}"
|
|
732
|
+
description="${iterator.displayValue}"
|
|
733
|
+
value="${iterator.countryCode}"
|
|
734
|
+
/>
|
|
735
|
+
<iselse>
|
|
736
|
+
<p>No countries available</p>
|
|
737
|
+
</isif>
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
### Multiple Options Selected
|
|
741
|
+
|
|
742
|
+
**Symptom:** Multiple options appear selected in browser.
|
|
743
|
+
|
|
744
|
+
**Cause:** Condition matches multiple items.
|
|
745
|
+
|
|
746
|
+
**Solution:**
|
|
747
|
+
```isml
|
|
748
|
+
<!-- Bad: Condition matches multiple items -->
|
|
749
|
+
<isselect
|
|
750
|
+
condition="${iterator.available == true}" <!-- Many could be true -->
|
|
751
|
+
... />
|
|
752
|
+
|
|
753
|
+
<!-- Good: Unique identifier -->
|
|
754
|
+
<isselect
|
|
755
|
+
condition="${iterator.ID == pdict.selectedID}" <!-- Only one match -->
|
|
756
|
+
... />
|
|
757
|
+
```
|
|
758
|
+
|
|
759
|
+
### Form Value Not Received
|
|
760
|
+
|
|
761
|
+
**Symptom:** Controller doesn't receive selected value.
|
|
762
|
+
|
|
763
|
+
**Causes:**
|
|
764
|
+
1. Name attribute doesn't match controller expectation
|
|
765
|
+
2. Form not submitted properly
|
|
766
|
+
3. Form method (GET/POST) mismatch
|
|
767
|
+
|
|
768
|
+
**Solution:**
|
|
769
|
+
```isml
|
|
770
|
+
<!-- Ensure name matches controller -->
|
|
771
|
+
<form action="${URLUtils.url('Controller-Action')}" method="post">
|
|
772
|
+
<isselect name="expectedFieldName" ... /> <!-- Must match controller -->
|
|
773
|
+
<button type="submit">Submit</button>
|
|
774
|
+
</form>
|
|
775
|
+
```
|
|
776
|
+
|
|
777
|
+
```javascript
|
|
778
|
+
// Controller
|
|
779
|
+
server.post('Action', function (req, res, next) {
|
|
780
|
+
var value = req.form.expectedFieldName; // Must match isselect name
|
|
781
|
+
});
|
|
782
|
+
```
|
|
783
|
+
|
|
784
|
+
### Special Characters Not Displaying
|
|
785
|
+
|
|
786
|
+
**Symptom:** Special characters appear as HTML entities in select options.
|
|
787
|
+
|
|
788
|
+
**Cause:** Double encoding (encoding enabled when content already encoded).
|
|
789
|
+
|
|
790
|
+
**Solution:**
|
|
791
|
+
```isml
|
|
792
|
+
<!-- If content is already encoded, disable encoding -->
|
|
793
|
+
<isselect
|
|
794
|
+
description="${iterator.alreadyEncodedText}"
|
|
795
|
+
encoding="off"
|
|
796
|
+
... />
|
|
797
|
+
```
|
|
798
|
+
|
|
799
|
+
## Performance Considerations
|
|
800
|
+
|
|
801
|
+
### 1. Minimize Iterator Size
|
|
802
|
+
|
|
803
|
+
Large iterators can slow rendering:
|
|
804
|
+
|
|
805
|
+
```isml
|
|
806
|
+
<!-- Good: Reasonable number of options -->
|
|
807
|
+
<isselect iterator="${pdict.countries}" ... /> <!-- ~200 countries -->
|
|
808
|
+
|
|
809
|
+
<!-- Avoid: Thousands of options -->
|
|
810
|
+
<isselect iterator="${pdict.allProducts}" ... /> <!-- Could be 10,000+ -->
|
|
811
|
+
```
|
|
812
|
+
|
|
813
|
+
### 2. Use Efficient Conditions
|
|
814
|
+
|
|
815
|
+
Keep condition expressions simple:
|
|
816
|
+
|
|
817
|
+
```isml
|
|
818
|
+
<!-- Good: Simple comparison -->
|
|
819
|
+
<isselect
|
|
820
|
+
condition="${iterator.ID == pdict.selectedID}"
|
|
821
|
+
... />
|
|
822
|
+
|
|
823
|
+
<!-- Avoid: Complex calculation in condition -->
|
|
824
|
+
<isselect
|
|
825
|
+
condition="${calculateComplexLogic(iterator, pdict.data)}"
|
|
826
|
+
... />
|
|
827
|
+
```
|
|
828
|
+
|
|
829
|
+
## Security Considerations
|
|
830
|
+
|
|
831
|
+
### 1. Keep Encoding Enabled
|
|
832
|
+
|
|
833
|
+
Always use encoding unless absolutely necessary to disable:
|
|
834
|
+
|
|
835
|
+
```isml
|
|
836
|
+
<!-- Good: Encoding enabled (default) -->
|
|
837
|
+
<isselect
|
|
838
|
+
description="${iterator.userProvidedName}"
|
|
839
|
+
encoding="on"
|
|
840
|
+
... />
|
|
841
|
+
|
|
842
|
+
<!-- Dangerous: User content without encoding -->
|
|
843
|
+
<isselect
|
|
844
|
+
description="${iterator.userProvidedName}"
|
|
845
|
+
encoding="off" <!-- Potential XSS -->
|
|
846
|
+
... />
|
|
847
|
+
```
|
|
848
|
+
|
|
849
|
+
### 2. Validate Selected Values Server-Side
|
|
850
|
+
|
|
851
|
+
Never trust client-submitted values:
|
|
852
|
+
|
|
853
|
+
```javascript
|
|
854
|
+
// Controller: Always validate
|
|
855
|
+
server.post('Process', function (req, res, next) {
|
|
856
|
+
var selectedValue = req.form.fieldName;
|
|
857
|
+
|
|
858
|
+
// Validate against allowed values
|
|
859
|
+
var validValues = ['option1', 'option2', 'option3'];
|
|
860
|
+
if (validValues.indexOf(selectedValue) === -1) {
|
|
861
|
+
// Invalid value submitted
|
|
862
|
+
res.json({error: 'Invalid selection'});
|
|
863
|
+
return next();
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
// Process valid value
|
|
867
|
+
});
|
|
868
|
+
```
|
|
869
|
+
|
|
870
|
+
### 3. Use Internal IDs for Values
|
|
871
|
+
|
|
872
|
+
Don't expose sensitive information in option values:
|
|
873
|
+
|
|
874
|
+
```isml
|
|
875
|
+
<!-- Good: Use internal ID -->
|
|
876
|
+
<isselect
|
|
877
|
+
value="${iterator.ID}"
|
|
878
|
+
description="${iterator.name}"
|
|
879
|
+
... />
|
|
880
|
+
|
|
881
|
+
<!-- Avoid: Sensitive data in value -->
|
|
882
|
+
<isselect
|
|
883
|
+
value="${iterator.secretKey}" <!-- Don't expose secrets -->
|
|
884
|
+
description="${iterator.name}"
|
|
885
|
+
... />
|
|
886
|
+
```
|
|
887
|
+
|
|
888
|
+
## Related Elements
|
|
889
|
+
|
|
890
|
+
- **`<isloop>`** - Alternative for creating custom select lists with more control
|
|
891
|
+
- **`<isset>`** - Set default values for preselection
|
|
892
|
+
- **`<isif>`** - Conditional select box rendering
|
|
893
|
+
- **`<isprint>`** - Output selected values with formatting
|
|
894
|
+
|
|
895
|
+
## Related APIs
|
|
896
|
+
|
|
897
|
+
- **`dw.web.FormElement`** - Form element handling
|
|
898
|
+
- **`dw.web.FormField`** - Form field access
|
|
899
|
+
- **`request.httpParameterMap`** - Access form submission values
|
|
900
|
+
- **`session.forms`** - Session form data
|
|
901
|
+
|
|
902
|
+
## See Also
|
|
903
|
+
|
|
904
|
+
- [SFCC Forms Development Skill](../../ai-instructions/skills/sfcc-forms-development/SKILL.md)
|
|
905
|
+
- [SFRA Controllers Skill](../../ai-instructions/skills/sfcc-sfra-controllers/SKILL.md)
|
|
906
|
+
- [Security Skill](../../ai-instructions/skills/sfcc-security/SKILL.md)
|
|
907
|
+
- [isloop Element](./isloop.md)
|
|
908
|
+
- [isset Element](./isset.md)
|