@salesforce/b2c-tooling-sdk 1.24.1 → 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 +81 -117
- 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 +7 -0
- package/dist/esm/auth/oauth-implicit.js +2 -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 +3 -0
- package/dist/esm/auth/oauth-pkce-fallback.js +27 -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 +2 -1
- 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/session-store.d.ts +7 -0
- package/dist/esm/auth/session-store.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/debug/debug-session.js +0 -8
- package/dist/esm/operations/debug/debug-session.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
|
@@ -8,6 +8,78 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @module clients/error-utils
|
|
10
10
|
*/
|
|
11
|
+
/**
|
|
12
|
+
* The OCAPI `fault.type` returned (with HTTP 403) when an instance has OCAPI
|
|
13
|
+
* disabled. The platform is progressively deprecating OCAPI; on a deprecated
|
|
14
|
+
* instance every Data API call fails with this fault regardless of scopes or
|
|
15
|
+
* credentials. SCAPI is the supported path forward.
|
|
16
|
+
*/
|
|
17
|
+
const OCAPI_DEPRECATED_FAULT_TYPE = 'OcapiDeprecatedException';
|
|
18
|
+
/** Doc anchor users are directed to when OCAPI is deprecated for an instance. */
|
|
19
|
+
const SCAPI_SETUP_DOC_URL = 'https://salesforcecommercecloud.github.io/b2c-developer-tooling/guide/authentication.html#scapi-authentication';
|
|
20
|
+
/**
|
|
21
|
+
* Renders the scope portion of the deprecation message. When the operation has
|
|
22
|
+
* a SCAPI equivalent, names the exact scope(s) that unlock it (e.g.
|
|
23
|
+
* `the "sfcc.scripts" or "sfcc.scripts.rw" scope`); otherwise falls back to the
|
|
24
|
+
* generic `sfcc.*` phrasing.
|
|
25
|
+
*/
|
|
26
|
+
function scopeClause(requiredScopes) {
|
|
27
|
+
if (!requiredScopes || requiredScopes.length === 0) {
|
|
28
|
+
return 'the required sfcc.* scopes';
|
|
29
|
+
}
|
|
30
|
+
const quoted = requiredScopes.map((s) => `"${s}"`);
|
|
31
|
+
const list = quoted.length === 1 ? quoted[0] : `${quoted.slice(0, -1).join(', ')} or ${quoted[quoted.length - 1]}`;
|
|
32
|
+
return `the ${list} scope`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Builds the user-facing guidance shown when an instance has OCAPI deprecated.
|
|
36
|
+
*
|
|
37
|
+
* Pass the SCAPI scope(s) the failed operation requires to name them in the
|
|
38
|
+
* message (e.g. an operation needing `sfcc.scripts.rw` tells the user exactly
|
|
39
|
+
* which scope to add). Omit `requiredScopes` for operations that have no SCAPI
|
|
40
|
+
* equivalent — the message then uses the generic `sfcc.*` phrasing.
|
|
41
|
+
*/
|
|
42
|
+
export function ocapiDeprecatedMessage(requiredScopes) {
|
|
43
|
+
return ('OCAPI is deprecated and disabled for this instance. ' +
|
|
44
|
+
`Configure SCAPI access (shortCode, tenantId, and ${scopeClause(requiredScopes)}) on your Account Manager API client to continue. ` +
|
|
45
|
+
`See: ${SCAPI_SETUP_DOC_URL}`);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Generic OCAPI deprecation message (no specific scope named). Convenience for
|
|
49
|
+
* call sites that surface the guidance directly without an operation scope.
|
|
50
|
+
*/
|
|
51
|
+
export const OCAPI_DEPRECATED_MESSAGE = ocapiDeprecatedMessage();
|
|
52
|
+
/**
|
|
53
|
+
* Returns true if an API error object is an OCAPI deprecation fault
|
|
54
|
+
* (`fault.type === 'OcapiDeprecatedException'`).
|
|
55
|
+
*
|
|
56
|
+
* Detection keys off the structured `fault.type`, not the message text, so it
|
|
57
|
+
* is robust to message wording changes. Used to convert the opaque OCAPI 403
|
|
58
|
+
* into actionable "configure SCAPI" guidance at every OCAPI-terminal site.
|
|
59
|
+
*/
|
|
60
|
+
export function isOcapiDeprecatedFault(error) {
|
|
61
|
+
if (!error || typeof error !== 'object')
|
|
62
|
+
return false;
|
|
63
|
+
const fault = error.fault;
|
|
64
|
+
if (!fault || typeof fault !== 'object')
|
|
65
|
+
return false;
|
|
66
|
+
return fault.type === OCAPI_DEPRECATED_FAULT_TYPE;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Error thrown when an OCAPI operation fails because OCAPI is deprecated for
|
|
70
|
+
* the instance. Carries actionable SCAPI-setup guidance — including the exact
|
|
71
|
+
* scope the failed operation needs, when supplied — so the CLI surfaces a
|
|
72
|
+
* helpful message instead of an opaque "Failed to ..." line.
|
|
73
|
+
*
|
|
74
|
+
* Thrown by OCAPI-terminal operations (those with no SCAPI fallback, or whose
|
|
75
|
+
* SCAPI path was already exhausted) when {@link isOcapiDeprecatedFault} matches.
|
|
76
|
+
*/
|
|
77
|
+
export class OcapiDeprecatedError extends Error {
|
|
78
|
+
constructor(options = {}) {
|
|
79
|
+
super(ocapiDeprecatedMessage(options.requiredScopes), options.cause === undefined ? undefined : { cause: options.cause });
|
|
80
|
+
this.name = 'OcapiDeprecatedError';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
11
83
|
/**
|
|
12
84
|
* Extract a clean error message from an API error response.
|
|
13
85
|
*
|
|
@@ -66,4 +138,30 @@ export function getApiErrorMessage(error, response) {
|
|
|
66
138
|
// Fallback to HTTP status
|
|
67
139
|
return `HTTP ${response.status} ${response.statusText}`;
|
|
68
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Throws a well-formed Error for a failed OCAPI call.
|
|
143
|
+
*
|
|
144
|
+
* Centralizes OCAPI-terminal error handling so every call site behaves
|
|
145
|
+
* consistently:
|
|
146
|
+
* - OCAPI deprecation faults become an {@link OcapiDeprecatedError} with
|
|
147
|
+
* actionable SCAPI-setup guidance, naming `requiredScopes` when the operation
|
|
148
|
+
* has a SCAPI equivalent.
|
|
149
|
+
* - Everything else throws `Error(`${prefix}: ${message}`)` where `message`
|
|
150
|
+
* is the fault text from {@link getApiErrorMessage}.
|
|
151
|
+
*
|
|
152
|
+
* The original `error` is always attached as `cause` for debug logging.
|
|
153
|
+
*
|
|
154
|
+
* @param error - The error object from an openapi-fetch result.
|
|
155
|
+
* @param response - The HTTP response (for status fallback).
|
|
156
|
+
* @param prefix - Operation-specific prefix, e.g. `'Failed to list code versions'`.
|
|
157
|
+
* @param requiredScopes - SCAPI scope(s) the equivalent operation needs, named
|
|
158
|
+
* in the deprecation message. Omit for OCAPI-only operations.
|
|
159
|
+
* @throws Always throws — return type is `never`.
|
|
160
|
+
*/
|
|
161
|
+
export function throwOcapiError(error, response, prefix, requiredScopes) {
|
|
162
|
+
if (isOcapiDeprecatedFault(error)) {
|
|
163
|
+
throw new OcapiDeprecatedError({ cause: error, requiredScopes });
|
|
164
|
+
}
|
|
165
|
+
throw new Error(`${prefix}: ${getApiErrorMessage(error, response)}`, { cause: error });
|
|
166
|
+
}
|
|
69
167
|
//# sourceMappingURL=error-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-utils.js","sourceRoot":"","sources":["../../../src/clients/error-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;GAIG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,QAAyD;IAC1G,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,KAAgC,CAAC;QAE7C,kDAAkD;QAClD,IAAI,GAAG,CAAC,KAAK,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,KAAgC,CAAC;YACpD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACzD,OAAO,MAAM,CAAC,OAAO,CAAC;YACxB,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,IAAI,GAAG,CAAC,KAAK,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAgC,CAAC;YACnD,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACvD,OAAO,KAAK,CAAC,OAAO,CAAC;YACvB,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACjD,OAAO,GAAG,CAAC,MAAM,CAAC;QACpB,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC/C,OAAO,GAAG,CAAC,KAAK,CAAC;QACnB,CAAC;QAED,6CAA6C;QAC7C,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACnD,OAAO,GAAG,CAAC,OAAO,CAAC;QACrB,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,OAAO,QAAQ,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;AAC1D,CAAC"}
|
|
1
|
+
{"version":3,"file":"error-utils.js","sourceRoot":"","sources":["../../../src/clients/error-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,9 +15,8 @@
|
|
|
15
15
|
import createClient, {} from 'openapi-fetch';
|
|
16
16
|
import { createAuthMiddleware, createLoggingMiddleware, createRateLimitMiddleware } from './middleware.js';
|
|
17
17
|
import { globalMiddlewareRegistry } from './middleware-registry.js';
|
|
18
|
-
import { OAuthStrategy } from '../auth/oauth.js';
|
|
19
|
-
import { JwtOAuthStrategy } from '../auth/oauth-jwt.js';
|
|
20
18
|
import { buildTenantScope, toOrganizationId, normalizeTenantId } from './custom-apis.js';
|
|
19
|
+
import { withScopes } from './scapi-backend-utils.js';
|
|
21
20
|
export { toOrganizationId, normalizeTenantId, buildTenantScope };
|
|
22
21
|
/**
|
|
23
22
|
* Creates a Granular Replications API client for publishing individual items.
|
|
@@ -68,9 +67,7 @@ export function createGranularReplicationsClient(config, auth) {
|
|
|
68
67
|
});
|
|
69
68
|
// Build required scopes: domain scope + tenant-specific scope
|
|
70
69
|
const requiredScopes = config.scopes ?? ['sfcc.granular-replications.rw', buildTenantScope(config.tenantId)];
|
|
71
|
-
const scopedAuth = auth
|
|
72
|
-
? auth.withAdditionalScopes(requiredScopes)
|
|
73
|
-
: auth;
|
|
70
|
+
const scopedAuth = withScopes(auth, requiredScopes);
|
|
74
71
|
client.use(createAuthMiddleware(scopedAuth));
|
|
75
72
|
for (const middleware of registry.getMiddleware('granular-replications')) {
|
|
76
73
|
client.use(middleware);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"granular-replications.js","sourceRoot":"","sources":["../../../src/clients/granular-replications.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;;;;GAQG;AACH,OAAO,YAAY,EAAE,EAAa,MAAM,eAAe,CAAC;AAGxD,OAAO,EAAC,oBAAoB,EAAE,uBAAuB,EAAE,yBAAyB,EAAC,MAAM,iBAAiB,CAAC;AACzG,OAAO,EAAC,wBAAwB,EAA0B,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"granular-replications.js","sourceRoot":"","sources":["../../../src/clients/granular-replications.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;;;;GAQG;AACH,OAAO,YAAY,EAAE,EAAa,MAAM,eAAe,CAAC;AAGxD,OAAO,EAAC,oBAAoB,EAAE,uBAAuB,EAAE,yBAAyB,EAAC,MAAM,iBAAiB,CAAC;AACzG,OAAO,EAAC,wBAAwB,EAA0B,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAC,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AACvF,OAAO,EAAC,UAAU,EAAC,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAC,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAC,CAAC;AA+B/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,MAAM,UAAU,gCAAgC,CAC9C,MAAwC,EACxC,IAAkB;IAElB,MAAM,QAAQ,GAAG,MAAM,CAAC,kBAAkB,IAAI,wBAAwB,CAAC;IAEvE,MAAM,MAAM,GAAG,YAAY,CAAQ;QACjC,OAAO,EAAE,WAAW,MAAM,CAAC,SAAS,6DAA6D;KAClG,CAAC,CAAC;IAEH,8DAA8D;IAC9D,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,+BAA+B,EAAE,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7G,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAEpD,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;IAE7C,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACzE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAC,MAAM,EAAE,uBAAuB,EAAC,CAAC,CAAC,CAAC;IACzE,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAE7D,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -121,11 +121,13 @@ export type { HttpClientType, HttpMiddlewareProvider, UnifiedMiddleware } from '
|
|
|
121
121
|
export { createOcapiClient } from './ocapi.js';
|
|
122
122
|
export type { OcapiClient, OcapiClientOptions, OcapiError, OcapiResponse, paths as OcapiPaths, components as OcapiComponents, } from './ocapi.js';
|
|
123
123
|
export { createSlasClient } from './slas-admin.js';
|
|
124
|
+
export { createSlasShopperClient, type SlasShopperClient, type SlasShopperClientConfig } from './slas-shopper.js';
|
|
125
|
+
export type { paths as SlasShopperPaths, components as SlasShopperComponents } from './slas-shopper.js';
|
|
124
126
|
export type { SlasClient, SlasClientConfig, SlasError, SlasResponse, paths as SlasPaths, components as SlasComponents, } from './slas-admin.js';
|
|
125
127
|
export { createOdsClient } from './ods.js';
|
|
126
128
|
export type { OdsClient, OdsClientConfig, OdsError, OdsResponse, paths as OdsPaths, components as OdsComponents, } from './ods.js';
|
|
127
|
-
export { createMrtClient, DEFAULT_MRT_ORIGIN } from './mrt.js';
|
|
128
|
-
export type { MrtClient, MrtClientConfig, MrtError, MrtResponse, BuildPushResponse, paths as MrtPaths, components as MrtComponents, } from './mrt.js';
|
|
129
|
+
export { createMrtClient, createMrtMaintenanceMiddleware, runWithMrtReadOnlyListener, DEFAULT_MRT_ORIGIN, MRT_READ_ONLY_HEADER, isMrtReadOnlyResponse, MrtMaintenanceError, } from './mrt.js';
|
|
130
|
+
export type { MrtClient, MrtClientConfig, MrtError, MrtResponse, MrtReadOnlyListener, BuildPushResponse, paths as MrtPaths, components as MrtComponents, } from './mrt.js';
|
|
129
131
|
export { createCustomApisClient, toOrganizationId, normalizeTenantId, buildTenantScope, ORGANIZATION_ID_PREFIX, SCAPI_TENANT_SCOPE_PREFIX, CUSTOM_APIS_DEFAULT_SCOPES, } from './custom-apis.js';
|
|
130
132
|
export type { CustomApisClient, CustomApisClientConfig, CustomApisError, CustomApisResponse, paths as CustomApisPaths, components as CustomApisComponents, } from './custom-apis.js';
|
|
131
133
|
export { createScapiSchemasClient, SCAPI_SCHEMAS_DEFAULT_SCOPES } from './scapi-schemas.js';
|
|
@@ -144,6 +146,29 @@ export { createMetricsClient, METRICS_DEFAULT_SCOPES } from './metrics.js';
|
|
|
144
146
|
export type { MetricsClient, MetricsClientConfig, MetricsResponse, MetricsDataResponse, Metric, MetricDataSeries, MetricDataPoint, MetricsError, paths as MetricsPaths, components as MetricsComponents, } from './metrics.js';
|
|
145
147
|
export { createGranularReplicationsClient } from './granular-replications.js';
|
|
146
148
|
export type { GranularReplicationsClient, GranularReplicationsClientConfig, GranularReplicationsError, GranularReplicationsResponse, ProductItem, PriceTableItem, ContentAssetItemPrivate, ContentAssetItemShared, PublishProcessResponse, PublishProcessListResponse, PublishIdResponse, paths as GranularReplicationsPaths, components as GranularReplicationsComponents, } from './granular-replications.js';
|
|
147
|
-
export {
|
|
149
|
+
export { createScapiJobsClient, SCAPI_JOBS_CASCADE } from './scapi-jobs.js';
|
|
150
|
+
export type { ScapiJobsClient, ScapiJobsClientConfig, ScapiJobsError, ScapiJobsResponse, paths as ScapiJobsPaths, components as ScapiJobsComponents, } from './scapi-jobs.js';
|
|
151
|
+
export { createScapiMerchantRolesClient, SCAPI_MERCHANT_ROLES_READ_SCOPES, SCAPI_MERCHANT_ROLES_RW_SCOPES, } from './scapi-merchant-roles.js';
|
|
152
|
+
export type { ScapiMerchantRolesClient, ScapiMerchantRolesClientConfig, ScapiMerchantRolesError, ScapiMerchantRolesResponse, paths as ScapiMerchantRolesPaths, components as ScapiMerchantRolesComponents, } from './scapi-merchant-roles.js';
|
|
153
|
+
export { createScapiMerchantUsersClient, SCAPI_MERCHANT_USERS_READ_SCOPES, SCAPI_MERCHANT_USERS_RW_SCOPES, } from './scapi-merchant-users.js';
|
|
154
|
+
export type { ScapiMerchantUsersClient, ScapiMerchantUsersClientConfig, ScapiMerchantUsersError, ScapiMerchantUsersResponse, paths as ScapiMerchantUsersPaths, components as ScapiMerchantUsersComponents, } from './scapi-merchant-users.js';
|
|
155
|
+
export { createScapiScriptsClient, SCAPI_SCRIPTS_READ_SCOPES, SCAPI_SCRIPTS_RW_SCOPES } from './scapi-scripts.js';
|
|
156
|
+
export type { ScapiScriptsClient, ScapiScriptsClientConfig, ScapiScriptsError, ScapiScriptsResponse, paths as ScapiScriptsPaths, components as ScapiScriptsComponents, } from './scapi-scripts.js';
|
|
157
|
+
export { createScapiSitesClient, SCAPI_SITES_CASCADE } from './scapi-sites.js';
|
|
158
|
+
export type { ScapiSitesClient, ScapiSitesClientConfig, ScapiSitesError, Site as ScapiSite, Sites as ScapiSites, SiteSearchResult as ScapiSiteSearchResult, paths as ScapiSitesPaths, components as ScapiSitesComponents, } from './scapi-sites.js';
|
|
159
|
+
export { createScapiCatalogsClient, SCAPI_CATALOGS_CASCADE } from './scapi-catalogs.js';
|
|
160
|
+
export type { ScapiCatalogsClient, ScapiCatalogsClientConfig, Catalog as ScapiCatalog, Catalogs as ScapiCatalogs, paths as ScapiCatalogsPaths, components as ScapiCatalogsComponents, } from './scapi-catalogs.js';
|
|
161
|
+
export { createStorefrontDeploymentsClient, STOREFRONT_DEPLOYMENTS_CASCADE } from './storefront-deployments.js';
|
|
162
|
+
export type { StorefrontDeploymentsClient, StorefrontDeploymentsClientConfig, StorefrontDeploymentsError, StorefrontDeploymentsResponse, Bundle as StorefrontBundle, BundleResult as StorefrontBundleResult, BundleUploadResponse as StorefrontBundleUploadResponse, Deployment as StorefrontDeployment, DeploymentResult as StorefrontDeploymentResult, DeploymentCreateRequest as StorefrontDeploymentCreateRequest, DeploymentStatus as StorefrontDeploymentStatus, paths as StorefrontDeploymentsPaths, components as StorefrontDeploymentsComponents, } from './storefront-deployments.js';
|
|
163
|
+
export { createScapiRequestError, assertOcapiCompatibilityAllowed, assertScapiAdminAuthSupported, isFallbackTrigger, isInvalidScopeError, resolvePreferredBackend, resolveScapiOrOcapi, SAFE_SCAPI_FALLBACK_STATUSES, SCAPI_CAPABILITY_BASELINE_RELEASE, ScapiCapabilityUnsupportedError, ScapiRequestError, ScapiUserAuthUnsupportedError, scapiUnavailableMessage, scapiCapabilityUnsupportedMessage, withScopes, } from './scapi-backend-utils.js';
|
|
164
|
+
export type { ApiBackendPreference, BackendBase, ResolveBackendOptions, ResolvePreferredBackendOptions, } from './scapi-backend-utils.js';
|
|
165
|
+
export { createFallbackBackend } from './scapi-fallback-backend.js';
|
|
166
|
+
export { createDualBackend } from './dual-backend-factory.js';
|
|
167
|
+
export type { DualBackendConfig, DualBackendCtors, ScapiBackendCtorConfig } from './dual-backend-factory.js';
|
|
168
|
+
export { buildScapiClient } from './scapi-client-factory.js';
|
|
169
|
+
export type { BuildScapiClientOptions, ScapiClientConfig } from './scapi-client-factory.js';
|
|
170
|
+
export { ScopeTierManager } from './scapi-scope-tier.js';
|
|
171
|
+
export type { ScopeTier, ScopeTierManagerOptions } from './scapi-scope-tier.js';
|
|
172
|
+
export { getApiErrorMessage, isOcapiDeprecatedFault, throwOcapiError, OcapiDeprecatedError, OCAPI_DEPRECATED_MESSAGE, ocapiDeprecatedMessage, } from './error-utils.js';
|
|
148
173
|
export { createTlsDispatcher } from './tls-dispatcher.js';
|
|
149
174
|
export type { TlsOptions } from './tls-dispatcher.js';
|
|
@@ -123,8 +123,9 @@ export { setUserAgent, getUserAgent, resetUserAgent, userAgentProvider } from '.
|
|
|
123
123
|
export { MiddlewareRegistry, globalMiddlewareRegistry } from './middleware-registry.js';
|
|
124
124
|
export { createOcapiClient } from './ocapi.js';
|
|
125
125
|
export { createSlasClient } from './slas-admin.js';
|
|
126
|
+
export { createSlasShopperClient } from './slas-shopper.js';
|
|
126
127
|
export { createOdsClient } from './ods.js';
|
|
127
|
-
export { createMrtClient, DEFAULT_MRT_ORIGIN } from './mrt.js';
|
|
128
|
+
export { createMrtClient, createMrtMaintenanceMiddleware, runWithMrtReadOnlyListener, DEFAULT_MRT_ORIGIN, MRT_READ_ONLY_HEADER, isMrtReadOnlyResponse, MrtMaintenanceError, } from './mrt.js';
|
|
128
129
|
export { createCustomApisClient, toOrganizationId, normalizeTenantId, buildTenantScope, ORGANIZATION_ID_PREFIX, SCAPI_TENANT_SCOPE_PREFIX, CUSTOM_APIS_DEFAULT_SCOPES, } from './custom-apis.js';
|
|
129
130
|
export { createScapiSchemasClient, SCAPI_SCHEMAS_DEFAULT_SCOPES } from './scapi-schemas.js';
|
|
130
131
|
export { createAccountManagerClient, createAccountManagerUsersClient, getUser, listUsers, createUser, updateUser, deleteUser, purgeUser, resetUser, findUserByLogin, fetchRoleMapping, resolveToInternalRole, resolveFromInternalRole, createAccountManagerRolesClient, getRole, listRoles, createAccountManagerApiClientsClient, createAccountManagerOrgsClient, isValidRoleTenantFilter, ROLE_TENANT_FILTER_PATTERN, } from './am-api.js';
|
|
@@ -134,6 +135,27 @@ export { createCipClient, CipClient, DEFAULT_CIP_HOST, DEFAULT_CIP_STAGING_HOST
|
|
|
134
135
|
export { createPreferencesClient, PREFERENCES_READ_SCOPES, PREFERENCES_RW_SCOPES } from './preferences.js';
|
|
135
136
|
export { createMetricsClient, METRICS_DEFAULT_SCOPES } from './metrics.js';
|
|
136
137
|
export { createGranularReplicationsClient } from './granular-replications.js';
|
|
137
|
-
|
|
138
|
+
// SCAPI Jobs
|
|
139
|
+
export { createScapiJobsClient, SCAPI_JOBS_CASCADE } from './scapi-jobs.js';
|
|
140
|
+
// SCAPI Merchant Roles
|
|
141
|
+
export { createScapiMerchantRolesClient, SCAPI_MERCHANT_ROLES_READ_SCOPES, SCAPI_MERCHANT_ROLES_RW_SCOPES, } from './scapi-merchant-roles.js';
|
|
142
|
+
// SCAPI Merchant Users
|
|
143
|
+
export { createScapiMerchantUsersClient, SCAPI_MERCHANT_USERS_READ_SCOPES, SCAPI_MERCHANT_USERS_RW_SCOPES, } from './scapi-merchant-users.js';
|
|
144
|
+
// SCAPI Scripts (code versions)
|
|
145
|
+
export { createScapiScriptsClient, SCAPI_SCRIPTS_READ_SCOPES, SCAPI_SCRIPTS_RW_SCOPES } from './scapi-scripts.js';
|
|
146
|
+
// SCAPI Sites
|
|
147
|
+
export { createScapiSitesClient, SCAPI_SITES_CASCADE } from './scapi-sites.js';
|
|
148
|
+
// SCAPI Catalogs
|
|
149
|
+
export { createScapiCatalogsClient, SCAPI_CATALOGS_CASCADE } from './scapi-catalogs.js';
|
|
150
|
+
// SCAPI Storefront family (storefront/*/v1) — the modern MRT backend. One
|
|
151
|
+
// client per API; Deployments now, Environments + Storefronts to follow.
|
|
152
|
+
export { createStorefrontDeploymentsClient, STOREFRONT_DEPLOYMENTS_CASCADE } from './storefront-deployments.js';
|
|
153
|
+
// SCAPI dual-backend utilities (shared across SCAPI/OCAPI domains)
|
|
154
|
+
export { createScapiRequestError, assertOcapiCompatibilityAllowed, assertScapiAdminAuthSupported, isFallbackTrigger, isInvalidScopeError, resolvePreferredBackend, resolveScapiOrOcapi, SAFE_SCAPI_FALLBACK_STATUSES, SCAPI_CAPABILITY_BASELINE_RELEASE, ScapiCapabilityUnsupportedError, ScapiRequestError, ScapiUserAuthUnsupportedError, scapiUnavailableMessage, scapiCapabilityUnsupportedMessage, withScopes, } from './scapi-backend-utils.js';
|
|
155
|
+
export { createFallbackBackend } from './scapi-fallback-backend.js';
|
|
156
|
+
export { createDualBackend } from './dual-backend-factory.js';
|
|
157
|
+
export { buildScapiClient } from './scapi-client-factory.js';
|
|
158
|
+
export { ScopeTierManager } from './scapi-scope-tier.js';
|
|
159
|
+
export { getApiErrorMessage, isOcapiDeprecatedFault, throwOcapiError, OcapiDeprecatedError, OCAPI_DEPRECATED_MESSAGE, ocapiDeprecatedMessage, } from './error-utils.js';
|
|
138
160
|
export { createTlsDispatcher } from './tls-dispatcher.js';
|
|
139
161
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/clients/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgHG;AACH,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAGzC,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,2BAA2B,EAC3B,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAQzB,iDAAiD;AACjD,OAAO,EAAC,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAE9F,OAAO,EAAC,kBAAkB,EAAE,wBAAwB,EAAC,MAAM,0BAA0B,CAAC;AAGtF,OAAO,EAAC,iBAAiB,EAAC,MAAM,YAAY,CAAC;AAU7C,OAAO,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/clients/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,11 +15,10 @@
|
|
|
15
15
|
* @module clients/metrics
|
|
16
16
|
*/
|
|
17
17
|
import createClient, {} from 'openapi-fetch';
|
|
18
|
-
import { OAuthStrategy } from '../auth/oauth.js';
|
|
19
|
-
import { JwtOAuthStrategy } from '../auth/oauth-jwt.js';
|
|
20
18
|
import { createAuthMiddleware, createLoggingMiddleware } from './middleware.js';
|
|
21
19
|
import { globalMiddlewareRegistry } from './middleware-registry.js';
|
|
22
20
|
import { buildTenantScope } from './custom-apis.js';
|
|
21
|
+
import { withScopes } from './scapi-backend-utils.js';
|
|
23
22
|
/** Default OAuth scope required for the Metrics API (read-only). */
|
|
24
23
|
export const METRICS_DEFAULT_SCOPES = ['sfcc.metrics'];
|
|
25
24
|
/**
|
|
@@ -49,9 +48,7 @@ export function createMetricsClient(config, auth) {
|
|
|
49
48
|
// Build required scopes: domain scope + tenant-specific scope
|
|
50
49
|
const requiredScopes = config.scopes ?? [...METRICS_DEFAULT_SCOPES, buildTenantScope(config.tenantId)];
|
|
51
50
|
// If auth supports scopes, add required scopes; otherwise use as-is
|
|
52
|
-
const scopedAuth = auth
|
|
53
|
-
? auth.withAdditionalScopes(requiredScopes)
|
|
54
|
-
: auth;
|
|
51
|
+
const scopedAuth = withScopes(auth, requiredScopes);
|
|
55
52
|
// Core middleware: auth first
|
|
56
53
|
client.use(createAuthMiddleware(scopedAuth));
|
|
57
54
|
// Plugin middleware from registry
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/clients/metrics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;;;;;;GAUG;AACH,OAAO,YAAY,EAAE,EAAa,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/clients/metrics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;;;;;;GAUG;AACH,OAAO,YAAY,EAAE,EAAa,MAAM,eAAe,CAAC;AAGxD,OAAO,EAAC,oBAAoB,EAAE,uBAAuB,EAAC,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAC,wBAAwB,EAA0B,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAC,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,0BAA0B,CAAC;AAiEpD,oEAAoE;AACpE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,cAAc,CAAC,CAAC;AAiCvD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAA2B,EAAE,IAAkB;IACjF,MAAM,QAAQ,GAAG,MAAM,CAAC,kBAAkB,IAAI,wBAAwB,CAAC;IAEvE,MAAM,MAAM,GAAG,YAAY,CAAQ;QACjC,OAAO,EAAE,WAAW,MAAM,CAAC,SAAS,4DAA4D;KACjG,CAAC,CAAC;IAEH,8DAA8D;IAC9D,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,sBAAsB,EAAE,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEvG,oEAAoE;IACpE,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAEpD,8BAA8B;IAC9B,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;IAE7C,kCAAkC;IAClC,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3D,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IAED,yEAAyE;IACzE,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC;IAE/C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -38,7 +38,7 @@ import type { Middleware } from 'openapi-fetch';
|
|
|
38
38
|
/**
|
|
39
39
|
* Types of HTTP clients that can receive middleware.
|
|
40
40
|
*/
|
|
41
|
-
export type HttpClientType = 'cip' | 'ocapi' | 'slas' | 'ods' | 'mrt' | 'mrt-b2c' | 'custom-apis' | 'scapi-schemas' | 'metrics' | 'cdn-zones' | 'granular-replications' | 'preferences' | 'webdav' | 'am-users-api' | 'am-roles-api' | 'am-apiclients-api' | 'am-orgs-api';
|
|
41
|
+
export type HttpClientType = 'cip' | 'ocapi' | 'slas' | 'ods' | 'mrt' | 'mrt-b2c' | 'custom-apis' | 'scapi-schemas' | 'metrics' | 'cdn-zones' | 'granular-replications' | 'preferences' | 'webdav' | 'am-users-api' | 'am-roles-api' | 'am-apiclients-api' | 'am-orgs-api' | 'scapi-jobs' | 'scapi-scripts' | 'scapi-merchant-users' | 'scapi-merchant-roles' | 'scapi-sites' | 'scapi-catalogs' | 'scapi' | 'storefront-deployments';
|
|
42
42
|
/**
|
|
43
43
|
* Middleware interface compatible with openapi-fetch.
|
|
44
44
|
*
|
|
@@ -142,7 +142,9 @@ export declare class MiddlewareRegistry {
|
|
|
142
142
|
* @param clientType - The type of client requesting middleware
|
|
143
143
|
* @returns Array of middleware in registration order
|
|
144
144
|
*/
|
|
145
|
-
getMiddleware(clientType: HttpClientType
|
|
145
|
+
getMiddleware(clientType: HttpClientType, options?: {
|
|
146
|
+
exclude?: string[];
|
|
147
|
+
}): UnifiedMiddleware[];
|
|
146
148
|
/**
|
|
147
149
|
* Clears all registered providers.
|
|
148
150
|
*
|
|
@@ -46,9 +46,11 @@ export class MiddlewareRegistry {
|
|
|
46
46
|
* @param clientType - The type of client requesting middleware
|
|
47
47
|
* @returns Array of middleware in registration order
|
|
48
48
|
*/
|
|
49
|
-
getMiddleware(clientType) {
|
|
49
|
+
getMiddleware(clientType, options = {}) {
|
|
50
50
|
const middleware = [];
|
|
51
51
|
for (const provider of this.providers) {
|
|
52
|
+
if (options.exclude?.includes(provider.name))
|
|
53
|
+
continue;
|
|
52
54
|
const m = provider.getMiddleware(clientType);
|
|
53
55
|
if (m) {
|
|
54
56
|
middleware.push(m);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware-registry.js","sourceRoot":"","sources":["../../../src/clients/middleware-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"middleware-registry.js","sourceRoot":"","sources":["../../../src/clients/middleware-registry.ts"],"names":[],"mappings":"AA4IA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,kBAAkB;IACrB,SAAS,GAA6B,EAAE,CAAC;IAEjD;;;;;;OAMG;IACH,QAAQ,CAAC,QAAgC;QACvC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,IAAY;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC/D,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,UAA0B,EAAE,UAAgC,EAAE;QAC1E,MAAM,UAAU,GAAwB,EAAE,CAAC;QAE3C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,SAAS;YACvD,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,CAAC,EAAE,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,kBAAkB,EAAE,CAAC"}
|
|
@@ -30,6 +30,43 @@ export interface ExtraParamsConfig {
|
|
|
30
30
|
* @returns Middleware that adds auth headers to requests and retries on 401
|
|
31
31
|
*/
|
|
32
32
|
export declare function createAuthMiddleware(auth: AuthStrategy): Middleware;
|
|
33
|
+
/**
|
|
34
|
+
* Scope cascade for a SCAPI domain. The auth middleware picks `read` or
|
|
35
|
+
* `write` based on the per-operation `scopeMode` hint and walks the chosen
|
|
36
|
+
* cascade through the auth strategy until one candidate survives at AM.
|
|
37
|
+
*
|
|
38
|
+
* Each candidate is an array of scopes; the auth strategy adds any base
|
|
39
|
+
* scopes (e.g. tenant scope) automatically.
|
|
40
|
+
*/
|
|
41
|
+
export interface ScopeCascade {
|
|
42
|
+
/** Scope candidates to try for read operations, in order of preference. */
|
|
43
|
+
read: string[][];
|
|
44
|
+
/** Scope candidates to try for write operations, in order of preference. */
|
|
45
|
+
write: string[][];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Internal request header read by {@link createScapiAuthMiddleware} to choose
|
|
49
|
+
* a cascade tier. Operations attach `'read'` or `'write'`; the header is
|
|
50
|
+
* stripped before the request leaves the middleware.
|
|
51
|
+
*/
|
|
52
|
+
export declare const SCOPE_MODE_HEADER = "x-b2c-scope-mode";
|
|
53
|
+
/**
|
|
54
|
+
* Auth middleware for SCAPI clients with a configured {@link ScopeCascade}.
|
|
55
|
+
*
|
|
56
|
+
* Reads the {@link SCOPE_MODE_HEADER} from the request, picks the matching
|
|
57
|
+
* cascade, and asks the auth strategy to resolve it (cache-first, then AM
|
|
58
|
+
* with `invalid_scope` fallback). Strips the header before the request is
|
|
59
|
+
* sent.
|
|
60
|
+
*
|
|
61
|
+
* Falls back to `getAuthorizationHeader()` when:
|
|
62
|
+
* - the strategy doesn't implement `getAccessTokenForCascade` (e.g.
|
|
63
|
+
* stateful sessions, basic auth), or
|
|
64
|
+
* - the request didn't supply a `scopeMode` header.
|
|
65
|
+
*
|
|
66
|
+
* 401 retry behavior matches {@link createAuthMiddleware}: on a 401 after a
|
|
67
|
+
* prior success, invalidate the token and retry once.
|
|
68
|
+
*/
|
|
69
|
+
export declare function createScapiAuthMiddleware(auth: AuthStrategy, cascade: ScopeCascade): Middleware;
|
|
33
70
|
/**
|
|
34
71
|
* Configuration for rate limiting middleware.
|
|
35
72
|
*/
|
|
@@ -90,6 +127,8 @@ export interface LoggingMiddlewareConfig {
|
|
|
90
127
|
* @example ['data', 'password', 'secret']
|
|
91
128
|
*/
|
|
92
129
|
maskBodyKeys?: string[];
|
|
130
|
+
/** Log headers and bodies at trace level. Disable for authentication endpoints. Defaults to true. */
|
|
131
|
+
logDetails?: boolean;
|
|
93
132
|
}
|
|
94
133
|
/**
|
|
95
134
|
* Creates logging middleware for openapi-fetch clients.
|
|
@@ -14,6 +14,10 @@ function headersToObject(headers) {
|
|
|
14
14
|
const retriedRequests = new WeakSet();
|
|
15
15
|
// Store cloned request bodies for potential retry (body can only be read once)
|
|
16
16
|
const requestBodies = new WeakMap();
|
|
17
|
+
// Remembers the SCAPI scope mode ('read' or 'write') a request was authorized
|
|
18
|
+
// with, so the 401 retry path can re-authorize at the same tier instead of
|
|
19
|
+
// hard-coding write.
|
|
20
|
+
const requestScopeModes = new WeakMap();
|
|
17
21
|
/**
|
|
18
22
|
* Creates authentication middleware for openapi-fetch.
|
|
19
23
|
*
|
|
@@ -89,6 +93,91 @@ export function createAuthMiddleware(auth) {
|
|
|
89
93
|
},
|
|
90
94
|
};
|
|
91
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Internal request header read by {@link createScapiAuthMiddleware} to choose
|
|
98
|
+
* a cascade tier. Operations attach `'read'` or `'write'`; the header is
|
|
99
|
+
* stripped before the request leaves the middleware.
|
|
100
|
+
*/
|
|
101
|
+
export const SCOPE_MODE_HEADER = 'x-b2c-scope-mode';
|
|
102
|
+
/**
|
|
103
|
+
* Auth middleware for SCAPI clients with a configured {@link ScopeCascade}.
|
|
104
|
+
*
|
|
105
|
+
* Reads the {@link SCOPE_MODE_HEADER} from the request, picks the matching
|
|
106
|
+
* cascade, and asks the auth strategy to resolve it (cache-first, then AM
|
|
107
|
+
* with `invalid_scope` fallback). Strips the header before the request is
|
|
108
|
+
* sent.
|
|
109
|
+
*
|
|
110
|
+
* Falls back to `getAuthorizationHeader()` when:
|
|
111
|
+
* - the strategy doesn't implement `getAccessTokenForCascade` (e.g.
|
|
112
|
+
* stateful sessions, basic auth), or
|
|
113
|
+
* - the request didn't supply a `scopeMode` header.
|
|
114
|
+
*
|
|
115
|
+
* 401 retry behavior matches {@link createAuthMiddleware}: on a 401 after a
|
|
116
|
+
* prior success, invalidate the token and retry once.
|
|
117
|
+
*/
|
|
118
|
+
export function createScapiAuthMiddleware(auth, cascade) {
|
|
119
|
+
const logger = getLogger();
|
|
120
|
+
let hasHadSuccess = false;
|
|
121
|
+
async function authorize(request) {
|
|
122
|
+
const mode = request.headers.get(SCOPE_MODE_HEADER);
|
|
123
|
+
request.headers.delete(SCOPE_MODE_HEADER);
|
|
124
|
+
if (mode && auth.getAccessTokenForCascade) {
|
|
125
|
+
requestScopeModes.set(request, mode);
|
|
126
|
+
const candidates = cascade[mode];
|
|
127
|
+
const token = await auth.getAccessTokenForCascade(candidates);
|
|
128
|
+
request.headers.set('Authorization', `Bearer ${token}`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (auth.getAuthorizationHeader) {
|
|
132
|
+
request.headers.set('Authorization', await auth.getAuthorizationHeader());
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
async onRequest({ request }) {
|
|
137
|
+
await authorize(request);
|
|
138
|
+
// Clone body for potential 401 retry (body is single-use).
|
|
139
|
+
if (request.body && auth.invalidateToken) {
|
|
140
|
+
const cloned = request.clone();
|
|
141
|
+
const bodyBuffer = await cloned.arrayBuffer();
|
|
142
|
+
requestBodies.set(request, bodyBuffer);
|
|
143
|
+
}
|
|
144
|
+
return request;
|
|
145
|
+
},
|
|
146
|
+
async onResponse({ request, response }) {
|
|
147
|
+
if (response.status !== 401) {
|
|
148
|
+
hasHadSuccess = true;
|
|
149
|
+
}
|
|
150
|
+
if (response.status === 401 && hasHadSuccess && !retriedRequests.has(request) && auth.invalidateToken) {
|
|
151
|
+
logger.debug('[ScapiAuthMiddleware] Received 401, invalidating token and retrying');
|
|
152
|
+
retriedRequests.add(request);
|
|
153
|
+
auth.invalidateToken();
|
|
154
|
+
const newHeaders = new Headers(request.headers);
|
|
155
|
+
// The original scope-mode header was stripped on the way in. Re-run
|
|
156
|
+
// the cascade at the same tier the original request used so a
|
|
157
|
+
// read-only request doesn't get retried as a write (which would fail
|
|
158
|
+
// for clients that only have the read scope).
|
|
159
|
+
const retryRequest = new Request(request.url, {
|
|
160
|
+
method: request.method,
|
|
161
|
+
headers: newHeaders,
|
|
162
|
+
body: requestBodies.get(request) ?? undefined,
|
|
163
|
+
...(requestBodies.get(request) ? { duplex: 'half' } : {}),
|
|
164
|
+
});
|
|
165
|
+
if (auth.getAccessTokenForCascade) {
|
|
166
|
+
const originalMode = requestScopeModes.get(request) ?? 'write';
|
|
167
|
+
const token = await auth.getAccessTokenForCascade(cascade[originalMode]);
|
|
168
|
+
retryRequest.headers.set('Authorization', `Bearer ${token}`);
|
|
169
|
+
}
|
|
170
|
+
else if (auth.getAuthorizationHeader) {
|
|
171
|
+
retryRequest.headers.set('Authorization', await auth.getAuthorizationHeader());
|
|
172
|
+
}
|
|
173
|
+
const retryResponse = await fetch(retryRequest);
|
|
174
|
+
logger.debug({ status: retryResponse.status }, `[ScapiAuthMiddleware] Retry response: ${retryResponse.status}`);
|
|
175
|
+
return retryResponse;
|
|
176
|
+
}
|
|
177
|
+
return response;
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
92
181
|
const DEFAULT_RATE_LIMIT_MAX_RETRIES = 3;
|
|
93
182
|
const DEFAULT_RATE_LIMIT_BASE_DELAY_MS = 1000;
|
|
94
183
|
const DEFAULT_RATE_LIMIT_MAX_DELAY_MS = 30000;
|
|
@@ -286,7 +375,7 @@ function maskBody(body, keysToMask) {
|
|
|
286
375
|
*/
|
|
287
376
|
export function createLoggingMiddleware(config) {
|
|
288
377
|
// Support both string (prefix) and config object for backwards compatibility
|
|
289
|
-
const { prefix, maskBodyKeys } = typeof config === 'string' ? { prefix: config, maskBodyKeys: undefined } : (config ?? {});
|
|
378
|
+
const { prefix, maskBodyKeys, logDetails = true, } = typeof config === 'string' ? { prefix: config, maskBodyKeys: undefined } : (config ?? {});
|
|
290
379
|
const reqTag = prefix ? `[${prefix} REQ]` : '';
|
|
291
380
|
const respTag = prefix ? `[${prefix} RESP]` : '';
|
|
292
381
|
return {
|
|
@@ -294,22 +383,34 @@ export function createLoggingMiddleware(config) {
|
|
|
294
383
|
const logger = getLogger();
|
|
295
384
|
const url = request.url;
|
|
296
385
|
logger.debug({ method: request.method, url }, `${reqTag} ${request.method} ${url}`);
|
|
297
|
-
|
|
386
|
+
request._startTime = Date.now();
|
|
387
|
+
if (!logDetails)
|
|
388
|
+
return request;
|
|
389
|
+
// Read body from the request (already serialized by openapi-fetch).
|
|
390
|
+
// Skip binary/multipart payloads: reading them would buffer the entire
|
|
391
|
+
// (potentially large) body into memory on every request, and the raw
|
|
392
|
+
// bytes should never be logged. maskBodyKeys only covers JSON keys, so a
|
|
393
|
+
// multipart bundle upload would otherwise leak its archive at trace level.
|
|
298
394
|
let body;
|
|
299
395
|
if (request.body) {
|
|
300
|
-
const
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
body = JSON.parse(text);
|
|
396
|
+
const contentType = request.headers.get('content-type') ?? '';
|
|
397
|
+
if (contentType.startsWith('multipart/') || contentType.startsWith('application/octet-stream')) {
|
|
398
|
+
body = `[${contentType} body omitted]`;
|
|
304
399
|
}
|
|
305
|
-
|
|
306
|
-
|
|
400
|
+
else {
|
|
401
|
+
const clonedRequest = request.clone();
|
|
402
|
+
const text = await clonedRequest.text();
|
|
403
|
+
try {
|
|
404
|
+
body = JSON.parse(text);
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
body = text;
|
|
408
|
+
}
|
|
307
409
|
}
|
|
308
410
|
}
|
|
309
411
|
// Mask sensitive/large body keys before logging
|
|
310
412
|
const maskedBody = maskBody(body, maskBodyKeys);
|
|
311
413
|
logger.trace({ method: request.method, url, headers: headersToObject(request.headers), body: maskedBody }, `${reqTag} ${request.method} ${url} body`);
|
|
312
|
-
request._startTime = Date.now();
|
|
313
414
|
return request;
|
|
314
415
|
},
|
|
315
416
|
async onResponse({ request, response }) {
|
|
@@ -317,7 +418,17 @@ export function createLoggingMiddleware(config) {
|
|
|
317
418
|
const startTime = request._startTime ?? Date.now();
|
|
318
419
|
const duration = Date.now() - startTime;
|
|
319
420
|
const url = request.url;
|
|
320
|
-
logger.debug({
|
|
421
|
+
logger.debug({
|
|
422
|
+
method: request.method,
|
|
423
|
+
url,
|
|
424
|
+
status: response.status,
|
|
425
|
+
duration,
|
|
426
|
+
...(response.headers.has('sfdc_correlation_id')
|
|
427
|
+
? { correlationId: response.headers.get('sfdc_correlation_id') }
|
|
428
|
+
: {}),
|
|
429
|
+
}, `${respTag} ${request.method} ${url} ${response.status} ${duration}ms`);
|
|
430
|
+
if (!logDetails)
|
|
431
|
+
return response;
|
|
321
432
|
const clonedResponse = response.clone();
|
|
322
433
|
let responseBody;
|
|
323
434
|
// Read as text first, then try to parse as JSON.
|
|
@@ -413,11 +524,7 @@ export function createExtraParamsMiddleware(config) {
|
|
|
413
524
|
newHeaders.set(key, value);
|
|
414
525
|
}
|
|
415
526
|
logger.trace({ extraHeaders: config.headers }, '[ExtraParams] Adding extra headers to request');
|
|
416
|
-
modifiedRequest = new Request(modifiedRequest
|
|
417
|
-
method: modifiedRequest.method,
|
|
418
|
-
headers: newHeaders,
|
|
419
|
-
...(canHaveBody && modifiedRequest.body ? { body: modifiedRequest.body, duplex: 'half' } : {}),
|
|
420
|
-
});
|
|
527
|
+
modifiedRequest = new Request(modifiedRequest, { headers: newHeaders });
|
|
421
528
|
}
|
|
422
529
|
// Add extra query parameters
|
|
423
530
|
if (config.query && Object.keys(config.query).length > 0) {
|
|
@@ -428,11 +535,8 @@ export function createExtraParamsMiddleware(config) {
|
|
|
428
535
|
}
|
|
429
536
|
}
|
|
430
537
|
logger.trace({ extraQuery: config.query, originalUrl: modifiedRequest.url, newUrl: url.toString() }, '[ExtraParams] Adding extra query params to URL');
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
headers: modifiedRequest.headers,
|
|
434
|
-
...(canHaveBody && modifiedRequest.body ? { body: modifiedRequest.body, duplex: 'half' } : {}),
|
|
435
|
-
});
|
|
538
|
+
// Preserve redirect mode and other fetch options when replacing the URL.
|
|
539
|
+
modifiedRequest = new Request(url, modifiedRequest);
|
|
436
540
|
}
|
|
437
541
|
// Merge extra body fields for JSON requests
|
|
438
542
|
if (config.body && Object.keys(config.body).length > 0) {
|
|
@@ -444,9 +548,7 @@ export function createExtraParamsMiddleware(config) {
|
|
|
444
548
|
const parsedBody = JSON.parse(originalBody);
|
|
445
549
|
const mergedBody = { ...parsedBody, ...config.body };
|
|
446
550
|
logger.trace({ originalBody: parsedBody, extraBody: config.body, mergedBody }, '[ExtraParams] Merging extra body fields into request');
|
|
447
|
-
modifiedRequest = new Request(modifiedRequest
|
|
448
|
-
method: modifiedRequest.method,
|
|
449
|
-
headers: modifiedRequest.headers,
|
|
551
|
+
modifiedRequest = new Request(modifiedRequest, {
|
|
450
552
|
body: JSON.stringify(mergedBody),
|
|
451
553
|
});
|
|
452
554
|
}
|
|
@@ -459,8 +561,7 @@ export function createExtraParamsMiddleware(config) {
|
|
|
459
561
|
logger.trace({ body: config.body }, '[ExtraParams] Creating new body with extra fields');
|
|
460
562
|
const headers = new Headers(modifiedRequest.headers);
|
|
461
563
|
headers.set('content-type', 'application/json');
|
|
462
|
-
modifiedRequest = new Request(modifiedRequest
|
|
463
|
-
method: modifiedRequest.method,
|
|
564
|
+
modifiedRequest = new Request(modifiedRequest, {
|
|
464
565
|
headers,
|
|
465
566
|
body: JSON.stringify(config.body),
|
|
466
567
|
});
|