@salesforce/source-deploy-retrieve 13.11.1 → 13.12.0-compute.6

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 (58) hide show
  1. package/lib/src/client/index.d.ts +1 -0
  2. package/lib/src/client/index.js.map +1 -1
  3. package/lib/src/client/metadataApiDeploy.d.ts +7 -0
  4. package/lib/src/client/metadataApiDeploy.js +24 -7
  5. package/lib/src/client/metadataApiDeploy.js.map +1 -1
  6. package/lib/src/client/metadataApiRetrieve.d.ts +7 -0
  7. package/lib/src/client/metadataApiRetrieve.js +23 -6
  8. package/lib/src/client/metadataApiRetrieve.js.map +1 -1
  9. package/lib/src/client/metadataTransfer.d.ts +3 -0
  10. package/lib/src/client/metadataTransfer.js +11 -1
  11. package/lib/src/client/metadataTransfer.js.map +1 -1
  12. package/lib/src/client/transports/computeAppTransport.d.ts +12 -0
  13. package/lib/src/client/transports/computeAppTransport.js +185 -0
  14. package/lib/src/client/transports/computeAppTransport.js.map +1 -0
  15. package/lib/src/client/transports/computeSourceBundle.d.ts +10 -0
  16. package/lib/src/client/transports/computeSourceBundle.js +293 -0
  17. package/lib/src/client/transports/computeSourceBundle.js.map +1 -0
  18. package/lib/src/client/transports/index.d.ts +2 -0
  19. package/lib/src/client/transports/index.js +18 -0
  20. package/lib/src/client/transports/index.js.map +1 -0
  21. package/lib/src/client/transports/transportCoordinator.d.ts +20 -0
  22. package/lib/src/client/transports/transportCoordinator.js +82 -0
  23. package/lib/src/client/transports/transportCoordinator.js.map +1 -0
  24. package/lib/src/client/transports/transportPipeline.d.ts +55 -0
  25. package/lib/src/client/transports/transportPipeline.js +189 -0
  26. package/lib/src/client/transports/transportPipeline.js.map +1 -0
  27. package/lib/src/client/transports/types.d.ts +45 -0
  28. package/lib/src/client/transports/types.js +18 -0
  29. package/lib/src/client/transports/types.js.map +1 -0
  30. package/lib/src/client/types.d.ts +8 -0
  31. package/lib/src/collections/componentSet.d.ts +9 -0
  32. package/lib/src/collections/componentSet.js +130 -1
  33. package/lib/src/collections/componentSet.js.map +1 -1
  34. package/lib/src/convert/convertContext/convertContext.js.map +1 -1
  35. package/lib/src/convert/transformers/computeAppMetadataTransformer.d.ts +18 -0
  36. package/lib/src/convert/transformers/computeAppMetadataTransformer.js +67 -0
  37. package/lib/src/convert/transformers/computeAppMetadataTransformer.js.map +1 -0
  38. package/lib/src/convert/transformers/metadataTransformerFactory.js +3 -0
  39. package/lib/src/convert/transformers/metadataTransformerFactory.js.map +1 -1
  40. package/lib/src/index.d.ts +1 -1
  41. package/lib/src/index.js.map +1 -1
  42. package/lib/src/registry/metadataRegistry.json +25 -1
  43. package/lib/src/registry/types.d.ts +5 -2
  44. package/lib/src/registry/types.js +2 -0
  45. package/lib/src/registry/types.js.map +1 -1
  46. package/lib/src/resolve/adapters/computeAppSourceAdapter.d.ts +28 -0
  47. package/lib/src/resolve/adapters/computeAppSourceAdapter.js +75 -0
  48. package/lib/src/resolve/adapters/computeAppSourceAdapter.js.map +1 -0
  49. package/lib/src/resolve/adapters/index.d.ts +1 -0
  50. package/lib/src/resolve/adapters/index.js +3 -1
  51. package/lib/src/resolve/adapters/index.js.map +1 -1
  52. package/lib/src/resolve/adapters/sourceAdapterFactory.js +3 -0
  53. package/lib/src/resolve/adapters/sourceAdapterFactory.js.map +1 -1
  54. package/lib/src/resolve/metadataResolver.js +1 -1
  55. package/lib/src/resolve/metadataResolver.js.map +1 -1
  56. package/lib/src/utils/filePathGenerator.js +4 -5
  57. package/lib/src/utils/filePathGenerator.js.map +1 -1
  58. package/package.json +4 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transportCoordinator.js","sourceRoot":"","sources":["../../../../src/client/transports/transportCoordinator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,iEAA8D;AAC9D,oCAAyC;AAEzC,gEAAwD;AAOxD,MAAa,oBAAoB;IAUZ;IACA;IACA;IACA;IAZX,qBAAqB,GAA4B;QACvD,aAAa,EAAE,EAAE;QACjB,YAAY,EAAE,EAAE;QAChB,gBAAgB,EAAE,EAAE;KACrB,CAAC;IACe,WAAW,GAAG,IAAI,OAAO,EAAmB,CAAC;IAC7C,YAAY,GAAG,IAAI,OAAO,EAAmB,CAAC;IAE/D,YACmB,QAA2B,EAC3B,MAAwB,EACxB,OAAyB,EACzB,SAA6B;QAH7B,aAAQ,GAAR,QAAQ,CAAmB;QAC3B,WAAM,GAAN,MAAM,CAAkB;QACxB,YAAO,GAAP,OAAO,CAAkB;QACzB,cAAS,GAAT,SAAS,CAAoB;IAC7C,CAAC;IAEG,KAAK,CAAC,iBAAiB;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAChG,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC;IACtC,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,MAAuB,EAAE,MAAqB;QACvE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC7B,MAAM,CAAC,mBAAmB,CACxB,IAAI,CAAC,qBAAqB,CAAC,aAAa,EACxC,IAAI,CAAC,qBAAqB,CAAC,YAAY,EACvC,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAC5C,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,KAAK,qBAAa,CAAC,SAAS;YAAE,OAAO;QAC/C,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE9B,IAAI,IAAI,CAAC,SAAS,KAAK,UAAU,IAAI,MAAM,YAAY,oCAAc,EAAE,CAAC;YACtE,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,OAAO,EAAE,CAAC;YACpE,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC,CAC1F,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,KAAK,CAAC,UAAU;qBACb,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,2BAAY,CAAC,QAAQ,CAAC;qBACnE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC,CACtE,CAAC;gBACF,yFAAyF;gBACzF,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;oBACxD,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;oBAC3D,IAAI,SAAS,CAAC,QAAQ,KAAK,2BAAY,CAAC,QAAQ;wBAAE,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC;oBAChG,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE;wBACpC,MAAM,YAAY,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;wBACpE,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;4BAAE,OAAO,KAAK,CAAC;wBACzF,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;wBACxB,OAAO,IAAI,CAAC;oBACd,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1E,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACxG,MAAM,CAAC,mBAAmB,CACxB,oBAAoB,CAAC,aAAa,EAClC,oBAAoB,CAAC,YAAY,EACjC,oBAAoB,CAAC,gBAAgB,CACtC,CAAC;IACJ,CAAC;CACF;AAnED,oDAmEC"}
@@ -0,0 +1,55 @@
1
+ import type { DestructiveChangesType } from '../../collections/types';
2
+ import { TransportName } from '../../registry/types';
3
+ import { SourceComponent } from '../../resolve/sourceComponent';
4
+ import { FileResponse } from '../types';
5
+ import { AsyncTransportHandle, TransportContext, TransportOperationResult, TransportProvider } from './types';
6
+ export type TransportGroup = {
7
+ transport: TransportProvider;
8
+ components: SourceComponent[];
9
+ };
10
+ export type GroupedComponents = {
11
+ metadataApi: SourceComponent[];
12
+ transports: TransportGroup[];
13
+ };
14
+ export type TransportPlan = {
15
+ phases: TransportPlanPhase[];
16
+ };
17
+ export type TransportPlanPhase = {
18
+ phase: 'before-metadata' | 'metadata-api' | 'after-metadata';
19
+ label: string;
20
+ endpoint: string;
21
+ components: TransportPlanComponent[];
22
+ };
23
+ export type TransportPlanComponent = {
24
+ fullName: string;
25
+ type: string;
26
+ /** Set when the component is deleted by the metadata API instead of deployed. */
27
+ destructiveChangesType?: DestructiveChangesType;
28
+ };
29
+ export type TransportPipelineResult = {
30
+ fileResponses: FileResponse[];
31
+ asyncHandles: AsyncTransportHandle[];
32
+ operationResults: TransportOperationResult[];
33
+ };
34
+ export type TransportStageEvent = {
35
+ transportName: TransportName;
36
+ label: string;
37
+ operation: 'deploy' | 'retrieve';
38
+ stage: 'start' | 'complete' | 'error';
39
+ componentCount: number;
40
+ componentNames: string[];
41
+ errorMessage?: string;
42
+ };
43
+ export declare class TransportPipeline {
44
+ private readonly transports;
45
+ private readonly logger;
46
+ constructor(transports?: TransportProvider[]);
47
+ static withBuiltinTransports(): TransportPipeline;
48
+ groupByTransport(components: SourceComponent[]): GroupedComponents;
49
+ explain(components: SourceComponent[], operation?: 'deploy' | 'retrieve'): TransportPlan;
50
+ runBeforeMetadata(context: TransportContext, groups: TransportGroup[], operation?: 'deploy' | 'retrieve'): Promise<TransportPipelineResult>;
51
+ runAfterMetadata(context: TransportContext, groups: TransportGroup[], operation?: 'deploy' | 'retrieve'): Promise<TransportPipelineResult>;
52
+ hasTransports(components: SourceComponent[]): boolean;
53
+ private findTransportFor;
54
+ private runTransportGroups;
55
+ }
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2026, Salesforce, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.TransportPipeline = void 0;
19
+ const core_1 = require("@salesforce/core");
20
+ const computeAppTransport_1 = require("./computeAppTransport");
21
+ class TransportPipeline {
22
+ transports = [];
23
+ logger;
24
+ constructor(transports) {
25
+ this.logger = core_1.Logger.childFromRoot('TransportPipeline');
26
+ if (transports) {
27
+ this.transports.push(...transports);
28
+ }
29
+ }
30
+ static withBuiltinTransports() {
31
+ return new TransportPipeline([new computeAppTransport_1.ComputeAppTransport()]);
32
+ }
33
+ groupByTransport(components) {
34
+ const metadataApi = [];
35
+ const transportMap = new Map();
36
+ for (const component of components) {
37
+ // deletions only go through MDAPI destructive changes; transports never see them
38
+ const transport = component.isMarkedForDelete() ? undefined : this.findTransportFor(component);
39
+ if (transport) {
40
+ let group = transportMap.get(transport.name);
41
+ if (!group) {
42
+ group = { transport, components: [] };
43
+ transportMap.set(transport.name, group);
44
+ }
45
+ group.components.push(component);
46
+ }
47
+ // all components go through metadata api — transport components
48
+ // also have metadata portions (.computeApp-meta.xml) that need MDAPI
49
+ metadataApi.push(component);
50
+ }
51
+ return {
52
+ metadataApi,
53
+ transports: [...transportMap.values()],
54
+ };
55
+ }
56
+ explain(components, operation = 'deploy') {
57
+ const { metadataApi, transports } = this.groupByTransport(components);
58
+ const phases = [];
59
+ const beforeMetadata = transports.filter((group) => getStep(group.transport, operation, 'before') !== undefined);
60
+ const afterMetadata = transports.filter((group) => getStep(group.transport, operation, 'after') !== undefined);
61
+ for (const group of beforeMetadata) {
62
+ const desc = group.transport.describe();
63
+ phases.push({
64
+ phase: 'before-metadata',
65
+ label: desc.label,
66
+ endpoint: desc.endpoint,
67
+ components: group.components.map(toPlanComponent),
68
+ });
69
+ }
70
+ phases.push({
71
+ phase: 'metadata-api',
72
+ label: 'Metadata API',
73
+ endpoint: 'SOAP/REST',
74
+ components: metadataApi.map(toPlanComponent),
75
+ });
76
+ for (const group of afterMetadata) {
77
+ const desc = group.transport.describe();
78
+ phases.push({
79
+ phase: 'after-metadata',
80
+ label: desc.label,
81
+ endpoint: desc.endpoint,
82
+ components: group.components.map(toPlanComponent),
83
+ });
84
+ }
85
+ return { phases };
86
+ }
87
+ async runBeforeMetadata(context, groups, operation = 'deploy') {
88
+ return this.runTransportGroups(groups, context, operation, 'before');
89
+ }
90
+ async runAfterMetadata(context, groups, operation = 'deploy') {
91
+ return this.runTransportGroups(groups, context, operation, 'after');
92
+ }
93
+ hasTransports(components) {
94
+ return components.some((component) => !component.isMarkedForDelete() && this.findTransportFor(component) !== undefined);
95
+ }
96
+ findTransportFor(component) {
97
+ const transportName = component.type.strategies?.transport;
98
+ if (!transportName)
99
+ return undefined;
100
+ const transport = this.transports.find((candidate) => candidate.name === transportName);
101
+ if (!transport) {
102
+ throw new core_1.SfError(`No transport provider is registered for '${transportName}' required by ${component.type.name}.`, 'MissingTransportProvider');
103
+ }
104
+ return transport;
105
+ }
106
+ async runTransportGroups(groups, context, operation, timing) {
107
+ const allFileResponses = [];
108
+ const allAsyncHandles = [];
109
+ const allOperationResults = [];
110
+ const lifecycle = core_1.Lifecycle.getInstance();
111
+ for (const group of groups) {
112
+ const step = getStep(group.transport, operation, timing);
113
+ if (!step)
114
+ continue;
115
+ this.logger.debug(`Running transport '${group.transport.name}' (${operation}) for ${group.components.length} component(s)`);
116
+ const desc = group.transport.describe();
117
+ const componentNames = group.components.map((c) => c.fullName);
118
+ const eventBase = {
119
+ transportName: group.transport.name,
120
+ label: desc.label,
121
+ operation,
122
+ componentCount: group.components.length,
123
+ componentNames,
124
+ };
125
+ // eslint-disable-next-line no-await-in-loop
126
+ await lifecycle.emit('transportStage', { ...eventBase, stage: 'start' });
127
+ const transportContext = {
128
+ ...context,
129
+ components: group.components,
130
+ };
131
+ try {
132
+ // eslint-disable-next-line no-await-in-loop
133
+ const result = await step(transportContext);
134
+ allFileResponses.push(...result.fileResponses);
135
+ if (result.asyncResult) {
136
+ allAsyncHandles.push(result.asyncResult);
137
+ }
138
+ allOperationResults.push(...(result.operationResults ?? []));
139
+ // eslint-disable-next-line no-await-in-loop
140
+ await lifecycle.emit('transportStage', { ...eventBase, stage: 'complete' });
141
+ }
142
+ catch (err) {
143
+ try {
144
+ // eslint-disable-next-line no-await-in-loop
145
+ await lifecycle.emit('transportStage', {
146
+ ...eventBase,
147
+ stage: 'error',
148
+ errorMessage: err.message,
149
+ });
150
+ }
151
+ catch {
152
+ /* don't mask the transport error */
153
+ }
154
+ throw err;
155
+ }
156
+ }
157
+ return { fileResponses: allFileResponses, asyncHandles: allAsyncHandles, operationResults: allOperationResults };
158
+ }
159
+ }
160
+ exports.TransportPipeline = TransportPipeline;
161
+ function toPlanComponent(component) {
162
+ const destructiveChangesType = component.getDestructiveChangesType();
163
+ return {
164
+ fullName: component.fullName,
165
+ type: component.type.name,
166
+ ...(component.isMarkedForDelete() && destructiveChangesType ? { destructiveChangesType } : {}),
167
+ };
168
+ }
169
+ function getStep(transport, operation, timing) {
170
+ if (operation === 'deploy' && timing === 'before') {
171
+ return transport.beforeDeploy
172
+ ? async (context) => transport.beforeDeploy(context)
173
+ : undefined;
174
+ }
175
+ if (operation === 'deploy') {
176
+ return transport.afterDeploy
177
+ ? async (context) => transport.afterDeploy(context)
178
+ : undefined;
179
+ }
180
+ if (timing === 'before') {
181
+ return transport.beforeRetrieve
182
+ ? async (context) => transport.beforeRetrieve(context)
183
+ : undefined;
184
+ }
185
+ return transport.afterRetrieve
186
+ ? async (context) => transport.afterRetrieve(context)
187
+ : undefined;
188
+ }
189
+ //# sourceMappingURL=transportPipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transportPipeline.js","sourceRoot":"","sources":["../../../../src/client/transports/transportPipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { Connection, SfProject } from '@salesforce/core';
2
+ import { TransportName } from '../../registry/types';
3
+ import { SourceComponent } from '../../resolve/sourceComponent';
4
+ import { FileResponse, PackageOptions } from '../types';
5
+ export type TransportStatus = 'Pending' | 'InProgress' | 'Succeeded' | 'Failed' | 'Unknown';
6
+ export type TransportDescription = {
7
+ label: string;
8
+ endpoint: string;
9
+ };
10
+ export type TransportContext = {
11
+ components: SourceComponent[];
12
+ connection: Connection;
13
+ project: SfProject;
14
+ orgId: string;
15
+ output?: string;
16
+ packageOptions?: PackageOptions;
17
+ /** Package name for each manifest-only transport member (`type#fullName`). */
18
+ transportPackageNames?: Record<string, string>;
19
+ };
20
+ export type TransportResult = {
21
+ fileResponses: FileResponse[];
22
+ asyncResult?: AsyncTransportHandle;
23
+ operationResults?: TransportOperationResult[];
24
+ };
25
+ export type TransportOperationResult = {
26
+ transportLabel: string;
27
+ operation: string;
28
+ status: TransportStatus;
29
+ message?: string;
30
+ };
31
+ export type AsyncTransportHandle = {
32
+ transportName: TransportName;
33
+ status: TransportStatus;
34
+ message?: string;
35
+ checkStatus(): Promise<AsyncTransportHandle>;
36
+ };
37
+ export type TransportProvider = {
38
+ readonly name: TransportName;
39
+ describe(): TransportDescription;
40
+ handles(component: SourceComponent): boolean;
41
+ beforeDeploy?(context: TransportContext): Promise<TransportResult>;
42
+ afterDeploy?(context: TransportContext): Promise<TransportResult>;
43
+ beforeRetrieve?(context: TransportContext): Promise<TransportResult>;
44
+ afterRetrieve?(context: TransportContext): Promise<TransportResult>;
45
+ };
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2026, Salesforce, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/client/transports/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG"}
@@ -359,5 +359,13 @@ export type BotVersionFilter = {
359
359
  export type MetadataApiRetrieveOptions = MetadataTransferOptions & RetrieveOptions & {
360
360
  registry?: RegistryAccess;
361
361
  botVersionFilters?: BotVersionFilter[];
362
+ /**
363
+ * Metadata type names whose transports should be skipped (e.g., `['ComputeApp']`).
364
+ * Components of these types will still be retrieved via the Metadata API but their
365
+ * secondary transport (Connect API, presigned URL, etc.) will not run.
366
+ */
367
+ skipTransports?: string[];
368
+ /** Explicit package association for manifest-only transport members, keyed by `type#fullName`. */
369
+ transportPackageNames?: Record<string, string>;
362
370
  };
363
371
  export {};
@@ -1,6 +1,7 @@
1
1
  import { MetadataApiDeploy, MetadataApiDeployOptions } from '../client/metadataApiDeploy';
2
2
  import { MetadataApiRetrieve } from '../client/metadataApiRetrieve';
3
3
  import type { MetadataApiRetrieveOptions } from '../client/types';
4
+ import { TransportPipeline } from '../client/transports/transportPipeline';
4
5
  import { SourceComponent } from '../resolve/sourceComponent';
5
6
  import { ComponentLike, MetadataComponent, MetadataMember } from '../resolve/types';
6
7
  import { RegistryAccess } from '../registry/registryAccess';
@@ -42,6 +43,8 @@ export declare class ComponentSet extends LazyCollection<MetadataComponent> {
42
43
  botName: string;
43
44
  versionFilter: 'all' | 'highest' | number;
44
45
  }>;
46
+ private manualTransportPipeline?;
47
+ private hasManualPipeline;
45
48
  private logger;
46
49
  private readonly registry;
47
50
  private components;
@@ -60,6 +63,8 @@ export declare class ComponentSet extends LazyCollection<MetadataComponent> {
60
63
  get size(): number;
61
64
  get destructiveChangesPre(): DecodeableMap<string, DecodeableMap<string, SourceComponent>>;
62
65
  get destructiveChangesPost(): DecodeableMap<string, DecodeableMap<string, SourceComponent>>;
66
+ get transportPipeline(): TransportPipeline | undefined;
67
+ set transportPipeline(pipeline: TransportPipeline | undefined);
63
68
  /**
64
69
  * Resolve metadata components from a file or directory path in a file system.
65
70
  *
@@ -206,6 +211,10 @@ export declare class ComponentSet extends LazyCollection<MetadataComponent> {
206
211
  * @return DestructiveChangesType[]
207
212
  */
208
213
  getTypesOfDestructiveChanges(): DestructiveChangesType[];
214
+ private deployWithPipeline;
215
+ private retrieveWithPipeline;
216
+ private getManifestSourceComponents;
217
+ private hasTransportEligibleTypes;
209
218
  /**
210
219
  * Returns an API version to use as the value of the `version` field
211
220
  * in a manifest (package.xml) for MDAPI calls in the following order
@@ -23,6 +23,8 @@ const ts_types_1 = require("@salesforce/ts-types");
23
23
  const decomposed_1 = require("../utils/decomposed");
24
24
  const metadataApiDeploy_1 = require("../client/metadataApiDeploy");
25
25
  const metadataApiRetrieve_1 = require("../client/metadataApiRetrieve");
26
+ const transportPipeline_1 = require("../client/transports/transportPipeline");
27
+ const transportCoordinator_1 = require("../client/transports/transportCoordinator");
26
28
  const constants_1 = require("../common/constants");
27
29
  const sourceComponent_1 = require("../resolve/sourceComponent");
28
30
  const metadataResolver_1 = require("../resolve/metadataResolver");
@@ -66,6 +68,8 @@ class ComponentSet extends lazyCollection_1.LazyCollection {
66
68
  fullName;
67
69
  forceIgnoredPaths;
68
70
  botVersionFilters;
71
+ manualTransportPipeline;
72
+ hasManualPipeline = false;
69
73
  logger;
70
74
  registry;
71
75
  // all components stored here, regardless of what manifest they belong to
@@ -112,6 +116,15 @@ class ComponentSet extends lazyCollection_1.LazyCollection {
112
116
  get destructiveChangesPost() {
113
117
  return this.destructiveComponents[types_1.DestructiveChangesType.POST];
114
118
  }
119
+ get transportPipeline() {
120
+ if (this.hasManualPipeline)
121
+ return this.manualTransportPipeline;
122
+ return this.hasTransportEligibleTypes() ? transportPipeline_1.TransportPipeline.withBuiltinTransports() : undefined;
123
+ }
124
+ set transportPipeline(pipeline) {
125
+ this.manualTransportPipeline = pipeline;
126
+ this.hasManualPipeline = true;
127
+ }
115
128
  static fromSource(input) {
116
129
  const parseFromSourceInputs = (given) => {
117
130
  if (Array.isArray(given)) {
@@ -268,6 +281,10 @@ class ComponentSet extends lazyCollection_1.LazyCollection {
268
281
  options.usernameOrConnection.setApiVersion(this.apiVersion);
269
282
  this.logger.debug(`Received conflicting apiVersion values for deploy. Using option=${this.apiVersion}, Ignoring apiVersion on connection=${options.usernameOrConnection.version}.`);
270
283
  }
284
+ const pipeline = options.apiOptions?.checkOnly ? undefined : this.transportPipeline;
285
+ if (pipeline?.hasTransports(toDeploy)) {
286
+ return this.deployWithPipeline(options, toDeploy, pipeline);
287
+ }
271
288
  const operationOptions = Object.assign({}, options, {
272
289
  components: this,
273
290
  registry: this.registry,
@@ -298,6 +315,21 @@ class ComponentSet extends lazyCollection_1.LazyCollection {
298
315
  options.usernameOrConnection.setApiVersion(this.apiVersion);
299
316
  this.logger.debug(`Received conflicting apiVersion values for retrieve. Using option=${this.apiVersion}, Ignoring apiVersion on connection=${options.usernameOrConnection.version}.`);
300
317
  }
318
+ if (options.format !== 'metadata') {
319
+ const sourceComponents = this.getSourceComponents().toArray();
320
+ const sourceMembers = new Set(sourceComponents.map((component) => `${component.type.name}#${component.fullName}`));
321
+ const selected = this.getManifestSourceComponents().filter((component) => !sourceMembers.has(`${component.type.name}#${component.fullName}`));
322
+ const skipped = new Set(options.skipTransports);
323
+ const transportComponents = [...selected, ...sourceComponents].filter((component) => !skipped.has(component.type.name));
324
+ if (transportComponents.length > 0) {
325
+ const pipeline = transportComponents.some((component) => component.type.strategies?.transport)
326
+ ? this.transportPipeline
327
+ : undefined;
328
+ if (pipeline?.hasTransports(transportComponents)) {
329
+ return this.retrieveWithPipeline(operationOptions, transportComponents, pipeline);
330
+ }
331
+ }
332
+ }
301
333
  const mdapiRetrieve = new metadataApiRetrieve_1.MetadataApiRetrieve(operationOptions);
302
334
  await mdapiRetrieve.start();
303
335
  return mdapiRetrieve;
@@ -569,6 +601,102 @@ class ComponentSet extends lazyCollection_1.LazyCollection {
569
601
  }
570
602
  return destructiveChangesTypes;
571
603
  }
604
+ async deployWithPipeline(options, components, pipeline) {
605
+ const { transports } = pipeline.groupByTransport(components);
606
+ const connection = typeof options.usernameOrConnection === 'string'
607
+ ? await core_1.Connection.create({ authInfo: await core_1.AuthInfo.create({ username: options.usernameOrConnection }) })
608
+ : options.usernameOrConnection;
609
+ if (typeof options.usernameOrConnection === 'string' && this.apiVersion && this.apiVersion !== connection.version) {
610
+ connection.setApiVersion(this.apiVersion);
611
+ }
612
+ const transportContext = {
613
+ components,
614
+ connection,
615
+ project: await core_1.SfProject.resolve(this.projectDirectory),
616
+ orgId: connection.getAuthInfoFields().orgId ?? '',
617
+ };
618
+ const coordinator = new transportCoordinator_1.TransportCoordinator(pipeline, transports, transportContext, 'deploy');
619
+ await coordinator.runBeforeMetadata();
620
+ const operationOptions = Object.assign({}, options, {
621
+ components: this,
622
+ registry: this.registry,
623
+ apiVersion: this.apiVersion,
624
+ });
625
+ const mdapiDeploy = new metadataApiDeploy_1.MetadataApiDeploy(operationOptions);
626
+ mdapiDeploy.addResultProcessor((result, status) => coordinator.processResult(result, status.status));
627
+ await mdapiDeploy.start();
628
+ return mdapiDeploy;
629
+ }
630
+ async retrieveWithPipeline(operationOptions, components, pipeline) {
631
+ const { transports } = pipeline.groupByTransport(components);
632
+ const connection = typeof operationOptions.usernameOrConnection === 'string'
633
+ ? await core_1.Connection.create({
634
+ authInfo: await core_1.AuthInfo.create({ username: operationOptions.usernameOrConnection }),
635
+ })
636
+ : operationOptions.usernameOrConnection;
637
+ if (typeof operationOptions.usernameOrConnection === 'string' &&
638
+ this.apiVersion &&
639
+ this.apiVersion !== connection.version) {
640
+ connection.setApiVersion(this.apiVersion);
641
+ }
642
+ const transportContext = {
643
+ components,
644
+ connection,
645
+ project: await core_1.SfProject.resolve(this.projectDirectory),
646
+ orgId: connection.getAuthInfoFields().orgId ?? '',
647
+ output: operationOptions.output,
648
+ packageOptions: operationOptions.packageOptions,
649
+ transportPackageNames: operationOptions.transportPackageNames,
650
+ };
651
+ const coordinator = new transportCoordinator_1.TransportCoordinator(pipeline, transports, transportContext, 'retrieve');
652
+ await coordinator.runBeforeMetadata();
653
+ const mdapiRetrieve = new metadataApiRetrieve_1.MetadataApiRetrieve(operationOptions);
654
+ mdapiRetrieve.addResultProcessor((result, status) => coordinator.processResult(result, status.status));
655
+ await mdapiRetrieve.start();
656
+ return mdapiRetrieve;
657
+ }
658
+ getManifestSourceComponents() {
659
+ const seen = new Set();
660
+ const results = [];
661
+ for (const component of this) {
662
+ if (!(component instanceof sourceComponent_1.SourceComponent) && component.type.strategies?.transport) {
663
+ const key = `${component.type.name}#${component.fullName}`;
664
+ if (!seen.has(key)) {
665
+ seen.add(key);
666
+ results.push(new sourceComponent_1.SourceComponent({ type: component.type, name: component.fullName }));
667
+ }
668
+ }
669
+ }
670
+ for (const [, members] of this.manifestComponents) {
671
+ for (const [, comp] of members) {
672
+ const key = `${comp.type.name}#${comp.fullName}`;
673
+ if (!seen.has(key)) {
674
+ seen.add(key);
675
+ results.push(comp);
676
+ }
677
+ }
678
+ }
679
+ return results;
680
+ }
681
+ hasTransportEligibleTypes() {
682
+ for (const comp of this.getSourceComponents()) {
683
+ if (comp.type.strategies?.transport)
684
+ return true;
685
+ }
686
+ for (const component of this) {
687
+ if (component.type.strategies?.transport)
688
+ return true;
689
+ }
690
+ // Also check manifestComponents for components without local source
691
+ // (e.g., -m retrieves where the component doesn't exist on disk yet)
692
+ for (const [, members] of this.manifestComponents) {
693
+ for (const [, comp] of members) {
694
+ if (comp.type.strategies?.transport)
695
+ return true;
696
+ }
697
+ }
698
+ return false;
699
+ }
572
700
  /**
573
701
  * Returns an API version to use as the value of the `version` field
574
702
  * in a manifest (package.xml) for MDAPI calls in the following order
@@ -612,7 +740,8 @@ class ComponentSet extends lazyCollection_1.LazyCollection {
612
740
  this.logger.warn(messages.getMessage('missingApiVersion'));
613
741
  }
614
742
  }
615
- return version;
743
+ const hasComputeApp = Array.from(this).some((component) => component.type.name === 'ComputeApp');
744
+ return hasComputeApp && +version < 68 ? '68.0' : version;
616
745
  }
617
746
  }
618
747
  exports.ComponentSet = ComponentSet;