@salesforce/source-deploy-retrieve 13.7.0 → 13.7.1-compute.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/src/client/index.d.ts +1 -0
- package/lib/src/client/index.js.map +1 -1
- package/lib/src/client/metadataApiDeploy.d.ts +7 -0
- package/lib/src/client/metadataApiDeploy.js +24 -7
- package/lib/src/client/metadataApiDeploy.js.map +1 -1
- package/lib/src/client/metadataApiRetrieve.d.ts +7 -0
- package/lib/src/client/metadataApiRetrieve.js +25 -6
- package/lib/src/client/metadataApiRetrieve.js.map +1 -1
- package/lib/src/client/metadataTransfer.d.ts +3 -0
- package/lib/src/client/metadataTransfer.js +11 -1
- package/lib/src/client/metadataTransfer.js.map +1 -1
- package/lib/src/client/transports/computeSourceBundle.d.ts +10 -0
- package/lib/src/client/transports/computeSourceBundle.js +276 -0
- package/lib/src/client/transports/computeSourceBundle.js.map +1 -0
- package/lib/src/client/transports/herokuComputeTransport.d.ts +12 -0
- package/lib/src/client/transports/herokuComputeTransport.js +168 -0
- package/lib/src/client/transports/herokuComputeTransport.js.map +1 -0
- package/lib/src/client/transports/index.d.ts +1 -0
- package/lib/src/client/transports/index.js +18 -0
- package/lib/src/client/transports/index.js.map +1 -0
- package/lib/src/client/transports/transportCoordinator.d.ts +20 -0
- package/lib/src/client/transports/transportCoordinator.js +67 -0
- package/lib/src/client/transports/transportCoordinator.js.map +1 -0
- package/lib/src/client/transports/transportPipeline.d.ts +51 -0
- package/lib/src/client/transports/transportPipeline.js +180 -0
- package/lib/src/client/transports/transportPipeline.js.map +1 -0
- package/lib/src/client/transports/types.d.ts +45 -0
- package/lib/src/client/transports/types.js +18 -0
- package/lib/src/client/transports/types.js.map +1 -0
- package/lib/src/client/types.d.ts +8 -0
- package/lib/src/collections/componentSet.d.ts +9 -0
- package/lib/src/collections/componentSet.js +130 -1
- package/lib/src/collections/componentSet.js.map +1 -1
- package/lib/src/index.d.ts +1 -1
- package/lib/src/index.js.map +1 -1
- package/lib/src/registry/metadataRegistry.json +14 -0
- package/lib/src/registry/types.d.ts +2 -0
- package/package.json +5 -2
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { TransportName } from '../../registry/types';
|
|
2
|
+
import { SourceComponent } from '../../resolve/sourceComponent';
|
|
3
|
+
import { FileResponse } from '../types';
|
|
4
|
+
import { AsyncTransportHandle, TransportContext, TransportOperationResult, TransportProvider } from './types';
|
|
5
|
+
export type TransportGroup = {
|
|
6
|
+
transport: TransportProvider;
|
|
7
|
+
components: SourceComponent[];
|
|
8
|
+
};
|
|
9
|
+
export type GroupedComponents = {
|
|
10
|
+
metadataApi: SourceComponent[];
|
|
11
|
+
transports: TransportGroup[];
|
|
12
|
+
};
|
|
13
|
+
export type TransportPlan = {
|
|
14
|
+
phases: TransportPlanPhase[];
|
|
15
|
+
};
|
|
16
|
+
export type TransportPlanPhase = {
|
|
17
|
+
phase: 'before-metadata' | 'metadata-api' | 'after-metadata';
|
|
18
|
+
label: string;
|
|
19
|
+
endpoint: string;
|
|
20
|
+
components: Array<{
|
|
21
|
+
fullName: string;
|
|
22
|
+
type: string;
|
|
23
|
+
}>;
|
|
24
|
+
};
|
|
25
|
+
export type TransportPipelineResult = {
|
|
26
|
+
fileResponses: FileResponse[];
|
|
27
|
+
asyncHandles: AsyncTransportHandle[];
|
|
28
|
+
operationResults: TransportOperationResult[];
|
|
29
|
+
};
|
|
30
|
+
export type TransportStageEvent = {
|
|
31
|
+
transportName: TransportName;
|
|
32
|
+
label: string;
|
|
33
|
+
operation: 'deploy' | 'retrieve';
|
|
34
|
+
stage: 'start' | 'complete' | 'error';
|
|
35
|
+
componentCount: number;
|
|
36
|
+
componentNames: string[];
|
|
37
|
+
errorMessage?: string;
|
|
38
|
+
};
|
|
39
|
+
export declare class TransportPipeline {
|
|
40
|
+
private readonly transports;
|
|
41
|
+
private readonly logger;
|
|
42
|
+
constructor(transports?: TransportProvider[]);
|
|
43
|
+
static withBuiltinTransports(): TransportPipeline;
|
|
44
|
+
groupByTransport(components: SourceComponent[]): GroupedComponents;
|
|
45
|
+
explain(components: SourceComponent[], operation?: 'deploy' | 'retrieve'): TransportPlan;
|
|
46
|
+
runBeforeMetadata(context: TransportContext, groups: TransportGroup[], operation?: 'deploy' | 'retrieve'): Promise<TransportPipelineResult>;
|
|
47
|
+
runAfterMetadata(context: TransportContext, groups: TransportGroup[], operation?: 'deploy' | 'retrieve'): Promise<TransportPipelineResult>;
|
|
48
|
+
hasTransports(components: SourceComponent[]): boolean;
|
|
49
|
+
private findTransportFor;
|
|
50
|
+
private runTransportGroups;
|
|
51
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
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 herokuComputeTransport_1 = require("./herokuComputeTransport");
|
|
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 herokuComputeTransport_1.HerokuComputeTransport()]);
|
|
32
|
+
}
|
|
33
|
+
groupByTransport(components) {
|
|
34
|
+
const metadataApi = [];
|
|
35
|
+
const transportMap = new Map();
|
|
36
|
+
for (const component of components) {
|
|
37
|
+
const transport = this.findTransportFor(component);
|
|
38
|
+
if (transport) {
|
|
39
|
+
let group = transportMap.get(transport.name);
|
|
40
|
+
if (!group) {
|
|
41
|
+
group = { transport, components: [] };
|
|
42
|
+
transportMap.set(transport.name, group);
|
|
43
|
+
}
|
|
44
|
+
group.components.push(component);
|
|
45
|
+
}
|
|
46
|
+
// all components go through metadata api — transport components
|
|
47
|
+
// also have metadata portions (.compute-meta.xml) that need MDAPI
|
|
48
|
+
metadataApi.push(component);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
metadataApi,
|
|
52
|
+
transports: [...transportMap.values()],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
explain(components, operation = 'deploy') {
|
|
56
|
+
const { metadataApi, transports } = this.groupByTransport(components);
|
|
57
|
+
const phases = [];
|
|
58
|
+
const beforeMetadata = transports.filter((group) => getStep(group.transport, operation, 'before') !== undefined);
|
|
59
|
+
const afterMetadata = transports.filter((group) => getStep(group.transport, operation, 'after') !== undefined);
|
|
60
|
+
for (const group of beforeMetadata) {
|
|
61
|
+
const desc = group.transport.describe();
|
|
62
|
+
phases.push({
|
|
63
|
+
phase: 'before-metadata',
|
|
64
|
+
label: desc.label,
|
|
65
|
+
endpoint: desc.endpoint,
|
|
66
|
+
components: group.components.map((c) => ({ fullName: c.fullName, type: c.type.name })),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
phases.push({
|
|
70
|
+
phase: 'metadata-api',
|
|
71
|
+
label: 'Metadata API',
|
|
72
|
+
endpoint: 'SOAP/REST',
|
|
73
|
+
components: metadataApi.map((c) => ({ fullName: c.fullName, type: c.type.name })),
|
|
74
|
+
});
|
|
75
|
+
for (const group of afterMetadata) {
|
|
76
|
+
const desc = group.transport.describe();
|
|
77
|
+
phases.push({
|
|
78
|
+
phase: 'after-metadata',
|
|
79
|
+
label: desc.label,
|
|
80
|
+
endpoint: desc.endpoint,
|
|
81
|
+
components: group.components.map((c) => ({ fullName: c.fullName, type: c.type.name })),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return { phases };
|
|
85
|
+
}
|
|
86
|
+
async runBeforeMetadata(context, groups, operation = 'deploy') {
|
|
87
|
+
return this.runTransportGroups(groups, context, operation, 'before');
|
|
88
|
+
}
|
|
89
|
+
async runAfterMetadata(context, groups, operation = 'deploy') {
|
|
90
|
+
return this.runTransportGroups(groups, context, operation, 'after');
|
|
91
|
+
}
|
|
92
|
+
hasTransports(components) {
|
|
93
|
+
return components.some((component) => this.findTransportFor(component) !== undefined);
|
|
94
|
+
}
|
|
95
|
+
findTransportFor(component) {
|
|
96
|
+
const transportName = component.type.strategies?.transport;
|
|
97
|
+
if (!transportName)
|
|
98
|
+
return undefined;
|
|
99
|
+
const transport = this.transports.find((candidate) => candidate.name === transportName);
|
|
100
|
+
if (!transport) {
|
|
101
|
+
throw new core_1.SfError(`No transport provider is registered for '${transportName}' required by ${component.type.name}.`, 'MissingTransportProvider');
|
|
102
|
+
}
|
|
103
|
+
return transport;
|
|
104
|
+
}
|
|
105
|
+
async runTransportGroups(groups, context, operation, timing) {
|
|
106
|
+
const allFileResponses = [];
|
|
107
|
+
const allAsyncHandles = [];
|
|
108
|
+
const allOperationResults = [];
|
|
109
|
+
const lifecycle = core_1.Lifecycle.getInstance();
|
|
110
|
+
for (const group of groups) {
|
|
111
|
+
const step = getStep(group.transport, operation, timing);
|
|
112
|
+
if (!step)
|
|
113
|
+
continue;
|
|
114
|
+
this.logger.debug(`Running transport '${group.transport.name}' (${operation}) for ${group.components.length} component(s)`);
|
|
115
|
+
const desc = group.transport.describe();
|
|
116
|
+
const componentNames = group.components.map((c) => c.fullName);
|
|
117
|
+
const eventBase = {
|
|
118
|
+
transportName: group.transport.name,
|
|
119
|
+
label: desc.label,
|
|
120
|
+
operation,
|
|
121
|
+
componentCount: group.components.length,
|
|
122
|
+
componentNames,
|
|
123
|
+
};
|
|
124
|
+
// eslint-disable-next-line no-await-in-loop
|
|
125
|
+
await lifecycle.emit('transportStage', { ...eventBase, stage: 'start' });
|
|
126
|
+
const transportContext = {
|
|
127
|
+
...context,
|
|
128
|
+
components: group.components,
|
|
129
|
+
};
|
|
130
|
+
try {
|
|
131
|
+
// eslint-disable-next-line no-await-in-loop
|
|
132
|
+
const result = await step(transportContext);
|
|
133
|
+
allFileResponses.push(...result.fileResponses);
|
|
134
|
+
if (result.asyncResult) {
|
|
135
|
+
allAsyncHandles.push(result.asyncResult);
|
|
136
|
+
}
|
|
137
|
+
allOperationResults.push(...(result.operationResults ?? []));
|
|
138
|
+
// eslint-disable-next-line no-await-in-loop
|
|
139
|
+
await lifecycle.emit('transportStage', { ...eventBase, stage: 'complete' });
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
try {
|
|
143
|
+
// eslint-disable-next-line no-await-in-loop
|
|
144
|
+
await lifecycle.emit('transportStage', {
|
|
145
|
+
...eventBase,
|
|
146
|
+
stage: 'error',
|
|
147
|
+
errorMessage: err.message,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
/* don't mask the transport error */
|
|
152
|
+
}
|
|
153
|
+
throw err;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return { fileResponses: allFileResponses, asyncHandles: allAsyncHandles, operationResults: allOperationResults };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.TransportPipeline = TransportPipeline;
|
|
160
|
+
function getStep(transport, operation, timing) {
|
|
161
|
+
if (operation === 'deploy' && timing === 'before') {
|
|
162
|
+
return transport.beforeDeploy
|
|
163
|
+
? async (context) => transport.beforeDeploy(context)
|
|
164
|
+
: undefined;
|
|
165
|
+
}
|
|
166
|
+
if (operation === 'deploy') {
|
|
167
|
+
return transport.afterDeploy
|
|
168
|
+
? async (context) => transport.afterDeploy(context)
|
|
169
|
+
: undefined;
|
|
170
|
+
}
|
|
171
|
+
if (timing === 'before') {
|
|
172
|
+
return transport.beforeRetrieve
|
|
173
|
+
? async (context) => transport.beforeRetrieve(context)
|
|
174
|
+
: undefined;
|
|
175
|
+
}
|
|
176
|
+
return transport.afterRetrieve
|
|
177
|
+
? async (context) => transport.afterRetrieve(context)
|
|
178
|
+
: undefined;
|
|
179
|
+
}
|
|
180
|
+
//# 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"}
|
|
@@ -352,5 +352,13 @@ export type BotVersionFilter = {
|
|
|
352
352
|
export type MetadataApiRetrieveOptions = MetadataTransferOptions & RetrieveOptions & {
|
|
353
353
|
registry?: RegistryAccess;
|
|
354
354
|
botVersionFilters?: BotVersionFilter[];
|
|
355
|
+
/**
|
|
356
|
+
* Metadata type names whose transports should be skipped (e.g., `['PlatformComputeApp']`).
|
|
357
|
+
* Components of these types will still be retrieved via the Metadata API but their
|
|
358
|
+
* secondary transport (Connect API, presigned URL, etc.) will not run.
|
|
359
|
+
*/
|
|
360
|
+
skipTransports?: string[];
|
|
361
|
+
/** Explicit package association for manifest-only transport members, keyed by `type#fullName`. */
|
|
362
|
+
transportPackageNames?: Record<string, string>;
|
|
355
363
|
};
|
|
356
364
|
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
|
-
|
|
743
|
+
const hasPlatformComputeApp = Array.from(this).some((component) => component.type.name === 'PlatformComputeApp');
|
|
744
|
+
return hasPlatformComputeApp && +version < 68 ? '68.0' : version;
|
|
616
745
|
}
|
|
617
746
|
}
|
|
618
747
|
exports.ComponentSet = ComponentSet;
|