@salesforce/b2c-tooling-sdk 2.1.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/data/content-schemas/databindingcontext.json +1 -1
  2. package/data/guides/enrichment.json +2887 -1480
  3. package/data/guides/index.json +3846 -1870
  4. package/data/help/index.json +1537 -1457
  5. package/data/help-kb/enrichment.json +6122 -0
  6. package/data/help-kb/index.json +8496 -0
  7. package/data/job-steps/index.json +1 -1
  8. package/data/job-steps/job-steps.json +1 -1
  9. package/data/script-api/index.json +137 -22
  10. package/data/tooling/index.json +22 -4
  11. package/data/xsd/channels.xsd +47 -0
  12. package/data/xsd/index.json +6 -2
  13. package/data/xsd/library.xsd +31 -0
  14. package/data/xsd/order.xsd +317 -0
  15. package/data/xsd/search2.xsd +1 -1
  16. package/data/xsd/sort.xsd +17 -0
  17. package/data/xsd/storefronts.xsd +34 -48
  18. package/dist/esm/auth/client-credentials.d.ts +43 -0
  19. package/dist/esm/auth/client-credentials.js +55 -0
  20. package/dist/esm/auth/client-credentials.js.map +1 -1
  21. package/dist/esm/auth/index.d.ts +2 -1
  22. package/dist/esm/auth/index.js +1 -1
  23. package/dist/esm/auth/index.js.map +1 -1
  24. package/dist/esm/auth/oauth.d.ts +3 -0
  25. package/dist/esm/auth/oauth.js +3 -3
  26. package/dist/esm/auth/oauth.js.map +1 -1
  27. package/dist/esm/auth/resolve.d.ts +2 -0
  28. package/dist/esm/auth/resolve.js +3 -2
  29. package/dist/esm/auth/resolve.js.map +1 -1
  30. package/dist/esm/auth/types.d.ts +5 -0
  31. package/dist/esm/auth/types.js +0 -5
  32. package/dist/esm/auth/types.js.map +1 -1
  33. package/dist/esm/cli/config.js +1 -0
  34. package/dist/esm/cli/config.js.map +1 -1
  35. package/dist/esm/cli/instance-command.d.ts +1 -0
  36. package/dist/esm/cli/mrt-command.d.ts +1 -0
  37. package/dist/esm/cli/oauth-command.d.ts +1 -0
  38. package/dist/esm/cli/oauth-command.js +8 -0
  39. package/dist/esm/cli/oauth-command.js.map +1 -1
  40. package/dist/esm/cli/ods-command.d.ts +1 -0
  41. package/dist/esm/cli/webdav-command.d.ts +1 -0
  42. package/dist/esm/clients/middleware-registry.d.ts +8 -36
  43. package/dist/esm/clients/middleware-registry.js +62 -1
  44. package/dist/esm/clients/middleware-registry.js.map +1 -1
  45. package/dist/esm/clients/slas-shopper.generated.d.ts +2 -1
  46. package/dist/esm/config/dw-json.d.ts +31 -0
  47. package/dist/esm/config/dw-json.js +47 -1
  48. package/dist/esm/config/dw-json.js.map +1 -1
  49. package/dist/esm/config/index.d.ts +2 -2
  50. package/dist/esm/config/index.js +1 -1
  51. package/dist/esm/config/index.js.map +1 -1
  52. package/dist/esm/config/mapping.js +7 -0
  53. package/dist/esm/config/mapping.js.map +1 -1
  54. package/dist/esm/config/resolved-config.js +1 -0
  55. package/dist/esm/config/resolved-config.js.map +1 -1
  56. package/dist/esm/config/sources/env-source.js +3 -0
  57. package/dist/esm/config/sources/env-source.js.map +1 -1
  58. package/dist/esm/config/types.d.ts +3 -0
  59. package/dist/esm/docs/search.js +4 -1
  60. package/dist/esm/docs/search.js.map +1 -1
  61. package/dist/esm/docs/types.d.ts +6 -1
  62. package/dist/esm/docs/types.js +1 -0
  63. package/dist/esm/docs/types.js.map +1 -1
  64. package/dist/esm/instance/index.js +1 -0
  65. package/dist/esm/instance/index.js.map +1 -1
  66. package/dist/esm/openshell/apply.d.ts +90 -0
  67. package/dist/esm/openshell/apply.js +225 -0
  68. package/dist/esm/openshell/apply.js.map +1 -0
  69. package/dist/esm/openshell/index.d.ts +30 -0
  70. package/dist/esm/openshell/index.js +34 -0
  71. package/dist/esm/openshell/index.js.map +1 -0
  72. package/dist/esm/openshell/setup.d.ts +94 -0
  73. package/dist/esm/openshell/setup.js +307 -0
  74. package/dist/esm/openshell/setup.js.map +1 -0
  75. package/dist/esm/operations/mtls/index.d.ts +135 -0
  76. package/dist/esm/operations/mtls/index.js +270 -0
  77. package/dist/esm/operations/mtls/index.js.map +1 -0
  78. package/dist/esm/scapi/auth-primitives.js +1 -0
  79. package/dist/esm/scapi/auth-primitives.js.map +1 -1
  80. package/dist/esm/scapi/authentication.d.ts +19 -0
  81. package/dist/esm/scapi/authentication.js +65 -6
  82. package/dist/esm/scapi/authentication.js.map +1 -1
  83. package/dist/esm/scapi/catalog.d.ts +2 -0
  84. package/dist/esm/scapi/catalog.js.map +1 -1
  85. package/dist/esm/scapi/index.d.ts +7 -3
  86. package/dist/esm/scapi/index.js +4 -2
  87. package/dist/esm/scapi/index.js.map +1 -1
  88. package/dist/esm/scapi/live.d.ts +52 -0
  89. package/dist/esm/scapi/live.js +142 -0
  90. package/dist/esm/scapi/live.js.map +1 -0
  91. package/dist/esm/scapi/request.d.ts +6 -0
  92. package/dist/esm/scapi/request.js +83 -61
  93. package/dist/esm/scapi/request.js.map +1 -1
  94. package/dist/esm/scapi/shopper.d.ts +31 -0
  95. package/dist/esm/scapi/shopper.js +79 -0
  96. package/dist/esm/scapi/shopper.js.map +1 -0
  97. package/dist/esm/scapi/worker-source.js +1 -1
  98. package/dist/esm/slas/index.d.ts +1 -1
  99. package/dist/esm/slas/index.js +1 -1
  100. package/dist/esm/slas/index.js.map +1 -1
  101. package/dist/esm/slas/token.d.ts +10 -0
  102. package/dist/esm/slas/token.js +27 -0
  103. package/dist/esm/slas/token.js.map +1 -1
  104. package/package.json +11 -1
  105. package/specs/slas-shopper-v1.yaml +2 -1
@@ -0,0 +1,307 @@
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
+ * Builds the OpenShell provider profiles, providers, network policy, and
8
+ * sandbox environment for running the B2C tooling inside an OpenShell sandbox.
9
+ *
10
+ * @module openshell/setup
11
+ */
12
+ import yaml from 'js-yaml';
13
+ import { Minimatch } from 'minimatch';
14
+ import { DEFAULT_ACCOUNT_MANAGER_HOST, DEFAULT_ODS_HOST } from '../defaults.js';
15
+ import { DEFAULT_CIP_HOST, DEFAULT_CIP_STAGING_HOST } from '../clients/cip.js';
16
+ import { DEFAULT_MRT_ORIGIN } from '../clients/mrt.js';
17
+ import { getLogsWebSocketUrl } from '../operations/mrt/tail-logs.js';
18
+ /** All supported sandbox access levels. */
19
+ export const OPENSHELL_ACCESS_LEVELS = [
20
+ 'NONE',
21
+ 'NO_DELETE',
22
+ 'NO_UPDATE',
23
+ 'READ_ONLY',
24
+ ];
25
+ /** Path of the forwarded Safety Mode configuration inside the sandbox. */
26
+ export const OPENSHELL_SAFETY_CONFIG_PATH = '/sandbox/.b2c/safety.json';
27
+ const TOKEN_PATH = '/dwsso/oauth2/access_token';
28
+ const AM_API_PATH = '/dw/rest/**';
29
+ const MRT_LOG_TOKEN_PATH = '/api/projects/*/target/*/jwt/';
30
+ /** Documentation hosts read by `b2c docs read` and the MCP `docs_read` tool. */
31
+ const DOCS_HOSTS = ['developer.salesforce.com', 'salesforcecommercecloud.github.io'];
32
+ const WEBDAV_PATH = '/on/demandware.servlet/webdav/**';
33
+ const NODE_BINARY = '/usr/local/bin/node';
34
+ const READ_METHODS = ['GET', 'HEAD', 'OPTIONS'];
35
+ const WRITE_METHODS = ['POST', 'PUT', 'PATCH'];
36
+ const WEBDAV_READ_METHODS = ['PROPFIND'];
37
+ const WEBDAV_WRITE_METHODS = ['MKCOL', 'MOVE', 'COPY'];
38
+ const ALL_METHODS = [...READ_METHODS, ...WRITE_METHODS, 'DELETE', ...WEBDAV_READ_METHODS, ...WEBDAV_WRITE_METHODS];
39
+ /**
40
+ * Profiles declare no endpoints: each provider is bound to hosts in the
41
+ * sandbox policy instead. OpenShell releases every credential of a provider to
42
+ * every host it is bound to, so each secret gets its own profile and provider.
43
+ */
44
+ const PROFILES = {
45
+ clientSecret: {
46
+ id: 'b2c-client-secret',
47
+ displayName: 'B2C Commerce API client secret',
48
+ description: 'Account Manager API client secret for client credentials authentication',
49
+ credential: 'client_secret',
50
+ envVar: 'SFCC_CLIENT_SECRET',
51
+ },
52
+ password: {
53
+ id: 'b2c-webdav-access-key',
54
+ displayName: 'B2C Commerce WebDAV access key',
55
+ description: 'Business Manager user access key for WebDAV',
56
+ credential: 'access_key',
57
+ envVar: 'SFCC_PASSWORD',
58
+ authStyle: 'basic',
59
+ },
60
+ mrtApiKey: {
61
+ id: 'b2c-mrt-api-key',
62
+ displayName: 'Managed Runtime API key',
63
+ description: 'Managed Runtime API key',
64
+ credential: 'api_key',
65
+ envVar: 'MRT_API_KEY',
66
+ authStyle: 'bearer',
67
+ },
68
+ };
69
+ function renderProfile(def) {
70
+ return yaml.dump({
71
+ id: def.id,
72
+ display_name: def.displayName,
73
+ description: def.description,
74
+ category: 'other',
75
+ credentials: [
76
+ {
77
+ name: def.credential,
78
+ description: def.description,
79
+ env_vars: [def.envVar],
80
+ required: true,
81
+ ...(def.authStyle ? { auth_style: def.authStyle } : {}),
82
+ ...(def.authStyle === 'bearer' ? { header_name: 'Authorization' } : {}),
83
+ },
84
+ ],
85
+ discovery: { credentials: [def.credential] },
86
+ }, { lineWidth: -1 });
87
+ }
88
+ /**
89
+ * Returns true when a secret sent in an unencoded Basic header would reach
90
+ * Account Manager altered (it form-decodes `+` and `%xx`).
91
+ */
92
+ export function secretNeedsBodyAuth(secret) {
93
+ return /[+%]/.test(secret);
94
+ }
95
+ function toSandboxName(value) {
96
+ const slug = value
97
+ .toLowerCase()
98
+ .replaceAll(/[^a-z0-9-]+/g, '-')
99
+ .replaceAll(/^-+|-+$/g, '');
100
+ return slug.startsWith('b2c') ? slug : `b2c-${slug}`;
101
+ }
102
+ function hostOf(value) {
103
+ return value.includes('://') ? new URL(value).hostname : value;
104
+ }
105
+ // NO_UPDATE is enforced like NO_DELETE on the network. Safety Mode in the
106
+ // sandbox blocks its reset, stop, and restart operations.
107
+ function methodRules(level, webdav, path = '/**') {
108
+ const methods = [...READ_METHODS];
109
+ if (level !== 'READ_ONLY')
110
+ methods.push(...WRITE_METHODS);
111
+ if (level === 'NONE')
112
+ methods.push('DELETE');
113
+ const rules = methods.map((method) => ({ allow: { method, path } }));
114
+ if (webdav) {
115
+ const webdavMethods = [...WEBDAV_READ_METHODS];
116
+ if (level !== 'READ_ONLY')
117
+ webdavMethods.push(...WEBDAV_WRITE_METHODS);
118
+ rules.push(...webdavMethods.map((method) => ({ allow: { method, path: WEBDAV_PATH } })));
119
+ }
120
+ return rules;
121
+ }
122
+ /**
123
+ * Converts Safety Mode rules that permit HTTP requests or jobs into network
124
+ * rules, so exceptions to the level also work in the sandbox. Command rules
125
+ * can't be expressed as network rules.
126
+ */
127
+ function safetyNetworkRules(rules) {
128
+ const result = [];
129
+ for (const rule of rules) {
130
+ if (rule.action === 'block' || rule.command !== undefined)
131
+ continue;
132
+ if (rule.job !== undefined) {
133
+ result.push({ allow: { method: 'POST', path: `/**/jobs/${rule.job}/executions` } });
134
+ }
135
+ else if (rule.path !== undefined || rule.method !== undefined) {
136
+ const matcher = rule.method ? new Minimatch(rule.method, { nocase: true }) : undefined;
137
+ for (const method of ALL_METHODS.filter((m) => !matcher || matcher.match(m))) {
138
+ result.push({ allow: { method, path: rule.path ?? '/**' } });
139
+ }
140
+ }
141
+ }
142
+ return result;
143
+ }
144
+ function endpoint(host, rules, extra = {}) {
145
+ return { host, port: 443, protocol: 'rest', enforcement: 'enforce', ...extra, rules };
146
+ }
147
+ /**
148
+ * Builds the OpenShell setup for a resolved B2C configuration.
149
+ *
150
+ * Only secrets present in the configuration get a provider. The API client
151
+ * secret is released only to the Account Manager token endpoint, the WebDAV
152
+ * access key only to the instance host, and the MRT API key only to the MRT
153
+ * host. B2C hosts are limited to the HTTP methods of the access level.
154
+ *
155
+ * @param config - The resolved configuration (secrets are read but never included in the result)
156
+ * @param options - Sandbox name, access level, and extra hosts
157
+ */
158
+ export function buildOpenShellSetup(config, options = {}) {
159
+ const accessLevel = options.accessLevel ?? 'NONE';
160
+ const safetyRules = options.safety?.rules ?? [];
161
+ const forwardSafety = safetyRules.length > 0 || options.safety?.confirm === true;
162
+ const extraRules = accessLevel === 'NONE' ? [] : safetyNetworkRules(safetyRules);
163
+ const sandboxName = toSandboxName(options.sandboxName ?? config.instanceName ?? config.hostname?.split('.')[0] ?? 'sandbox');
164
+ const providers = [];
165
+ const addProvider = (source, suffix) => {
166
+ const name = `${sandboxName}-${suffix}`;
167
+ providers.push({ name, type: PROFILES[source].id, envVar: PROFILES[source].envVar, source });
168
+ return name;
169
+ };
170
+ const env = {};
171
+ const setEnv = (key, value) => {
172
+ if (value)
173
+ env[key] = value;
174
+ };
175
+ const policies = {};
176
+ const hosts = [];
177
+ const addPolicy = (key, name, endpoints) => {
178
+ policies[key] = { name, endpoints, binaries: [{ path: NODE_BINARY }] };
179
+ hosts.push(...endpoints.map((e) => e.host));
180
+ };
181
+ // Account Manager: the client secret may only be sent to the token endpoint.
182
+ // The Account Manager API (`b2c am`) uses the OAuth token.
183
+ const accountManagerHost = config.accountManagerHost ?? DEFAULT_ACCOUNT_MANAGER_HOST;
184
+ if (config.clientId && config.clientSecret) {
185
+ const provider = addProvider('clientSecret', 'client-secret');
186
+ // Inside the sandbox the secret is a placeholder, which defaults to an
187
+ // unencoded Basic header. Secrets that Account Manager would misread
188
+ // there go in the body instead, which the proxy re-encodes.
189
+ const clientAuthMethod = config.clientAuthMethod === 'body' || secretNeedsBodyAuth(config.clientSecret) ? 'body' : undefined;
190
+ const bodyRewrite = clientAuthMethod === 'body' ? { request_body_credential_rewrite: true } : {};
191
+ addPolicy('b2c_account_manager', 'b2c-account-manager', [
192
+ endpoint(accountManagerHost, [{ allow: { method: 'POST', path: TOKEN_PATH } }, ...methodRules(accessLevel, false, AM_API_PATH)], { ...bodyRewrite, credential_binding: { provider } }),
193
+ ]);
194
+ setEnv('SFCC_CLIENT_ID', config.clientId);
195
+ setEnv('SFCC_ACCOUNT_MANAGER_HOST', config.accountManagerHost);
196
+ setEnv('SFCC_CLIENT_AUTH_METHOD', clientAuthMethod);
197
+ }
198
+ // Instance: OCAPI and WebDAV. The WebDAV access key is bound here only.
199
+ if (config.hostname) {
200
+ const provider = config.username && config.password ? addProvider('password', 'webdav') : undefined;
201
+ const binding = provider ? { credential_binding: { provider } } : {};
202
+ const instanceHosts = [...new Set([config.hostname, config.webdavHostname].filter(Boolean))];
203
+ addPolicy('b2c_instance', 'b2c-instance', instanceHosts.map((host) => endpoint(host, [...methodRules(accessLevel, true), ...extraRules], binding)));
204
+ setEnv('SFCC_SERVER', config.hostname);
205
+ setEnv('SFCC_WEBDAV_SERVER', config.webdavHostname);
206
+ setEnv('SFCC_USERNAME', provider ? config.username : undefined);
207
+ setEnv('SFCC_CODE_VERSION', config.codeVersion);
208
+ }
209
+ // SCAPI Admin APIs use the OAuth access token; no stored secret.
210
+ if (config.shortCode) {
211
+ addPolicy('b2c_scapi', 'b2c-scapi', [
212
+ endpoint(`${config.shortCode}.api.commercecloud.salesforce.com`, [
213
+ ...methodRules(accessLevel, false),
214
+ ...extraRules,
215
+ ]),
216
+ ]);
217
+ setEnv('SFCC_SHORTCODE', config.shortCode);
218
+ }
219
+ setEnv('SFCC_TENANT_ID', config.tenantId);
220
+ setEnv('SFCC_SITE_ID', config.siteId);
221
+ if (config.clientId && config.clientSecret) {
222
+ // On-demand sandboxes (`b2c sandbox`) use the OAuth token.
223
+ addPolicy('b2c_sandbox_api', 'b2c-sandbox-api', [
224
+ endpoint(config.sandboxApiHost ?? DEFAULT_ODS_HOST, methodRules(accessLevel, false)),
225
+ ]);
226
+ setEnv('SFCC_SANDBOX_API_HOST', config.sandboxApiHost);
227
+ // CIP analytics queries are read-only SQL, but the protocol sends every
228
+ // request as a POST, so POST is allowed at every access level.
229
+ const cipHosts = config.cipHost ? [config.cipHost] : [DEFAULT_CIP_HOST, DEFAULT_CIP_STAGING_HOST];
230
+ addPolicy('b2c_cip', 'b2c-cip', cipHosts.map((host) => endpoint(host, [{ allow: { method: 'POST', path: '/**' } }])));
231
+ setEnv('SFCC_CIP_HOST', config.cipHost);
232
+ }
233
+ // Managed Runtime: the API key is bound to the MRT host only.
234
+ if (config.mrtApiKey) {
235
+ const provider = addProvider('mrtApiKey', 'mrt');
236
+ const mrtOrigin = config.mrtOrigin ?? DEFAULT_MRT_ORIGIN;
237
+ // Tailing logs requests a short-lived log token (a POST), then opens a
238
+ // WebSocket to the log host with that token.
239
+ const logTokenRule = accessLevel === 'READ_ONLY' ? [{ allow: { method: 'POST', path: MRT_LOG_TOKEN_PATH } }] : [];
240
+ addPolicy('b2c_mrt', 'b2c-mrt', [
241
+ endpoint(hostOf(mrtOrigin), [...methodRules(accessLevel, false), ...logTokenRule], {
242
+ credential_binding: { provider },
243
+ }),
244
+ { host: hostOf(getLogsWebSocketUrl(mrtOrigin)), port: 443 },
245
+ ]);
246
+ setEnv('MRT_PROJECT', config.mrtProject);
247
+ setEnv('MRT_ENVIRONMENT', config.mrtEnvironment);
248
+ setEnv('MRT_CLOUD_ORIGIN', config.mrtOrigin);
249
+ }
250
+ if (options.allowHosts && options.allowHosts.length > 0) {
251
+ addPolicy('b2c_additional', 'b2c-additional-hosts', options.allowHosts.map((host) => endpoint(hostOf(host), methodRules(accessLevel, false))));
252
+ }
253
+ // Documentation pages for `b2c docs read`: read only.
254
+ addPolicy('b2c_docs', 'b2c-docs', DOCS_HOSTS.map((host) => endpoint(host, methodRules('READ_ONLY', false))));
255
+ // Match Safety Mode to the network policy so blocked operations fail early
256
+ // with a clear message. Telemetry and update checks would only be denied.
257
+ env.SFCC_SAFETY_LEVEL = accessLevel;
258
+ if (forwardSafety)
259
+ env.SFCC_SAFETY_CONFIG = OPENSHELL_SAFETY_CONFIG_PATH;
260
+ env.SFCC_DISABLE_TELEMETRY = 'true';
261
+ env.B2C_SKIP_NEW_VERSION_CHECK = 'true';
262
+ const policy = yaml.dump({
263
+ version: 1,
264
+ filesystem_policy: {
265
+ include_workdir: true,
266
+ read_only: ['/bin', '/usr', '/opt', '/lib', '/proc', '/dev/urandom', '/etc'],
267
+ read_write: ['/sandbox', '/tmp', '/dev/null', '/home/sandbox'],
268
+ },
269
+ landlock: { compatibility: 'best_effort' },
270
+ network_policies: policies,
271
+ }, { lineWidth: -1, flowLevel: 6, noRefs: true });
272
+ const profileSources = [...new Set(providers.map((p) => p.source))];
273
+ return {
274
+ sandboxName,
275
+ profiles: profileSources.map((source) => ({ id: PROFILES[source].id, content: renderProfile(PROFILES[source]) })),
276
+ providers,
277
+ policy,
278
+ env,
279
+ hosts,
280
+ safetyConfig: forwardSafety
281
+ ? `${JSON.stringify({ level: accessLevel, confirm: options.safety?.confirm, rules: safetyRules }, null, 2)}\n`
282
+ : undefined,
283
+ unmappedSafetyRules: accessLevel === 'NONE' ? [] : safetyRules.filter((r) => r.action !== 'block' && r.command !== undefined),
284
+ };
285
+ }
286
+ /**
287
+ * Returns the Dockerfile for a sandbox image with the B2C CLI (and optionally
288
+ * the MCP server) installed.
289
+ *
290
+ * @param options - Package versions to install; defaults to `latest`
291
+ */
292
+ export function buildOpenShellDockerfile(options = {}) {
293
+ const packages = [`@salesforce/b2c-cli@${options.cliVersion ?? 'latest'}`];
294
+ if (options.mcp)
295
+ packages.push(`@salesforce/b2c-dx-mcp@${options.mcpVersion ?? 'latest'}`);
296
+ return `FROM node:22-bookworm-slim
297
+ RUN apt-get update \\
298
+ && apt-get install -y --no-install-recommends ca-certificates iproute2 \\
299
+ && rm -rf /var/lib/apt/lists/*
300
+ RUN npm install -g ${packages.join(' ')} && npm cache clean --force
301
+ RUN useradd --create-home --shell /bin/bash sandbox \\
302
+ && install -d -o sandbox -g sandbox /sandbox
303
+ USER sandbox
304
+ WORKDIR /sandbox
305
+ `;
306
+ }
307
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/openshell/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ import type { CdnZonesClient, CdnZonesComponents } from '../../clients/index.js';
2
+ /** eCDN mTLS certificate as returned by the CDN Zones API. */
3
+ export type MtlsCertificate = CdnZonesComponents['schemas']['MtlsCertificateResponse'];
4
+ /**
5
+ * Maximum validity eCDN accepts for an uploaded code upload CA certificate.
6
+ * Also the default validity for {@link generateCaCertificate}.
7
+ */
8
+ export declare const MAX_CODE_UPLOAD_CA_VALIDITY_DAYS = 365;
9
+ /** Default validity for a generated CA certificate. */
10
+ export declare const DEFAULT_CA_VALIDITY_DAYS = 365;
11
+ /** Default validity for an issued client certificate (1 year). */
12
+ export declare const DEFAULT_CLIENT_VALIDITY_DAYS = 365;
13
+ /** Default RSA key size in bits. */
14
+ export declare const DEFAULT_KEY_SIZE = 2048;
15
+ /** A PEM-encoded certificate and its private key. */
16
+ export interface CertificateKeyPair {
17
+ /** PEM-encoded X.509 certificate */
18
+ certificatePem: string;
19
+ /** PEM-encoded private key */
20
+ privateKeyPem: string;
21
+ }
22
+ /** A generated certificate with metadata. */
23
+ export interface GeneratedCertificate extends CertificateKeyPair {
24
+ /** Hex-encoded serial number */
25
+ serialNumber: string;
26
+ /** Certificate subject distinguished name (e.g. `CN=My CA`) */
27
+ subject: string;
28
+ /** Start of validity */
29
+ notBefore: Date;
30
+ /** End of validity */
31
+ notAfter: Date;
32
+ }
33
+ /** Options for {@link generateCaCertificate}. */
34
+ export interface GenerateCaCertificateOptions {
35
+ /**
36
+ * Subject common name. Salesforce recommends the staging Business Manager
37
+ * hostname (`staging-<realm>-<customer>.demandware.net`).
38
+ * Default: `B2C Commerce Code Upload CA`
39
+ */
40
+ commonName?: string;
41
+ /** Optional subject organization (O) */
42
+ organization?: string;
43
+ /**
44
+ * Validity in days. Default: {@link DEFAULT_CA_VALIDITY_DAYS}. eCDN rejects CA
45
+ * certificates valid for more than {@link MAX_CODE_UPLOAD_CA_VALIDITY_DAYS} days.
46
+ */
47
+ validityDays?: number;
48
+ /** RSA key size in bits. Default: {@link DEFAULT_KEY_SIZE} */
49
+ keySize?: number;
50
+ }
51
+ /** Options for {@link issueClientCertificate}. */
52
+ export interface IssueClientCertificateOptions {
53
+ /** CA certificate and private key used to sign the client certificate */
54
+ ca: CertificateKeyPair;
55
+ /** Subject common name identifying the client; Salesforce recommends the Business Manager username or API client ID */
56
+ commonName: string;
57
+ /** Optional subject organization (O) */
58
+ organization?: string;
59
+ /** Validity in days. Default: {@link DEFAULT_CLIENT_VALIDITY_DAYS}; capped at the CA's expiry */
60
+ validityDays?: number;
61
+ /** RSA key size in bits. Default: {@link DEFAULT_KEY_SIZE} */
62
+ keySize?: number;
63
+ /** Passphrase protecting the PKCS12 bundle. Default: a random passphrase */
64
+ passphrase?: string;
65
+ }
66
+ /** An issued client certificate, including the PKCS12 bundle. */
67
+ export interface IssuedClientCertificate extends GeneratedCertificate {
68
+ /** PKCS12 (`.p12`) bundle containing the client key, certificate, and CA certificate */
69
+ pkcs12: Buffer;
70
+ /** Passphrase protecting {@link pkcs12} */
71
+ passphrase: string;
72
+ }
73
+ /** Options for {@link createCodeUploadCertificate}. */
74
+ export interface CreateCodeUploadCertificateOptions {
75
+ /** Certificate name for identification */
76
+ name: string;
77
+ /** PEM-encoded CA certificate */
78
+ certificatePem: string;
79
+ /** PEM-encoded CA private key */
80
+ privateKeyPem: string;
81
+ }
82
+ /**
83
+ * Generates a random passphrase suitable for protecting a PKCS12 bundle.
84
+ *
85
+ * @returns A 32-character URL-safe random string
86
+ */
87
+ export declare function generatePassphrase(): string;
88
+ /**
89
+ * Generates a self-signed CA certificate for mTLS code upload.
90
+ *
91
+ * The CA is uploaded to eCDN with {@link createCodeUploadCertificate} and used
92
+ * to sign client certificates with {@link issueClientCertificate}. Keep the CA
93
+ * private key secret: anyone holding it can issue trusted client certificates.
94
+ *
95
+ * @param options - Subject, validity, and key size options
96
+ * @returns The CA certificate and private key as PEM strings
97
+ */
98
+ export declare function generateCaCertificate(options?: GenerateCaCertificateOptions): GeneratedCertificate;
99
+ /**
100
+ * Issues a client certificate signed by the given CA and bundles it as PKCS12.
101
+ *
102
+ * The resulting `.p12` is what the CLI, IDE extension, and other WebDAV clients
103
+ * use for two-factor code upload (`certificate` / `certificate-passphrase` in
104
+ * dw.json). This runs entirely locally; no API call is made.
105
+ *
106
+ * @param options - CA, subject, validity, and passphrase options
107
+ * @returns The client certificate, private key, and PKCS12 bundle
108
+ * @throws Error if the CA certificate/key are invalid, don't match, or the CA has expired
109
+ */
110
+ export declare function issueClientCertificate(options: IssueClientCertificateOptions): IssuedClientCertificate;
111
+ /**
112
+ * Validates that a PEM certificate can be uploaded as a code upload CA.
113
+ *
114
+ * The CA certificate bundle is allowed a maximum expiry of 1 year
115
+ * ({@link MAX_CODE_UPLOAD_CA_VALIDITY_DAYS} days); before it expires it must be
116
+ * renewed to avoid disruption with code uploads.
117
+ *
118
+ * @param certificatePem - PEM-encoded CA certificate
119
+ * @throws Error if the certificate can't be parsed, isn't a CA, is expired, or is valid for more than 1 year
120
+ */
121
+ export declare function validateCodeUploadCaCertificate(certificatePem: string): void;
122
+ /**
123
+ * Uploads a CA certificate to eCDN for two-factor (mTLS) code upload.
124
+ *
125
+ * Requires a read-write CDN Zones client (`sfcc.cdn-zones.rw` scope) for a
126
+ * staging organization. The certificate is checked locally first with
127
+ * {@link validateCodeUploadCaCertificate}.
128
+ *
129
+ * @param client - Read-write CDN Zones client
130
+ * @param organizationId - Organization ID (`f_ecom_<tenant>`)
131
+ * @param options - Certificate name and PEM contents
132
+ * @returns The created certificate, including `mtlsAssociatedCodeUploadHostname`
133
+ * @throws Error if the certificate is invalid or the API request fails
134
+ */
135
+ export declare function createCodeUploadCertificate(client: CdnZonesClient, organizationId: string, options: CreateCodeUploadCertificateOptions): Promise<MtlsCertificate>;