@salesforce/b2c-tooling-sdk 2.1.0 → 2.2.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 (35) hide show
  1. package/data/content-schemas/databindingcontext.json +1 -1
  2. package/data/guides/enrichment.json +2030 -1413
  3. package/data/guides/index.json +2637 -1807
  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 +11 -2
  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/clients/middleware-registry.d.ts +8 -36
  19. package/dist/esm/clients/middleware-registry.js +62 -1
  20. package/dist/esm/clients/middleware-registry.js.map +1 -1
  21. package/dist/esm/config/dw-json.d.ts +28 -0
  22. package/dist/esm/config/dw-json.js +47 -1
  23. package/dist/esm/config/dw-json.js.map +1 -1
  24. package/dist/esm/config/index.d.ts +2 -2
  25. package/dist/esm/config/index.js +1 -1
  26. package/dist/esm/config/index.js.map +1 -1
  27. package/dist/esm/docs/search.js +3 -1
  28. package/dist/esm/docs/search.js.map +1 -1
  29. package/dist/esm/docs/types.d.ts +4 -1
  30. package/dist/esm/docs/types.js +1 -0
  31. package/dist/esm/docs/types.js.map +1 -1
  32. package/dist/esm/operations/mtls/index.d.ts +135 -0
  33. package/dist/esm/operations/mtls/index.js +270 -0
  34. package/dist/esm/operations/mtls/index.js.map +1 -0
  35. package/package.json +7 -1
@@ -0,0 +1,270 @@
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
+ * mTLS code upload certificate operations for B2C Commerce.
8
+ *
9
+ * Two-factor (mTLS) code upload to staging via eCDN works with a private
10
+ * certificate authority (CA):
11
+ *
12
+ * 1. Generate a CA certificate and key ({@link generateCaCertificate}).
13
+ * 2. Upload the CA to eCDN ({@link createCodeUploadCertificate}). The response
14
+ * includes the code upload hostname associated with the staging zone.
15
+ * 3. Issue one or more client certificates signed by the CA, bundled as PKCS12
16
+ * (`.p12`) files ({@link issueClientCertificate}). Each user (named after their
17
+ * Business Manager username) or CI pipeline (named after its API client ID)
18
+ * gets its own client certificate for WebDAV uploads; the CA itself is never
19
+ * used as a client certificate.
20
+ *
21
+ * The CA certificate may be valid for at most {@link MAX_CODE_UPLOAD_CA_VALIDITY_DAYS}
22
+ * days. To rotate, upload a new CA before the old one expires, re-issue client
23
+ * certificates from it, then delete the old CA.
24
+ *
25
+ * ## Usage
26
+ *
27
+ * ```typescript
28
+ * import {createCdnZonesClient} from '@salesforce/b2c-tooling-sdk/clients';
29
+ * import {
30
+ * createCodeUploadCertificate,
31
+ * generateCaCertificate,
32
+ * issueClientCertificate,
33
+ * } from '@salesforce/b2c-tooling-sdk/operations/mtls';
34
+ *
35
+ * const ca = generateCaCertificate({commonName: 'My Code Upload CA'});
36
+ * const client = createCdnZonesClient({shortCode, tenantId}, auth, {readWrite: true});
37
+ * const uploaded = await createCodeUploadCertificate(client, organizationId, {
38
+ * name: 'code-upload',
39
+ * certificatePem: ca.certificatePem,
40
+ * privateKeyPem: ca.privateKeyPem,
41
+ * });
42
+ *
43
+ * const clientCert = issueClientCertificate({ca, commonName: 'build-server'});
44
+ * await fs.writeFile('build-server.p12', clientCert.pkcs12);
45
+ * // clientCert.passphrase protects the .p12; uploaded.mtlsAssociatedCodeUploadHostname
46
+ * // is the WebDAV hostname to use with it.
47
+ * ```
48
+ *
49
+ * @module operations/mtls
50
+ */
51
+ import { generateKeyPairSync, randomBytes, X509Certificate } from 'node:crypto';
52
+ import forge from 'node-forge';
53
+ import { getApiErrorMessage } from '../../clients/error-utils.js';
54
+ import { getLogger } from '../../logging/logger.js';
55
+ /**
56
+ * Maximum validity eCDN accepts for an uploaded code upload CA certificate.
57
+ * Also the default validity for {@link generateCaCertificate}.
58
+ */
59
+ export const MAX_CODE_UPLOAD_CA_VALIDITY_DAYS = 365;
60
+ /** Default validity for a generated CA certificate. */
61
+ export const DEFAULT_CA_VALIDITY_DAYS = MAX_CODE_UPLOAD_CA_VALIDITY_DAYS;
62
+ /** Default validity for an issued client certificate (1 year). */
63
+ export const DEFAULT_CLIENT_VALIDITY_DAYS = 365;
64
+ /** Default RSA key size in bits. */
65
+ export const DEFAULT_KEY_SIZE = 2048;
66
+ const MS_PER_DAY = 24 * 60 * 60 * 1000;
67
+ /**
68
+ * Generates a random passphrase suitable for protecting a PKCS12 bundle.
69
+ *
70
+ * @returns A 32-character URL-safe random string
71
+ */
72
+ export function generatePassphrase() {
73
+ return randomBytes(24).toString('base64url');
74
+ }
75
+ // Backdate the start of validity slightly to tolerate clock skew between machines.
76
+ function backdatedNow() {
77
+ return new Date(Date.now() - 5 * 60 * 1000);
78
+ }
79
+ function assertPositiveInteger(value, name) {
80
+ if (!Number.isInteger(value) || value <= 0) {
81
+ throw new RangeError(`${name} must be a positive integer, got ${value}`);
82
+ }
83
+ }
84
+ // Node's native key generation is much faster than node-forge's pure JS implementation.
85
+ function generateRsaKeyPair(keySize) {
86
+ assertPositiveInteger(keySize, 'keySize');
87
+ const { privateKey } = generateKeyPairSync('rsa', {
88
+ modulusLength: keySize,
89
+ privateKeyEncoding: { type: 'pkcs1', format: 'pem' },
90
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
91
+ });
92
+ const forgeKey = forge.pki.privateKeyFromPem(privateKey);
93
+ return { privateKey: forgeKey, publicKey: forge.pki.setRsaPublicKey(forgeKey.n, forgeKey.e) };
94
+ }
95
+ // Positive 128-bit serial (RFC 5280 requires a positive integer of at most 20 octets).
96
+ function randomSerialNumber() {
97
+ const bytes = randomBytes(16);
98
+ bytes[0] &= 0x7f;
99
+ bytes[0] |= 0x10;
100
+ return bytes.toString('hex');
101
+ }
102
+ function buildSubject(commonName, organization) {
103
+ const attrs = [{ name: 'commonName', value: commonName }];
104
+ if (organization) {
105
+ attrs.push({ name: 'organizationName', value: organization });
106
+ }
107
+ return attrs;
108
+ }
109
+ function formatSubject(cert) {
110
+ return cert.subject.attributes.map((a) => `${a.shortName ?? a.name}=${String(a.value)}`).join(', ');
111
+ }
112
+ function toGenerated(cert, privateKey) {
113
+ return {
114
+ certificatePem: forge.pki.certificateToPem(cert),
115
+ privateKeyPem: forge.pki.privateKeyToPem(privateKey),
116
+ serialNumber: cert.serialNumber,
117
+ subject: formatSubject(cert),
118
+ notBefore: cert.validity.notBefore,
119
+ notAfter: cert.validity.notAfter,
120
+ };
121
+ }
122
+ /**
123
+ * Generates a self-signed CA certificate for mTLS code upload.
124
+ *
125
+ * The CA is uploaded to eCDN with {@link createCodeUploadCertificate} and used
126
+ * to sign client certificates with {@link issueClientCertificate}. Keep the CA
127
+ * private key secret: anyone holding it can issue trusted client certificates.
128
+ *
129
+ * @param options - Subject, validity, and key size options
130
+ * @returns The CA certificate and private key as PEM strings
131
+ */
132
+ export function generateCaCertificate(options = {}) {
133
+ const validityDays = options.validityDays ?? DEFAULT_CA_VALIDITY_DAYS;
134
+ assertPositiveInteger(validityDays, 'validityDays');
135
+ if (validityDays > MAX_CODE_UPLOAD_CA_VALIDITY_DAYS) {
136
+ throw new RangeError(`validityDays must be at most ${MAX_CODE_UPLOAD_CA_VALIDITY_DAYS}; eCDN allows a maximum CA expiry of 1 year`);
137
+ }
138
+ const keys = generateRsaKeyPair(options.keySize ?? DEFAULT_KEY_SIZE);
139
+ const cert = forge.pki.createCertificate();
140
+ cert.publicKey = keys.publicKey;
141
+ cert.serialNumber = randomSerialNumber();
142
+ cert.validity.notBefore = backdatedNow();
143
+ cert.validity.notAfter = new Date(cert.validity.notBefore.getTime() + validityDays * MS_PER_DAY);
144
+ const subject = buildSubject(options.commonName ?? 'B2C Commerce Code Upload CA', options.organization);
145
+ cert.setSubject(subject);
146
+ cert.setIssuer(subject);
147
+ cert.setExtensions([
148
+ { name: 'basicConstraints', cA: true, critical: true },
149
+ { name: 'keyUsage', keyCertSign: true, cRLSign: true, critical: true },
150
+ { name: 'subjectKeyIdentifier' },
151
+ ]);
152
+ cert.sign(keys.privateKey, forge.md.sha256.create());
153
+ getLogger().debug({ subject: formatSubject(cert), notAfter: cert.validity.notAfter }, 'Generated mTLS CA certificate');
154
+ return toGenerated(cert, keys.privateKey);
155
+ }
156
+ /**
157
+ * Issues a client certificate signed by the given CA and bundles it as PKCS12.
158
+ *
159
+ * The resulting `.p12` is what the CLI, IDE extension, and other WebDAV clients
160
+ * use for two-factor code upload (`certificate` / `certificate-passphrase` in
161
+ * dw.json). This runs entirely locally; no API call is made.
162
+ *
163
+ * @param options - CA, subject, validity, and passphrase options
164
+ * @returns The client certificate, private key, and PKCS12 bundle
165
+ * @throws Error if the CA certificate/key are invalid, don't match, or the CA has expired
166
+ */
167
+ export function issueClientCertificate(options) {
168
+ const caCert = forge.pki.certificateFromPem(options.ca.certificatePem);
169
+ const caKey = forge.pki.privateKeyFromPem(options.ca.privateKeyPem);
170
+ const caPublicKey = caCert.publicKey;
171
+ if (caPublicKey.n.compareTo(caKey.n) !== 0) {
172
+ throw new Error('CA private key does not match the CA certificate');
173
+ }
174
+ const now = new Date();
175
+ if (caCert.validity.notAfter <= now) {
176
+ throw new Error(`CA certificate expired on ${caCert.validity.notAfter.toISOString()}`);
177
+ }
178
+ const validityDays = options.validityDays ?? DEFAULT_CLIENT_VALIDITY_DAYS;
179
+ assertPositiveInteger(validityDays, 'validityDays');
180
+ const keys = generateRsaKeyPair(options.keySize ?? DEFAULT_KEY_SIZE);
181
+ const cert = forge.pki.createCertificate();
182
+ cert.publicKey = keys.publicKey;
183
+ cert.serialNumber = randomSerialNumber();
184
+ cert.validity.notBefore = backdatedNow();
185
+ const requestedNotAfter = new Date(cert.validity.notBefore.getTime() + validityDays * MS_PER_DAY);
186
+ cert.validity.notAfter = requestedNotAfter < caCert.validity.notAfter ? requestedNotAfter : caCert.validity.notAfter;
187
+ cert.setSubject(buildSubject(options.commonName, options.organization));
188
+ cert.setIssuer(caCert.subject.attributes);
189
+ cert.setExtensions([
190
+ { name: 'basicConstraints', cA: false, critical: true },
191
+ { name: 'keyUsage', digitalSignature: true, keyEncipherment: true, critical: true },
192
+ { name: 'extKeyUsage', clientAuth: true },
193
+ { name: 'subjectKeyIdentifier' },
194
+ { name: 'authorityKeyIdentifier', keyIdentifier: caCert.generateSubjectKeyIdentifier().getBytes() },
195
+ ]);
196
+ cert.sign(caKey, forge.md.sha256.create());
197
+ const passphrase = options.passphrase ?? generatePassphrase();
198
+ // 3DES matches `openssl pkcs12 -export -legacy`, which Salesforce recommends so the
199
+ // bundle can be imported into macOS Keychain and other tools that lack AES PBES2 support.
200
+ const p12Asn1 = forge.pkcs12.toPkcs12Asn1(keys.privateKey, [cert, caCert], passphrase, {
201
+ algorithm: '3des',
202
+ friendlyName: options.commonName,
203
+ });
204
+ const pkcs12 = Buffer.from(forge.asn1.toDer(p12Asn1).getBytes(), 'binary');
205
+ getLogger().debug({ subject: formatSubject(cert), notAfter: cert.validity.notAfter }, 'Issued mTLS client certificate');
206
+ return { ...toGenerated(cert, keys.privateKey), pkcs12, passphrase };
207
+ }
208
+ /**
209
+ * Validates that a PEM certificate can be uploaded as a code upload CA.
210
+ *
211
+ * The CA certificate bundle is allowed a maximum expiry of 1 year
212
+ * ({@link MAX_CODE_UPLOAD_CA_VALIDITY_DAYS} days); before it expires it must be
213
+ * renewed to avoid disruption with code uploads.
214
+ *
215
+ * @param certificatePem - PEM-encoded CA certificate
216
+ * @throws Error if the certificate can't be parsed, isn't a CA, is expired, or is valid for more than 1 year
217
+ */
218
+ export function validateCodeUploadCaCertificate(certificatePem) {
219
+ let cert;
220
+ try {
221
+ cert = new X509Certificate(certificatePem);
222
+ }
223
+ catch (error) {
224
+ throw new Error(`Invalid CA certificate: ${error instanceof Error ? error.message : String(error)}`, {
225
+ cause: error,
226
+ });
227
+ }
228
+ if (!cert.ca) {
229
+ throw new Error('Certificate is not a CA certificate. Upload the CA that signs your client certificates, not a client certificate. ' +
230
+ 'If you generated it with OpenSSL, add -addext "basicConstraints=critical,CA:TRUE" -addext "keyUsage=critical,keyCertSign,cRLSign" ' +
231
+ '(the macOS default OpenSSL configuration omits them).');
232
+ }
233
+ const notBefore = new Date(cert.validFrom);
234
+ const notAfter = new Date(cert.validTo);
235
+ if (notAfter.getTime() <= Date.now()) {
236
+ throw new Error(`CA certificate expired on ${notAfter.toISOString()}`);
237
+ }
238
+ const validityDays = (notAfter.getTime() - notBefore.getTime()) / MS_PER_DAY;
239
+ if (validityDays > MAX_CODE_UPLOAD_CA_VALIDITY_DAYS) {
240
+ throw new Error(`CA certificate is valid for ${Math.floor(validityDays)} days; eCDN allows a maximum CA expiry of 1 year (${MAX_CODE_UPLOAD_CA_VALIDITY_DAYS} days).`);
241
+ }
242
+ }
243
+ /**
244
+ * Uploads a CA certificate to eCDN for two-factor (mTLS) code upload.
245
+ *
246
+ * Requires a read-write CDN Zones client (`sfcc.cdn-zones.rw` scope) for a
247
+ * staging organization. The certificate is checked locally first with
248
+ * {@link validateCodeUploadCaCertificate}.
249
+ *
250
+ * @param client - Read-write CDN Zones client
251
+ * @param organizationId - Organization ID (`f_ecom_<tenant>`)
252
+ * @param options - Certificate name and PEM contents
253
+ * @returns The created certificate, including `mtlsAssociatedCodeUploadHostname`
254
+ * @throws Error if the certificate is invalid or the API request fails
255
+ */
256
+ export async function createCodeUploadCertificate(client, organizationId, options) {
257
+ validateCodeUploadCaCertificate(options.certificatePem);
258
+ const { data, error, response } = await client.POST('/organizations/{organizationId}/mtls/code-upload-certificates', {
259
+ params: { path: { organizationId } },
260
+ body: { name: options.name, certificate: options.certificatePem, privateKey: options.privateKeyPem },
261
+ });
262
+ if (error) {
263
+ throw new Error(`Failed to create mTLS certificate: ${getApiErrorMessage(error, response)}`, { cause: error });
264
+ }
265
+ if (!data?.data) {
266
+ throw new Error('No certificate data returned from API');
267
+ }
268
+ return data.data;
269
+ }
270
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/operations/mtls/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,EAAC,mBAAmB,EAAE,WAAW,EAAE,eAAe,EAAC,MAAM,aAAa,CAAC;AAC9E,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,OAAO,EAAC,kBAAkB,EAAC,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAKlD;;;GAGG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,GAAG,CAAC;AAEpD,uDAAuD;AACvD,MAAM,CAAC,MAAM,wBAAwB,GAAG,gCAAgC,CAAC;AAEzE,kEAAkE;AAClE,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAEhD,oCAAoC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AA2ErC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,mFAAmF;AACnF,SAAS,YAAY;IACnB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa,EAAE,IAAY;IACxD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,oCAAoC,KAAK,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,wFAAwF;AACxF,SAAS,kBAAkB,CAAC,OAAe;IACzC,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1C,MAAM,EAAC,UAAU,EAAC,GAAG,mBAAmB,CAAC,KAAK,EAAE;QAC9C,aAAa,EAAE,OAAO;QACtB,kBAAkB,EAAE,EAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAC;QAClD,iBAAiB,EAAE,EAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAC;KACjD,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,UAAU,CAA6B,CAAC;IACrF,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAC,CAAC;AAC9F,CAAC;AAED,uFAAuF;AACvF,SAAS,kBAAkB;IACzB,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC9B,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACjB,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACjB,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,YAAY,CAAC,UAAkB,EAAE,YAAqB;IAC7D,MAAM,KAAK,GAAiC,CAAC,EAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAC,CAAC,CAAC;IACtF,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAC,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,IAA2B;IAChD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,WAAW,CAAC,IAA2B,EAAE,UAAgC;IAChF,OAAO;QACL,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAChD,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC;QACpD,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC;QAC5B,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;QAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;KACjC,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAwC,EAAE;IAC9E,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,wBAAwB,CAAC;IACtE,qBAAqB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IACpD,IAAI,YAAY,GAAG,gCAAgC,EAAE,CAAC;QACpD,MAAM,IAAI,UAAU,CAClB,gCAAgC,gCAAgC,6CAA6C,CAC9G,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC;IAErE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;IAC3C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAChC,IAAI,CAAC,YAAY,GAAG,kBAAkB,EAAE,CAAC;IACzC,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;IACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,YAAY,GAAG,UAAU,CAAC,CAAC;IAEjG,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,IAAI,6BAA6B,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACxG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACxB,IAAI,CAAC,aAAa,CAAC;QACjB,EAAC,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC;QACpD,EAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC;QACpE,EAAC,IAAI,EAAE,sBAAsB,EAAC;KAC/B,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAErD,SAAS,EAAE,CAAC,KAAK,CAAC,EAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAC,EAAE,+BAA+B,CAAC,CAAC;IACrH,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAsC;IAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,aAAa,CAA6B,CAAC;IAChG,MAAM,WAAW,GAAG,MAAM,CAAC,SAAoC,CAAC;IAChE,IAAI,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,GAAG,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,4BAA4B,CAAC;IAC1E,qBAAqB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC;IAErE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;IAC3C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAChC,IAAI,CAAC,YAAY,GAAG,kBAAkB,EAAE,CAAC;IACzC,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;IACzC,MAAM,iBAAiB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,YAAY,GAAG,UAAU,CAAC,CAAC;IAClG,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAErH,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC,aAAa,CAAC;QACjB,EAAC,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAC;QACrD,EAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC;QACjF,EAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAC;QACvC,EAAC,IAAI,EAAE,sBAAsB,EAAC;QAC9B,EAAC,IAAI,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,CAAC,4BAA4B,EAAE,CAAC,QAAQ,EAAE,EAAC;KAClG,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAE3C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,EAAE,CAAC;IAC9D,oFAAoF;IACpF,0FAA0F;IAC1F,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE;QACrF,SAAS,EAAE,MAAM;QACjB,YAAY,EAAE,OAAO,CAAC,UAAU;KACjC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;IAE3E,SAAS,EAAE,CAAC,KAAK,CAAC,EAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAC,EAAE,gCAAgC,CAAC,CAAC;IACtH,OAAO,EAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,EAAC,CAAC;AACrE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,+BAA+B,CAAC,cAAsB;IACpE,IAAI,IAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE;YACnG,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,oHAAoH;YAClH,oIAAoI;YACpI,uDAAuD,CAC1D,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,QAAQ,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,YAAY,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC;IAC7E,IAAI,YAAY,GAAG,gCAAgC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,qDAAqD,gCAAgC,SAAS,CACtJ,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAAsB,EACtB,cAAsB,EACtB,OAA2C;IAE3C,+BAA+B,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACxD,MAAM,EAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAC,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,+DAA+D,EAAE;QACjH,MAAM,EAAE,EAAC,IAAI,EAAE,EAAC,cAAc,EAAC,EAAC;QAChC,IAAI,EAAE,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,aAAa,EAAC;KACnG,CAAC,CAAC;IAEH,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,sCAAsC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAC,KAAK,EAAE,KAAK,EAAC,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@salesforce/b2c-tooling-sdk",
3
3
  "description": "Core tooling library for Salesforce B2C Commerce CLI",
4
- "version": "2.1.0",
4
+ "version": "2.2.0",
5
5
  "author": "Charles Lavery",
6
6
  "license": "Apache-2.0",
7
7
  "repository": "SalesforceCommerceCloud/b2c-developer-tooling",
@@ -108,6 +108,10 @@
108
108
  "types": "./dist/esm/operations/metrics/index.d.ts",
109
109
  "default": "./dist/esm/operations/metrics/index.js"
110
110
  },
111
+ "./operations/mtls": {
112
+ "types": "./dist/esm/operations/mtls/index.d.ts",
113
+ "default": "./dist/esm/operations/mtls/index.js"
114
+ },
111
115
  "./slas": {
112
116
  "types": "./dist/esm/slas/index.d.ts",
113
117
  "default": "./dist/esm/slas/index.js"
@@ -207,6 +211,7 @@
207
211
  "@types/js-yaml": "4.0.9",
208
212
  "@types/mocha": "^10",
209
213
  "@types/node": "^22",
214
+ "@types/node-forge": "1.3.14",
210
215
  "@types/sinon": "^21.0.0",
211
216
  "@types/tar-fs": "^2.0.4",
212
217
  "@types/xml2js": "^0.4.14",
@@ -251,6 +256,7 @@
251
256
  "jszip": "3.10.1",
252
257
  "minimatch": "10.2.4",
253
258
  "minisearch": "7.2.0",
259
+ "node-forge": "1.4.0",
254
260
  "open": "11.0.0",
255
261
  "openapi-fetch": "0.15.0",
256
262
  "pino": "10.1.0",