@salesforce/core 3.31.7 → 3.31.9
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/LICENSE.txt +11 -11
- package/README.md +222 -222
- package/lib/config/aliasesConfig.d.ts +12 -12
- package/lib/config/aliasesConfig.js +27 -27
- package/lib/config/authInfoConfig.d.ts +19 -19
- package/lib/config/authInfoConfig.js +34 -34
- package/lib/config/config.d.ts +311 -311
- package/lib/config/config.js +574 -574
- package/lib/config/configAggregator.d.ts +232 -232
- package/lib/config/configAggregator.js +379 -379
- package/lib/config/configFile.d.ts +199 -199
- package/lib/config/configFile.js +340 -340
- package/lib/config/configGroup.d.ts +141 -141
- package/lib/config/configGroup.js +224 -224
- package/lib/config/configStore.d.ts +241 -241
- package/lib/config/configStore.js +352 -352
- package/lib/config/envVars.d.ts +101 -101
- package/lib/config/envVars.js +456 -456
- package/lib/config/orgUsersConfig.d.ts +31 -31
- package/lib/config/orgUsersConfig.js +41 -41
- package/lib/config/sandboxOrgConfig.d.ts +37 -37
- package/lib/config/sandboxOrgConfig.js +50 -50
- package/lib/config/sandboxProcessCache.d.ts +16 -16
- package/lib/config/sandboxProcessCache.js +37 -37
- package/lib/config/tokensConfig.d.ts +10 -10
- package/lib/config/tokensConfig.js +28 -28
- package/lib/config/ttlConfig.d.ts +34 -34
- package/lib/config/ttlConfig.js +54 -54
- package/lib/crypto/crypto.d.ts +54 -54
- package/lib/crypto/crypto.js +220 -220
- package/lib/crypto/keyChain.d.ts +8 -8
- package/lib/crypto/keyChain.js +61 -61
- package/lib/crypto/keyChainImpl.d.ts +116 -116
- package/lib/crypto/keyChainImpl.js +486 -486
- package/lib/crypto/secureBuffer.d.ts +46 -46
- package/lib/crypto/secureBuffer.js +82 -82
- package/lib/deviceOauthService.d.ts +71 -71
- package/lib/deviceOauthService.js +191 -191
- package/lib/exported.d.ts +38 -38
- package/lib/exported.js +118 -118
- package/lib/global.d.ts +70 -70
- package/lib/global.js +109 -109
- package/lib/lifecycleEvents.d.ts +93 -93
- package/lib/lifecycleEvents.js +188 -188
- package/lib/logger.d.ts +381 -381
- package/lib/logger.js +734 -734
- package/lib/messages.d.ts +291 -291
- package/lib/messages.js +543 -543
- package/lib/org/authInfo.d.ts +344 -344
- package/lib/org/authInfo.js +892 -892
- package/lib/org/authRemover.d.ts +88 -88
- package/lib/org/authRemover.js +182 -182
- package/lib/org/connection.d.ts +197 -197
- package/lib/org/connection.js +395 -395
- package/lib/org/index.d.ts +6 -6
- package/lib/org/index.js +28 -28
- package/lib/org/org.d.ts +558 -558
- package/lib/org/org.js +1267 -1267
- package/lib/org/orgConfigProperties.d.ts +69 -69
- package/lib/org/orgConfigProperties.js +136 -136
- package/lib/org/permissionSetAssignment.d.ts +35 -35
- package/lib/org/permissionSetAssignment.js +125 -125
- package/lib/org/scratchOrgCache.d.ts +20 -20
- package/lib/org/scratchOrgCache.js +32 -32
- package/lib/org/scratchOrgCreate.d.ts +54 -54
- package/lib/org/scratchOrgCreate.js +216 -216
- package/lib/org/scratchOrgErrorCodes.d.ts +10 -10
- package/lib/org/scratchOrgErrorCodes.js +88 -88
- package/lib/org/scratchOrgFeatureDeprecation.d.ts +26 -26
- package/lib/org/scratchOrgFeatureDeprecation.js +109 -109
- package/lib/org/scratchOrgInfoApi.d.ts +68 -68
- package/lib/org/scratchOrgInfoApi.js +416 -413
- package/lib/org/scratchOrgInfoGenerator.d.ts +64 -64
- package/lib/org/scratchOrgInfoGenerator.js +241 -241
- package/lib/org/scratchOrgLifecycleEvents.d.ts +10 -10
- package/lib/org/scratchOrgLifecycleEvents.js +40 -40
- package/lib/org/scratchOrgSettingsGenerator.d.ts +78 -78
- package/lib/org/scratchOrgSettingsGenerator.js +276 -276
- package/lib/org/scratchOrgTypes.d.ts +43 -43
- package/lib/org/scratchOrgTypes.js +8 -8
- package/lib/org/user.d.ts +187 -187
- package/lib/org/user.js +448 -448
- package/lib/schema/printer.d.ts +79 -79
- package/lib/schema/printer.js +260 -260
- package/lib/schema/validator.d.ts +70 -70
- package/lib/schema/validator.js +169 -169
- package/lib/sfError.d.ts +73 -73
- package/lib/sfError.js +136 -136
- package/lib/sfProject.d.ts +357 -357
- package/lib/sfProject.js +671 -671
- package/lib/stateAggregator/accessors/aliasAccessor.d.ts +98 -98
- package/lib/stateAggregator/accessors/aliasAccessor.js +145 -145
- package/lib/stateAggregator/accessors/orgAccessor.d.ts +101 -101
- package/lib/stateAggregator/accessors/orgAccessor.js +240 -240
- package/lib/stateAggregator/accessors/sandboxAccessor.d.ts +8 -8
- package/lib/stateAggregator/accessors/sandboxAccessor.js +27 -27
- package/lib/stateAggregator/accessors/tokenAccessor.d.ts +63 -63
- package/lib/stateAggregator/accessors/tokenAccessor.js +79 -79
- package/lib/stateAggregator/index.d.ts +4 -4
- package/lib/stateAggregator/index.js +26 -26
- package/lib/stateAggregator/stateAggregator.d.ts +25 -25
- package/lib/stateAggregator/stateAggregator.js +45 -45
- package/lib/status/myDomainResolver.d.ts +66 -66
- package/lib/status/myDomainResolver.js +124 -124
- package/lib/status/pollingClient.d.ts +85 -85
- package/lib/status/pollingClient.js +115 -115
- package/lib/status/streamingClient.d.ts +244 -244
- package/lib/status/streamingClient.js +436 -436
- package/lib/status/types.d.ts +89 -89
- package/lib/status/types.js +17 -17
- package/lib/testSetup.d.ts +553 -553
- package/lib/testSetup.js +871 -871
- package/lib/util/cache.d.ts +11 -11
- package/lib/util/cache.js +69 -69
- package/lib/util/checkLightningDomain.d.ts +1 -1
- package/lib/util/checkLightningDomain.js +28 -28
- package/lib/util/directoryWriter.d.ts +12 -12
- package/lib/util/directoryWriter.js +53 -53
- package/lib/util/getJwtAudienceUrl.d.ts +4 -4
- package/lib/util/getJwtAudienceUrl.js +18 -18
- package/lib/util/internal.d.ts +58 -58
- package/lib/util/internal.js +118 -118
- package/lib/util/jsonXmlTools.d.ts +14 -14
- package/lib/util/jsonXmlTools.js +38 -38
- package/lib/util/mapKeys.d.ts +14 -14
- package/lib/util/mapKeys.js +51 -51
- package/lib/util/sfdc.d.ts +52 -52
- package/lib/util/sfdc.js +85 -85
- package/lib/util/sfdcUrl.d.ts +72 -72
- package/lib/util/sfdcUrl.js +215 -215
- package/lib/util/structuredWriter.d.ts +9 -9
- package/lib/util/structuredWriter.js +2 -2
- package/lib/util/zipWriter.d.ts +16 -16
- package/lib/util/zipWriter.js +67 -67
- package/lib/webOAuthServer.d.ts +156 -156
- package/lib/webOAuthServer.js +388 -388
- package/messages/auth.md +37 -37
- package/messages/config.md +156 -156
- package/messages/connection.md +30 -30
- package/messages/core.json +20 -20
- package/messages/core.md +67 -67
- package/messages/encryption.md +85 -85
- package/messages/envVars.md +303 -303
- package/messages/org.md +63 -63
- package/messages/permissionSetAssignment.md +31 -31
- package/messages/scratchOrgCreate.md +23 -23
- package/messages/scratchOrgErrorCodes.md +115 -115
- package/messages/scratchOrgFeatureDeprecation.md +11 -11
- package/messages/scratchOrgInfoApi.md +19 -15
- package/messages/scratchOrgInfoGenerator.md +23 -23
- package/messages/streaming.md +23 -23
- package/messages/user.md +35 -35
- package/package.json +97 -97
|
@@ -1,277 +1,277 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
* Copyright (c) 2021, salesforce.com, inc.
|
|
4
|
-
* All rights reserved.
|
|
5
|
-
* Licensed under the BSD 3-Clause license.
|
|
6
|
-
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.createRecordTypeAndBusinessProcessFileContent = exports.createObjectFileContent = exports.RequestStatus = void 0;
|
|
10
|
-
const path = require("path");
|
|
11
|
-
const kit_1 = require("@salesforce/kit");
|
|
12
|
-
const ts_types_1 = require("@salesforce/ts-types");
|
|
13
|
-
const js2xmlparser = require("js2xmlparser");
|
|
14
|
-
const logger_1 = require("../logger");
|
|
15
|
-
const sfError_1 = require("../sfError");
|
|
16
|
-
const pollingClient_1 = require("../status/pollingClient");
|
|
17
|
-
const zipWriter_1 = require("../util/zipWriter");
|
|
18
|
-
const directoryWriter_1 = require("../util/directoryWriter");
|
|
19
|
-
var RequestStatus;
|
|
20
|
-
(function (RequestStatus) {
|
|
21
|
-
RequestStatus["Pending"] = "Pending";
|
|
22
|
-
RequestStatus["InProgress"] = "InProgress";
|
|
23
|
-
RequestStatus["Succeeded"] = "Succeeded";
|
|
24
|
-
RequestStatus["SucceededPartial"] = "SucceededPartial";
|
|
25
|
-
RequestStatus["Failed"] = "Failed";
|
|
26
|
-
RequestStatus["Canceling"] = "Canceling";
|
|
27
|
-
RequestStatus["Canceled"] = "Canceled";
|
|
28
|
-
})(RequestStatus = exports.RequestStatus || (exports.RequestStatus = {}));
|
|
29
|
-
const breakPolling = ['Succeeded', 'SucceededPartial', 'Failed', 'Canceled'];
|
|
30
|
-
const createObjectFileContent = ({ allRecordTypes = [], allBusinessProcesses = [], apiVersion, settingData, objectSettingsData, }) => {
|
|
31
|
-
const output = {
|
|
32
|
-
'@': {
|
|
33
|
-
xmlns: 'http://soap.sforce.com/2006/04/metadata',
|
|
34
|
-
},
|
|
35
|
-
types: [],
|
|
36
|
-
};
|
|
37
|
-
if (settingData) {
|
|
38
|
-
const strings = Object.keys(settingData).map((item) => (0, kit_1.upperFirst)(item).replace('Settings', ''));
|
|
39
|
-
output.types.push({ members: strings, name: 'Settings' });
|
|
40
|
-
}
|
|
41
|
-
if (objectSettingsData) {
|
|
42
|
-
const strings = Object.keys(objectSettingsData).map((item) => (0, kit_1.upperFirst)(item));
|
|
43
|
-
output.types.push({ members: strings, name: 'CustomObject' });
|
|
44
|
-
if (allRecordTypes.length > 0) {
|
|
45
|
-
output.types.push({ members: allRecordTypes, name: 'RecordType' });
|
|
46
|
-
}
|
|
47
|
-
if (allBusinessProcesses.length > 0) {
|
|
48
|
-
output.types.push({ members: allBusinessProcesses, name: 'BusinessProcess' });
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return { ...output, ...{ version: apiVersion } };
|
|
52
|
-
};
|
|
53
|
-
exports.createObjectFileContent = createObjectFileContent;
|
|
54
|
-
const calculateBusinessProcess = (objectName, defaultRecordType) => {
|
|
55
|
-
let businessProcessName = null;
|
|
56
|
-
let businessProcessPicklistVal = null;
|
|
57
|
-
// These four objects require any record type to specify a "business process"--
|
|
58
|
-
// a restricted set of items from a standard picklist on the object.
|
|
59
|
-
if (['Case', 'Lead', 'Opportunity', 'Solution'].includes(objectName)) {
|
|
60
|
-
businessProcessName = (0, kit_1.upperFirst)(defaultRecordType) + 'Process';
|
|
61
|
-
switch (objectName) {
|
|
62
|
-
case 'Case':
|
|
63
|
-
businessProcessPicklistVal = 'New';
|
|
64
|
-
break;
|
|
65
|
-
case 'Lead':
|
|
66
|
-
businessProcessPicklistVal = 'New - Not Contacted';
|
|
67
|
-
break;
|
|
68
|
-
case 'Opportunity':
|
|
69
|
-
businessProcessPicklistVal = 'Prospecting';
|
|
70
|
-
break;
|
|
71
|
-
case 'Solution':
|
|
72
|
-
businessProcessPicklistVal = 'Draft';
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return [businessProcessName, businessProcessPicklistVal];
|
|
76
|
-
};
|
|
77
|
-
const createRecordTypeAndBusinessProcessFileContent = (objectName, json, allRecordTypes, allBusinessProcesses) => {
|
|
78
|
-
let output = {
|
|
79
|
-
'@': {
|
|
80
|
-
xmlns: 'http://soap.sforce.com/2006/04/metadata',
|
|
81
|
-
},
|
|
82
|
-
};
|
|
83
|
-
const name = (0, kit_1.upperFirst)(objectName);
|
|
84
|
-
const sharingModel = json.sharingModel;
|
|
85
|
-
if (sharingModel) {
|
|
86
|
-
output = {
|
|
87
|
-
...output,
|
|
88
|
-
sharingModel: (0, kit_1.upperFirst)(sharingModel),
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
const defaultRecordType = json.defaultRecordType;
|
|
92
|
-
if (typeof defaultRecordType === 'string') {
|
|
93
|
-
// We need to keep track of these globally for when we generate the package XML.
|
|
94
|
-
allRecordTypes.push(`${name}.${(0, kit_1.upperFirst)(defaultRecordType)}`);
|
|
95
|
-
const [businessProcessName, businessProcessPicklistVal] = calculateBusinessProcess(name, defaultRecordType);
|
|
96
|
-
// Create the record type
|
|
97
|
-
const recordTypes = {
|
|
98
|
-
fullName: (0, kit_1.upperFirst)(defaultRecordType),
|
|
99
|
-
label: (0, kit_1.upperFirst)(defaultRecordType),
|
|
100
|
-
active: true,
|
|
101
|
-
};
|
|
102
|
-
output = {
|
|
103
|
-
...output,
|
|
104
|
-
recordTypes: {
|
|
105
|
-
...recordTypes,
|
|
106
|
-
},
|
|
107
|
-
};
|
|
108
|
-
if (businessProcessName) {
|
|
109
|
-
// We need to keep track of these globally for the package.xml
|
|
110
|
-
const values = {
|
|
111
|
-
fullName: businessProcessPicklistVal,
|
|
112
|
-
};
|
|
113
|
-
if (name !== 'Opportunity') {
|
|
114
|
-
values.default = true;
|
|
115
|
-
}
|
|
116
|
-
allBusinessProcesses.push(`${name}.${businessProcessName}`);
|
|
117
|
-
output = {
|
|
118
|
-
...output,
|
|
119
|
-
recordTypes: {
|
|
120
|
-
...recordTypes,
|
|
121
|
-
businessProcess: businessProcessName,
|
|
122
|
-
},
|
|
123
|
-
businessProcesses: {
|
|
124
|
-
fullName: businessProcessName,
|
|
125
|
-
isActive: true,
|
|
126
|
-
values,
|
|
127
|
-
},
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return output;
|
|
132
|
-
};
|
|
133
|
-
exports.createRecordTypeAndBusinessProcessFileContent = createRecordTypeAndBusinessProcessFileContent;
|
|
134
|
-
/**
|
|
135
|
-
* Helper class for dealing with the settings that are defined in a scratch definition file. This class knows how to extract the
|
|
136
|
-
* settings from the definition, how to expand them into a MD directory and how to generate a package.xml.
|
|
137
|
-
*/
|
|
138
|
-
class SettingsGenerator {
|
|
139
|
-
constructor(options) {
|
|
140
|
-
this.allRecordTypes = [];
|
|
141
|
-
this.allBusinessProcesses = [];
|
|
142
|
-
this.logger = logger_1.Logger.childFromRoot('SettingsGenerator');
|
|
143
|
-
// If SFDX_MDAPI_TEMP_DIR is set, copy settings to that dir for people to inspect.
|
|
144
|
-
const mdApiTmpDir = options?.mdApiTmpDir ?? kit_1.env.getString('SFDX_MDAPI_TEMP_DIR');
|
|
145
|
-
this.shapeDirName = options?.shapeDirName ?? `shape_${Date.now()}`;
|
|
146
|
-
this.packageFilePath = path.join(this.shapeDirName, 'package.xml');
|
|
147
|
-
let storePath;
|
|
148
|
-
if (!options?.asDirectory) {
|
|
149
|
-
storePath = mdApiTmpDir ? path.join(mdApiTmpDir, `${this.shapeDirName}.zip`) : undefined;
|
|
150
|
-
this.writer = new zipWriter_1.ZipWriter(storePath);
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
storePath = mdApiTmpDir ? path.join(mdApiTmpDir, this.shapeDirName) : undefined;
|
|
154
|
-
this.writer = new directoryWriter_1.DirectoryWriter(storePath);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
/** extract the settings from the scratch def file, if they are present. */
|
|
158
|
-
// eslint-disable-next-line @typescript-eslint/require-await
|
|
159
|
-
async extract(scratchDef) {
|
|
160
|
-
this.logger.debug('extracting settings from scratch definition file');
|
|
161
|
-
this.settingData = scratchDef.settings;
|
|
162
|
-
this.objectSettingsData = scratchDef.objectSettings;
|
|
163
|
-
this.logger.debug('settings are', this.settingData);
|
|
164
|
-
return { settings: this.settingData, objectSettings: this.objectSettingsData };
|
|
165
|
-
}
|
|
166
|
-
/** True if we are currently tracking setting or object setting data. */
|
|
167
|
-
hasSettings() {
|
|
168
|
-
return !(0, kit_1.isEmpty)(this.settingData) || !(0, kit_1.isEmpty)(this.objectSettingsData);
|
|
169
|
-
}
|
|
170
|
-
/** Create temporary deploy directory used to upload the scratch org shape.
|
|
171
|
-
* This will create the dir, all of the .setting files and minimal object files needed for objectSettings
|
|
172
|
-
*/
|
|
173
|
-
async createDeploy() {
|
|
174
|
-
const settingsDir = path.join(this.shapeDirName, 'settings');
|
|
175
|
-
const objectsDir = path.join(this.shapeDirName, 'objects');
|
|
176
|
-
await Promise.all([
|
|
177
|
-
this.writeSettingsIfNeeded(settingsDir),
|
|
178
|
-
this.writeObjectSettingsIfNeeded(objectsDir, this.allRecordTypes, this.allBusinessProcesses),
|
|
179
|
-
]);
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Deploys the settings to the org.
|
|
183
|
-
*/
|
|
184
|
-
async deploySettingsViaFolder(scratchOrg, apiVersion) {
|
|
185
|
-
const username = scratchOrg.getUsername();
|
|
186
|
-
const logger = await logger_1.Logger.child('deploySettingsViaFolder');
|
|
187
|
-
await this.createDeployPackageContents(apiVersion);
|
|
188
|
-
const connection = scratchOrg.getConnection();
|
|
189
|
-
logger.debug(`deploying to apiVersion: ${apiVersion}`);
|
|
190
|
-
connection.setApiVersion(apiVersion);
|
|
191
|
-
const { id } = await connection.deploy(this.writer.buffer, {});
|
|
192
|
-
logger.debug(`deploying settings id ${id}`);
|
|
193
|
-
let result = await connection.metadata.checkDeployStatus(id);
|
|
194
|
-
const pollingOptions = {
|
|
195
|
-
async poll() {
|
|
196
|
-
try {
|
|
197
|
-
result = await connection.metadata.checkDeployStatus(id, true);
|
|
198
|
-
logger.debug(`Deploy id: ${id} status: ${result.status}`);
|
|
199
|
-
if (breakPolling.includes(result.status)) {
|
|
200
|
-
return {
|
|
201
|
-
completed: true,
|
|
202
|
-
payload: result.status,
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
return {
|
|
206
|
-
completed: false,
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
catch (error) {
|
|
210
|
-
logger.debug(`An error occurred trying to check deploy id: ${id}`);
|
|
211
|
-
logger.debug(`Error: ${error.message}`);
|
|
212
|
-
logger.debug('Re-trying deploy check again....');
|
|
213
|
-
return {
|
|
214
|
-
completed: false,
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
},
|
|
218
|
-
timeout: kit_1.Duration.minutes(10),
|
|
219
|
-
frequency: kit_1.Duration.seconds(1),
|
|
220
|
-
timeoutErrorName: 'DeployingSettingsTimeoutError',
|
|
221
|
-
};
|
|
222
|
-
const client = await pollingClient_1.PollingClient.create(pollingOptions);
|
|
223
|
-
const status = await client.subscribe();
|
|
224
|
-
if (status !== RequestStatus.Succeeded) {
|
|
225
|
-
const componentFailures = (0, ts_types_1.ensureObject)(result.details).componentFailures;
|
|
226
|
-
const failures = (Array.isArray(componentFailures) ? componentFailures : [componentFailures])
|
|
227
|
-
.map((failure) => failure.problem)
|
|
228
|
-
.join('\n');
|
|
229
|
-
const error = new sfError_1.SfError(`A scratch org was created with username ${username}, but the settings failed to deploy due to: \n${failures}`, 'ProblemDeployingSettings');
|
|
230
|
-
error.setData(result);
|
|
231
|
-
throw error;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
async createDeployPackageContents(apiVersion) {
|
|
235
|
-
const packageObjectProps = (0, exports.createObjectFileContent)({
|
|
236
|
-
allRecordTypes: this.allRecordTypes,
|
|
237
|
-
allBusinessProcesses: this.allBusinessProcesses,
|
|
238
|
-
apiVersion,
|
|
239
|
-
settingData: this.settingData,
|
|
240
|
-
objectSettingsData: this.objectSettingsData,
|
|
241
|
-
});
|
|
242
|
-
const xml = js2xmlparser.parse('Package', packageObjectProps);
|
|
243
|
-
await this.writer.addToStore(xml, this.packageFilePath);
|
|
244
|
-
await this.writer.finalize();
|
|
245
|
-
}
|
|
246
|
-
getShapeDirName() {
|
|
247
|
-
return this.shapeDirName;
|
|
248
|
-
}
|
|
249
|
-
/**
|
|
250
|
-
* Returns the destination where the writer placed the settings content.
|
|
251
|
-
*
|
|
252
|
-
*/
|
|
253
|
-
getDestinationPath() {
|
|
254
|
-
return this.writer.getDestinationPath();
|
|
255
|
-
}
|
|
256
|
-
async writeObjectSettingsIfNeeded(objectsDir, allRecordTypes, allbusinessProcesses) {
|
|
257
|
-
if (this.objectSettingsData) {
|
|
258
|
-
await Promise.all(Object.entries(this.objectSettingsData).map(([item, value]) => {
|
|
259
|
-
const fileContent = (0, exports.createRecordTypeAndBusinessProcessFileContent)(item, value, allRecordTypes, allbusinessProcesses);
|
|
260
|
-
const xml = js2xmlparser.parse('CustomObject', fileContent);
|
|
261
|
-
return this.writer.addToStore(xml, path.join(objectsDir, (0, kit_1.upperFirst)(item) + '.object'));
|
|
262
|
-
}));
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
async writeSettingsIfNeeded(settingsDir) {
|
|
266
|
-
if (this.settingData) {
|
|
267
|
-
await Promise.all(Object.entries(this.settingData).map(([item, value]) => {
|
|
268
|
-
const typeName = (0, kit_1.upperFirst)(item);
|
|
269
|
-
const fname = typeName.replace('Settings', '');
|
|
270
|
-
const fileContent = js2xmlparser.parse(typeName, value);
|
|
271
|
-
return this.writer.addToStore(fileContent, path.join(settingsDir, fname + '.settings'));
|
|
272
|
-
}));
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
exports.default = SettingsGenerator;
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2021, salesforce.com, inc.
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
* Licensed under the BSD 3-Clause license.
|
|
6
|
+
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createRecordTypeAndBusinessProcessFileContent = exports.createObjectFileContent = exports.RequestStatus = void 0;
|
|
10
|
+
const path = require("path");
|
|
11
|
+
const kit_1 = require("@salesforce/kit");
|
|
12
|
+
const ts_types_1 = require("@salesforce/ts-types");
|
|
13
|
+
const js2xmlparser = require("js2xmlparser");
|
|
14
|
+
const logger_1 = require("../logger");
|
|
15
|
+
const sfError_1 = require("../sfError");
|
|
16
|
+
const pollingClient_1 = require("../status/pollingClient");
|
|
17
|
+
const zipWriter_1 = require("../util/zipWriter");
|
|
18
|
+
const directoryWriter_1 = require("../util/directoryWriter");
|
|
19
|
+
var RequestStatus;
|
|
20
|
+
(function (RequestStatus) {
|
|
21
|
+
RequestStatus["Pending"] = "Pending";
|
|
22
|
+
RequestStatus["InProgress"] = "InProgress";
|
|
23
|
+
RequestStatus["Succeeded"] = "Succeeded";
|
|
24
|
+
RequestStatus["SucceededPartial"] = "SucceededPartial";
|
|
25
|
+
RequestStatus["Failed"] = "Failed";
|
|
26
|
+
RequestStatus["Canceling"] = "Canceling";
|
|
27
|
+
RequestStatus["Canceled"] = "Canceled";
|
|
28
|
+
})(RequestStatus = exports.RequestStatus || (exports.RequestStatus = {}));
|
|
29
|
+
const breakPolling = ['Succeeded', 'SucceededPartial', 'Failed', 'Canceled'];
|
|
30
|
+
const createObjectFileContent = ({ allRecordTypes = [], allBusinessProcesses = [], apiVersion, settingData, objectSettingsData, }) => {
|
|
31
|
+
const output = {
|
|
32
|
+
'@': {
|
|
33
|
+
xmlns: 'http://soap.sforce.com/2006/04/metadata',
|
|
34
|
+
},
|
|
35
|
+
types: [],
|
|
36
|
+
};
|
|
37
|
+
if (settingData) {
|
|
38
|
+
const strings = Object.keys(settingData).map((item) => (0, kit_1.upperFirst)(item).replace('Settings', ''));
|
|
39
|
+
output.types.push({ members: strings, name: 'Settings' });
|
|
40
|
+
}
|
|
41
|
+
if (objectSettingsData) {
|
|
42
|
+
const strings = Object.keys(objectSettingsData).map((item) => (0, kit_1.upperFirst)(item));
|
|
43
|
+
output.types.push({ members: strings, name: 'CustomObject' });
|
|
44
|
+
if (allRecordTypes.length > 0) {
|
|
45
|
+
output.types.push({ members: allRecordTypes, name: 'RecordType' });
|
|
46
|
+
}
|
|
47
|
+
if (allBusinessProcesses.length > 0) {
|
|
48
|
+
output.types.push({ members: allBusinessProcesses, name: 'BusinessProcess' });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return { ...output, ...{ version: apiVersion } };
|
|
52
|
+
};
|
|
53
|
+
exports.createObjectFileContent = createObjectFileContent;
|
|
54
|
+
const calculateBusinessProcess = (objectName, defaultRecordType) => {
|
|
55
|
+
let businessProcessName = null;
|
|
56
|
+
let businessProcessPicklistVal = null;
|
|
57
|
+
// These four objects require any record type to specify a "business process"--
|
|
58
|
+
// a restricted set of items from a standard picklist on the object.
|
|
59
|
+
if (['Case', 'Lead', 'Opportunity', 'Solution'].includes(objectName)) {
|
|
60
|
+
businessProcessName = (0, kit_1.upperFirst)(defaultRecordType) + 'Process';
|
|
61
|
+
switch (objectName) {
|
|
62
|
+
case 'Case':
|
|
63
|
+
businessProcessPicklistVal = 'New';
|
|
64
|
+
break;
|
|
65
|
+
case 'Lead':
|
|
66
|
+
businessProcessPicklistVal = 'New - Not Contacted';
|
|
67
|
+
break;
|
|
68
|
+
case 'Opportunity':
|
|
69
|
+
businessProcessPicklistVal = 'Prospecting';
|
|
70
|
+
break;
|
|
71
|
+
case 'Solution':
|
|
72
|
+
businessProcessPicklistVal = 'Draft';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return [businessProcessName, businessProcessPicklistVal];
|
|
76
|
+
};
|
|
77
|
+
const createRecordTypeAndBusinessProcessFileContent = (objectName, json, allRecordTypes, allBusinessProcesses) => {
|
|
78
|
+
let output = {
|
|
79
|
+
'@': {
|
|
80
|
+
xmlns: 'http://soap.sforce.com/2006/04/metadata',
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
const name = (0, kit_1.upperFirst)(objectName);
|
|
84
|
+
const sharingModel = json.sharingModel;
|
|
85
|
+
if (sharingModel) {
|
|
86
|
+
output = {
|
|
87
|
+
...output,
|
|
88
|
+
sharingModel: (0, kit_1.upperFirst)(sharingModel),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const defaultRecordType = json.defaultRecordType;
|
|
92
|
+
if (typeof defaultRecordType === 'string') {
|
|
93
|
+
// We need to keep track of these globally for when we generate the package XML.
|
|
94
|
+
allRecordTypes.push(`${name}.${(0, kit_1.upperFirst)(defaultRecordType)}`);
|
|
95
|
+
const [businessProcessName, businessProcessPicklistVal] = calculateBusinessProcess(name, defaultRecordType);
|
|
96
|
+
// Create the record type
|
|
97
|
+
const recordTypes = {
|
|
98
|
+
fullName: (0, kit_1.upperFirst)(defaultRecordType),
|
|
99
|
+
label: (0, kit_1.upperFirst)(defaultRecordType),
|
|
100
|
+
active: true,
|
|
101
|
+
};
|
|
102
|
+
output = {
|
|
103
|
+
...output,
|
|
104
|
+
recordTypes: {
|
|
105
|
+
...recordTypes,
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
if (businessProcessName) {
|
|
109
|
+
// We need to keep track of these globally for the package.xml
|
|
110
|
+
const values = {
|
|
111
|
+
fullName: businessProcessPicklistVal,
|
|
112
|
+
};
|
|
113
|
+
if (name !== 'Opportunity') {
|
|
114
|
+
values.default = true;
|
|
115
|
+
}
|
|
116
|
+
allBusinessProcesses.push(`${name}.${businessProcessName}`);
|
|
117
|
+
output = {
|
|
118
|
+
...output,
|
|
119
|
+
recordTypes: {
|
|
120
|
+
...recordTypes,
|
|
121
|
+
businessProcess: businessProcessName,
|
|
122
|
+
},
|
|
123
|
+
businessProcesses: {
|
|
124
|
+
fullName: businessProcessName,
|
|
125
|
+
isActive: true,
|
|
126
|
+
values,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return output;
|
|
132
|
+
};
|
|
133
|
+
exports.createRecordTypeAndBusinessProcessFileContent = createRecordTypeAndBusinessProcessFileContent;
|
|
134
|
+
/**
|
|
135
|
+
* Helper class for dealing with the settings that are defined in a scratch definition file. This class knows how to extract the
|
|
136
|
+
* settings from the definition, how to expand them into a MD directory and how to generate a package.xml.
|
|
137
|
+
*/
|
|
138
|
+
class SettingsGenerator {
|
|
139
|
+
constructor(options) {
|
|
140
|
+
this.allRecordTypes = [];
|
|
141
|
+
this.allBusinessProcesses = [];
|
|
142
|
+
this.logger = logger_1.Logger.childFromRoot('SettingsGenerator');
|
|
143
|
+
// If SFDX_MDAPI_TEMP_DIR is set, copy settings to that dir for people to inspect.
|
|
144
|
+
const mdApiTmpDir = options?.mdApiTmpDir ?? kit_1.env.getString('SFDX_MDAPI_TEMP_DIR');
|
|
145
|
+
this.shapeDirName = options?.shapeDirName ?? `shape_${Date.now()}`;
|
|
146
|
+
this.packageFilePath = path.join(this.shapeDirName, 'package.xml');
|
|
147
|
+
let storePath;
|
|
148
|
+
if (!options?.asDirectory) {
|
|
149
|
+
storePath = mdApiTmpDir ? path.join(mdApiTmpDir, `${this.shapeDirName}.zip`) : undefined;
|
|
150
|
+
this.writer = new zipWriter_1.ZipWriter(storePath);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
storePath = mdApiTmpDir ? path.join(mdApiTmpDir, this.shapeDirName) : undefined;
|
|
154
|
+
this.writer = new directoryWriter_1.DirectoryWriter(storePath);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/** extract the settings from the scratch def file, if they are present. */
|
|
158
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
159
|
+
async extract(scratchDef) {
|
|
160
|
+
this.logger.debug('extracting settings from scratch definition file');
|
|
161
|
+
this.settingData = scratchDef.settings;
|
|
162
|
+
this.objectSettingsData = scratchDef.objectSettings;
|
|
163
|
+
this.logger.debug('settings are', this.settingData);
|
|
164
|
+
return { settings: this.settingData, objectSettings: this.objectSettingsData };
|
|
165
|
+
}
|
|
166
|
+
/** True if we are currently tracking setting or object setting data. */
|
|
167
|
+
hasSettings() {
|
|
168
|
+
return !(0, kit_1.isEmpty)(this.settingData) || !(0, kit_1.isEmpty)(this.objectSettingsData);
|
|
169
|
+
}
|
|
170
|
+
/** Create temporary deploy directory used to upload the scratch org shape.
|
|
171
|
+
* This will create the dir, all of the .setting files and minimal object files needed for objectSettings
|
|
172
|
+
*/
|
|
173
|
+
async createDeploy() {
|
|
174
|
+
const settingsDir = path.join(this.shapeDirName, 'settings');
|
|
175
|
+
const objectsDir = path.join(this.shapeDirName, 'objects');
|
|
176
|
+
await Promise.all([
|
|
177
|
+
this.writeSettingsIfNeeded(settingsDir),
|
|
178
|
+
this.writeObjectSettingsIfNeeded(objectsDir, this.allRecordTypes, this.allBusinessProcesses),
|
|
179
|
+
]);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Deploys the settings to the org.
|
|
183
|
+
*/
|
|
184
|
+
async deploySettingsViaFolder(scratchOrg, apiVersion) {
|
|
185
|
+
const username = scratchOrg.getUsername();
|
|
186
|
+
const logger = await logger_1.Logger.child('deploySettingsViaFolder');
|
|
187
|
+
await this.createDeployPackageContents(apiVersion);
|
|
188
|
+
const connection = scratchOrg.getConnection();
|
|
189
|
+
logger.debug(`deploying to apiVersion: ${apiVersion}`);
|
|
190
|
+
connection.setApiVersion(apiVersion);
|
|
191
|
+
const { id } = await connection.deploy(this.writer.buffer, {});
|
|
192
|
+
logger.debug(`deploying settings id ${id}`);
|
|
193
|
+
let result = await connection.metadata.checkDeployStatus(id);
|
|
194
|
+
const pollingOptions = {
|
|
195
|
+
async poll() {
|
|
196
|
+
try {
|
|
197
|
+
result = await connection.metadata.checkDeployStatus(id, true);
|
|
198
|
+
logger.debug(`Deploy id: ${id} status: ${result.status}`);
|
|
199
|
+
if (breakPolling.includes(result.status)) {
|
|
200
|
+
return {
|
|
201
|
+
completed: true,
|
|
202
|
+
payload: result.status,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
completed: false,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
logger.debug(`An error occurred trying to check deploy id: ${id}`);
|
|
211
|
+
logger.debug(`Error: ${error.message}`);
|
|
212
|
+
logger.debug('Re-trying deploy check again....');
|
|
213
|
+
return {
|
|
214
|
+
completed: false,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
timeout: kit_1.Duration.minutes(10),
|
|
219
|
+
frequency: kit_1.Duration.seconds(1),
|
|
220
|
+
timeoutErrorName: 'DeployingSettingsTimeoutError',
|
|
221
|
+
};
|
|
222
|
+
const client = await pollingClient_1.PollingClient.create(pollingOptions);
|
|
223
|
+
const status = await client.subscribe();
|
|
224
|
+
if (status !== RequestStatus.Succeeded) {
|
|
225
|
+
const componentFailures = (0, ts_types_1.ensureObject)(result.details).componentFailures;
|
|
226
|
+
const failures = (Array.isArray(componentFailures) ? componentFailures : [componentFailures])
|
|
227
|
+
.map((failure) => failure.problem)
|
|
228
|
+
.join('\n');
|
|
229
|
+
const error = new sfError_1.SfError(`A scratch org was created with username ${username}, but the settings failed to deploy due to: \n${failures}`, 'ProblemDeployingSettings');
|
|
230
|
+
error.setData(result);
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async createDeployPackageContents(apiVersion) {
|
|
235
|
+
const packageObjectProps = (0, exports.createObjectFileContent)({
|
|
236
|
+
allRecordTypes: this.allRecordTypes,
|
|
237
|
+
allBusinessProcesses: this.allBusinessProcesses,
|
|
238
|
+
apiVersion,
|
|
239
|
+
settingData: this.settingData,
|
|
240
|
+
objectSettingsData: this.objectSettingsData,
|
|
241
|
+
});
|
|
242
|
+
const xml = js2xmlparser.parse('Package', packageObjectProps);
|
|
243
|
+
await this.writer.addToStore(xml, this.packageFilePath);
|
|
244
|
+
await this.writer.finalize();
|
|
245
|
+
}
|
|
246
|
+
getShapeDirName() {
|
|
247
|
+
return this.shapeDirName;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Returns the destination where the writer placed the settings content.
|
|
251
|
+
*
|
|
252
|
+
*/
|
|
253
|
+
getDestinationPath() {
|
|
254
|
+
return this.writer.getDestinationPath();
|
|
255
|
+
}
|
|
256
|
+
async writeObjectSettingsIfNeeded(objectsDir, allRecordTypes, allbusinessProcesses) {
|
|
257
|
+
if (this.objectSettingsData) {
|
|
258
|
+
await Promise.all(Object.entries(this.objectSettingsData).map(([item, value]) => {
|
|
259
|
+
const fileContent = (0, exports.createRecordTypeAndBusinessProcessFileContent)(item, value, allRecordTypes, allbusinessProcesses);
|
|
260
|
+
const xml = js2xmlparser.parse('CustomObject', fileContent);
|
|
261
|
+
return this.writer.addToStore(xml, path.join(objectsDir, (0, kit_1.upperFirst)(item) + '.object'));
|
|
262
|
+
}));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
async writeSettingsIfNeeded(settingsDir) {
|
|
266
|
+
if (this.settingData) {
|
|
267
|
+
await Promise.all(Object.entries(this.settingData).map(([item, value]) => {
|
|
268
|
+
const typeName = (0, kit_1.upperFirst)(item);
|
|
269
|
+
const fname = typeName.replace('Settings', '');
|
|
270
|
+
const fileContent = js2xmlparser.parse(typeName, value);
|
|
271
|
+
return this.writer.addToStore(fileContent, path.join(settingsDir, fname + '.settings'));
|
|
272
|
+
}));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
exports.default = SettingsGenerator;
|
|
277
277
|
//# sourceMappingURL=scratchOrgSettingsGenerator.js.map
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
import { JsonMap } from '@salesforce/ts-types';
|
|
2
|
-
export interface ScratchOrgInfo {
|
|
3
|
-
AdminEmail?: string;
|
|
4
|
-
readonly CreatedDate?: string;
|
|
5
|
-
ConnectedAppCallbackUrl?: string;
|
|
6
|
-
ConnectedAppConsumerKey?: string;
|
|
7
|
-
Country?: string;
|
|
8
|
-
Description?: string;
|
|
9
|
-
DurationDays?: number;
|
|
10
|
-
Edition?: string;
|
|
11
|
-
readonly ErrorCode?: string;
|
|
12
|
-
readonly ExpirationDate?: string;
|
|
13
|
-
Features?: string;
|
|
14
|
-
HasSampleData?: boolean;
|
|
15
|
-
readonly Id?: string;
|
|
16
|
-
Language?: string;
|
|
17
|
-
LoginUrl: string;
|
|
18
|
-
readonly Name?: string;
|
|
19
|
-
Namespace?: string;
|
|
20
|
-
OrgName?: string;
|
|
21
|
-
Release?: 'Current' | 'Previous' | 'Preview';
|
|
22
|
-
readonly ScratchOrg?: string;
|
|
23
|
-
SourceOrg?: string;
|
|
24
|
-
readonly AuthCode: string;
|
|
25
|
-
Snapshot: string;
|
|
26
|
-
readonly Status: 'New' | 'Creating' | 'Active' | 'Error' | 'Deleted';
|
|
27
|
-
readonly SignupEmail: string;
|
|
28
|
-
readonly SignupUsername: string;
|
|
29
|
-
readonly SignupInstance: string;
|
|
30
|
-
Username: string;
|
|
31
|
-
settings?: Record<string, unknown>;
|
|
32
|
-
objectSettings?: {
|
|
33
|
-
[objectName: string]: ObjectSetting;
|
|
34
|
-
};
|
|
35
|
-
orgPreferences?: {
|
|
36
|
-
enabled: string[];
|
|
37
|
-
disabled: string[];
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
export interface ObjectSetting extends JsonMap {
|
|
41
|
-
sharingModel?: string;
|
|
42
|
-
defaultRecordType?: string;
|
|
43
|
-
}
|
|
1
|
+
import { JsonMap } from '@salesforce/ts-types';
|
|
2
|
+
export interface ScratchOrgInfo {
|
|
3
|
+
AdminEmail?: string;
|
|
4
|
+
readonly CreatedDate?: string;
|
|
5
|
+
ConnectedAppCallbackUrl?: string;
|
|
6
|
+
ConnectedAppConsumerKey?: string;
|
|
7
|
+
Country?: string;
|
|
8
|
+
Description?: string;
|
|
9
|
+
DurationDays?: number;
|
|
10
|
+
Edition?: string;
|
|
11
|
+
readonly ErrorCode?: string;
|
|
12
|
+
readonly ExpirationDate?: string;
|
|
13
|
+
Features?: string;
|
|
14
|
+
HasSampleData?: boolean;
|
|
15
|
+
readonly Id?: string;
|
|
16
|
+
Language?: string;
|
|
17
|
+
LoginUrl: string;
|
|
18
|
+
readonly Name?: string;
|
|
19
|
+
Namespace?: string;
|
|
20
|
+
OrgName?: string;
|
|
21
|
+
Release?: 'Current' | 'Previous' | 'Preview';
|
|
22
|
+
readonly ScratchOrg?: string;
|
|
23
|
+
SourceOrg?: string;
|
|
24
|
+
readonly AuthCode: string;
|
|
25
|
+
Snapshot: string;
|
|
26
|
+
readonly Status: 'New' | 'Creating' | 'Active' | 'Error' | 'Deleted';
|
|
27
|
+
readonly SignupEmail: string;
|
|
28
|
+
readonly SignupUsername: string;
|
|
29
|
+
readonly SignupInstance: string;
|
|
30
|
+
Username: string;
|
|
31
|
+
settings?: Record<string, unknown>;
|
|
32
|
+
objectSettings?: {
|
|
33
|
+
[objectName: string]: ObjectSetting;
|
|
34
|
+
};
|
|
35
|
+
orgPreferences?: {
|
|
36
|
+
enabled: string[];
|
|
37
|
+
disabled: string[];
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export interface ObjectSetting extends JsonMap {
|
|
41
|
+
sharingModel?: string;
|
|
42
|
+
defaultRecordType?: string;
|
|
43
|
+
}
|