@salesforce/b2c-tooling-sdk 1.24.2 → 2.0.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/data/content-schemas/componenttype.json +0 -30
- package/data/scapi-snippets/campaign-promotions.js +40 -0
- package/data/scapi-snippets/code-version-inspect.js +31 -0
- package/data/scapi-snippets/create-product.js +108 -0
- package/data/scapi-snippets/failed-job-triage.js +37 -0
- package/data/scapi-snippets/job-execution-inspect.js +52 -0
- package/data/scapi-snippets/job-execution-review.js +46 -0
- package/data/scapi-snippets/manifest.json +220 -0
- package/data/scapi-snippets/site-cartridge-inspect.js +27 -0
- package/data/tooling/index.json +80 -116
- package/dist/esm/auth/index.d.ts +2 -2
- package/dist/esm/auth/index.js +1 -1
- package/dist/esm/auth/index.js.map +1 -1
- package/dist/esm/auth/oauth-implicit.d.ts +1 -0
- package/dist/esm/auth/oauth-implicit.js +1 -0
- package/dist/esm/auth/oauth-implicit.js.map +1 -1
- package/dist/esm/auth/oauth-jwt.d.ts +18 -4
- package/dist/esm/auth/oauth-jwt.js +67 -17
- package/dist/esm/auth/oauth-jwt.js.map +1 -1
- package/dist/esm/auth/oauth-pkce-fallback.d.ts +1 -0
- package/dist/esm/auth/oauth-pkce-fallback.js +1 -0
- package/dist/esm/auth/oauth-pkce-fallback.js.map +1 -1
- package/dist/esm/auth/oauth-pkce.d.ts +1 -0
- package/dist/esm/auth/oauth-pkce.js +1 -0
- package/dist/esm/auth/oauth-pkce.js.map +1 -1
- package/dist/esm/auth/oauth.d.ts +55 -6
- package/dist/esm/auth/oauth.js +139 -21
- package/dist/esm/auth/oauth.js.map +1 -1
- package/dist/esm/auth/resolve.d.ts +37 -0
- package/dist/esm/auth/resolve.js +48 -0
- package/dist/esm/auth/resolve.js.map +1 -1
- package/dist/esm/auth/types.d.ts +44 -0
- package/dist/esm/auth/types.js.map +1 -1
- package/dist/esm/cli/base-command.d.ts +9 -0
- package/dist/esm/cli/base-command.js +31 -0
- package/dist/esm/cli/base-command.js.map +1 -1
- package/dist/esm/cli/bm-command.d.ts +15 -0
- package/dist/esm/cli/bm-command.js +25 -0
- package/dist/esm/cli/bm-command.js.map +1 -0
- package/dist/esm/cli/code-command.d.ts +14 -0
- package/dist/esm/cli/code-command.js +22 -0
- package/dist/esm/cli/code-command.js.map +1 -0
- package/dist/esm/cli/config.js +3 -0
- package/dist/esm/cli/config.js.map +1 -1
- package/dist/esm/cli/index.d.ts +5 -1
- package/dist/esm/cli/index.js +7 -1
- package/dist/esm/cli/index.js.map +1 -1
- package/dist/esm/cli/instance-command.d.ts +45 -0
- package/dist/esm/cli/instance-command.js +66 -1
- package/dist/esm/cli/instance-command.js.map +1 -1
- package/dist/esm/cli/job-command.d.ts +37 -16
- package/dist/esm/cli/job-command.js +73 -23
- package/dist/esm/cli/job-command.js.map +1 -1
- package/dist/esm/cli/mrt-command.d.ts +138 -9
- package/dist/esm/cli/mrt-command.js +277 -16
- package/dist/esm/cli/mrt-command.js.map +1 -1
- package/dist/esm/cli/oauth-command.d.ts +1 -1
- package/dist/esm/cli/oauth-command.js +2 -0
- package/dist/esm/cli/oauth-command.js.map +1 -1
- package/dist/esm/cli/webdav-command.d.ts +1 -0
- package/dist/esm/clients/cdn-zones.js +2 -5
- package/dist/esm/clients/cdn-zones.js.map +1 -1
- package/dist/esm/clients/cip.d.ts +12 -3
- package/dist/esm/clients/cip.js +85 -30
- package/dist/esm/clients/cip.js.map +1 -1
- package/dist/esm/clients/custom-apis.js +2 -5
- package/dist/esm/clients/custom-apis.js.map +1 -1
- package/dist/esm/clients/dual-backend-factory.d.ts +70 -0
- package/dist/esm/clients/dual-backend-factory.js +48 -0
- package/dist/esm/clients/dual-backend-factory.js.map +1 -0
- package/dist/esm/clients/error-utils.d.ts +62 -0
- package/dist/esm/clients/error-utils.js +98 -0
- package/dist/esm/clients/error-utils.js.map +1 -1
- package/dist/esm/clients/granular-replications.js +2 -5
- package/dist/esm/clients/granular-replications.js.map +1 -1
- package/dist/esm/clients/index.d.ts +28 -3
- package/dist/esm/clients/index.js +24 -2
- package/dist/esm/clients/index.js.map +1 -1
- package/dist/esm/clients/metrics.js +2 -5
- package/dist/esm/clients/metrics.js.map +1 -1
- package/dist/esm/clients/middleware-registry.d.ts +4 -2
- package/dist/esm/clients/middleware-registry.js +3 -1
- package/dist/esm/clients/middleware-registry.js.map +1 -1
- package/dist/esm/clients/middleware.d.ts +39 -0
- package/dist/esm/clients/middleware.js +126 -25
- package/dist/esm/clients/middleware.js.map +1 -1
- package/dist/esm/clients/mrt-b2c.js +3 -0
- package/dist/esm/clients/mrt-b2c.js.map +1 -1
- package/dist/esm/clients/mrt.d.ts +27 -10
- package/dist/esm/clients/mrt.generated.d.ts +77 -0
- package/dist/esm/clients/mrt.js +68 -0
- package/dist/esm/clients/mrt.js.map +1 -1
- package/dist/esm/clients/preferences.js +2 -5
- package/dist/esm/clients/preferences.js.map +1 -1
- package/dist/esm/clients/scapi-backend-utils.d.ts +163 -0
- package/dist/esm/clients/scapi-backend-utils.js +180 -0
- package/dist/esm/clients/scapi-backend-utils.js.map +1 -0
- package/dist/esm/clients/scapi-catalogs.d.ts +12 -0
- package/dist/esm/clients/scapi-catalogs.generated.d.ts +104 -0
- package/dist/esm/clients/scapi-catalogs.generated.js +6 -0
- package/dist/esm/clients/scapi-catalogs.generated.js.map +1 -0
- package/dist/esm/clients/scapi-catalogs.js +14 -0
- package/dist/esm/clients/scapi-catalogs.js.map +1 -0
- package/dist/esm/clients/scapi-client-factory.d.ts +81 -0
- package/dist/esm/clients/scapi-client-factory.js +84 -0
- package/dist/esm/clients/scapi-client-factory.js.map +1 -0
- package/dist/esm/clients/scapi-fallback-backend.d.ts +34 -0
- package/dist/esm/clients/scapi-fallback-backend.js +132 -0
- package/dist/esm/clients/scapi-fallback-backend.js.map +1 -0
- package/dist/esm/clients/scapi-jobs.d.ts +32 -0
- package/dist/esm/clients/scapi-jobs.generated.d.ts +535 -0
- package/dist/esm/clients/scapi-jobs.generated.js +6 -0
- package/dist/esm/clients/scapi-jobs.generated.js.map +1 -0
- package/dist/esm/clients/scapi-jobs.js +24 -0
- package/dist/esm/clients/scapi-jobs.js.map +1 -0
- package/dist/esm/clients/scapi-merchant-roles.d.ts +19 -0
- package/dist/esm/clients/scapi-merchant-roles.generated.d.ts +726 -0
- package/dist/esm/clients/scapi-merchant-roles.generated.js +6 -0
- package/dist/esm/clients/scapi-merchant-roles.generated.js.map +1 -0
- package/dist/esm/clients/scapi-merchant-roles.js +12 -0
- package/dist/esm/clients/scapi-merchant-roles.js.map +1 -0
- package/dist/esm/clients/scapi-merchant-users.d.ts +19 -0
- package/dist/esm/clients/scapi-merchant-users.generated.d.ts +300 -0
- package/dist/esm/clients/scapi-merchant-users.generated.js +6 -0
- package/dist/esm/clients/scapi-merchant-users.generated.js.map +1 -0
- package/dist/esm/clients/scapi-merchant-users.js +12 -0
- package/dist/esm/clients/scapi-merchant-users.js.map +1 -0
- package/dist/esm/clients/scapi-schemas.js +2 -5
- package/dist/esm/clients/scapi-schemas.js.map +1 -1
- package/dist/esm/clients/scapi-scope-tier.d.ts +78 -0
- package/dist/esm/clients/scapi-scope-tier.js +113 -0
- package/dist/esm/clients/scapi-scope-tier.js.map +1 -0
- package/dist/esm/clients/scapi-scripts.d.ts +17 -0
- package/dist/esm/clients/scapi-scripts.generated.d.ts +392 -0
- package/dist/esm/clients/scapi-scripts.generated.js +6 -0
- package/dist/esm/clients/scapi-scripts.generated.js.map +1 -0
- package/dist/esm/clients/scapi-scripts.js +12 -0
- package/dist/esm/clients/scapi-scripts.js.map +1 -0
- package/dist/esm/clients/scapi-sites.d.ts +26 -0
- package/dist/esm/clients/scapi-sites.generated.d.ts +500 -0
- package/dist/esm/clients/scapi-sites.generated.js +6 -0
- package/dist/esm/clients/scapi-sites.generated.js.map +1 -0
- package/dist/esm/clients/scapi-sites.js +25 -0
- package/dist/esm/clients/scapi-sites.js.map +1 -0
- package/dist/esm/clients/slas-shopper.d.ts +19 -0
- package/dist/esm/clients/slas-shopper.generated.d.ts +165 -0
- package/dist/esm/clients/slas-shopper.generated.js +6 -0
- package/dist/esm/clients/slas-shopper.generated.js.map +1 -0
- package/dist/esm/clients/slas-shopper.js +35 -0
- package/dist/esm/clients/slas-shopper.js.map +1 -0
- package/dist/esm/clients/storefront-deployments.d.ts +56 -0
- package/dist/esm/clients/storefront-deployments.generated.d.ts +558 -0
- package/dist/esm/clients/storefront-deployments.generated.js +6 -0
- package/dist/esm/clients/storefront-deployments.generated.js.map +1 -0
- package/dist/esm/clients/storefront-deployments.js +24 -0
- package/dist/esm/clients/storefront-deployments.js.map +1 -0
- package/dist/esm/clients/webdav.js +4 -1
- package/dist/esm/clients/webdav.js.map +1 -1
- package/dist/esm/compat/dispatcher.d.ts +49 -0
- package/dist/esm/compat/dispatcher.js +124 -0
- package/dist/esm/compat/dispatcher.js.map +1 -0
- package/dist/esm/compat/index.d.ts +10 -0
- package/dist/esm/compat/index.js +15 -0
- package/dist/esm/compat/index.js.map +1 -0
- package/dist/esm/compat/jobs-backend.d.ts +31 -0
- package/dist/esm/compat/jobs-backend.js +76 -0
- package/dist/esm/compat/jobs-backend.js.map +1 -0
- package/dist/esm/config/dw-json.d.ts +4 -0
- package/dist/esm/config/dw-json.js.map +1 -1
- package/dist/esm/config/index.d.ts +1 -1
- package/dist/esm/config/index.js.map +1 -1
- package/dist/esm/config/mapping.d.ts +2 -5
- package/dist/esm/config/mapping.js +25 -1
- package/dist/esm/config/mapping.js.map +1 -1
- package/dist/esm/config/resolved-config.d.ts +2 -2
- package/dist/esm/config/resolved-config.js.map +1 -1
- package/dist/esm/config/sources/env-source.js +17 -0
- package/dist/esm/config/sources/env-source.js.map +1 -1
- package/dist/esm/config/types.d.ts +21 -2
- package/dist/esm/docs/search.js +2 -25
- package/dist/esm/docs/search.js.map +1 -1
- package/dist/esm/guidance/catalog.d.ts +37 -0
- package/dist/esm/guidance/catalog.js +282 -0
- package/dist/esm/guidance/catalog.js.map +1 -0
- package/dist/esm/guidance/index.d.ts +8 -0
- package/dist/esm/guidance/index.js +14 -0
- package/dist/esm/guidance/index.js.map +1 -0
- package/dist/esm/guidance/markdown.d.ts +10 -0
- package/dist/esm/guidance/markdown.js +52 -0
- package/dist/esm/guidance/markdown.js.map +1 -0
- package/dist/esm/guidance/types.d.ts +92 -0
- package/dist/esm/guidance/types.js +17 -0
- package/dist/esm/guidance/types.js.map +1 -0
- package/dist/esm/index.d.ts +14 -5
- package/dist/esm/index.js +14 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/instance/index.d.ts +96 -2
- package/dist/esm/instance/index.js +98 -5
- package/dist/esm/instance/index.js.map +1 -1
- package/dist/esm/operations/bm-roles/backend.d.ts +4 -0
- package/dist/esm/operations/bm-roles/backend.js +11 -0
- package/dist/esm/operations/bm-roles/backend.js.map +1 -0
- package/dist/esm/operations/bm-roles/index.d.ts +6 -0
- package/dist/esm/operations/bm-roles/index.js +4 -0
- package/dist/esm/operations/bm-roles/index.js.map +1 -1
- package/dist/esm/operations/bm-roles/ocapi-backend.d.ts +17 -0
- package/dist/esm/operations/bm-roles/ocapi-backend.js +151 -0
- package/dist/esm/operations/bm-roles/ocapi-backend.js.map +1 -0
- package/dist/esm/operations/bm-roles/roles.js +13 -17
- package/dist/esm/operations/bm-roles/roles.js.map +1 -1
- package/dist/esm/operations/bm-roles/scapi-backend.d.ts +27 -0
- package/dist/esm/operations/bm-roles/scapi-backend.js +138 -0
- package/dist/esm/operations/bm-roles/scapi-backend.js.map +1 -0
- package/dist/esm/operations/bm-roles/types.d.ts +49 -0
- package/dist/esm/operations/bm-roles/types.js +2 -0
- package/dist/esm/operations/bm-roles/types.js.map +1 -0
- package/dist/esm/operations/bm-users/backend.d.ts +4 -0
- package/dist/esm/operations/bm-users/backend.js +11 -0
- package/dist/esm/operations/bm-users/backend.js.map +1 -0
- package/dist/esm/operations/bm-users/index.d.ts +11 -3
- package/dist/esm/operations/bm-users/index.js +9 -3
- package/dist/esm/operations/bm-users/index.js.map +1 -1
- package/dist/esm/operations/bm-users/ocapi-backend.d.ts +13 -0
- package/dist/esm/operations/bm-users/ocapi-backend.js +92 -0
- package/dist/esm/operations/bm-users/ocapi-backend.js.map +1 -0
- package/dist/esm/operations/bm-users/scapi-backend.d.ts +23 -0
- package/dist/esm/operations/bm-users/scapi-backend.js +199 -0
- package/dist/esm/operations/bm-users/scapi-backend.js.map +1 -0
- package/dist/esm/operations/bm-users/types.d.ts +99 -0
- package/dist/esm/operations/bm-users/types.js +2 -0
- package/dist/esm/operations/bm-users/types.js.map +1 -0
- package/dist/esm/operations/bm-users/users.d.ts +4 -3
- package/dist/esm/operations/bm-users/users.js +23 -19
- package/dist/esm/operations/bm-users/users.js.map +1 -1
- package/dist/esm/operations/cap/install.js +23 -45
- package/dist/esm/operations/cap/install.js.map +1 -1
- package/dist/esm/operations/cap/list.js +4 -8
- package/dist/esm/operations/cap/list.js.map +1 -1
- package/dist/esm/operations/cap/uninstall.js +17 -37
- package/dist/esm/operations/cap/uninstall.js.map +1 -1
- package/dist/esm/operations/catalogs/catalogs-backend.d.ts +4 -0
- package/dist/esm/operations/catalogs/catalogs-backend.js +16 -0
- package/dist/esm/operations/catalogs/catalogs-backend.js.map +1 -0
- package/dist/esm/operations/catalogs/catalogs-types.d.ts +14 -0
- package/dist/esm/operations/catalogs/catalogs-types.js +2 -0
- package/dist/esm/operations/catalogs/catalogs-types.js.map +1 -0
- package/dist/esm/operations/catalogs/index.d.ts +7 -0
- package/dist/esm/operations/catalogs/index.js +10 -0
- package/dist/esm/operations/catalogs/index.js.map +1 -0
- package/dist/esm/operations/catalogs/ocapi-catalogs-backend.d.ts +8 -0
- package/dist/esm/operations/catalogs/ocapi-catalogs-backend.js +36 -0
- package/dist/esm/operations/catalogs/ocapi-catalogs-backend.js.map +1 -0
- package/dist/esm/operations/catalogs/scapi-catalogs-backend.d.ts +15 -0
- package/dist/esm/operations/catalogs/scapi-catalogs-backend.js +42 -0
- package/dist/esm/operations/catalogs/scapi-catalogs-backend.js.map +1 -0
- package/dist/esm/operations/cip/index.js +10 -2
- package/dist/esm/operations/cip/index.js.map +1 -1
- package/dist/esm/operations/cip/reports.js +19 -3
- package/dist/esm/operations/cip/reports.js.map +1 -1
- package/dist/esm/operations/cip/types.d.ts +8 -4
- package/dist/esm/operations/code/deploy.d.ts +3 -0
- package/dist/esm/operations/code/deploy.js +5 -3
- package/dist/esm/operations/code/deploy.js.map +1 -1
- package/dist/esm/operations/code/download.d.ts +3 -0
- package/dist/esm/operations/code/download.js +5 -5
- package/dist/esm/operations/code/download.js.map +1 -1
- package/dist/esm/operations/code/index.d.ts +7 -1
- package/dist/esm/operations/code/index.js +5 -1
- package/dist/esm/operations/code/index.js.map +1 -1
- package/dist/esm/operations/code/ocapi-scripts-backend.d.ts +12 -0
- package/dist/esm/operations/code/ocapi-scripts-backend.js +40 -0
- package/dist/esm/operations/code/ocapi-scripts-backend.js.map +1 -0
- package/dist/esm/operations/code/scapi-scripts-backend.d.ts +22 -0
- package/dist/esm/operations/code/scapi-scripts-backend.js +94 -0
- package/dist/esm/operations/code/scapi-scripts-backend.js.map +1 -0
- package/dist/esm/operations/code/scripts-backend.d.ts +17 -0
- package/dist/esm/operations/code/scripts-backend.js +40 -0
- package/dist/esm/operations/code/scripts-backend.js.map +1 -0
- package/dist/esm/operations/code/scripts-types.d.ts +43 -0
- package/dist/esm/operations/code/scripts-types.js +2 -0
- package/dist/esm/operations/code/scripts-types.js.map +1 -0
- package/dist/esm/operations/code/upload-files.d.ts +6 -0
- package/dist/esm/operations/code/upload-files.js +58 -7
- package/dist/esm/operations/code/upload-files.js.map +1 -1
- package/dist/esm/operations/code/versions.d.ts +0 -20
- package/dist/esm/operations/code/versions.js +16 -51
- package/dist/esm/operations/code/versions.js.map +1 -1
- package/dist/esm/operations/code/watch.d.ts +3 -0
- package/dist/esm/operations/code/watch.js +3 -2
- package/dist/esm/operations/code/watch.js.map +1 -1
- package/dist/esm/operations/jobs/discover.d.ts +1 -1
- package/dist/esm/operations/jobs/discover.js +51 -21
- package/dist/esm/operations/jobs/discover.js.map +1 -1
- package/dist/esm/operations/jobs/index.d.ts +14 -57
- package/dist/esm/operations/jobs/index.js +15 -59
- package/dist/esm/operations/jobs/index.js.map +1 -1
- package/dist/esm/operations/jobs/ocapi-mapping.d.ts +34 -0
- package/dist/esm/operations/jobs/ocapi-mapping.js +100 -0
- package/dist/esm/operations/jobs/ocapi-mapping.js.map +1 -0
- package/dist/esm/operations/jobs/run-system-job.d.ts +81 -0
- package/dist/esm/operations/jobs/run-system-job.js +137 -0
- package/dist/esm/operations/jobs/run-system-job.js.map +1 -0
- package/dist/esm/operations/jobs/run.js +16 -4
- package/dist/esm/operations/jobs/run.js.map +1 -1
- package/dist/esm/operations/jobs/scapi-ops.d.ts +61 -0
- package/dist/esm/operations/jobs/scapi-ops.js +214 -0
- package/dist/esm/operations/jobs/scapi-ops.js.map +1 -0
- package/dist/esm/operations/jobs/site-archive.js +28 -66
- package/dist/esm/operations/jobs/site-archive.js.map +1 -1
- package/dist/esm/operations/jobs/types.d.ts +46 -0
- package/dist/esm/operations/jobs/types.js +2 -0
- package/dist/esm/operations/jobs/types.js.map +1 -0
- package/dist/esm/operations/jobs/wait-canonical.d.ts +28 -0
- package/dist/esm/operations/jobs/wait-canonical.js +48 -0
- package/dist/esm/operations/jobs/wait-canonical.js.map +1 -0
- package/dist/esm/operations/mrt/bundle.d.ts +164 -2
- package/dist/esm/operations/mrt/bundle.js +315 -9
- package/dist/esm/operations/mrt/bundle.js.map +1 -1
- package/dist/esm/operations/mrt/deployment.d.ts +221 -0
- package/dist/esm/operations/mrt/deployment.js +239 -0
- package/dist/esm/operations/mrt/deployment.js.map +1 -1
- package/dist/esm/operations/mrt/index.d.ts +8 -6
- package/dist/esm/operations/mrt/index.js +5 -3
- package/dist/esm/operations/mrt/index.js.map +1 -1
- package/dist/esm/operations/mrt/mrt-backend.d.ts +117 -0
- package/dist/esm/operations/mrt/mrt-backend.js +84 -0
- package/dist/esm/operations/mrt/mrt-backend.js.map +1 -0
- package/dist/esm/operations/mrt/push.d.ts +83 -1
- package/dist/esm/operations/mrt/push.js +102 -1
- package/dist/esm/operations/mrt/push.js.map +1 -1
- package/dist/esm/operations/sites/cartridges.d.ts +10 -8
- package/dist/esm/operations/sites/cartridges.js +35 -67
- package/dist/esm/operations/sites/cartridges.js.map +1 -1
- package/dist/esm/operations/sites/index.d.ts +10 -6
- package/dist/esm/operations/sites/index.js +9 -6
- package/dist/esm/operations/sites/index.js.map +1 -1
- package/dist/esm/operations/sites/ocapi-sites-backend.d.ts +20 -0
- package/dist/esm/operations/sites/ocapi-sites-backend.js +98 -0
- package/dist/esm/operations/sites/ocapi-sites-backend.js.map +1 -0
- package/dist/esm/operations/sites/scapi-sites-backend.d.ts +33 -0
- package/dist/esm/operations/sites/scapi-sites-backend.js +166 -0
- package/dist/esm/operations/sites/scapi-sites-backend.js.map +1 -0
- package/dist/esm/operations/sites/sites-backend.d.ts +9 -0
- package/dist/esm/operations/sites/sites-backend.js +16 -0
- package/dist/esm/operations/sites/sites-backend.js.map +1 -0
- package/dist/esm/operations/sites/sites-scopes.d.ts +2 -0
- package/dist/esm/operations/sites/sites-scopes.js +16 -0
- package/dist/esm/operations/sites/sites-scopes.js.map +1 -0
- package/dist/esm/operations/sites/sites-types.d.ts +50 -0
- package/dist/esm/operations/sites/sites-types.js +2 -0
- package/dist/esm/operations/sites/sites-types.js.map +1 -0
- package/dist/esm/safety/safety-middleware.d.ts +7 -3
- package/dist/esm/safety/safety-middleware.js +13 -9
- package/dist/esm/safety/safety-middleware.js.map +1 -1
- package/dist/esm/scaffold/sources.js +6 -9
- package/dist/esm/scaffold/sources.js.map +1 -1
- package/dist/esm/scapi/auth-primitives.d.ts +3 -0
- package/dist/esm/scapi/auth-primitives.js +104 -0
- package/dist/esm/scapi/auth-primitives.js.map +1 -0
- package/dist/esm/scapi/authentication.d.ts +30 -0
- package/dist/esm/scapi/authentication.js +136 -0
- package/dist/esm/scapi/authentication.js.map +1 -0
- package/dist/esm/scapi/catalog.d.ts +29 -0
- package/dist/esm/scapi/catalog.js +81 -0
- package/dist/esm/scapi/catalog.js.map +1 -0
- package/dist/esm/scapi/index.d.ts +12 -0
- package/dist/esm/scapi/index.js +13 -0
- package/dist/esm/scapi/index.js.map +1 -0
- package/dist/esm/scapi/request.d.ts +15 -0
- package/dist/esm/scapi/request.js +239 -0
- package/dist/esm/scapi/request.js.map +1 -0
- package/dist/esm/scapi/runtime.d.ts +20 -0
- package/dist/esm/scapi/runtime.js +131 -0
- package/dist/esm/scapi/runtime.js.map +1 -0
- package/dist/esm/scapi/snippets.d.ts +22 -0
- package/dist/esm/scapi/snippets.js +140 -0
- package/dist/esm/scapi/snippets.js.map +1 -0
- package/dist/esm/scapi/worker-source.d.ts +2 -0
- package/dist/esm/scapi/worker-source.js +101 -0
- package/dist/esm/scapi/worker-source.js.map +1 -0
- package/dist/esm/search/ranking.d.ts +12 -0
- package/dist/esm/search/ranking.js +28 -0
- package/dist/esm/search/ranking.js.map +1 -0
- package/dist/esm/skills/sources.d.ts +2 -2
- package/dist/esm/skills/sources.js +10 -2
- package/dist/esm/skills/sources.js.map +1 -1
- package/dist/esm/skills/types.d.ts +1 -1
- package/dist/esm/slas/token.js +33 -94
- package/dist/esm/slas/token.js.map +1 -1
- package/dist/esm/slas/types.d.ts +5 -0
- package/node_modules/@salesforce/b2c-api-schemas/README.md +23 -0
- package/node_modules/@salesforce/b2c-api-schemas/manifest.json +576 -0
- package/node_modules/@salesforce/b2c-api-schemas/package.json +15 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/cdn/zones/v1.json +11490 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/checkout/orders/v1.json +3589 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/checkout/shopper-baskets/v1.json +6544 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/checkout/shopper-baskets/v2.json +7148 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/checkout/shopper-orders/v1.json +4411 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/checkout/shopper-payments/v1.json +643 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/configuration/cors/v1.json +295 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/configuration/preferences/v1.json +2036 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/configuration/shopper-configurations/v1.json +327 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/configuration/timeouts/v1.json +234 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/custom-object/custom-objects/v1.json +1542 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/custom-object/shopper-custom-objects/v1.json +405 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/customer/customers/v1.json +2531 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/customer/shopper-customers/v1.json +7944 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/dx/custom-apis/v1.json +292 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/dx/object-definitions/v1.json +2537 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/dx/scapi-schemas/v1.json +517 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/dx/scripts/v1.json +589 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/experience/experiences/v1.json +3600 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/experience/shopper-experience/v1.json +2319 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/intelligence/analytics/v1.json +658 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/inventory/availability/v1.json +2649 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/inventory/impex/v1.json +6615 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/inventory/reservation/v1.json +2103 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/merchant/roles/v1.json +1760 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/merchant/users/v1.json +640 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/observability/metrics/v1.json +1263 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/operation/jobs/v1.json +1259 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/operation/replications/v1.json +760 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/pricing/assignments/v1.json +1047 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/pricing/campaigns/v1.json +1929 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/pricing/coupons/v1.json +1542 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/pricing/gift-certificates/v1.json +1093 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/pricing/promotions/v1.json +1324 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/pricing/shopper-gift-certificates/v1.json +325 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/pricing/shopper-promotions/v1.json +631 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/pricing/source-code-groups/v1.json +1036 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/product/catalogs/v1.json +5175 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/product/inventory-lists/v1.json +866 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/product/price-books/v1.json +747 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/product/products/v1.json +5076 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/product/shopper-availability/v1.json +509 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/product/shopper-delivery-estimates/v1.json +517 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/product/shopper-products/v1.json +2961 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/search/shopper-search/v1.json +1889 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/shopper/auth/v1.json +7014 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/shopper/auth-admin/v1.json +1898 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/shopper/consents/v1.json +622 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/shopper/shopper-agents/v1.json +192 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/shopper/shopper-consents/v1.json +913 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/shopper/shopper-context/v1.json +630 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/site/seo/v1.json +223 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/site/shopper-seo/v1.json +423 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/site/sites/v1.json +1088 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/store/shopper-stores/v1.json +798 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/store/store-redirect-mappings/v1.json +607 -0
- package/node_modules/@salesforce/b2c-api-schemas/scapi/store/stores/v1.json +1418 -0
- package/package.json +24 -3
- package/specs/dx-scripts-v1.yaml +409 -0
- package/specs/merchant-roles-v1.yaml +1085 -0
- package/specs/merchant-users-v1.yaml +398 -0
- package/specs/mrt-api-v1.json +105 -0
- package/specs/operations-jobs-v1.yaml +793 -0
- package/specs/product-catalogs-v1.yaml +111 -0
- package/specs/site-sites-v1.yaml +667 -0
- package/specs/slas-shopper-v1.yaml +83 -0
- package/specs/storefront-deployments-v1.yaml +630 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { getApiErrorMessage } from './error-utils.js';
|
|
2
|
+
/** Platform release used when documenting currently-unavailable SCAPI capabilities. */
|
|
3
|
+
export const SCAPI_CAPABILITY_BASELINE_RELEASE = '26.8';
|
|
4
|
+
/** Error raised when browser-based Account Manager user auth is passed to a SCAPI Admin client. */
|
|
5
|
+
export class ScapiUserAuthUnsupportedError extends Error {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(`SCAPI Admin APIs do not currently support browser user authentication as of B2C Commerce release ${SCAPI_CAPABILITY_BASELINE_RELEASE}. ` +
|
|
8
|
+
'Use client credentials or JWT Bearer authentication, or set apiBackend to "ocapi" ' +
|
|
9
|
+
'(CLI: --api-backend ocapi) for now. The tooling will be updated when SCAPI support becomes available.');
|
|
10
|
+
this.name = 'ScapiUserAuthUnsupportedError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** Reject browser user-auth strategies before a SCAPI request is attempted. */
|
|
14
|
+
export function assertScapiAdminAuthSupported(auth) {
|
|
15
|
+
if ('authMethod' in auth && (auth.authMethod === 'user' || auth.authMethod === 'implicit')) {
|
|
16
|
+
throw new ScapiUserAuthUnsupportedError();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Returns a copy of `auth` with `additionalScopes` merged in, or the original
|
|
21
|
+
* `auth` if the strategy doesn't support scope merging (e.g., basic/api-key
|
|
22
|
+
* auth, or a stored-session strategy where scopes were fixed at acquisition).
|
|
23
|
+
*
|
|
24
|
+
* Centralized so SCAPI client factories don't have to keep extending an
|
|
25
|
+
* `instanceof` chain as new OAuth strategy types are added.
|
|
26
|
+
*/
|
|
27
|
+
export function withScopes(auth, additionalScopes) {
|
|
28
|
+
assertScapiAdminAuthSupported(auth);
|
|
29
|
+
if (typeof auth.withAdditionalScopes === 'function') {
|
|
30
|
+
return auth.withAdditionalScopes(additionalScopes);
|
|
31
|
+
}
|
|
32
|
+
return auth;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Detects an Account Manager `invalid_scope` error.
|
|
36
|
+
*
|
|
37
|
+
* When a client's API client doesn't have the requested scope configured,
|
|
38
|
+
* Account Manager returns `{"error":"invalid_scope", ...}` on the token
|
|
39
|
+
* request. The OAuth strategy surfaces that as an Error whose message
|
|
40
|
+
* contains `invalid_scope`.
|
|
41
|
+
*
|
|
42
|
+
* Used by fallback wrappers to decide whether to downgrade to OCAPI.
|
|
43
|
+
*/
|
|
44
|
+
export function isInvalidScopeError(error) {
|
|
45
|
+
return error instanceof Error && error.message.includes('invalid_scope');
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Thrown by SCAPI backends when a requested operation cannot be expressed on
|
|
49
|
+
* SCAPI (e.g., toggling the `disabled` flag via the SCAPI Users PATCH, which
|
|
50
|
+
* the SCAPI schema does not include). The fallback wrapper recognizes this
|
|
51
|
+
* and falls back to OCAPI; in explicit `scapi` mode it propagates so the
|
|
52
|
+
* caller sees the limitation.
|
|
53
|
+
*/
|
|
54
|
+
export class ScapiCapabilityUnsupportedError extends Error {
|
|
55
|
+
constructor(message) {
|
|
56
|
+
super(message);
|
|
57
|
+
this.name = 'ScapiCapabilityUnsupportedError';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Builds the canonical error for a capability absent from the current live SCAPI schemas. */
|
|
61
|
+
export function scapiCapabilityUnsupportedMessage(capability) {
|
|
62
|
+
return (`SCAPI does not currently support ${capability} as of B2C Commerce release ${SCAPI_CAPABILITY_BASELINE_RELEASE}. ` +
|
|
63
|
+
'Set apiBackend to "ocapi" (CLI: --api-backend ocapi) for now. ' +
|
|
64
|
+
'The tooling will be updated when SCAPI support becomes available.');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Prevents an OCAPI-only compatibility operation from silently contacting
|
|
68
|
+
* OCAPI when the caller explicitly selected SCAPI. `auto` remains eligible
|
|
69
|
+
* for the temporary compatibility path, while explicit OCAPI is always
|
|
70
|
+
* allowed.
|
|
71
|
+
*/
|
|
72
|
+
export function assertOcapiCompatibilityAllowed(preference, capability) {
|
|
73
|
+
if (preference === 'scapi') {
|
|
74
|
+
throw new ScapiCapabilityUnsupportedError(scapiCapabilityUnsupportedMessage(capability));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* HTTP statuses that prove SCAPI rejected a request before performing it.
|
|
79
|
+
*
|
|
80
|
+
* These are safe for the temporary `auto` compatibility mode to retry over
|
|
81
|
+
* OCAPI. Ambiguous responses (`429`, `5xx`) and network failures are excluded
|
|
82
|
+
* because a mutating request might already have reached the platform.
|
|
83
|
+
*/
|
|
84
|
+
export const SAFE_SCAPI_FALLBACK_STATUSES = new Set([400, 401, 403, 404, 405, 406, 415]);
|
|
85
|
+
/**
|
|
86
|
+
* A structured SCAPI response failure. Backends must retain the response
|
|
87
|
+
* status so the shared fallback policy can distinguish a definite rejection
|
|
88
|
+
* from an ambiguous transport/server failure.
|
|
89
|
+
*/
|
|
90
|
+
export class ScapiRequestError extends Error {
|
|
91
|
+
status;
|
|
92
|
+
constructor(message,
|
|
93
|
+
/** HTTP status returned by SCAPI. */
|
|
94
|
+
status, options) {
|
|
95
|
+
super(message, options);
|
|
96
|
+
this.status = status;
|
|
97
|
+
this.name = 'ScapiRequestError';
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Creates a structured SCAPI error using the repository's common formatter. */
|
|
101
|
+
export function createScapiRequestError(error, response, fallbackMessage) {
|
|
102
|
+
const message = error ? getApiErrorMessage(error, response) : fallbackMessage;
|
|
103
|
+
return new ScapiRequestError(message || fallbackMessage, response.status, { cause: error });
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Detects whether an error should trigger an OCAPI fallback. Currently:
|
|
107
|
+
* - {@link isInvalidScopeError}: AM rejected the requested scope.
|
|
108
|
+
* - {@link ScapiCapabilityUnsupportedError}: the SCAPI surface lacks the
|
|
109
|
+
* capability the caller asked for.
|
|
110
|
+
* - {@link ScapiRequestError}: SCAPI definitively rejected the request with
|
|
111
|
+
* a safe client-error status.
|
|
112
|
+
*/
|
|
113
|
+
export function isFallbackTrigger(error) {
|
|
114
|
+
return (isInvalidScopeError(error) ||
|
|
115
|
+
error instanceof ScapiCapabilityUnsupportedError ||
|
|
116
|
+
(error instanceof ScapiRequestError && SAFE_SCAPI_FALLBACK_STATUSES.has(error.status)));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Message for when explicit SCAPI is requested but the instance can't reach it.
|
|
120
|
+
*
|
|
121
|
+
* Names both reasons the SCAPI client config can be unavailable — missing
|
|
122
|
+
* coordinates OR an auth flow that can't request scopes — because a user who
|
|
123
|
+
* hits this in explicit `--api-backend scapi` mode often *does* have shortCode
|
|
124
|
+
* and tenantId configured; the real blocker can be browser user auth, which
|
|
125
|
+
* SCAPI Admin APIs do not currently support, or a fixed-scope stored token.
|
|
126
|
+
* The old message only mentioned missing credentials, which was misleading.
|
|
127
|
+
*/
|
|
128
|
+
export function scapiUnavailableMessage(domainName) {
|
|
129
|
+
return (`${domainName} SCAPI backend requires shortCode, tenantId, and a stateless OAuth flow ` +
|
|
130
|
+
`(client-credentials or JWT Bearer) that can request the required scopes. ` +
|
|
131
|
+
`Browser user auth (Authorization Code + PKCE or implicit) is not supported by SCAPI Admin APIs ` +
|
|
132
|
+
`as of B2C Commerce release ${SCAPI_CAPABILITY_BASELINE_RELEASE} and is currently OCAPI/WebDAV-only; ` +
|
|
133
|
+
`fixed-token stored sessions cannot request SCAPI scopes — ` +
|
|
134
|
+
`use client-credentials/JWT, or set --api-backend ocapi for now. ` +
|
|
135
|
+
`The tooling will be updated when SCAPI support becomes available.`);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Generic tri-state backend resolver shared by SCAPI-vs-OCAPI and SCAPI-vs-legacy
|
|
139
|
+
* domains — the single definition of the preference/availability precedence.
|
|
140
|
+
*
|
|
141
|
+
* - Explicit primary → primary.
|
|
142
|
+
* - Explicit `'scapi'` → `'scapi'`, throwing `unavailableMessage()` when the SCAPI
|
|
143
|
+
* config is missing (fail loud; never silently downgrade).
|
|
144
|
+
* - `'auto'` → `'scapi'` when config is available, otherwise the primary backend.
|
|
145
|
+
*/
|
|
146
|
+
export function resolvePreferredBackend(opts) {
|
|
147
|
+
const { preference, primary, hasScapiConfig, unavailableMessage } = opts;
|
|
148
|
+
if (preference === primary)
|
|
149
|
+
return primary;
|
|
150
|
+
if (preference === 'scapi') {
|
|
151
|
+
if (!hasScapiConfig) {
|
|
152
|
+
throw new Error(unavailableMessage());
|
|
153
|
+
}
|
|
154
|
+
return 'scapi';
|
|
155
|
+
}
|
|
156
|
+
// auto
|
|
157
|
+
return hasScapiConfig ? 'scapi' : primary;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Resolves a user preference + config availability into a concrete backend choice.
|
|
161
|
+
*
|
|
162
|
+
* - Explicit `'ocapi'` always returns `'ocapi'`.
|
|
163
|
+
* - Explicit `'scapi'` requires SCAPI config and throws if missing.
|
|
164
|
+
* - `'auto'` returns `'scapi'` if SCAPI config is available, otherwise `'ocapi'`.
|
|
165
|
+
*
|
|
166
|
+
* Throws an error with the domain name in the message when explicit SCAPI is
|
|
167
|
+
* requested without the required configuration. The error identifies release
|
|
168
|
+
* 26.8 as the current platform capability baseline so it can be revised when
|
|
169
|
+
* SCAPI adds support.
|
|
170
|
+
*/
|
|
171
|
+
export function resolveScapiOrOcapi(opts) {
|
|
172
|
+
const { preference, hasScapiConfig, domainName } = opts;
|
|
173
|
+
return resolvePreferredBackend({
|
|
174
|
+
preference,
|
|
175
|
+
primary: 'ocapi',
|
|
176
|
+
hasScapiConfig,
|
|
177
|
+
unavailableMessage: () => scapiUnavailableMessage(domainName),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=scapi-backend-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scapi-backend-utils.js","sourceRoot":"","sources":["../../../src/clients/scapi-backend-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Client } from 'openapi-fetch';
|
|
2
|
+
import type { AuthStrategy } from '../auth/types.js';
|
|
3
|
+
import type { paths, components } from './scapi-catalogs.generated.js';
|
|
4
|
+
import { type ScapiClientConfig } from './scapi-client-factory.js';
|
|
5
|
+
import type { ScopeCascade } from './middleware.js';
|
|
6
|
+
export type { paths, components };
|
|
7
|
+
export type ScapiCatalogsClient = Client<paths>;
|
|
8
|
+
export type ScapiCatalogsClientConfig = ScapiClientConfig;
|
|
9
|
+
export type Catalog = components['schemas']['Catalog'];
|
|
10
|
+
export type Catalogs = components['schemas']['Catalogs'];
|
|
11
|
+
export declare const SCAPI_CATALOGS_CASCADE: ScopeCascade;
|
|
12
|
+
export declare function createScapiCatalogsClient(config: ScapiCatalogsClientConfig, auth: AuthStrategy): ScapiCatalogsClient;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file was auto-generated by openapi-typescript.
|
|
3
|
+
* Do not make direct changes to the file.
|
|
4
|
+
*/
|
|
5
|
+
export interface paths {
|
|
6
|
+
"/organizations/{organizationId}/catalogs": {
|
|
7
|
+
parameters: {
|
|
8
|
+
query?: never;
|
|
9
|
+
header?: never;
|
|
10
|
+
path?: never;
|
|
11
|
+
cookie?: never;
|
|
12
|
+
};
|
|
13
|
+
get: operations["getCatalogs"];
|
|
14
|
+
put?: never;
|
|
15
|
+
post?: never;
|
|
16
|
+
delete?: never;
|
|
17
|
+
options?: never;
|
|
18
|
+
head?: never;
|
|
19
|
+
patch?: never;
|
|
20
|
+
trace?: never;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export type webhooks = Record<string, never>;
|
|
24
|
+
export interface components {
|
|
25
|
+
schemas: {
|
|
26
|
+
Catalog: {
|
|
27
|
+
id: string;
|
|
28
|
+
name?: {
|
|
29
|
+
[key: string]: string;
|
|
30
|
+
};
|
|
31
|
+
description?: {
|
|
32
|
+
[key: string]: string;
|
|
33
|
+
};
|
|
34
|
+
online?: boolean;
|
|
35
|
+
} & {
|
|
36
|
+
[key: string]: unknown;
|
|
37
|
+
};
|
|
38
|
+
Catalogs: {
|
|
39
|
+
data: components["schemas"]["Catalog"][];
|
|
40
|
+
limit: number;
|
|
41
|
+
offset: number;
|
|
42
|
+
total: number;
|
|
43
|
+
};
|
|
44
|
+
ErrorResponse: {
|
|
45
|
+
title: string;
|
|
46
|
+
type: string;
|
|
47
|
+
detail: string;
|
|
48
|
+
instance?: string;
|
|
49
|
+
} & {
|
|
50
|
+
[key: string]: unknown;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
responses: never;
|
|
54
|
+
parameters: never;
|
|
55
|
+
requestBodies: never;
|
|
56
|
+
headers: never;
|
|
57
|
+
pathItems: never;
|
|
58
|
+
}
|
|
59
|
+
export type $defs = Record<string, never>;
|
|
60
|
+
export interface operations {
|
|
61
|
+
getCatalogs: {
|
|
62
|
+
parameters: {
|
|
63
|
+
query?: {
|
|
64
|
+
limit?: number;
|
|
65
|
+
offset?: number;
|
|
66
|
+
};
|
|
67
|
+
header?: never;
|
|
68
|
+
path: {
|
|
69
|
+
organizationId: string;
|
|
70
|
+
};
|
|
71
|
+
cookie?: never;
|
|
72
|
+
};
|
|
73
|
+
requestBody?: never;
|
|
74
|
+
responses: {
|
|
75
|
+
/** @description Catalogs retrieved successfully. */
|
|
76
|
+
200: {
|
|
77
|
+
headers: {
|
|
78
|
+
[name: string]: unknown;
|
|
79
|
+
};
|
|
80
|
+
content: {
|
|
81
|
+
"application/json": components["schemas"]["Catalogs"];
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
/** @description Bad Request */
|
|
85
|
+
400: {
|
|
86
|
+
headers: {
|
|
87
|
+
[name: string]: unknown;
|
|
88
|
+
};
|
|
89
|
+
content: {
|
|
90
|
+
"application/problem+json": components["schemas"]["ErrorResponse"];
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
/** @description Unauthorized */
|
|
94
|
+
401: {
|
|
95
|
+
headers: {
|
|
96
|
+
[name: string]: unknown;
|
|
97
|
+
};
|
|
98
|
+
content: {
|
|
99
|
+
"application/problem+json": components["schemas"]["ErrorResponse"];
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scapi-catalogs.generated.js","sourceRoot":"","sources":["../../../src/clients/scapi-catalogs.generated.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { buildScapiClient } from './scapi-client-factory.js';
|
|
2
|
+
export const SCAPI_CATALOGS_CASCADE = {
|
|
3
|
+
read: [['sfcc.catalogs.rw'], ['sfcc.catalogs']],
|
|
4
|
+
write: [['sfcc.catalogs.rw']],
|
|
5
|
+
};
|
|
6
|
+
export function createScapiCatalogsClient(config, auth) {
|
|
7
|
+
return buildScapiClient({
|
|
8
|
+
pathSegment: 'product/catalogs/v1',
|
|
9
|
+
domainKey: 'scapi-catalogs',
|
|
10
|
+
scopeCascade: SCAPI_CATALOGS_CASCADE,
|
|
11
|
+
logPrefix: 'SCAPI-CATALOGS',
|
|
12
|
+
}, config, auth);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=scapi-catalogs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scapi-catalogs.js","sourceRoot":"","sources":["../../../src/clients/scapi-catalogs.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,gBAAgB,EAAyB,MAAM,2BAA2B,CAAC;AASnF,MAAM,CAAC,MAAM,sBAAsB,GAAiB;IAClD,IAAI,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;IAC/C,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAAC,MAAiC,EAAE,IAAkB;IAC7F,OAAO,gBAAgB,CACrB;QACE,WAAW,EAAE,qBAAqB;QAClC,SAAS,EAAE,gBAAgB;QAC3B,YAAY,EAAE,sBAAsB;QACpC,SAAS,EAAE,gBAAgB;KAC5B,EACD,MAAM,EACN,IAAI,CACL,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic builder for SCAPI Admin API clients.
|
|
3
|
+
*
|
|
4
|
+
* The four new SCAPI clients (jobs, scripts, merchant-users, merchant-roles)
|
|
5
|
+
* each had ~20 lines of nearly-identical setup: build the openapi-fetch
|
|
6
|
+
* client with a domain URL, install auth middleware with merged scopes,
|
|
7
|
+
* install plugin middleware from the registry, then rate-limit and logging.
|
|
8
|
+
*
|
|
9
|
+
* This module collapses that setup into one helper.
|
|
10
|
+
*
|
|
11
|
+
* @module clients/scapi-client-factory
|
|
12
|
+
*/
|
|
13
|
+
import { type Client } from 'openapi-fetch';
|
|
14
|
+
import type { AuthStrategy } from '../auth/types.js';
|
|
15
|
+
import { type ScopeCascade } from './middleware.js';
|
|
16
|
+
import { type HttpClientType, type MiddlewareRegistry } from './middleware-registry.js';
|
|
17
|
+
export interface BuildScapiClientOptions {
|
|
18
|
+
/**
|
|
19
|
+
* URL path segment after the SCAPI host root, e.g. `'operation/jobs/v1'`.
|
|
20
|
+
*/
|
|
21
|
+
pathSegment: string;
|
|
22
|
+
/**
|
|
23
|
+
* Middleware registry key, e.g. `'scapi-jobs'`. Plugin middleware
|
|
24
|
+
* registered under this key gets installed on the client.
|
|
25
|
+
*/
|
|
26
|
+
domainKey: HttpClientType;
|
|
27
|
+
/**
|
|
28
|
+
* Per-operation scope cascade. When supplied, operations attach a
|
|
29
|
+
* `x-b2c-scope-mode` header (`'read'` or `'write'`) and the auth
|
|
30
|
+
* middleware walks the matching cascade until AM accepts one. Mutually
|
|
31
|
+
* exclusive with {@link defaultScopes}; new domains should prefer this.
|
|
32
|
+
*/
|
|
33
|
+
scopeCascade?: ScopeCascade;
|
|
34
|
+
/**
|
|
35
|
+
* Legacy: a single scope set requested for every operation. Used by
|
|
36
|
+
* domains that still rely on `ScopeTierManager` to switch clients
|
|
37
|
+
* between rw and ro. Mutually exclusive with {@link scopeCascade}.
|
|
38
|
+
*
|
|
39
|
+
* @deprecated Use {@link scopeCascade} for new domains.
|
|
40
|
+
*/
|
|
41
|
+
defaultScopes?: string[];
|
|
42
|
+
/**
|
|
43
|
+
* Logging/rate-limit prefix, e.g. `'SCAPI-JOBS'`. Used in log lines.
|
|
44
|
+
*/
|
|
45
|
+
logPrefix: string;
|
|
46
|
+
}
|
|
47
|
+
export interface ScapiClientConfig {
|
|
48
|
+
shortCode: string;
|
|
49
|
+
tenantId: string;
|
|
50
|
+
/**
|
|
51
|
+
* Override the requested scopes. When omitted, defaults to
|
|
52
|
+
* `[...defaultScopes, buildTenantScope(tenantId)]`.
|
|
53
|
+
*/
|
|
54
|
+
scopes?: string[];
|
|
55
|
+
/** Override the global middleware registry (mainly for tests). */
|
|
56
|
+
middlewareRegistry?: MiddlewareRegistry;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Builds a typed openapi-fetch client for a SCAPI Admin API.
|
|
60
|
+
*
|
|
61
|
+
* @param options - Domain-specific URL/key/scopes/log-prefix
|
|
62
|
+
* @param config - Caller-supplied shortCode, tenantId, optional overrides
|
|
63
|
+
* @param auth - Auth strategy (scopes are merged via {@link withScopes})
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* export function createScapiJobsClient(config: ScapiClientConfig, auth: AuthStrategy): ScapiJobsClient {
|
|
68
|
+
* return buildScapiClient<paths>(
|
|
69
|
+
* {
|
|
70
|
+
* pathSegment: 'operation/jobs/v1',
|
|
71
|
+
* domainKey: 'scapi-jobs',
|
|
72
|
+
* defaultScopes: SCAPI_JOBS_RW_SCOPES,
|
|
73
|
+
* logPrefix: 'SCAPI-JOBS',
|
|
74
|
+
* },
|
|
75
|
+
* config,
|
|
76
|
+
* auth,
|
|
77
|
+
* );
|
|
78
|
+
* }
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export declare function buildScapiClient<P extends Record<string, any>>(options: BuildScapiClientOptions, config: ScapiClientConfig, auth: AuthStrategy): Client<P>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025, Salesforce, Inc.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2
|
|
4
|
+
* For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Generic builder for SCAPI Admin API clients.
|
|
8
|
+
*
|
|
9
|
+
* The four new SCAPI clients (jobs, scripts, merchant-users, merchant-roles)
|
|
10
|
+
* each had ~20 lines of nearly-identical setup: build the openapi-fetch
|
|
11
|
+
* client with a domain URL, install auth middleware with merged scopes,
|
|
12
|
+
* install plugin middleware from the registry, then rate-limit and logging.
|
|
13
|
+
*
|
|
14
|
+
* This module collapses that setup into one helper.
|
|
15
|
+
*
|
|
16
|
+
* @module clients/scapi-client-factory
|
|
17
|
+
*/
|
|
18
|
+
import createClient, {} from 'openapi-fetch';
|
|
19
|
+
import { createAuthMiddleware, createLoggingMiddleware, createRateLimitMiddleware, createScapiAuthMiddleware, } from './middleware.js';
|
|
20
|
+
import { globalMiddlewareRegistry } from './middleware-registry.js';
|
|
21
|
+
import { buildTenantScope } from './custom-apis.js';
|
|
22
|
+
import { withScopes } from './scapi-backend-utils.js';
|
|
23
|
+
/**
|
|
24
|
+
* Builds a typed openapi-fetch client for a SCAPI Admin API.
|
|
25
|
+
*
|
|
26
|
+
* @param options - Domain-specific URL/key/scopes/log-prefix
|
|
27
|
+
* @param config - Caller-supplied shortCode, tenantId, optional overrides
|
|
28
|
+
* @param auth - Auth strategy (scopes are merged via {@link withScopes})
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* export function createScapiJobsClient(config: ScapiClientConfig, auth: AuthStrategy): ScapiJobsClient {
|
|
33
|
+
* return buildScapiClient<paths>(
|
|
34
|
+
* {
|
|
35
|
+
* pathSegment: 'operation/jobs/v1',
|
|
36
|
+
* domainKey: 'scapi-jobs',
|
|
37
|
+
* defaultScopes: SCAPI_JOBS_RW_SCOPES,
|
|
38
|
+
* logPrefix: 'SCAPI-JOBS',
|
|
39
|
+
* },
|
|
40
|
+
* config,
|
|
41
|
+
* auth,
|
|
42
|
+
* );
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
// `paths` types from openapi-typescript are `interface paths { ... }` shapes
|
|
47
|
+
// which don't satisfy `Record<string, unknown>`. The unconstrained generic
|
|
48
|
+
// is fine since openapi-fetch's `Client<P>` constraint handles the shape check.
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
50
|
+
export function buildScapiClient(options, config, auth) {
|
|
51
|
+
const registry = config.middlewareRegistry ?? globalMiddlewareRegistry;
|
|
52
|
+
if (options.scopeCascade && options.defaultScopes) {
|
|
53
|
+
throw new Error(`[buildScapiClient] ${options.domainKey}: scopeCascade and defaultScopes are mutually exclusive.`);
|
|
54
|
+
}
|
|
55
|
+
if (!options.scopeCascade && !options.defaultScopes) {
|
|
56
|
+
throw new Error(`[buildScapiClient] ${options.domainKey}: must provide either scopeCascade or defaultScopes.`);
|
|
57
|
+
}
|
|
58
|
+
const client = createClient({
|
|
59
|
+
baseUrl: `https://${config.shortCode}.api.commercecloud.salesforce.com/${options.pathSegment}`,
|
|
60
|
+
});
|
|
61
|
+
if (options.scopeCascade) {
|
|
62
|
+
// Cascade-aware path: bake the tenant scope into the auth strategy as a
|
|
63
|
+
// "base scope" applied to every cascade attempt; the cascade itself only
|
|
64
|
+
// varies the domain (rw/ro) scope per operation.
|
|
65
|
+
const tenantBase = config.scopes ?? [buildTenantScope(config.tenantId)];
|
|
66
|
+
const scopedAuth = withScopes(auth, tenantBase);
|
|
67
|
+
client.use(createScapiAuthMiddleware(scopedAuth, options.scopeCascade));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Legacy path: single static scope set requested for every operation.
|
|
71
|
+
// Used by domains still on ScopeTierManager (scripts/users/roles until
|
|
72
|
+
// they migrate to scopeCascade).
|
|
73
|
+
const requiredScopes = config.scopes ?? [...options.defaultScopes, buildTenantScope(config.tenantId)];
|
|
74
|
+
const scopedAuth = withScopes(auth, requiredScopes);
|
|
75
|
+
client.use(createAuthMiddleware(scopedAuth));
|
|
76
|
+
}
|
|
77
|
+
for (const middleware of registry.getMiddleware(options.domainKey)) {
|
|
78
|
+
client.use(middleware);
|
|
79
|
+
}
|
|
80
|
+
client.use(createRateLimitMiddleware({ prefix: options.logPrefix }));
|
|
81
|
+
client.use(createLoggingMiddleware(options.logPrefix));
|
|
82
|
+
return client;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=scapi-client-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scapi-client-factory.js","sourceRoot":"","sources":["../../../src/clients/scapi-client-factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;;;;;;;GAWG;AACH,OAAO,YAAY,EAAE,EAAa,MAAM,eAAe,CAAC;AAExD,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,GAE1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,wBAAwB,EAA+C,MAAM,0BAA0B,CAAC;AAChH,OAAO,EAAC,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,0BAA0B,CAAC;AA6CpD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,6EAA6E;AAC7E,2EAA2E;AAC3E,gFAAgF;AAChF,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB,CAC9B,OAAgC,EAChC,MAAyB,EACzB,IAAkB;IAElB,MAAM,QAAQ,GAAG,MAAM,CAAC,kBAAkB,IAAI,wBAAwB,CAAC;IAEvE,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,CAAC,SAAS,0DAA0D,CAAC,CAAC;IACrH,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,CAAC,SAAS,sDAAsD,CAAC,CAAC;IACjH,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAI;QAC7B,OAAO,EAAE,WAAW,MAAM,CAAC,SAAS,qCAAqC,OAAO,CAAC,WAAW,EAAE;KAC/F,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,wEAAwE;QACxE,yEAAyE;QACzE,iDAAiD;QACjD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxE,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,sEAAsE;QACtE,uEAAuE;QACvE,iCAAiC;QACjC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,aAAc,EAAE,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvG,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACnE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAC,CAAC,CAAC,CAAC;IACnE,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAEvD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type BackendBase } from './scapi-backend-utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a fallback wrapper over `scapi` and `ocapi` backends.
|
|
4
|
+
*
|
|
5
|
+
* The returned object presents the same interface as `T`. Method calls are
|
|
6
|
+
* intercepted: the first call tries SCAPI; on a safe fallback trigger it falls back
|
|
7
|
+
* to OCAPI. The choice is cached for the wrapper's lifetime.
|
|
8
|
+
*
|
|
9
|
+
* **Contract:**
|
|
10
|
+
* - Both `scapi` and `ocapi` must implement `T`. TypeScript enforces this
|
|
11
|
+
* at the call site since both are typed as `T`.
|
|
12
|
+
* - Only methods of `T` are routed through the fallback logic. The `name`
|
|
13
|
+
* getter is special-cased to reflect the resolved backend.
|
|
14
|
+
* - **Non-method properties** are returned from the SCAPI target only and
|
|
15
|
+
* are not switched on fallback. By convention, backends should be method
|
|
16
|
+
* bags — any state beyond `name` should be encapsulated, not exposed.
|
|
17
|
+
* - **Concurrency:** if two calls race before resolution, both may attempt
|
|
18
|
+
* SCAPI. This is benign for read operations (idempotent retries) and
|
|
19
|
+
* acceptable for writes (both either succeed or fail with the same
|
|
20
|
+
* error). Each Proxy instance has its own state, so this concerns only
|
|
21
|
+
* shared use of a single wrapper.
|
|
22
|
+
*
|
|
23
|
+
* @param scapi - Primary (SCAPI) backend implementation
|
|
24
|
+
* @param ocapi - Fallback (OCAPI) backend implementation
|
|
25
|
+
* @param domainName - Used in fallback log messages, e.g. `'jobs'`
|
|
26
|
+
* @returns A Proxy over `scapi` whose methods route through fallback logic
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* const backend = createFallbackBackend<JobsBackend>(scapiJobs, ocapiJobs, 'jobs');
|
|
31
|
+
* await backend.executeJob('my-job'); // tries SCAPI, may fall back to OCAPI
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function createFallbackBackend<T extends BackendBase>(scapi: T, ocapi: T, domainName: string): T;
|