@salesforce/core 3.31.4 → 3.31.7

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 (153) hide show
  1. package/LICENSE.txt +11 -11
  2. package/README.md +222 -222
  3. package/lib/config/aliasesConfig.d.ts +12 -12
  4. package/lib/config/aliasesConfig.js +27 -27
  5. package/lib/config/authInfoConfig.d.ts +19 -19
  6. package/lib/config/authInfoConfig.js +34 -34
  7. package/lib/config/config.d.ts +311 -311
  8. package/lib/config/config.js +574 -574
  9. package/lib/config/configAggregator.d.ts +232 -232
  10. package/lib/config/configAggregator.js +379 -379
  11. package/lib/config/configFile.d.ts +199 -199
  12. package/lib/config/configFile.js +340 -340
  13. package/lib/config/configGroup.d.ts +141 -141
  14. package/lib/config/configGroup.js +224 -224
  15. package/lib/config/configStore.d.ts +241 -241
  16. package/lib/config/configStore.js +352 -352
  17. package/lib/config/envVars.d.ts +101 -101
  18. package/lib/config/envVars.js +456 -456
  19. package/lib/config/orgUsersConfig.d.ts +31 -31
  20. package/lib/config/orgUsersConfig.js +41 -41
  21. package/lib/config/sandboxOrgConfig.d.ts +37 -37
  22. package/lib/config/sandboxOrgConfig.js +50 -50
  23. package/lib/config/sandboxProcessCache.d.ts +16 -16
  24. package/lib/config/sandboxProcessCache.js +37 -37
  25. package/lib/config/tokensConfig.d.ts +10 -10
  26. package/lib/config/tokensConfig.js +28 -28
  27. package/lib/config/ttlConfig.d.ts +34 -34
  28. package/lib/config/ttlConfig.js +54 -54
  29. package/lib/crypto/crypto.d.ts +54 -54
  30. package/lib/crypto/crypto.js +220 -220
  31. package/lib/crypto/keyChain.d.ts +8 -8
  32. package/lib/crypto/keyChain.js +61 -61
  33. package/lib/crypto/keyChainImpl.d.ts +116 -116
  34. package/lib/crypto/keyChainImpl.js +486 -486
  35. package/lib/crypto/secureBuffer.d.ts +46 -46
  36. package/lib/crypto/secureBuffer.js +82 -82
  37. package/lib/deviceOauthService.d.ts +71 -71
  38. package/lib/deviceOauthService.js +191 -191
  39. package/lib/exported.d.ts +38 -38
  40. package/lib/exported.js +118 -118
  41. package/lib/global.d.ts +70 -70
  42. package/lib/global.js +109 -109
  43. package/lib/lifecycleEvents.d.ts +93 -93
  44. package/lib/lifecycleEvents.js +188 -188
  45. package/lib/logger.d.ts +381 -381
  46. package/lib/logger.js +734 -734
  47. package/lib/messages.d.ts +291 -291
  48. package/lib/messages.js +543 -543
  49. package/lib/org/authInfo.d.ts +344 -344
  50. package/lib/org/authInfo.js +892 -892
  51. package/lib/org/authRemover.d.ts +88 -88
  52. package/lib/org/authRemover.js +182 -182
  53. package/lib/org/connection.d.ts +197 -197
  54. package/lib/org/connection.js +395 -395
  55. package/lib/org/index.d.ts +6 -6
  56. package/lib/org/index.js +28 -28
  57. package/lib/org/org.d.ts +558 -558
  58. package/lib/org/org.js +1267 -1267
  59. package/lib/org/orgConfigProperties.d.ts +69 -69
  60. package/lib/org/orgConfigProperties.js +136 -136
  61. package/lib/org/permissionSetAssignment.d.ts +35 -35
  62. package/lib/org/permissionSetAssignment.js +125 -125
  63. package/lib/org/scratchOrgCache.d.ts +20 -20
  64. package/lib/org/scratchOrgCache.js +32 -32
  65. package/lib/org/scratchOrgCreate.d.ts +54 -54
  66. package/lib/org/scratchOrgCreate.js +216 -216
  67. package/lib/org/scratchOrgErrorCodes.d.ts +10 -10
  68. package/lib/org/scratchOrgErrorCodes.js +88 -88
  69. package/lib/org/scratchOrgFeatureDeprecation.d.ts +26 -26
  70. package/lib/org/scratchOrgFeatureDeprecation.js +109 -109
  71. package/lib/org/scratchOrgInfoApi.d.ts +68 -68
  72. package/lib/org/scratchOrgInfoApi.js +413 -413
  73. package/lib/org/scratchOrgInfoGenerator.d.ts +64 -64
  74. package/lib/org/scratchOrgInfoGenerator.js +241 -241
  75. package/lib/org/scratchOrgLifecycleEvents.d.ts +10 -10
  76. package/lib/org/scratchOrgLifecycleEvents.js +40 -40
  77. package/lib/org/scratchOrgSettingsGenerator.d.ts +78 -78
  78. package/lib/org/scratchOrgSettingsGenerator.js +276 -276
  79. package/lib/org/scratchOrgTypes.d.ts +43 -43
  80. package/lib/org/scratchOrgTypes.js +8 -8
  81. package/lib/org/user.d.ts +187 -187
  82. package/lib/org/user.js +448 -448
  83. package/lib/schema/printer.d.ts +79 -79
  84. package/lib/schema/printer.js +260 -260
  85. package/lib/schema/validator.d.ts +70 -70
  86. package/lib/schema/validator.js +169 -169
  87. package/lib/sfError.d.ts +73 -73
  88. package/lib/sfError.js +136 -136
  89. package/lib/sfProject.d.ts +357 -357
  90. package/lib/sfProject.js +671 -671
  91. package/lib/stateAggregator/accessors/aliasAccessor.d.ts +98 -98
  92. package/lib/stateAggregator/accessors/aliasAccessor.js +145 -145
  93. package/lib/stateAggregator/accessors/orgAccessor.d.ts +101 -101
  94. package/lib/stateAggregator/accessors/orgAccessor.js +240 -240
  95. package/lib/stateAggregator/accessors/sandboxAccessor.d.ts +8 -8
  96. package/lib/stateAggregator/accessors/sandboxAccessor.js +27 -27
  97. package/lib/stateAggregator/accessors/tokenAccessor.d.ts +63 -63
  98. package/lib/stateAggregator/accessors/tokenAccessor.js +79 -79
  99. package/lib/stateAggregator/index.d.ts +4 -4
  100. package/lib/stateAggregator/index.js +26 -26
  101. package/lib/stateAggregator/stateAggregator.d.ts +25 -25
  102. package/lib/stateAggregator/stateAggregator.js +45 -45
  103. package/lib/status/myDomainResolver.d.ts +66 -66
  104. package/lib/status/myDomainResolver.js +124 -124
  105. package/lib/status/pollingClient.d.ts +85 -85
  106. package/lib/status/pollingClient.js +115 -115
  107. package/lib/status/streamingClient.d.ts +244 -244
  108. package/lib/status/streamingClient.js +436 -436
  109. package/lib/status/types.d.ts +89 -89
  110. package/lib/status/types.js +17 -17
  111. package/lib/testSetup.d.ts +553 -553
  112. package/lib/testSetup.js +871 -871
  113. package/lib/util/cache.d.ts +11 -11
  114. package/lib/util/cache.js +69 -69
  115. package/lib/util/checkLightningDomain.d.ts +1 -1
  116. package/lib/util/checkLightningDomain.js +28 -28
  117. package/lib/util/directoryWriter.d.ts +12 -12
  118. package/lib/util/directoryWriter.js +53 -53
  119. package/lib/util/getJwtAudienceUrl.d.ts +4 -4
  120. package/lib/util/getJwtAudienceUrl.js +18 -18
  121. package/lib/util/internal.d.ts +58 -58
  122. package/lib/util/internal.js +118 -118
  123. package/lib/util/jsonXmlTools.d.ts +14 -14
  124. package/lib/util/jsonXmlTools.js +38 -38
  125. package/lib/util/mapKeys.d.ts +14 -14
  126. package/lib/util/mapKeys.js +51 -51
  127. package/lib/util/sfdc.d.ts +52 -52
  128. package/lib/util/sfdc.js +85 -85
  129. package/lib/util/sfdcUrl.d.ts +72 -72
  130. package/lib/util/sfdcUrl.js +215 -215
  131. package/lib/util/structuredWriter.d.ts +9 -9
  132. package/lib/util/structuredWriter.js +2 -2
  133. package/lib/util/zipWriter.d.ts +16 -16
  134. package/lib/util/zipWriter.js +67 -67
  135. package/lib/webOAuthServer.d.ts +156 -156
  136. package/lib/webOAuthServer.js +388 -388
  137. package/messages/auth.md +37 -37
  138. package/messages/config.md +156 -156
  139. package/messages/connection.md +30 -30
  140. package/messages/core.json +20 -20
  141. package/messages/core.md +67 -67
  142. package/messages/encryption.md +85 -85
  143. package/messages/envVars.md +303 -303
  144. package/messages/org.md +63 -63
  145. package/messages/permissionSetAssignment.md +31 -31
  146. package/messages/scratchOrgCreate.md +23 -23
  147. package/messages/scratchOrgErrorCodes.md +115 -115
  148. package/messages/scratchOrgFeatureDeprecation.md +11 -11
  149. package/messages/scratchOrgInfoApi.md +15 -15
  150. package/messages/scratchOrgInfoGenerator.md +23 -23
  151. package/messages/streaming.md +23 -23
  152. package/messages/user.md +35 -35
  153. 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
+ }