@salesforce/b2c-dx-mcp 3.2.0 → 3.3.0
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/bin/run.js +5 -9
- package/content/guidance/b2c/b2c-hooks/references/ORDER-HOOK-LIFECYCLE.md +1 -1
- package/content/guidance/b2c/b2c-onboarding/SKILL.md +4 -4
- package/content/guidance/b2c/b2c-ordering/SKILL.md +2 -2
- package/content/guidance/b2c/b2c-querying-data/SKILL.md +2 -2
- package/content/guidance/b2c/b2c-scapi-admin/SKILL.md +3 -3
- package/content/guidance/b2c/b2c-scapi-admin/references/CLIENT-EXAMPLES.md +4 -4
- package/content/guidance/b2c/b2c-scapi-shopper/SKILL.md +6 -6
- package/content/guidance/b2c/b2c-scapi-shopper/references/CLIENT-EXAMPLES.md +8 -9
- package/content/guidance/b2c-cli/b2c-cip/SKILL.md +3 -3
- package/content/guidance/b2c-cli/b2c-cip/references/SALES_ANALYSIS.md +1 -1
- package/content/guidance/b2c-cli/b2c-config/SKILL.md +31 -21
- package/content/guidance/b2c-cli/b2c-content/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-debug/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-docs/SKILL.md +23 -2
- package/content/guidance/b2c-cli/b2c-ecdn/references/ADVANCED.md +1 -1
- package/content/guidance/b2c-cli/b2c-job/references/IMPORT.md +1 -1
- package/content/guidance/b2c-cli/b2c-metrics/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-mrt/SKILL.md +3 -3
- package/content/guidance/b2c-cli/b2c-scapi-custom/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-scapi-schemas/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-site-import-export/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-sites/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-slas/SKILL.md +1 -1
- package/content/guidance/b2c-ops/b2c-checkout-triage/SKILL.md +2 -2
- package/content/guidance/b2c-ops/b2c-job-health/SKILL.md +2 -2
- package/content/guidance/b2c-ops/b2c-order-failure-triage/SKILL.md +1 -1
- package/content/guidance/b2c-ops/b2c-order-failure-triage/references/order-evidence.md +2 -2
- package/content/guidance/b2c-ops/b2c-production-triage/SKILL.md +4 -4
- package/content/guidance/index.json +935 -258
- package/content/guidance/mcp/{cip → b2c-mcp-cip}/SKILL.md +10 -8
- package/content/guidance/mcp/{b2c-config → b2c-mcp-config}/SKILL.md +10 -9
- package/content/guidance/mcp/{debugger → b2c-mcp-debugger}/SKILL.md +9 -8
- package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/SKILL.md +81 -10
- package/content/guidance/mcp/{server → b2c-mcp-server}/SKILL.md +49 -25
- package/content/guidance/storefront-next/sfnext-accessibility/SKILL.md +103 -0
- package/content/guidance/storefront-next/sfnext-accessibility/references/checklist.md +64 -0
- package/content/guidance/storefront-next/sfnext-analytics-consent/SKILL.md +91 -0
- package/content/guidance/storefront-next/sfnext-analytics-consent/references/CUSTOM-ADAPTER.md +49 -0
- package/content/guidance/storefront-next/sfnext-authentication/SKILL.md +86 -79
- package/content/guidance/storefront-next/sfnext-authentication/references/COOKIES.md +39 -0
- package/content/guidance/storefront-next/sfnext-authentication/references/LOGIN-FLOWS.md +59 -0
- package/content/guidance/storefront-next/sfnext-commerce-features/SKILL.md +67 -0
- package/content/guidance/storefront-next/sfnext-commerce-features/references/FEATURE-PREREQUISITES.md +37 -0
- package/content/guidance/storefront-next/sfnext-components/SKILL.md +98 -136
- package/content/guidance/storefront-next/sfnext-components/references/COMPONENT-AUTHORING.md +118 -0
- package/content/guidance/storefront-next/sfnext-components/references/SHAPE-TOKENS.md +51 -0
- package/content/guidance/storefront-next/sfnext-components/references/STORYBOOK.md +54 -0
- package/content/guidance/storefront-next/sfnext-components/references/TOKEN-SYSTEM.md +53 -0
- package/content/guidance/storefront-next/sfnext-components/references/TROUBLESHOOTING.md +19 -0
- package/content/guidance/storefront-next/sfnext-configuration/SKILL.md +116 -113
- package/content/guidance/storefront-next/sfnext-configuration/references/ENV-VARIABLES.md +55 -0
- package/content/guidance/storefront-next/sfnext-configuration/references/MULTI-SITE-URLS.md +137 -0
- package/content/guidance/storefront-next/sfnext-data-fetching/SKILL.md +100 -150
- package/content/guidance/storefront-next/sfnext-data-fetching/references/ACTIONS.md +53 -0
- package/content/guidance/storefront-next/sfnext-data-fetching/references/API-CLIENTS.md +34 -0
- package/content/guidance/storefront-next/sfnext-data-fetching/references/LOADERS.md +73 -0
- package/content/guidance/storefront-next/sfnext-data-fetching/references/SCAPI-FETCHER.md +23 -77
- package/content/guidance/storefront-next/sfnext-deployment/SKILL.md +83 -97
- package/content/guidance/storefront-next/sfnext-deployment/references/MRT-DEPLOYMENT.md +37 -68
- package/content/guidance/storefront-next/sfnext-extensions/SKILL.md +73 -97
- package/content/guidance/storefront-next/sfnext-extensions/references/ACTION-HOOKS.md +57 -0
- package/content/guidance/storefront-next/sfnext-extensions/references/BASE-AUDIT.md +47 -44
- package/content/guidance/storefront-next/sfnext-extensions/references/CLI-AND-INSTALL.md +58 -0
- package/content/guidance/storefront-next/sfnext-extensions/references/EXTENSION-EXAMPLES.md +49 -86
- package/content/guidance/storefront-next/sfnext-hybrid-storefronts/SKILL.md +59 -114
- package/content/guidance/storefront-next/sfnext-hybrid-storefronts/references/HYBRID-PROXY-CONFIG.md +53 -90
- package/content/guidance/storefront-next/sfnext-i18n/SKILL.md +96 -131
- package/content/guidance/storefront-next/sfnext-i18n/references/locale-config.md +35 -0
- package/content/guidance/storefront-next/sfnext-overview/SKILL.md +101 -0
- package/content/guidance/storefront-next/sfnext-page-designer/SKILL.md +152 -131
- package/content/guidance/storefront-next/sfnext-page-designer/references/BUSINESS-MANAGER.md +46 -0
- package/content/guidance/storefront-next/sfnext-page-designer/references/COMPONENT-REGISTRY.md +86 -53
- package/content/guidance/storefront-next/sfnext-page-designer/references/DECORATOR-PATTERNS.md +119 -131
- package/content/guidance/storefront-next/sfnext-page-designer/references/REVIEW-CHECKLIST.md +83 -0
- package/content/guidance/storefront-next/sfnext-page-designer/references/TROUBLESHOOTING.md +35 -0
- package/content/guidance/storefront-next/sfnext-performance/SKILL.md +75 -105
- package/content/guidance/storefront-next/sfnext-performance/references/PERFORMANCE-REVIEW-CHECKLIST.md +85 -0
- package/content/guidance/storefront-next/sfnext-performance/references/SUSPENSE-AND-STREAMING.md +58 -0
- package/content/guidance/storefront-next/sfnext-project-setup/SKILL.md +103 -116
- package/content/guidance/storefront-next/sfnext-project-setup/references/PROJECT-STRUCTURE.md +61 -99
- package/content/guidance/storefront-next/sfnext-project-setup/references/SCRIPTS.md +47 -0
- package/content/guidance/storefront-next/sfnext-project-setup/references/SFNEXT-CLI.md +63 -0
- package/content/guidance/storefront-next/sfnext-quality-gates/SKILL.md +70 -0
- package/content/guidance/storefront-next/sfnext-quality-gates/references/lint-and-budgets.md +39 -0
- package/content/guidance/storefront-next/sfnext-revalidation/SKILL.md +121 -0
- package/content/guidance/storefront-next/sfnext-revalidation/references/POLICIES-AND-TAGS.md +55 -0
- package/content/guidance/storefront-next/sfnext-routing/SKILL.md +86 -143
- package/content/guidance/storefront-next/sfnext-routing/references/ROUTE-CONVENTIONS.md +51 -51
- package/content/guidance/storefront-next/sfnext-routing/references/URLS-AND-SEO-ROUTES.md +22 -0
- package/content/guidance/storefront-next/sfnext-scapi/SKILL.md +126 -0
- package/content/guidance/storefront-next/sfnext-scapi/references/WORKED-EXAMPLE.md +39 -0
- package/content/guidance/storefront-next/sfnext-security/SKILL.md +129 -0
- package/content/guidance/storefront-next/sfnext-security/references/COOKIE-DOMAIN.md +39 -0
- package/content/guidance/storefront-next/sfnext-security/references/TURNSTILE.md +43 -0
- package/content/guidance/storefront-next/sfnext-seo/SKILL.md +95 -0
- package/content/guidance/storefront-next/sfnext-seo/references/MULTI-DOMAIN-BASE-PATH.md +17 -0
- package/content/guidance/storefront-next/sfnext-seo/references/SEO-ROUTES.md +31 -0
- package/content/guidance/storefront-next/sfnext-state-management/SKILL.md +80 -89
- package/content/guidance/storefront-next/sfnext-state-management/references/PATTERNS.md +45 -0
- package/content/guidance/storefront-next/sfnext-testing/SKILL.md +105 -138
- package/content/guidance/storefront-next/sfnext-testing/references/E2E.md +38 -0
- package/content/guidance/storefront-next/sfnext-testing/references/STORYBOOK-PATTERNS.md +73 -94
- package/content/guidance/storefront-next/sfnext-testing/references/UNIT-AND-ROUTE-TESTS.md +60 -0
- package/content/guidance/storefront-next/sfnext-theming/SKILL.md +104 -0
- package/content/guidance/storefront-next/sfnext-theming/references/REBRAND-CHECKLIST.md +29 -0
- package/dist/commands/mcp.d.ts +8 -2
- package/dist/commands/mcp.js +54 -20
- package/dist/guidance.d.ts +4 -1
- package/dist/guidance.js +23 -5
- package/dist/registry.d.ts +2 -1
- package/dist/registry.js +3 -3
- package/dist/server.d.ts +10 -0
- package/dist/server.js +21 -0
- package/dist/skill-references.js +5 -5
- package/dist/tools/cartridges/index.js +1 -0
- package/dist/tools/cip/index.js +6 -3
- package/dist/tools/diagnostics/debug-capture-at-breakpoint.js +1 -1
- package/dist/tools/diagnostics/debug-set-breakpoints.js +1 -1
- package/dist/tools/diagnostics/debug-start-session.js +1 -1
- package/dist/tools/scapi/execution-registry.js +9 -9
- package/dist/tools/scapi/index.d.ts +4 -1
- package/dist/tools/scapi/index.js +4 -2
- package/dist/tools/scapi/scapi-code.d.ts +2 -2
- package/dist/tools/scapi/scapi-code.js +17 -61
- package/dist/utils/types.d.ts +6 -0
- package/node_modules/@salesforce/b2c-agent-plugins/CHANGELOG.md +20 -0
- package/node_modules/@salesforce/b2c-agent-plugins/README.md +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/.codex-plugin/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-hooks/references/ORDER-HOOK-LIFECYCLE.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-onboarding/SKILL.md +4 -4
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-ordering/SKILL.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-querying-data/SKILL.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-scapi-admin/SKILL.md +3 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-scapi-admin/references/CLIENT-EXAMPLES.md +4 -4
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-scapi-shopper/SKILL.md +6 -6
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-scapi-shopper/references/CLIENT-EXAMPLES.md +8 -9
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/.codex-plugin/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-cip/SKILL.md +3 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-cip/references/SALES_ANALYSIS.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-config/SKILL.md +31 -21
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-content/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-debug/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-docs/SKILL.md +23 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-ecdn/references/ADVANCED.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-job/references/IMPORT.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-metrics/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-mrt/SKILL.md +3 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-scapi-custom/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-scapi-schemas/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-site-import-export/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-sites/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-slas/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/.codex-plugin/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-checkout-triage/SKILL.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-job-health/SKILL.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-order-failure-triage/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-order-failure-triage/references/order-evidence.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-production-triage/SKILL.md +4 -4
- package/node_modules/@salesforce/b2c-agent-plugins/figma-to-sfnext-pagedesigner/README.md +4 -4
- package/node_modules/@salesforce/b2c-agent-plugins/figma-to-sfnext-pagedesigner/skills/figma-to-sfnext-pagedesigner/SKILL.md +76 -73
- package/node_modules/@salesforce/b2c-agent-plugins/figma-to-sfnext-pagedesigner/skills/figma-to-sfnext-pagedesigner/evals/trigger-evals.json +12 -10
- package/node_modules/@salesforce/b2c-agent-plugins/figma-to-sfnext-pagedesigner/skills/figma-to-sfnext-pagedesigner/references/PAGE-DESIGNER-SFN.md +49 -74
- package/node_modules/@salesforce/b2c-agent-plugins/package.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/.codex-plugin/plugin.json +9 -6
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/README.md +43 -22
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/plugin.json +9 -6
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-accessibility/SKILL.md +103 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-accessibility/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-accessibility/references/checklist.md +64 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-analytics-consent/SKILL.md +91 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-analytics-consent/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-analytics-consent/references/CUSTOM-ADAPTER.md +49 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-authentication/SKILL.md +86 -79
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-authentication/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-authentication/references/COOKIES.md +39 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-authentication/references/LOGIN-FLOWS.md +59 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-commerce-features/SKILL.md +67 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-commerce-features/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-commerce-features/references/FEATURE-PREREQUISITES.md +37 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/SKILL.md +98 -136
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/COMPONENT-AUTHORING.md +118 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/SHAPE-TOKENS.md +51 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/STORYBOOK.md +54 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/TOKEN-SYSTEM.md +53 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/TROUBLESHOOTING.md +19 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-configuration/SKILL.md +116 -113
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-configuration/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-configuration/references/ENV-VARIABLES.md +55 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-configuration/references/MULTI-SITE-URLS.md +137 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/SKILL.md +100 -150
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/ACTIONS.md +53 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/API-CLIENTS.md +34 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/LOADERS.md +73 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/SCAPI-FETCHER.md +23 -77
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-deployment/SKILL.md +83 -97
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-deployment/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-deployment/references/MRT-DEPLOYMENT.md +37 -68
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/SKILL.md +73 -97
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/references/ACTION-HOOKS.md +57 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/references/BASE-AUDIT.md +47 -44
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/references/CLI-AND-INSTALL.md +58 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/references/EXTENSION-EXAMPLES.md +49 -86
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-hybrid-storefronts/SKILL.md +59 -114
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-hybrid-storefronts/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-hybrid-storefronts/references/HYBRID-PROXY-CONFIG.md +53 -90
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-i18n/SKILL.md +96 -131
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-i18n/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-i18n/references/locale-config.md +35 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-overview/SKILL.md +101 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-overview/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/SKILL.md +152 -131
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/BUSINESS-MANAGER.md +46 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/COMPONENT-REGISTRY.md +86 -53
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/DECORATOR-PATTERNS.md +119 -131
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/REVIEW-CHECKLIST.md +83 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/TROUBLESHOOTING.md +35 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-performance/SKILL.md +75 -105
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-performance/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-performance/references/PERFORMANCE-REVIEW-CHECKLIST.md +85 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-performance/references/SUSPENSE-AND-STREAMING.md +58 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/SKILL.md +103 -116
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/references/PROJECT-STRUCTURE.md +61 -99
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/references/SCRIPTS.md +47 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/references/SFNEXT-CLI.md +63 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-quality-gates/SKILL.md +70 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-quality-gates/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-quality-gates/references/lint-and-budgets.md +39 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-revalidation/SKILL.md +121 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-revalidation/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-revalidation/references/POLICIES-AND-TAGS.md +55 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-routing/SKILL.md +86 -143
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-routing/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-routing/references/ROUTE-CONVENTIONS.md +51 -51
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-routing/references/URLS-AND-SEO-ROUTES.md +22 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi/SKILL.md +126 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi/references/WORKED-EXAMPLE.md +39 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-security/SKILL.md +129 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-security/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-security/references/COOKIE-DOMAIN.md +39 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-security/references/TURNSTILE.md +43 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-seo/SKILL.md +95 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-seo/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-seo/references/MULTI-DOMAIN-BASE-PATH.md +17 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-seo/references/SEO-ROUTES.md +31 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-state-management/SKILL.md +80 -89
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-state-management/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-state-management/references/PATTERNS.md +45 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/SKILL.md +105 -138
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/references/E2E.md +38 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/references/STORYBOOK-PATTERNS.md +73 -94
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/references/UNIT-AND-ROUTE-TESTS.md +60 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-theming/SKILL.md +104 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-theming/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-theming/references/REBRAND-CHECKLIST.md +29 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next-figma/skills/sfnext-create-figma-kit/SKILL.md +3 -3
- package/oclif.manifest.json +21 -4
- package/package.json +3 -3
- package/content/guidance/storefront-next/sfnext-create-component/SKILL.md +0 -195
- package/content/guidance/storefront-next/sfnext-create-component/references/COMPONENT-AUTHORING.md +0 -206
- package/content/guidance/storefront-next/sfnext-create-component/references/PROJECT-STRUCTURE.md +0 -43
- package/content/guidance/storefront-next/sfnext-create-component/references/TOKEN-SYSTEM.md +0 -130
- package/content/guidance/storefront-next/sfnext-create-component/references/TROUBLESHOOTING.md +0 -34
- package/content/guidance/storefront-next/sfnext-create-vertical/SKILL.md +0 -135
- package/content/guidance/storefront-next/sfnext-create-vertical/references/COMPONENT-AUTHORING.md +0 -206
- package/content/guidance/storefront-next/sfnext-create-vertical/references/PROJECT-STRUCTURE.md +0 -43
- package/content/guidance/storefront-next/sfnext-create-vertical/references/TOKEN-SYSTEM.md +0 -130
- package/content/guidance/storefront-next/sfnext-create-vertical/references/TROUBLESHOOTING.md +0 -34
- package/content/guidance/storefront-next/sfnext-custom-apis/SKILL.md +0 -221
- package/content/guidance/storefront-next/sfnext-custom-apis/references/WORKFLOW-EXAMPLES.md +0 -294
- package/content/guidance/storefront-next/sfnext-data-fetching/references/LOADER-PATTERNS.md +0 -102
- package/content/guidance/storefront-next/sfnext-project-setup/references/ENV-VARIABLES.md +0 -82
- package/content/guidance/storefront-next/sfnext-scapi-management/SKILL.md +0 -203
- package/content/guidance/storefront-next/sfnext-scapi-management/references/CLI-COMMANDS.md +0 -122
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/SKILL.md +0 -195
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/evals/trigger-evals.json +0 -12
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/references/COMPONENT-AUTHORING.md +0 -206
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/references/PROJECT-STRUCTURE.md +0 -43
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/references/TOKEN-SYSTEM.md +0 -130
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/references/TROUBLESHOOTING.md +0 -34
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/SKILL.md +0 -135
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/evals/trigger-evals.json +0 -12
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/references/COMPONENT-AUTHORING.md +0 -206
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/references/PROJECT-STRUCTURE.md +0 -43
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/references/TOKEN-SYSTEM.md +0 -130
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/references/TROUBLESHOOTING.md +0 -34
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-custom-apis/SKILL.md +0 -221
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-custom-apis/evals/trigger-evals.json +0 -12
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-custom-apis/references/WORKFLOW-EXAMPLES.md +0 -294
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/LOADER-PATTERNS.md +0 -102
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/references/ENV-VARIABLES.md +0 -82
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi-management/SKILL.md +0 -203
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi-management/evals/trigger-evals.json +0 -12
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi-management/references/CLI-COMMANDS.md +0 -122
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/custom-apis.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/custom-properties.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/jobs.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/products.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/promotions.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/saving.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/snippets.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/tokens.md +0 -0
- /package/content/guidance/mcp/{server → b2c-mcp-server}/references/files.md +0 -0
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
# Token System Reference
|
|
2
|
-
|
|
3
|
-
## The one rule that overrides everything else
|
|
4
|
-
|
|
5
|
-
**Never use a raw hex value, RGB value, or hardcoded color in any component or CSS file.**
|
|
6
|
-
Always use a semantic Tailwind utility that maps to a CSS variable. The variables are defined in
|
|
7
|
-
`src/theme/tokens/` and bridged to Tailwind utilities in `src/theme/tailwind.css`.
|
|
8
|
-
|
|
9
|
-
```tsx
|
|
10
|
-
// ✅ correct
|
|
11
|
-
<div className="bg-primary text-primary-foreground" />
|
|
12
|
-
|
|
13
|
-
// ❌ wrong — breaks dark mode, breaks vertical theming, breaks Figma sync
|
|
14
|
-
<div style={{ background: '#000000', color: '#ffffff' }} />
|
|
15
|
-
<div className="bg-black text-white" />
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Token files and what they own
|
|
19
|
-
|
|
20
|
-
| File | Owns |
|
|
21
|
-
|------|------|
|
|
22
|
-
| `src/theme/tokens/core.css` | Background, foreground, card, popover, primary, secondary, muted, accent, border, input, ring, separator, rating, charts, sidebar, focus helpers |
|
|
23
|
-
| `src/theme/tokens/brand.css` | Brand palette (`--brand-black`, `--brand-white`, `--brand-gray-*`, `--brand-primary`). **This is the only file that changes per vertical.** |
|
|
24
|
-
| `src/theme/tokens/header.css` | Header background/foreground, header menu surfaces, footer. Dark header = black bg / white text. |
|
|
25
|
-
| `src/theme/tokens/status.css` | Destructive, warning, success, info, status-positive/warning/critical, active-bg |
|
|
26
|
-
| `src/theme/tokens/swatch.css` | Swatch color, labeled, pill — variant selector UI only |
|
|
27
|
-
| `src/theme/tokens/components.css` | Payment provider colors, cart-specific tokens |
|
|
28
|
-
|
|
29
|
-
## Semantic token meanings — use the right one
|
|
30
|
-
|
|
31
|
-
### Text colors
|
|
32
|
-
| Token class | When to use |
|
|
33
|
-
|-------------|-------------|
|
|
34
|
-
| `text-foreground` | Default body text, headings |
|
|
35
|
-
| `text-muted-foreground` | Secondary labels, helper text, placeholder, metadata |
|
|
36
|
-
| `text-primary-foreground` | Text on a `bg-primary` surface (e.g. button label) |
|
|
37
|
-
| `text-secondary-foreground` | Text on a `bg-secondary` surface |
|
|
38
|
-
| `text-accent-foreground` | Text on a `bg-accent` surface (hover chips, tags) |
|
|
39
|
-
| `text-destructive` | Error text, destructive action labels |
|
|
40
|
-
| `text-card-foreground` | Text inside card surfaces |
|
|
41
|
-
|
|
42
|
-
### Background colors
|
|
43
|
-
| Token class | When to use |
|
|
44
|
-
|-------------|-------------|
|
|
45
|
-
| `bg-background` | Page/app background |
|
|
46
|
-
| `bg-primary` | CTAs, filled buttons, strong actions |
|
|
47
|
-
| `bg-secondary` | Secondary button fill, subtle section bg |
|
|
48
|
-
| `bg-muted` | Skeleton, disabled surfaces, subtle fills |
|
|
49
|
-
| `bg-accent` | Hover state, selected chip, tag bg |
|
|
50
|
-
| `bg-card` | Card and tile surfaces |
|
|
51
|
-
| `bg-popover` | Dropdown, tooltip, modal backgrounds |
|
|
52
|
-
|
|
53
|
-
### Borders
|
|
54
|
-
| Token class | When to use |
|
|
55
|
-
|-------------|-------------|
|
|
56
|
-
| `border-border` | Standard dividers, list separators — uses alpha so it renders correctly on ANY surface color |
|
|
57
|
-
| `border-border-subtle` | Form inputs, card edges — slightly more visible |
|
|
58
|
-
| `border-input` | Input field border specifically |
|
|
59
|
-
| `ring-ring` | Focus ring on interactive elements |
|
|
60
|
-
|
|
61
|
-
**Never use `border-black`, `border-gray-*`, or `divide-gray-*`.** Use `border-border` or `border-border-subtle`.
|
|
62
|
-
|
|
63
|
-
### Header/navigation surfaces
|
|
64
|
-
| Token class | When to use |
|
|
65
|
-
|-------------|-------------|
|
|
66
|
-
| `bg-[--header-background]` | Header band background |
|
|
67
|
-
| `text-[--header-foreground]` | Header text and icons |
|
|
68
|
-
| `bg-[--header-menu-background]` | Mega/dropdown menu panel |
|
|
69
|
-
| `bg-[--footer-background]` | Footer background |
|
|
70
|
-
|
|
71
|
-
### Status and feedback
|
|
72
|
-
| Token class | When to use |
|
|
73
|
-
|-------------|-------------|
|
|
74
|
-
| `text-destructive` / `bg-destructive` | Delete, remove, error state |
|
|
75
|
-
| `bg-warning-bg` / `text-warning-foreground` | Caution messages |
|
|
76
|
-
| `text-status-positive` | In-stock, success indicator |
|
|
77
|
-
| `text-status-critical` | Out of stock, error badge |
|
|
78
|
-
| `bg-active-bg` / `text-active-foreground` | Active/authorized badge |
|
|
79
|
-
|
|
80
|
-
## Dark mode rules
|
|
81
|
-
|
|
82
|
-
**Do not write `dark:bg-black` or any dark: hardcoded color.**
|
|
83
|
-
Dark mode is fully handled by `.dark` overrides in `src/theme/tokens/core.css` and other token files.
|
|
84
|
-
Using semantic classes automatically gets the correct dark value.
|
|
85
|
-
|
|
86
|
-
```tsx
|
|
87
|
-
// ✅ correct — dark mode is automatic
|
|
88
|
-
<div className="bg-card text-card-foreground" />
|
|
89
|
-
|
|
90
|
-
// ❌ wrong
|
|
91
|
-
<div className="bg-white dark:bg-gray-900 text-black dark:text-white" />
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
The only valid `dark:` usage is for classes that reference another semantic token:
|
|
95
|
-
|
|
96
|
-
```tsx
|
|
97
|
-
// ✅ valid dark: override pattern
|
|
98
|
-
className="dark:bg-input/30 dark:border-input"
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## What changes per vertical — and what does not
|
|
102
|
-
|
|
103
|
-
### Changes (vertical-specific, lives in `src/theme/tokens/brand.css`)
|
|
104
|
-
- Brand palette values (`--brand-black`, `--brand-primary`, `--brand-gray-*`)
|
|
105
|
-
- Logo treatment (`--header-logo-filter`)
|
|
106
|
-
- Brand-specific component tokens
|
|
107
|
-
|
|
108
|
-
### Does NOT change (shared, lives in core/header/status/swatch/components)
|
|
109
|
-
- Semantic token names and their Tailwind utility names
|
|
110
|
-
- Dark mode pairing rules
|
|
111
|
-
- Component variant logic (CVA)
|
|
112
|
-
- Border alpha values
|
|
113
|
-
- Status and feedback colors
|
|
114
|
-
|
|
115
|
-
**Never override core.css, header.css, status.css, swatch.css, or components.css to create a vertical.**
|
|
116
|
-
Only `brand.css` changes between verticals.
|
|
117
|
-
|
|
118
|
-
## Tailwind utility bridge
|
|
119
|
-
|
|
120
|
-
All token → Tailwind utility mappings are defined in `src/theme/tailwind.css`.
|
|
121
|
-
If a CSS variable exists in a token file but has no Tailwind utility in `tailwind.css`, add it there
|
|
122
|
-
before using it in a component. Do not use arbitrary `[--variable-name]` syntax for variables that
|
|
123
|
-
should be in the bridge.
|
|
124
|
-
|
|
125
|
-
```css
|
|
126
|
-
/* src/theme/tailwind.css — add new token bridge entries here */
|
|
127
|
-
--color-my-new-token: var(--my-new-token);
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
Then use `bg-my-new-token` in components.
|
package/content/guidance/storefront-next/sfnext-create-vertical/references/TROUBLESHOOTING.md
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# Troubleshooting Reference
|
|
2
|
-
|
|
3
|
-
## Token not found in Tailwind utilities
|
|
4
|
-
If a CSS variable exists in a token file but has no Tailwind utility in `tailwind.css`:
|
|
5
|
-
- Open `src/theme/tailwind.css`.
|
|
6
|
-
- Add a bridge entry: `--color-my-new-token: var(--my-new-token);`.
|
|
7
|
-
- Then use `bg-my-new-token` in components — never the `bg-[--my-new-token]` arbitrary syntax.
|
|
8
|
-
|
|
9
|
-
## Colors look wrong in dark mode
|
|
10
|
-
- You probably hardcoded a color (`bg-white`, `text-black`, raw hex) instead of using a semantic token.
|
|
11
|
-
- Replace with the semantic utility (`bg-background`, `text-foreground`, etc.). Dark mode is handled by `.dark` overrides in the token files automatically.
|
|
12
|
-
|
|
13
|
-
## Vertical changes leak into other verticals
|
|
14
|
-
- You edited a shared token file (`core.css`, `header.css`, `status.css`, `swatch.css`, `components.css`). Move the change into `brand.css`.
|
|
15
|
-
- Or you added `if (vertical)` logic to a shared component. Replace it with a CVA variant, a slot/render-prop on the base, or an extension.
|
|
16
|
-
|
|
17
|
-
## Component already exists
|
|
18
|
-
If a scan finds an existing component that covers the need:
|
|
19
|
-
- Add a new CVA variant instead of creating a new component.
|
|
20
|
-
- Wrap in a thin composite if behaviour differs.
|
|
21
|
-
- Never duplicate.
|
|
22
|
-
|
|
23
|
-
## Local pages won't render without SCAPI
|
|
24
|
-
- Use fixtures: create `src/config/<vertical>-fixtures.ts` and short-circuit the `_app.tsx` and `_app.product.$productId.tsx` loaders during vertical development.
|
|
25
|
-
- Restore the real SCAPI calls once credentials are available.
|
|
26
|
-
|
|
27
|
-
## Linter errors after changes
|
|
28
|
-
Run `pnpm lint:fix` first. If errors remain, check:
|
|
29
|
-
- Missing copyright header (required on every `.ts`/`.tsx` file).
|
|
30
|
-
- Raw hex value or hardcoded Tailwind color — replace with a semantic token class.
|
|
31
|
-
- Missing `data-slot` attribute on a component root.
|
|
32
|
-
|
|
33
|
-
## Snapshot tests fail after visual changes
|
|
34
|
-
Run `pnpm test-storybook:snapshot:agent -- --updateSnapshot` to update baselines after intentional visual changes.
|
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sfnext-custom-apis
|
|
3
|
-
description: End-to-end workflow for consuming custom SCAPI endpoints from a Storefront Next project — adding them as typed clients via `b2c sfnext scapi add custom`, discovering their schema, and calling them from loaders/actions/useScapiFetcher. Use this skill whenever the user wants to call a custom API from their Storefront Next app, gets a 404 or 401 when calling a custom endpoint from their sfnext loader, needs to add a custom API as a typed client in their storefront, asks about the full workflow from custom API cartridge to sfnext consumption, or says 'custom API in storefront next'. Also use when they ask how createApiClients exposes custom API methods or how to use useScapiFetcher with a custom endpoint. NOT for writing the custom API cartridge files (schema.yaml/script.js) from scratch — see b2c:b2c-custom-api-development. NOT for just checking registration status — see b2c-cli:b2c-scapi-custom.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Custom APIs in Storefront Next
|
|
7
|
-
|
|
8
|
-
This skill covers the end-to-end workflow for implementing and consuming custom SCAPI endpoints from a Storefront Next project.
|
|
9
|
-
|
|
10
|
-
## Overview
|
|
11
|
-
|
|
12
|
-
Custom APIs let you define your own REST endpoints on B2C Commerce. In a Storefront Next project, you call these from loaders and actions just like standard SCAPI clients — with full type safety.
|
|
13
|
-
|
|
14
|
-
### End-to-End Workflow
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
Create custom API → Deploy & register → Add typed client → Discover schema → Call from loader
|
|
18
|
-
(cartridge) (b2c code deploy) (sfnext scapi add) (scapi schemas) (createApiClients)
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Step 1: Create the Custom API
|
|
22
|
-
|
|
23
|
-
A custom API consists of three files in a cartridge:
|
|
24
|
-
|
|
25
|
-
```
|
|
26
|
-
my-cartridge/cartridge/rest-apis/my-loyalty-api/
|
|
27
|
-
├── schema.yaml # OpenAPI 3.0 schema (endpoints, params, responses)
|
|
28
|
-
├── api.json # API metadata (version, security scheme)
|
|
29
|
-
└── script.js # Implementation (controller script)
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
For full details on writing these files, see the `b2c:b2c-custom-api-development` skill.
|
|
33
|
-
|
|
34
|
-
**Key choices that affect the client:**
|
|
35
|
-
|
|
36
|
-
| Choice | Impact |
|
|
37
|
-
|--------|--------|
|
|
38
|
-
| Directory name (`my-loyalty-api`) | Becomes the API name for `scapi add` |
|
|
39
|
-
| `type` in api.json (`shopper` or `admin`) | Determines auth scheme and whether `siteId` is required |
|
|
40
|
-
| Paths in schema.yaml | Become the methods on the typed client |
|
|
41
|
-
|
|
42
|
-
## Step 2: Deploy and Register
|
|
43
|
-
|
|
44
|
-
Deploy the cartridge and verify the custom API is registered:
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
# deploy the cartridge
|
|
48
|
-
b2c code deploy ./my-cartridge --activate
|
|
49
|
-
|
|
50
|
-
# verify registration
|
|
51
|
-
b2c scapi custom status
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
A successful registration shows `status: active` for your endpoints. If you see `not_registered`, debug with:
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
b2c scapi custom status --status not_registered --columns type,apiName,endpointPath,errorReason
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
See `b2c-cli:b2c-scapi-custom` for full diagnostics.
|
|
61
|
-
|
|
62
|
-
## Step 3: Add as Typed Client
|
|
63
|
-
|
|
64
|
-
Once registered, add the custom API to your Storefront Next project:
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
b2c sfnext scapi add custom my-loyalty-api v1
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
This generates typed client code. The client becomes available as:
|
|
71
|
-
|
|
72
|
-
```typescript
|
|
73
|
-
const clients = createApiClients(context);
|
|
74
|
-
clients.myLoyaltyApi.getPoints({...});
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
## Step 4: Discover the API Shape
|
|
78
|
-
|
|
79
|
-
Use schema browsing to understand your custom API's endpoints and response types:
|
|
80
|
-
|
|
81
|
-
```bash
|
|
82
|
-
# list endpoints
|
|
83
|
-
b2c scapi schemas get custom my-loyalty-api v1 --list-paths
|
|
84
|
-
|
|
85
|
-
# expand a specific endpoint
|
|
86
|
-
b2c scapi schemas get custom my-loyalty-api v1 \
|
|
87
|
-
--expand-paths /loyalty/points/{customerId}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
This shows you the exact parameter names and response shape to use in your loader.
|
|
91
|
-
|
|
92
|
-
## Step 5: Call from Loaders and Actions
|
|
93
|
-
|
|
94
|
-
### Calling from a Loader (Shopper API)
|
|
95
|
-
|
|
96
|
-
```typescript
|
|
97
|
-
import { createApiClients } from '@/lib/api-clients';
|
|
98
|
-
|
|
99
|
-
export function loader({ params, context }: LoaderFunctionArgs) {
|
|
100
|
-
const clients = createApiClients(context);
|
|
101
|
-
return {
|
|
102
|
-
loyaltyPoints: clients.myLoyaltyApi.getPoints({
|
|
103
|
-
params: {
|
|
104
|
-
path: { customerId: params.customerId },
|
|
105
|
-
query: { siteId: context.siteId }
|
|
106
|
-
}
|
|
107
|
-
}).then(({ data }) => data),
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Calling from an Action (Mutation)
|
|
113
|
-
|
|
114
|
-
```typescript
|
|
115
|
-
import { data } from 'react-router';
|
|
116
|
-
import { createApiClients } from '@/lib/api-clients';
|
|
117
|
-
|
|
118
|
-
export async function action({ request, context }: ActionFunctionArgs) {
|
|
119
|
-
const formData = await request.formData();
|
|
120
|
-
const clients = createApiClients(context);
|
|
121
|
-
|
|
122
|
-
try {
|
|
123
|
-
await clients.myLoyaltyApi.redeemPoints({
|
|
124
|
-
params: {
|
|
125
|
-
path: { customerId: formData.get('customerId') as string },
|
|
126
|
-
query: { siteId: context.siteId },
|
|
127
|
-
body: { points: Number(formData.get('points')) }
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
return data({ success: true });
|
|
131
|
-
} catch (error) {
|
|
132
|
-
return data({ success: false, error: error.message }, { status: 400 });
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
### Using useScapiFetcher (Interactive)
|
|
138
|
-
|
|
139
|
-
For on-demand fetching triggered by user interactions:
|
|
140
|
-
|
|
141
|
-
```typescript
|
|
142
|
-
import { useScapiFetcher } from '@/hooks/use-scapi-fetcher';
|
|
143
|
-
|
|
144
|
-
export function useLoyaltyPoints(customerId: string) {
|
|
145
|
-
const parameters = useMemo(
|
|
146
|
-
() => ({
|
|
147
|
-
params: {
|
|
148
|
-
path: { customerId },
|
|
149
|
-
query: { siteId: getSiteId() }
|
|
150
|
-
}
|
|
151
|
-
}),
|
|
152
|
-
[customerId]
|
|
153
|
-
);
|
|
154
|
-
|
|
155
|
-
const fetcher = useScapiFetcher(
|
|
156
|
-
'myLoyaltyApi',
|
|
157
|
-
'getPoints',
|
|
158
|
-
parameters
|
|
159
|
-
);
|
|
160
|
-
|
|
161
|
-
return {
|
|
162
|
-
points: fetcher.data,
|
|
163
|
-
isLoading: fetcher.state === 'loading',
|
|
164
|
-
refresh: () => fetcher.load(),
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
## Step 6: Debug Issues
|
|
170
|
-
|
|
171
|
-
| Issue | Cause | Solution |
|
|
172
|
-
|-------|-------|----------|
|
|
173
|
-
| Client property not available | Forgot `sfnext scapi add` | Run `b2c sfnext scapi add custom <name> <version>` |
|
|
174
|
-
| 404 from custom endpoint | API not registered | Check `b2c scapi custom status`; redeploy with `--activate` |
|
|
175
|
-
| 401 Unauthorized | Wrong security scheme | Shopper APIs use ShopperToken; Admin APIs use BearerToken |
|
|
176
|
-
| Missing `siteId` error | Shopper custom APIs require siteId | Always include `siteId` in query params for Shopper APIs |
|
|
177
|
-
| Schema returns empty | API not yet registered | Deploy and activate the cartridge first, then browse schemas |
|
|
178
|
-
| Types outdated after schema change | Stale generated types | Re-run `b2c sfnext scapi add custom <name> <version> --force` |
|
|
179
|
-
|
|
180
|
-
## Custom API Client Naming
|
|
181
|
-
|
|
182
|
-
The API directory name maps to a camelCase property on `createApiClients()`:
|
|
183
|
-
|
|
184
|
-
| Directory Name | Client Property | Example Call |
|
|
185
|
-
|---------------|-----------------|-------------|
|
|
186
|
-
| `my-loyalty-api` | `clients.myLoyaltyApi` | `clients.myLoyaltyApi.getPoints({...})` |
|
|
187
|
-
| `order-status` | `clients.orderStatus` | `clients.orderStatus.getStatus({...})` |
|
|
188
|
-
| `inventory-check` | `clients.inventoryCheck` | `clients.inventoryCheck.checkStock({...})` |
|
|
189
|
-
|
|
190
|
-
## Shopper vs Admin Custom APIs
|
|
191
|
-
|
|
192
|
-
| Aspect | Shopper API | Admin API |
|
|
193
|
-
|--------|-------------|-----------|
|
|
194
|
-
| Auth scheme | ShopperToken (SLAS) | BearerToken (Account Manager) |
|
|
195
|
-
| Requires `siteId` | Yes | No |
|
|
196
|
-
| Called from | Storefront loaders/actions | Admin tools, batch jobs |
|
|
197
|
-
| Typical use | Customer-facing features | Back-office operations |
|
|
198
|
-
|
|
199
|
-
Most Storefront Next custom APIs are **Shopper** type since they serve storefront pages.
|
|
200
|
-
|
|
201
|
-
## Common Pitfalls
|
|
202
|
-
|
|
203
|
-
| Pitfall | Problem | Solution |
|
|
204
|
-
|---------|---------|----------|
|
|
205
|
-
| Using admin auth for a shopper endpoint | 401 errors in storefront context | Set `type: "shopper"` in api.json |
|
|
206
|
-
| Forgetting to redeploy after schema changes | Stale endpoints | Redeploy cartridge and re-add client with `--force` |
|
|
207
|
-
| Not including `siteId` for shopper APIs | Request rejected | Always pass `siteId` in query params |
|
|
208
|
-
| Calling custom API before registration completes | Intermittent 404s | Wait for `status: active` in `b2c scapi custom status` |
|
|
209
|
-
|
|
210
|
-
## Related Skills
|
|
211
|
-
|
|
212
|
-
- `storefront-next:sfnext-scapi-management` - Managing typed clients (add/remove/list)
|
|
213
|
-
- `storefront-next:sfnext-data-fetching` - Loader/action/useScapiFetcher patterns
|
|
214
|
-
- `b2c:b2c-custom-api-development` - Creating the custom API cartridge (schema + script + mapping)
|
|
215
|
-
- `b2c-cli:b2c-scapi-custom` - Checking custom API registration status
|
|
216
|
-
- `b2c-cli:b2c-scapi-schemas` - Schema discovery commands
|
|
217
|
-
- `b2c-cli:b2c-code` - Deploying and activating code versions
|
|
218
|
-
|
|
219
|
-
## Reference Documentation
|
|
220
|
-
|
|
221
|
-
- [Workflow Examples](references/WORKFLOW-EXAMPLES.md) - Complete end-to-end worked examples
|
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
# Workflow Examples
|
|
2
|
-
|
|
3
|
-
Complete end-to-end examples showing the full lifecycle from custom API creation through calling from a Storefront Next storefront.
|
|
4
|
-
|
|
5
|
-
## Example 1: Shopper Custom API — Loyalty Points
|
|
6
|
-
|
|
7
|
-
A customer-facing API that retrieves and redeems loyalty points.
|
|
8
|
-
|
|
9
|
-
### Cartridge Structure
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
loyalty-cartridge/cartridge/rest-apis/loyalty-points/
|
|
13
|
-
├── schema.yaml
|
|
14
|
-
├── api.json
|
|
15
|
-
└── script.js
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
### schema.yaml
|
|
19
|
-
|
|
20
|
-
```yaml
|
|
21
|
-
openapi: "3.0.0"
|
|
22
|
-
info:
|
|
23
|
-
title: Loyalty Points API
|
|
24
|
-
version: "v1"
|
|
25
|
-
paths:
|
|
26
|
-
/points/{customerId}:
|
|
27
|
-
get:
|
|
28
|
-
operationId: getPoints
|
|
29
|
-
parameters:
|
|
30
|
-
- name: customerId
|
|
31
|
-
in: path
|
|
32
|
-
required: true
|
|
33
|
-
schema:
|
|
34
|
-
type: string
|
|
35
|
-
- name: siteId
|
|
36
|
-
in: query
|
|
37
|
-
required: true
|
|
38
|
-
schema:
|
|
39
|
-
type: string
|
|
40
|
-
responses:
|
|
41
|
-
"200":
|
|
42
|
-
description: Customer loyalty points
|
|
43
|
-
content:
|
|
44
|
-
application/json:
|
|
45
|
-
schema:
|
|
46
|
-
$ref: "#/components/schemas/LoyaltyBalance"
|
|
47
|
-
/points/{customerId}/redeem:
|
|
48
|
-
post:
|
|
49
|
-
operationId: redeemPoints
|
|
50
|
-
parameters:
|
|
51
|
-
- name: customerId
|
|
52
|
-
in: path
|
|
53
|
-
required: true
|
|
54
|
-
schema:
|
|
55
|
-
type: string
|
|
56
|
-
- name: siteId
|
|
57
|
-
in: query
|
|
58
|
-
required: true
|
|
59
|
-
schema:
|
|
60
|
-
type: string
|
|
61
|
-
requestBody:
|
|
62
|
-
required: true
|
|
63
|
-
content:
|
|
64
|
-
application/json:
|
|
65
|
-
schema:
|
|
66
|
-
$ref: "#/components/schemas/RedeemRequest"
|
|
67
|
-
responses:
|
|
68
|
-
"200":
|
|
69
|
-
description: Redemption result
|
|
70
|
-
content:
|
|
71
|
-
application/json:
|
|
72
|
-
schema:
|
|
73
|
-
$ref: "#/components/schemas/RedeemResult"
|
|
74
|
-
components:
|
|
75
|
-
schemas:
|
|
76
|
-
LoyaltyBalance:
|
|
77
|
-
type: object
|
|
78
|
-
properties:
|
|
79
|
-
customerId:
|
|
80
|
-
type: string
|
|
81
|
-
points:
|
|
82
|
-
type: integer
|
|
83
|
-
tier:
|
|
84
|
-
type: string
|
|
85
|
-
enum: [bronze, silver, gold, platinum]
|
|
86
|
-
lastUpdated:
|
|
87
|
-
type: string
|
|
88
|
-
format: date-time
|
|
89
|
-
RedeemRequest:
|
|
90
|
-
type: object
|
|
91
|
-
required: [points]
|
|
92
|
-
properties:
|
|
93
|
-
points:
|
|
94
|
-
type: integer
|
|
95
|
-
minimum: 1
|
|
96
|
-
RedeemResult:
|
|
97
|
-
type: object
|
|
98
|
-
properties:
|
|
99
|
-
success:
|
|
100
|
-
type: boolean
|
|
101
|
-
remainingPoints:
|
|
102
|
-
type: integer
|
|
103
|
-
transactionId:
|
|
104
|
-
type: string
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### api.json
|
|
108
|
-
|
|
109
|
-
```json
|
|
110
|
-
{
|
|
111
|
-
"type": "shopper",
|
|
112
|
-
"version": "v1"
|
|
113
|
-
}
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### Deploy and Register
|
|
117
|
-
|
|
118
|
-
```bash
|
|
119
|
-
# deploy the cartridge
|
|
120
|
-
b2c code deploy ./loyalty-cartridge --activate
|
|
121
|
-
|
|
122
|
-
# verify registration
|
|
123
|
-
b2c scapi custom status --api-name loyalty-points
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### Add to Storefront Next Project
|
|
127
|
-
|
|
128
|
-
```bash
|
|
129
|
-
b2c sfnext scapi add custom loyalty-points v1
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### Discover and Use
|
|
133
|
-
|
|
134
|
-
```bash
|
|
135
|
-
# check endpoints
|
|
136
|
-
b2c scapi schemas get custom loyalty-points v1 --list-paths
|
|
137
|
-
|
|
138
|
-
# inspect response shape
|
|
139
|
-
b2c scapi schemas get custom loyalty-points v1 \
|
|
140
|
-
--expand-paths /points/{customerId} \
|
|
141
|
-
--expand-schemas LoyaltyBalance
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### Storefront Code
|
|
145
|
-
|
|
146
|
-
```typescript
|
|
147
|
-
// src/routes/_app.account.loyalty.tsx
|
|
148
|
-
import { createApiClients } from '@/lib/api-clients';
|
|
149
|
-
import { createPage } from '@/lib/create-page';
|
|
150
|
-
|
|
151
|
-
interface LoyaltyPageData {
|
|
152
|
-
balance: Promise<LoyaltyBalance>;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export function loader({ context }: LoaderFunctionArgs): LoyaltyPageData {
|
|
156
|
-
const clients = createApiClients(context);
|
|
157
|
-
const customerId = context.session.customerId;
|
|
158
|
-
|
|
159
|
-
return {
|
|
160
|
-
balance: clients.loyaltyPoints.getPoints({
|
|
161
|
-
params: {
|
|
162
|
-
path: { customerId },
|
|
163
|
-
query: { siteId: context.siteId }
|
|
164
|
-
}
|
|
165
|
-
}).then(({ data }) => data),
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
export default createPage<LoyaltyPageData>(({ data }) => (
|
|
170
|
-
<div className="space-y-4">
|
|
171
|
-
<h1 className="text-2xl font-bold">Loyalty Points</h1>
|
|
172
|
-
<Suspense fallback={<Skeleton className="h-24" />}>
|
|
173
|
-
<Await resolve={data.balance}>
|
|
174
|
-
{(balance) => (
|
|
175
|
-
<div className="rounded-lg border p-6">
|
|
176
|
-
<p className="text-4xl font-bold">{balance.points}</p>
|
|
177
|
-
<p className="text-muted-foreground">
|
|
178
|
-
{balance.tier} tier
|
|
179
|
-
</p>
|
|
180
|
-
</div>
|
|
181
|
-
)}
|
|
182
|
-
</Await>
|
|
183
|
-
</Suspense>
|
|
184
|
-
</div>
|
|
185
|
-
));
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
---
|
|
189
|
-
|
|
190
|
-
## Example 2: Admin Custom API — Inventory Check
|
|
191
|
-
|
|
192
|
-
An admin API for back-office inventory operations. Admin APIs use BearerToken auth and do not require `siteId`.
|
|
193
|
-
|
|
194
|
-
### Key Differences from Shopper APIs
|
|
195
|
-
|
|
196
|
-
| Aspect | This Example | Example 1 (Shopper) |
|
|
197
|
-
|--------|-------------|---------------------|
|
|
198
|
-
| api.json `type` | `"admin"` | `"shopper"` |
|
|
199
|
-
| Auth | BearerToken (Account Manager) | ShopperToken (SLAS) |
|
|
200
|
-
| `siteId` param | Not required | Required |
|
|
201
|
-
| Typical caller | Admin tools, cron jobs | Storefront loaders |
|
|
202
|
-
|
|
203
|
-
### api.json
|
|
204
|
-
|
|
205
|
-
```json
|
|
206
|
-
{
|
|
207
|
-
"type": "admin",
|
|
208
|
-
"version": "v1"
|
|
209
|
-
}
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
### Usage in Storefront Context
|
|
213
|
-
|
|
214
|
-
Admin APIs are typically NOT called from storefront loaders (since storefronts use shopper auth). If you need admin-level data in a storefront, consider:
|
|
215
|
-
|
|
216
|
-
1. Using a shopper API that exposes the same data with appropriate access controls
|
|
217
|
-
2. Pre-computing results and storing them in a custom object accessible via shopper APIs
|
|
218
|
-
|
|
219
|
-
---
|
|
220
|
-
|
|
221
|
-
## Example 3: useScapiFetcher with Custom API
|
|
222
|
-
|
|
223
|
-
Interactive pattern for fetching custom API data after page load (e.g., showing loyalty points in a modal that opens on click).
|
|
224
|
-
|
|
225
|
-
```typescript
|
|
226
|
-
// src/hooks/use-loyalty-points.ts
|
|
227
|
-
import { useScapiFetcher } from '@/hooks/use-scapi-fetcher';
|
|
228
|
-
import { useMemo, useCallback } from 'react';
|
|
229
|
-
|
|
230
|
-
export function useLoyaltyPoints(customerId: string | undefined) {
|
|
231
|
-
const parameters = useMemo(
|
|
232
|
-
() => customerId ? {
|
|
233
|
-
params: {
|
|
234
|
-
path: { customerId },
|
|
235
|
-
query: { siteId: getSiteId() }
|
|
236
|
-
}
|
|
237
|
-
} : null,
|
|
238
|
-
[customerId]
|
|
239
|
-
);
|
|
240
|
-
|
|
241
|
-
const fetcher = useScapiFetcher(
|
|
242
|
-
'loyaltyPoints',
|
|
243
|
-
'getPoints',
|
|
244
|
-
parameters
|
|
245
|
-
);
|
|
246
|
-
|
|
247
|
-
const refresh = useCallback(async () => {
|
|
248
|
-
if (parameters) {
|
|
249
|
-
await fetcher.load();
|
|
250
|
-
}
|
|
251
|
-
}, [fetcher, parameters]);
|
|
252
|
-
|
|
253
|
-
return {
|
|
254
|
-
points: fetcher.data?.points ?? 0,
|
|
255
|
-
tier: fetcher.data?.tier ?? 'bronze',
|
|
256
|
-
isLoading: fetcher.state === 'loading',
|
|
257
|
-
refresh,
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
```typescript
|
|
263
|
-
// src/components/loyalty-badge.tsx
|
|
264
|
-
import { useLoyaltyPoints } from '@/hooks/use-loyalty-points';
|
|
265
|
-
|
|
266
|
-
export function LoyaltyBadge({ customerId }: { customerId: string }) {
|
|
267
|
-
const { points, tier, isLoading, refresh } = useLoyaltyPoints(customerId);
|
|
268
|
-
|
|
269
|
-
useEffect(() => {
|
|
270
|
-
refresh();
|
|
271
|
-
}, [refresh]);
|
|
272
|
-
|
|
273
|
-
if (isLoading) return <Skeleton className="h-6 w-16" />;
|
|
274
|
-
|
|
275
|
-
return (
|
|
276
|
-
<Badge variant={tier === 'platinum' ? 'default' : 'secondary'}>
|
|
277
|
-
{points} pts
|
|
278
|
-
</Badge>
|
|
279
|
-
);
|
|
280
|
-
}
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
### How It Works
|
|
284
|
-
|
|
285
|
-
```
|
|
286
|
-
LoyaltyBadge renders
|
|
287
|
-
→ useLoyaltyPoints calls useScapiFetcher('loyaltyPoints', 'getPoints', params)
|
|
288
|
-
→ fetcher.load() sends GET to /resource/api/client/{encoded-params}
|
|
289
|
-
→ Resource route runs ON SERVER
|
|
290
|
-
→ createApiClients(context).loyaltyPoints.getPoints({...}) calls SCAPI
|
|
291
|
-
→ JSON response returned to component
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
The custom API call happens server-side even though it's triggered from a client component.
|