@salesforce/b2c-tooling-sdk 1.7.0 → 1.8.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 (33) hide show
  1. package/dist/cjs/config/dw-json.d.ts +2 -0
  2. package/dist/cjs/config/dw-json.js.map +1 -1
  3. package/dist/cjs/config/mapping.js +5 -0
  4. package/dist/cjs/config/mapping.js.map +1 -1
  5. package/dist/cjs/config/types.d.ts +2 -0
  6. package/dist/cjs/operations/code/download.d.ts +17 -6
  7. package/dist/cjs/operations/code/download.js +189 -87
  8. package/dist/cjs/operations/code/download.js.map +1 -1
  9. package/dist/cjs/operations/code/index.d.ts +3 -1
  10. package/dist/cjs/operations/code/index.js +3 -1
  11. package/dist/cjs/operations/code/index.js.map +1 -1
  12. package/dist/cjs/operations/code/upload-files.d.ts +47 -0
  13. package/dist/cjs/operations/code/upload-files.js +116 -0
  14. package/dist/cjs/operations/code/upload-files.js.map +1 -0
  15. package/dist/cjs/operations/code/watch.js +18 -92
  16. package/dist/cjs/operations/code/watch.js.map +1 -1
  17. package/dist/esm/config/dw-json.d.ts +2 -0
  18. package/dist/esm/config/dw-json.js.map +1 -1
  19. package/dist/esm/config/mapping.js +5 -0
  20. package/dist/esm/config/mapping.js.map +1 -1
  21. package/dist/esm/config/types.d.ts +2 -0
  22. package/dist/esm/operations/code/download.d.ts +17 -6
  23. package/dist/esm/operations/code/download.js +189 -87
  24. package/dist/esm/operations/code/download.js.map +1 -1
  25. package/dist/esm/operations/code/index.d.ts +3 -1
  26. package/dist/esm/operations/code/index.js +3 -1
  27. package/dist/esm/operations/code/index.js.map +1 -1
  28. package/dist/esm/operations/code/upload-files.d.ts +47 -0
  29. package/dist/esm/operations/code/upload-files.js +116 -0
  30. package/dist/esm/operations/code/upload-files.js.map +1 -0
  31. package/dist/esm/operations/code/watch.js +18 -92
  32. package/dist/esm/operations/code/watch.js.map +1 -1
  33. package/package.json +1 -1
@@ -11,14 +11,169 @@ import { getActiveCodeVersion } from './versions.js';
11
11
  const ZIP_BODY = new URLSearchParams({ method: 'ZIP' }).toString();
12
12
  // 10 minutes — server-side zipping and large downloads can take a long time
13
13
  const LONG_OPERATION_TIMEOUT_MS = 600_000;
14
+ // Progress helper: fires immediately (0s) then every 5s until stopped
15
+ const PROGRESS_INTERVAL_MS = 5_000;
16
+ function startProgress(phase, onProgress) {
17
+ const start = Date.now();
18
+ onProgress?.({ phase, elapsedSeconds: 0 });
19
+ if (!onProgress)
20
+ return () => { };
21
+ const interval = setInterval(() => {
22
+ onProgress({ phase, elapsedSeconds: Math.round((Date.now() - start) / 1000) });
23
+ }, PROGRESS_INTERVAL_MS);
24
+ return () => clearInterval(interval);
25
+ }
26
+ /**
27
+ * Resolves code version from instance config or OCAPI auto-discovery.
28
+ */
29
+ async function resolveCodeVersion(instance) {
30
+ const logger = getLogger();
31
+ let codeVersion = instance.config.codeVersion;
32
+ if (!codeVersion) {
33
+ logger.debug('No code version configured, attempting to discover active version...');
34
+ try {
35
+ const activeVersion = await getActiveCodeVersion(instance);
36
+ if (activeVersion?.id) {
37
+ codeVersion = activeVersion.id;
38
+ instance.config.codeVersion = codeVersion;
39
+ }
40
+ }
41
+ catch (error) {
42
+ logger.debug({ error }, 'Failed to discover active code version');
43
+ }
44
+ if (!codeVersion) {
45
+ throw new Error('Code version required for download. Configure --code-version or ensure OAuth credentials are available for auto-discovery.');
46
+ }
47
+ }
48
+ return codeVersion;
49
+ }
50
+ /**
51
+ * Extracts files from a ZIP archive to disk.
52
+ *
53
+ * @param zip - Loaded JSZip instance
54
+ * @param options - Extraction options
55
+ * @param options.stripPrefix - Number of path segments to strip from ZIP entry paths (e.g. 1 to remove codeVersion, 2 to remove codeVersion + cartridgeName)
56
+ * @param options.outputDirectory - Base output directory
57
+ * @param options.mirror - Map of cartridge names to local paths for mirror extraction
58
+ * @param options.include - Cartridge names to include
59
+ * @param options.exclude - Cartridge names to exclude
60
+ * @returns Set of extracted cartridge names
61
+ */
62
+ async function extractZip(zip, options) {
63
+ const extractedCartridges = new Set();
64
+ const entries = Object.values(zip.files).filter((entry) => !entry.dir);
65
+ for (const entry of entries) {
66
+ const parts = entry.name.split('/');
67
+ if (parts.length < options.stripPrefix + 1) {
68
+ continue;
69
+ }
70
+ // Strip the prefix segments
71
+ for (let i = 0; i < options.stripPrefix; i++) {
72
+ parts.shift();
73
+ }
74
+ // Determine cartridge name: either from the next segment or from the option
75
+ const cartridgeName = options.cartridgeName ?? parts.shift();
76
+ const relativePath = options.cartridgeName ? parts.join('/') : parts.join('/');
77
+ // Apply filters
78
+ if (options.include?.length && !options.include.includes(cartridgeName)) {
79
+ continue;
80
+ }
81
+ if (options.exclude?.length && options.exclude.includes(cartridgeName)) {
82
+ continue;
83
+ }
84
+ let targetPath;
85
+ if (options.mirror?.has(cartridgeName)) {
86
+ targetPath = path.join(options.mirror.get(cartridgeName), relativePath);
87
+ }
88
+ else {
89
+ targetPath = path.join(options.outputDirectory, cartridgeName, relativePath);
90
+ }
91
+ // Preserve existing file permissions
92
+ let existingMode = null;
93
+ try {
94
+ const stat = await fs.promises.stat(targetPath);
95
+ existingMode = stat.mode;
96
+ }
97
+ catch {
98
+ // File doesn't exist yet
99
+ }
100
+ await fs.promises.mkdir(path.dirname(targetPath), { recursive: true });
101
+ const content = await entry.async('nodebuffer');
102
+ await fs.promises.writeFile(targetPath, content);
103
+ if (existingMode !== null) {
104
+ await fs.promises.chmod(targetPath, existingMode);
105
+ }
106
+ extractedCartridges.add(cartridgeName);
107
+ }
108
+ return extractedCartridges;
109
+ }
110
+ /**
111
+ * Downloads a single cartridge from an instance via WebDAV.
112
+ *
113
+ * This is more efficient than downloading the entire code version when only
114
+ * one cartridge is needed, as it ZIPs only the cartridge subdirectory on the server.
115
+ *
116
+ * @param instance - B2C instance to download from
117
+ * @param codeVersion - Code version containing the cartridge
118
+ * @param cartridgeName - Name of the cartridge to download
119
+ * @param outputPath - Local path to extract the cartridge into
120
+ * @param onProgress - Optional progress callback
121
+ */
122
+ export async function downloadSingleCartridge(instance, codeVersion, cartridgeName, outputPath, onProgress) {
123
+ const logger = getLogger();
124
+ const webdav = instance.webdav;
125
+ const cartridgePath = `Cartridges/${codeVersion}/${cartridgeName}`;
126
+ const zipPath = `${cartridgePath}.zip`;
127
+ let stopProgress = startProgress('zipping', onProgress);
128
+ logger.debug({ cartridgeName, codeVersion }, 'Requesting server-side zip for single cartridge...');
129
+ const zipResponse = await webdav.request(cartridgePath, {
130
+ method: 'POST',
131
+ body: ZIP_BODY,
132
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
133
+ signal: AbortSignal.timeout(LONG_OPERATION_TIMEOUT_MS),
134
+ });
135
+ stopProgress();
136
+ if (!zipResponse.ok) {
137
+ const text = await zipResponse.text();
138
+ throw new Error(`Failed to create server-side zip: ${zipResponse.status} ${zipResponse.statusText} - ${text}`);
139
+ }
140
+ stopProgress = startProgress('downloading', onProgress);
141
+ const dlResponse = await webdav.request(zipPath, {
142
+ method: 'GET',
143
+ signal: AbortSignal.timeout(LONG_OPERATION_TIMEOUT_MS),
144
+ });
145
+ if (!dlResponse.ok) {
146
+ stopProgress();
147
+ throw new Error(`Failed to download zip: ${dlResponse.status} ${dlResponse.statusText}`);
148
+ }
149
+ const buffer = await dlResponse.arrayBuffer();
150
+ stopProgress();
151
+ logger.debug({ size: buffer.byteLength }, `Archive downloaded: ${buffer.byteLength} bytes`);
152
+ // Cleanup server-side zip (best effort)
153
+ onProgress?.({ phase: 'cleanup', elapsedSeconds: 0 });
154
+ try {
155
+ await webdav.delete(zipPath);
156
+ }
157
+ catch (error) {
158
+ logger.warn({ error, zipPath }, 'Failed to clean up server-side zip (non-fatal)');
159
+ }
160
+ // Extract
161
+ onProgress?.({ phase: 'extracting', elapsedSeconds: 0 });
162
+ const zip = await JSZip.loadAsync(buffer);
163
+ // Single cartridge ZIP contains: cartridgeName/relative/path...
164
+ await extractZip(zip, {
165
+ stripPrefix: 1,
166
+ outputDirectory: path.dirname(outputPath),
167
+ cartridgeName,
168
+ });
169
+ logger.debug({ cartridgeName, codeVersion }, `Downloaded cartridge ${cartridgeName}`);
170
+ }
14
171
  /**
15
172
  * Downloads cartridges from an instance via WebDAV.
16
173
  *
17
- * This function:
18
- * 1. Triggers server-side zipping of the code version
19
- * 2. Downloads the zip archive
20
- * 3. Cleans up the server-side zip (best-effort)
21
- * 4. Extracts cartridges locally with optional filtering
174
+ * When `include` specifies cartridges, each is downloaded individually using
175
+ * per-cartridge server-side zipping for efficiency. When downloading all
176
+ * cartridges (no include filter), the entire code version is zipped at once.
22
177
  *
23
178
  * If `instance.config.codeVersion` is not set, attempts to discover the active
24
179
  * code version via OCAPI. If that also fails, throws an error.
@@ -34,7 +189,7 @@ const LONG_OPERATION_TIMEOUT_MS = 600_000;
34
189
  * // Download all cartridges
35
190
  * const result = await downloadCartridges(instance, './output');
36
191
  *
37
- * // Download specific cartridges
192
+ * // Download specific cartridges (efficient per-cartridge download)
38
193
  * const result = await downloadCartridges(instance, './output', {
39
194
  * include: ['app_storefront_base'],
40
195
  * });
@@ -46,41 +201,28 @@ const LONG_OPERATION_TIMEOUT_MS = 600_000;
46
201
  */
47
202
  export async function downloadCartridges(instance, outputDirectory, options = {}) {
48
203
  const logger = getLogger();
49
- let codeVersion = instance.config.codeVersion;
50
- if (!codeVersion) {
51
- logger.debug('No code version configured, attempting to discover active version...');
52
- try {
53
- const activeVersion = await getActiveCodeVersion(instance);
54
- if (activeVersion?.id) {
55
- codeVersion = activeVersion.id;
56
- instance.config.codeVersion = codeVersion;
57
- }
58
- }
59
- catch (error) {
60
- logger.debug({ error }, 'Failed to discover active code version');
61
- }
62
- if (!codeVersion) {
63
- throw new Error('Code version required for download. Configure --code-version or ensure OAuth credentials are available for auto-discovery.');
204
+ const codeVersion = await resolveCodeVersion(instance);
205
+ const resolvedOutput = path.resolve(outputDirectory);
206
+ const { include, exclude, mirror, onProgress } = options;
207
+ // When specific cartridges are requested, download each individually
208
+ if (include?.length) {
209
+ const allExtracted = new Set();
210
+ for (const cartridgeName of include) {
211
+ if (exclude?.length && exclude.includes(cartridgeName))
212
+ continue;
213
+ const outputPath = mirror?.has(cartridgeName)
214
+ ? mirror.get(cartridgeName)
215
+ : path.join(resolvedOutput, cartridgeName);
216
+ await downloadSingleCartridge(instance, codeVersion, cartridgeName, outputPath, onProgress);
217
+ allExtracted.add(cartridgeName);
64
218
  }
219
+ const cartridgeList = [...allExtracted].sort();
220
+ return { cartridges: cartridgeList, codeVersion, outputDirectory: resolvedOutput };
65
221
  }
222
+ // Full code version download
66
223
  const webdav = instance.webdav;
67
224
  const zipPath = `Cartridges/${codeVersion}.zip`;
68
- const resolvedOutput = path.resolve(outputDirectory);
69
- const { onProgress } = options;
70
- // Progress helper: fires immediately (0s) then every 5s until stopped
71
- const PROGRESS_INTERVAL_MS = 5_000;
72
- function startProgress(phase) {
73
- const start = Date.now();
74
- onProgress?.({ phase, elapsedSeconds: 0 });
75
- if (!onProgress)
76
- return () => { };
77
- const interval = setInterval(() => {
78
- onProgress({ phase, elapsedSeconds: Math.round((Date.now() - start) / 1000) });
79
- }, PROGRESS_INTERVAL_MS);
80
- return () => clearInterval(interval);
81
- }
82
- // Step 1: Trigger server-side zip (can take several minutes for large code versions)
83
- let stopProgress = startProgress('zipping');
225
+ let stopProgress = startProgress('zipping', onProgress);
84
226
  logger.debug({ codeVersion }, 'Requesting server-side zip...');
85
227
  const zipResponse = await webdav.request(`Cartridges/${codeVersion}`, {
86
228
  method: 'POST',
@@ -96,8 +238,7 @@ export async function downloadCartridges(instance, outputDirectory, options = {}
96
238
  throw new Error(`Failed to create server-side zip: ${zipResponse.status} ${zipResponse.statusText} - ${text}`);
97
239
  }
98
240
  logger.debug('Server-side zip created');
99
- // Step 2: Download zip archive (can be large)
100
- stopProgress = startProgress('downloading');
241
+ stopProgress = startProgress('downloading', onProgress);
101
242
  logger.debug({ zipPath }, 'Downloading zip archive...');
102
243
  const downloadResponse = await webdav.request(zipPath, {
103
244
  method: 'GET',
@@ -110,7 +251,7 @@ export async function downloadCartridges(instance, outputDirectory, options = {}
110
251
  const buffer = await downloadResponse.arrayBuffer();
111
252
  stopProgress();
112
253
  logger.debug({ size: buffer.byteLength }, `Archive downloaded: ${buffer.byteLength} bytes`);
113
- // Step 3: Cleanup server-side zip (best-effort)
254
+ // Cleanup server-side zip (best-effort)
114
255
  onProgress?.({ phase: 'cleanup', elapsedSeconds: 0 });
115
256
  try {
116
257
  await webdav.delete(zipPath);
@@ -119,56 +260,17 @@ export async function downloadCartridges(instance, outputDirectory, options = {}
119
260
  catch (error) {
120
261
  logger.warn({ error, zipPath }, 'Failed to clean up server-side zip (non-fatal)');
121
262
  }
122
- // Step 4: Extract locally
263
+ // Extract
123
264
  onProgress?.({ phase: 'extracting', elapsedSeconds: 0 });
124
265
  logger.debug('Extracting archive...');
125
266
  const zip = await JSZip.loadAsync(buffer);
126
- const extractedCartridges = new Set();
127
- const { include, exclude, mirror } = options;
128
- const entries = Object.values(zip.files).filter((entry) => !entry.dir);
129
- for (const entry of entries) {
130
- const parts = entry.name.split('/');
131
- if (parts.length < 3) {
132
- continue;
133
- }
134
- // Format: {codeVersion}/{cartridgeName}/{relativePath...}
135
- parts.shift(); // remove codeVersion
136
- const cartridgeName = parts.shift();
137
- const relativePath = parts.join('/');
138
- // Apply filters
139
- if (include?.length && !include.includes(cartridgeName)) {
140
- continue;
141
- }
142
- if (exclude?.length && exclude.includes(cartridgeName)) {
143
- continue;
144
- }
145
- let targetPath;
146
- if (mirror?.has(cartridgeName)) {
147
- targetPath = path.join(mirror.get(cartridgeName), relativePath);
148
- }
149
- else {
150
- targetPath = path.join(resolvedOutput, cartridgeName, relativePath);
151
- }
152
- // Preserve existing file permissions
153
- let existingMode = null;
154
- try {
155
- const stat = await fs.promises.stat(targetPath);
156
- existingMode = stat.mode;
157
- }
158
- catch {
159
- // File doesn't exist yet
160
- }
161
- // Ensure parent directory exists
162
- await fs.promises.mkdir(path.dirname(targetPath), { recursive: true });
163
- // Write file
164
- const content = await entry.async('nodebuffer');
165
- await fs.promises.writeFile(targetPath, content);
166
- // Restore permissions if file existed
167
- if (existingMode !== null) {
168
- await fs.promises.chmod(targetPath, existingMode);
169
- }
170
- extractedCartridges.add(cartridgeName);
171
- }
267
+ // Full code version ZIP: {codeVersion}/{cartridgeName}/{relativePath...}
268
+ const extractedCartridges = await extractZip(zip, {
269
+ stripPrefix: 1,
270
+ outputDirectory: resolvedOutput,
271
+ mirror,
272
+ exclude,
273
+ });
172
274
  const cartridgeList = [...extractedCartridges].sort();
173
275
  logger.debug({ server: instance.config.hostname, codeVersion, cartridgeCount: cartridgeList.length }, `Downloaded ${cartridgeList.length} cartridge(s) from ${instance.config.hostname}`);
174
276
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"download.js","sourceRoot":"","sources":["../../../../src/operations/code/download.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../../../src/operations/code/download.ts"],"names":[],"mappings":"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"}
@@ -66,7 +66,9 @@ export { listCodeVersions, getActiveCodeVersion, activateCodeVersion, reloadCode
66
66
  export type { CodeVersion, CodeVersionResult } from './versions.js';
67
67
  export { findAndDeployCartridges, uploadCartridges, deleteCartridges } from './deploy.js';
68
68
  export type { DeployOptions, DeployResult, UploadOptions, UploadProgressInfo } from './deploy.js';
69
- export { downloadCartridges } from './download.js';
69
+ export { downloadCartridges, downloadSingleCartridge } from './download.js';
70
70
  export type { DownloadOptions, DownloadProgressInfo, DownloadResult } from './download.js';
71
+ export { uploadFiles, fileToCartridgePath } from './upload-files.js';
72
+ export type { FileChange, UploadFilesOptions } from './upload-files.js';
71
73
  export { watchCartridges } from './watch.js';
72
74
  export type { WatchOptions, WatchResult } from './watch.js';
@@ -72,7 +72,9 @@ export { listCodeVersions, getActiveCodeVersion, activateCodeVersion, reloadCode
72
72
  // Deployment
73
73
  export { findAndDeployCartridges, uploadCartridges, deleteCartridges } from './deploy.js';
74
74
  // Download
75
- export { downloadCartridges } from './download.js';
75
+ export { downloadCartridges, downloadSingleCartridge } from './download.js';
76
+ // File upload pipeline
77
+ export { uploadFiles, fileToCartridgePath } from './upload-files.js';
76
78
  // Watch
77
79
  export { watchCartridges } from './watch.js';
78
80
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/operations/code/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AAEH,sBAAsB;AACtB,OAAO,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAG/C,0BAA0B;AAC1B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,aAAa;AACb,OAAO,EAAC,uBAAuB,EAAE,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAGxF,WAAW;AACX,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC;AAGjD,QAAQ;AACR,OAAO,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/operations/code/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AAEH,sBAAsB;AACtB,OAAO,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAG/C,0BAA0B;AAC1B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,aAAa;AACb,OAAO,EAAC,uBAAuB,EAAE,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAGxF,WAAW;AACX,OAAO,EAAC,kBAAkB,EAAE,uBAAuB,EAAC,MAAM,eAAe,CAAC;AAG1E,uBAAuB;AACvB,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAC,MAAM,mBAAmB,CAAC;AAGnE,QAAQ;AACR,OAAO,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { B2CInstance } from '../../instance/index.js';
2
+ import type { CartridgeMapping } from './cartridges.js';
3
+ /**
4
+ * Represents a file to upload or delete, with source and destination paths.
5
+ */
6
+ export interface FileChange {
7
+ /** Absolute path to the file on disk */
8
+ src: string;
9
+ /** Cartridge-relative destination path (e.g. "cartridgeName/path/to/file.js") */
10
+ dest: string;
11
+ }
12
+ /**
13
+ * Callbacks for file upload/delete operations.
14
+ */
15
+ export interface UploadFilesOptions {
16
+ /** Called after files are successfully uploaded */
17
+ onUpload?: (files: string[]) => void;
18
+ /** Called after files are successfully deleted */
19
+ onDelete?: (files: string[]) => void;
20
+ /** Called when an error occurs */
21
+ onError?: (error: Error) => void;
22
+ }
23
+ /**
24
+ * Maps an absolute file path to its cartridge-relative destination.
25
+ *
26
+ * @param absolutePath - The absolute path to a file
27
+ * @param cartridges - The list of discovered cartridge mappings
28
+ * @returns The file change with src and dest, or undefined if the path is not inside any cartridge
29
+ */
30
+ export declare function fileToCartridgePath(absolutePath: string, cartridges: CartridgeMapping[]): FileChange | undefined;
31
+ /**
32
+ * Uploads and deletes files on an instance via WebDAV.
33
+ *
34
+ * This is the core batch-upload pipeline used by both `watchCartridges` and
35
+ * the VS Code extension. It:
36
+ * 1. Filters out non-existent upload files
37
+ * 2. Creates a ZIP archive of upload files
38
+ * 3. Uploads via WebDAV PUT and unzips on server
39
+ * 4. Deletes files (skipping any that were also uploaded in the same batch)
40
+ *
41
+ * @param instance - B2C instance to sync to
42
+ * @param codeVersion - Code version to deploy to
43
+ * @param uploads - Files to upload
44
+ * @param deletes - Files to delete
45
+ * @param options - Callbacks for upload/delete/error events
46
+ */
47
+ export declare function uploadFiles(instance: B2CInstance, codeVersion: string, uploads: FileChange[], deletes: FileChange[], options?: UploadFilesOptions): Promise<void>;
@@ -0,0 +1,116 @@
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
+ import path from 'node:path';
7
+ import fs from 'node:fs';
8
+ import JSZip from 'jszip';
9
+ import { getLogger } from '../../logging/logger.js';
10
+ const UNZIP_BODY = new URLSearchParams({ method: 'UNZIP' }).toString();
11
+ /**
12
+ * Maps an absolute file path to its cartridge-relative destination.
13
+ *
14
+ * @param absolutePath - The absolute path to a file
15
+ * @param cartridges - The list of discovered cartridge mappings
16
+ * @returns The file change with src and dest, or undefined if the path is not inside any cartridge
17
+ */
18
+ export function fileToCartridgePath(absolutePath, cartridges) {
19
+ const cartridge = cartridges.find((c) => absolutePath.startsWith(c.src));
20
+ if (!cartridge) {
21
+ return undefined;
22
+ }
23
+ const relativePath = absolutePath.substring(cartridge.src.length);
24
+ const destPath = path.join(cartridge.dest, relativePath);
25
+ return {
26
+ src: absolutePath,
27
+ dest: destPath,
28
+ };
29
+ }
30
+ /**
31
+ * Uploads and deletes files on an instance via WebDAV.
32
+ *
33
+ * This is the core batch-upload pipeline used by both `watchCartridges` and
34
+ * the VS Code extension. It:
35
+ * 1. Filters out non-existent upload files
36
+ * 2. Creates a ZIP archive of upload files
37
+ * 3. Uploads via WebDAV PUT and unzips on server
38
+ * 4. Deletes files (skipping any that were also uploaded in the same batch)
39
+ *
40
+ * @param instance - B2C instance to sync to
41
+ * @param codeVersion - Code version to deploy to
42
+ * @param uploads - Files to upload
43
+ * @param deletes - Files to delete
44
+ * @param options - Callbacks for upload/delete/error events
45
+ */
46
+ export async function uploadFiles(instance, codeVersion, uploads, deletes, options) {
47
+ const logger = getLogger();
48
+ const webdav = instance.webdav;
49
+ const webdavLocation = `Cartridges/${codeVersion}`;
50
+ const validUploadFiles = uploads.filter((f) => {
51
+ if (!fs.existsSync(f.src)) {
52
+ logger.debug({ file: f.src }, 'Skipping missing file');
53
+ return false;
54
+ }
55
+ return true;
56
+ });
57
+ if (validUploadFiles.length > 0) {
58
+ const uploadPath = `${webdavLocation}/_upload-${Date.now()}.zip`;
59
+ try {
60
+ const zip = new JSZip();
61
+ for (const f of validUploadFiles) {
62
+ try {
63
+ const content = await fs.promises.readFile(f.src);
64
+ zip.file(f.dest, content);
65
+ }
66
+ catch (error) {
67
+ logger.warn({ file: f.src, error }, 'Failed to add file to archive');
68
+ }
69
+ }
70
+ const buffer = await zip.generateAsync({
71
+ type: 'nodebuffer',
72
+ compression: 'DEFLATE',
73
+ compressionOptions: { level: 5 },
74
+ });
75
+ await webdav.put(uploadPath, buffer, 'application/zip');
76
+ logger.debug({ uploadPath }, 'Archive uploaded');
77
+ const response = await webdav.request(uploadPath, {
78
+ method: 'POST',
79
+ body: UNZIP_BODY,
80
+ headers: {
81
+ 'Content-Type': 'application/x-www-form-urlencoded',
82
+ },
83
+ });
84
+ if (!response.ok) {
85
+ throw new Error(`Unzip failed: ${response.status}`);
86
+ }
87
+ await webdav.delete(uploadPath);
88
+ logger.debug({ fileCount: validUploadFiles.length, server: instance.config.hostname }, `Uploaded ${validUploadFiles.length} file(s)`);
89
+ options?.onUpload?.(validUploadFiles.map((f) => f.dest));
90
+ }
91
+ catch (error) {
92
+ const err = error instanceof Error ? error : new Error(String(error));
93
+ logger.error({ error: err }, `Upload error: ${err.message}`);
94
+ options?.onError?.(err);
95
+ throw err;
96
+ }
97
+ }
98
+ // Skip deletes for any file that was also uploaded in this batch (disk state wins)
99
+ const uploadedPaths = new Set(validUploadFiles.map((f) => f.dest));
100
+ const filesToDeleteFiltered = deletes.filter((f) => !uploadedPaths.has(f.dest));
101
+ if (filesToDeleteFiltered.length > 0) {
102
+ logger.debug({ fileCount: filesToDeleteFiltered.length }, `Deleting ${filesToDeleteFiltered.length} file(s)`);
103
+ for (const f of filesToDeleteFiltered) {
104
+ const deletePath = `${webdavLocation}/${f.dest}`;
105
+ try {
106
+ await webdav.delete(deletePath);
107
+ logger.info({ path: deletePath }, `Deleted: ${deletePath}`);
108
+ }
109
+ catch (error) {
110
+ logger.debug({ path: deletePath, error }, `Failed to delete ${deletePath}`);
111
+ }
112
+ }
113
+ options?.onDelete?.(filesToDeleteFiltered.map((f) => f.dest));
114
+ }
115
+ }
116
+ //# sourceMappingURL=upload-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-files.js","sourceRoot":"","sources":["../../../../src/operations/code/upload-files.ts"],"names":[],"mappings":"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"}