@salesforce/core 3.7.4 → 3.7.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.
- package/CHANGELOG.md +219 -0
- package/README.md +4 -4
- package/lib/config/config.d.ts +5 -5
- package/lib/config/config.js +5 -5
- package/lib/config/configAggregator.d.ts +2 -2
- package/lib/config/configAggregator.js +2 -2
- package/lib/config/configFile.d.ts +2 -2
- package/lib/config/configFile.js +7 -7
- package/lib/config/configStore.js +7 -6
- package/lib/config/envVars.d.ts +20 -5
- package/lib/config/envVars.js +70 -5
- package/lib/crypto/keyChainImpl.js +2 -3
- package/lib/deviceOauthService.js +2 -2
- package/lib/exported.d.ts +6 -4
- package/lib/exported.js +13 -6
- package/lib/globalInfo/accessors/aliasAccessor.js +2 -2
- package/lib/lifecycleEvents.js +1 -1
- package/lib/logger.d.ts +3 -3
- package/lib/logger.js +9 -10
- package/lib/messages.d.ts +2 -2
- package/lib/messages.js +4 -4
- package/lib/org/authInfo.d.ts +1 -1
- package/lib/org/authInfo.js +6 -7
- package/lib/org/authRemover.d.ts +2 -2
- package/lib/org/authRemover.js +2 -2
- package/lib/org/connection.d.ts +7 -2
- package/lib/org/connection.js +17 -4
- package/lib/org/org.d.ts +16 -6
- package/lib/org/org.js +52 -49
- package/lib/org/permissionSetAssignment.js +2 -2
- package/lib/org/scratchOrgCreate.d.ts +43 -0
- package/lib/org/scratchOrgCreate.js +142 -0
- package/lib/org/scratchOrgErrorCodes.d.ts +4 -0
- package/lib/org/scratchOrgErrorCodes.js +62 -0
- package/lib/org/scratchOrgFeatureDeprecation.d.ts +26 -0
- package/lib/org/scratchOrgFeatureDeprecation.js +110 -0
- package/lib/org/scratchOrgInfoApi.d.ts +94 -0
- package/lib/org/scratchOrgInfoApi.js +350 -0
- package/lib/org/scratchOrgInfoGenerator.d.ts +63 -0
- package/lib/org/scratchOrgInfoGenerator.js +223 -0
- package/lib/org/scratchOrgSettingsGenerator.d.ts +56 -0
- package/lib/org/scratchOrgSettingsGenerator.js +210 -0
- package/lib/org/user.js +8 -7
- package/lib/schema/printer.js +2 -2
- package/lib/schema/validator.d.ts +4 -4
- package/lib/schema/validator.js +9 -9
- package/lib/{sfdxError.d.ts → sfError.d.ts} +14 -9
- package/lib/{sfdxError.js → sfError.js} +20 -14
- package/lib/{sfdxProject.d.ts → sfProject.d.ts} +37 -27
- package/lib/{sfdxProject.js → sfProject.js} +75 -63
- package/lib/status/pollingClient.d.ts +2 -2
- package/lib/status/pollingClient.js +10 -4
- package/lib/status/streamingClient.d.ts +1 -1
- package/lib/status/streamingClient.js +6 -6
- package/lib/testSetup.d.ts +4 -4
- package/lib/testSetup.js +8 -8
- package/lib/util/fs.js +7 -7
- package/lib/util/internal.d.ts +2 -2
- package/lib/util/internal.js +2 -2
- package/lib/util/jsonXmlTools.d.ts +14 -0
- package/lib/util/jsonXmlTools.js +41 -0
- package/lib/util/mapKeys.d.ts +14 -0
- package/lib/util/mapKeys.js +48 -0
- package/lib/util/sfdcUrl.d.ts +2 -2
- package/lib/util/sfdcUrl.js +2 -2
- package/lib/util/zipWriter.d.ts +14 -0
- package/lib/util/zipWriter.js +68 -0
- package/lib/webOAuthServer.js +11 -11
- package/messages/envVars.md +53 -13
- package/messages/org.md +4 -0
- package/messages/scratchOrgCreate.md +27 -0
- package/messages/scratchOrgErrorCodes.md +99 -0
- package/messages/scratchOrgFeatureDeprecation.md +11 -0
- package/messages/scratchOrgInfoApi.md +11 -0
- package/messages/scratchOrgInfoGenerator.md +19 -0
- package/messages/user.md +4 -0
- package/package.json +5 -1
|
@@ -11,7 +11,8 @@ const kit_1 = require("@salesforce/kit");
|
|
|
11
11
|
const ts_types_1 = require("@salesforce/ts-types");
|
|
12
12
|
const ts_retry_promise_1 = require("ts-retry-promise");
|
|
13
13
|
const logger_1 = require("../logger");
|
|
14
|
-
const
|
|
14
|
+
const sfError_1 = require("../sfError");
|
|
15
|
+
const lifecycleEvents_1 = require("../lifecycleEvents");
|
|
15
16
|
/**
|
|
16
17
|
* This is a polling client that can be used to poll the status of long running tasks. It can be used as a replacement
|
|
17
18
|
* for Streaming when streaming topics are not available or when streaming handshakes are failing. Why wouldn't you
|
|
@@ -60,9 +61,14 @@ class PollingClient extends kit_1.AsyncOptionalCreatable {
|
|
|
60
61
|
result = await this.options.poll();
|
|
61
62
|
}
|
|
62
63
|
catch (error) {
|
|
63
|
-
errorInPollingFunction = error;
|
|
64
|
+
const err = (errorInPollingFunction = error);
|
|
65
|
+
if (['ETIMEDOUT', 'ENOTFOUND', 'ECONNRESET', 'socket hang up'].some((retryableNetworkError) => err.message.includes(retryableNetworkError))) {
|
|
66
|
+
this.logger.debug('Network error on the request', err);
|
|
67
|
+
await lifecycleEvents_1.Lifecycle.getInstance().emitWarning('Network error occurred. Continuing to poll.');
|
|
68
|
+
throw sfError_1.SfError.wrap(err);
|
|
69
|
+
}
|
|
64
70
|
// there was an actual error thrown, so we don't want to keep retrying
|
|
65
|
-
throw new ts_retry_promise_1.NotRetryableError(
|
|
71
|
+
throw new ts_retry_promise_1.NotRetryableError(err.name);
|
|
66
72
|
}
|
|
67
73
|
if (result.completed) {
|
|
68
74
|
return result.payload;
|
|
@@ -82,7 +88,7 @@ class PollingClient extends kit_1.AsyncOptionalCreatable {
|
|
|
82
88
|
throw errorInPollingFunction;
|
|
83
89
|
}
|
|
84
90
|
this.logger.debug('Polling timed out');
|
|
85
|
-
throw new
|
|
91
|
+
throw new sfError_1.SfError('The client has timed out.', (_a = this.options.timeoutErrorName) !== null && _a !== void 0 ? _a : 'PollingClientTimeout');
|
|
86
92
|
}
|
|
87
93
|
}
|
|
88
94
|
}
|
|
@@ -113,7 +113,7 @@ export declare class StreamingClient extends AsyncOptionalCreatable<StreamingCli
|
|
|
113
113
|
* Subscribe to streaming events. When the streaming processor that's set in the options completes execution it
|
|
114
114
|
* returns a payload in the StatusResult object. The payload is just echoed here for convenience.
|
|
115
115
|
*
|
|
116
|
-
* **Throws** *{@link
|
|
116
|
+
* **Throws** *{@link SfError}{ name: '{@link StreamingClient.TimeoutErrorType.SUBSCRIBE}'}* When the subscribe timeout occurs.
|
|
117
117
|
*
|
|
118
118
|
* @param streamInit This function should call the platform apis that result in streaming updates on push topics.
|
|
119
119
|
* {@link StatusResult}
|
|
@@ -13,7 +13,7 @@ const lib_1 = require("@salesforce/kit/lib");
|
|
|
13
13
|
const lib_2 = require("@salesforce/ts-types/lib");
|
|
14
14
|
const Faye = require("faye");
|
|
15
15
|
const logger_1 = require("../logger");
|
|
16
|
-
const
|
|
16
|
+
const sfError_1 = require("../sfError");
|
|
17
17
|
const messages_1 = require("../messages");
|
|
18
18
|
const types_1 = require("./types");
|
|
19
19
|
Object.defineProperty(exports, "CometClient", { enumerable: true, get: function () { return types_1.CometClient; } });
|
|
@@ -151,7 +151,7 @@ class StreamingClient extends lib_1.AsyncOptionalCreatable {
|
|
|
151
151
|
this.cometClient.setHeader('Authorization', `OAuth ${accessToken}`);
|
|
152
152
|
}
|
|
153
153
|
else {
|
|
154
|
-
throw new
|
|
154
|
+
throw new sfError_1.SfError('Missing or invalid access token', 'MissingOrInvalidAccessToken');
|
|
155
155
|
}
|
|
156
156
|
this.log(`Streaming client target url: ${this.targetUrl}`);
|
|
157
157
|
this.log(`options.subscribeTimeout (ms): ${this.options.subscribeTimeout.milliseconds}`);
|
|
@@ -201,7 +201,7 @@ class StreamingClient extends lib_1.AsyncOptionalCreatable {
|
|
|
201
201
|
* Subscribe to streaming events. When the streaming processor that's set in the options completes execution it
|
|
202
202
|
* returns a payload in the StatusResult object. The payload is just echoed here for convenience.
|
|
203
203
|
*
|
|
204
|
-
* **Throws** *{@link
|
|
204
|
+
* **Throws** *{@link SfError}{ name: '{@link StreamingClient.TimeoutErrorType.SUBSCRIBE}'}* When the subscribe timeout occurs.
|
|
205
205
|
*
|
|
206
206
|
* @param streamInit This function should call the platform apis that result in streaming updates on push topics.
|
|
207
207
|
* {@link StatusResult}
|
|
@@ -342,13 +342,13 @@ exports.StreamingClient = StreamingClient;
|
|
|
342
342
|
logger.warn('envDep is deprecated');
|
|
343
343
|
}
|
|
344
344
|
if (!streamProcessor) {
|
|
345
|
-
throw new
|
|
345
|
+
throw new sfError_1.SfError('Missing stream processor', 'MissingArg');
|
|
346
346
|
}
|
|
347
347
|
if (!org) {
|
|
348
|
-
throw new
|
|
348
|
+
throw new sfError_1.SfError('Missing org', 'MissingArg');
|
|
349
349
|
}
|
|
350
350
|
if (!channel) {
|
|
351
|
-
throw new
|
|
351
|
+
throw new sfError_1.SfError('Missing streaming channel', 'MissingArg');
|
|
352
352
|
}
|
|
353
353
|
this.org = org;
|
|
354
354
|
this.apiVersion = org.getConnection().getApiVersion();
|
package/lib/testSetup.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import * as sinonType from 'sinon';
|
|
|
4
4
|
import { AnyJson, JsonMap, Optional } from '@salesforce/ts-types';
|
|
5
5
|
import { ConfigContents } from './config/configStore';
|
|
6
6
|
import { Logger } from './logger';
|
|
7
|
-
import {
|
|
7
|
+
import { SfError } from './sfError';
|
|
8
8
|
import { CometClient, CometSubscription, Message, StreamingExtension } from './status/streamingClient';
|
|
9
9
|
import { SfOrg } from './globalInfo';
|
|
10
10
|
/**
|
|
@@ -85,7 +85,7 @@ export interface TestContext {
|
|
|
85
85
|
[configName: string]: Optional<ConfigStub>;
|
|
86
86
|
GlobalInfo?: ConfigStub;
|
|
87
87
|
Aliases?: ConfigStub;
|
|
88
|
-
|
|
88
|
+
SfProjectJson?: ConfigStub;
|
|
89
89
|
SfdxConfig?: ConfigStub;
|
|
90
90
|
};
|
|
91
91
|
/**
|
|
@@ -252,7 +252,7 @@ export declare const testSetup: (sinon?: any) => TestContext;
|
|
|
252
252
|
*
|
|
253
253
|
* **See** {@link shouldThrow}
|
|
254
254
|
*/
|
|
255
|
-
export declare const unexpectedResult:
|
|
255
|
+
export declare const unexpectedResult: SfError;
|
|
256
256
|
/**
|
|
257
257
|
* Use for this testing pattern:
|
|
258
258
|
* ```
|
|
@@ -302,7 +302,7 @@ export interface StreamingMockCometSubscriptionOptions {
|
|
|
302
302
|
/**
|
|
303
303
|
* If it's an error that states what that error should be.
|
|
304
304
|
*/
|
|
305
|
-
subscriptionErrbackError?:
|
|
305
|
+
subscriptionErrbackError?: SfError;
|
|
306
306
|
/**
|
|
307
307
|
* A list of messages to playback for the client. One message per process tick.
|
|
308
308
|
*/
|
package/lib/testSetup.js
CHANGED
|
@@ -21,8 +21,8 @@ const connection_1 = require("./org/connection");
|
|
|
21
21
|
const crypto_2 = require("./crypto/crypto");
|
|
22
22
|
const logger_1 = require("./logger");
|
|
23
23
|
const messages_1 = require("./messages");
|
|
24
|
-
const
|
|
25
|
-
const
|
|
24
|
+
const sfError_1 = require("./sfError");
|
|
25
|
+
const sfProject_1 = require("./sfProject");
|
|
26
26
|
const streamingClient_1 = require("./status/streamingClient");
|
|
27
27
|
const globalInfo_1 = require("./globalInfo");
|
|
28
28
|
const global_1 = require("./global");
|
|
@@ -126,12 +126,12 @@ const instantiateContext = (sinon) => {
|
|
|
126
126
|
inProject(inProject = true) {
|
|
127
127
|
testContext.SANDBOXES.PROJECT.restore();
|
|
128
128
|
if (inProject) {
|
|
129
|
-
testContext.SANDBOXES.PROJECT.stub(
|
|
130
|
-
testContext.SANDBOXES.PROJECT.stub(
|
|
129
|
+
testContext.SANDBOXES.PROJECT.stub(sfProject_1.SfProject, 'resolveProjectPath').callsFake(() => testContext.localPathRetriever(testContext.id));
|
|
130
|
+
testContext.SANDBOXES.PROJECT.stub(sfProject_1.SfProject, 'resolveProjectPathSync').callsFake(() => testContext.localPathRetrieverSync(testContext.id));
|
|
131
131
|
}
|
|
132
132
|
else {
|
|
133
|
-
testContext.SANDBOXES.PROJECT.stub(
|
|
134
|
-
testContext.SANDBOXES.PROJECT.stub(
|
|
133
|
+
testContext.SANDBOXES.PROJECT.stub(sfProject_1.SfProject, 'resolveProjectPath').rejects(new sfError_1.SfError('', 'InvalidProjectWorkspaceError'));
|
|
134
|
+
testContext.SANDBOXES.PROJECT.stub(sfProject_1.SfProject, 'resolveProjectPathSync').throws(new sfError_1.SfError('', 'InvalidProjectWorkspaceError'));
|
|
135
135
|
}
|
|
136
136
|
},
|
|
137
137
|
};
|
|
@@ -174,7 +174,7 @@ const stubContext = (testContext) => {
|
|
|
174
174
|
testContext.inProject(true);
|
|
175
175
|
testContext.SANDBOXES.CONFIG.stub(configFile_1.ConfigFile, 'resolveRootFolder').callsFake((isGlobal) => testContext.rootPathRetriever(isGlobal, testContext.id));
|
|
176
176
|
testContext.SANDBOXES.CONFIG.stub(configFile_1.ConfigFile, 'resolveRootFolderSync').callsFake((isGlobal) => testContext.rootPathRetrieverSync(isGlobal, testContext.id));
|
|
177
|
-
(0, ts_sinon_1.stubMethod)(testContext.SANDBOXES.PROJECT,
|
|
177
|
+
(0, ts_sinon_1.stubMethod)(testContext.SANDBOXES.PROJECT, sfProject_1.SfProjectJson.prototype, 'doesPackageExist').callsFake(() => true);
|
|
178
178
|
const initStubForRead = (configFile) => {
|
|
179
179
|
const stub = testContext.configStubs[configFile.constructor.name] || {};
|
|
180
180
|
// init calls read calls getPath which sets the path on the config file the first time.
|
|
@@ -324,7 +324,7 @@ exports.testSetup = (0, kit_1.once)(_testSetup);
|
|
|
324
324
|
*
|
|
325
325
|
* **See** {@link shouldThrow}
|
|
326
326
|
*/
|
|
327
|
-
exports.unexpectedResult = new
|
|
327
|
+
exports.unexpectedResult = new sfError_1.SfError('This code was expected to fail', 'UnexpectedResult');
|
|
328
328
|
/**
|
|
329
329
|
* Use for this testing pattern:
|
|
330
330
|
* ```
|
package/lib/util/fs.js
CHANGED
|
@@ -13,7 +13,7 @@ const util_1 = require("util");
|
|
|
13
13
|
const kit_1 = require("@salesforce/kit");
|
|
14
14
|
const fsLib = require("graceful-fs");
|
|
15
15
|
const mkdirpLib = require("mkdirp");
|
|
16
|
-
const
|
|
16
|
+
const sfError_1 = require("../sfError");
|
|
17
17
|
/**
|
|
18
18
|
* @deprecated Use fs/promises instead
|
|
19
19
|
*/
|
|
@@ -79,13 +79,13 @@ exports.fs = Object.assign({}, fsLib, {
|
|
|
79
79
|
*/
|
|
80
80
|
remove: async (dirPath) => {
|
|
81
81
|
if (!dirPath) {
|
|
82
|
-
throw new
|
|
82
|
+
throw new sfError_1.SfError('Path is null or undefined.', 'PathIsNullOrUndefined');
|
|
83
83
|
}
|
|
84
84
|
try {
|
|
85
85
|
await exports.fs.access(dirPath, fsLib.constants.R_OK);
|
|
86
86
|
}
|
|
87
87
|
catch (err) {
|
|
88
|
-
throw new
|
|
88
|
+
throw new sfError_1.SfError(`The path: ${dirPath} doesn't exist or access is denied.`, 'DirMissingOrNoAccess');
|
|
89
89
|
}
|
|
90
90
|
const files = await exports.fs.readdir(dirPath);
|
|
91
91
|
const stats = await Promise.all(files.map((file) => exports.fs.stat(path.join(dirPath, file))));
|
|
@@ -105,13 +105,13 @@ exports.fs = Object.assign({}, fsLib, {
|
|
|
105
105
|
*/
|
|
106
106
|
removeSync: (dirPath) => {
|
|
107
107
|
if (!dirPath) {
|
|
108
|
-
throw new
|
|
108
|
+
throw new sfError_1.SfError('Path is null or undefined.', 'PathIsNullOrUndefined');
|
|
109
109
|
}
|
|
110
110
|
try {
|
|
111
111
|
exports.fs.accessSync(dirPath, fsLib.constants.R_OK);
|
|
112
112
|
}
|
|
113
113
|
catch (err) {
|
|
114
|
-
throw new
|
|
114
|
+
throw new sfError_1.SfError(`The path: ${dirPath} doesn't exist or access is denied.`, 'DirMissingOrNoAccess');
|
|
115
115
|
}
|
|
116
116
|
exports.fs.actOnSync(dirPath, (fullPath, file) => {
|
|
117
117
|
if (file) {
|
|
@@ -340,7 +340,7 @@ exports.fs = Object.assign({}, fsLib, {
|
|
|
340
340
|
return exports.fs.getContentHash(contentA) === exports.fs.getContentHash(contentB);
|
|
341
341
|
}
|
|
342
342
|
catch (err) {
|
|
343
|
-
throw new
|
|
343
|
+
throw new sfError_1.SfError(`The path: ${err.path} doesn't exist or access is denied.`, 'DirMissingOrNoAccess');
|
|
344
344
|
}
|
|
345
345
|
},
|
|
346
346
|
/**
|
|
@@ -362,7 +362,7 @@ exports.fs = Object.assign({}, fsLib, {
|
|
|
362
362
|
return exports.fs.getContentHash(contentA) === exports.fs.getContentHash(contentB);
|
|
363
363
|
}
|
|
364
364
|
catch (err) {
|
|
365
|
-
throw new
|
|
365
|
+
throw new sfError_1.SfError(`The path: ${err.path} doesn't exist or access is denied.`, 'DirMissingOrNoAccess');
|
|
366
366
|
}
|
|
367
367
|
},
|
|
368
368
|
/**
|
package/lib/util/internal.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export declare const SFDX_PROJECT_JSON = "sfdx-project.json";
|
|
|
11
11
|
*
|
|
12
12
|
* **See** {@link traverseForFile}
|
|
13
13
|
*
|
|
14
|
-
* **Throws** *{@link
|
|
14
|
+
* **Throws** *{@link SfError}{ name: 'InvalidProjectWorkspaceError' }* If the current folder is not located in a workspace.
|
|
15
15
|
*
|
|
16
16
|
* @param dir The directory path to start traversing from.
|
|
17
17
|
* @ignore
|
|
@@ -24,7 +24,7 @@ export declare function resolveProjectPath(dir?: string): Promise<string>;
|
|
|
24
24
|
*
|
|
25
25
|
* **See** {@link traverseForFile}
|
|
26
26
|
*
|
|
27
|
-
* **Throws** *{@link
|
|
27
|
+
* **Throws** *{@link SfError}{ name: 'InvalidProjectWorkspaceError' }* If the current folder is not located in a workspace.
|
|
28
28
|
*
|
|
29
29
|
* @param dir The directory path to start traversing from.
|
|
30
30
|
* @ignore
|
package/lib/util/internal.js
CHANGED
|
@@ -25,7 +25,7 @@ exports.SFDX_PROJECT_JSON = 'sfdx-project.json';
|
|
|
25
25
|
*
|
|
26
26
|
* **See** {@link traverseForFile}
|
|
27
27
|
*
|
|
28
|
-
* **Throws** *{@link
|
|
28
|
+
* **Throws** *{@link SfError}{ name: 'InvalidProjectWorkspaceError' }* If the current folder is not located in a workspace.
|
|
29
29
|
*
|
|
30
30
|
* @param dir The directory path to start traversing from.
|
|
31
31
|
* @ignore
|
|
@@ -45,7 +45,7 @@ exports.resolveProjectPath = resolveProjectPath;
|
|
|
45
45
|
*
|
|
46
46
|
* **See** {@link traverseForFile}
|
|
47
47
|
*
|
|
48
|
-
* **Throws** *{@link
|
|
48
|
+
* **Throws** *{@link SfError}{ name: 'InvalidProjectWorkspaceError' }* If the current folder is not located in a workspace.
|
|
49
49
|
*
|
|
50
50
|
* @param dir The directory path to start traversing from.
|
|
51
51
|
* @ignore
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { JsonMap } from '@salesforce/ts-types';
|
|
2
|
+
import { IOptions } from 'js2xmlparser/lib/options';
|
|
3
|
+
export interface JSONasXML {
|
|
4
|
+
json: JsonMap;
|
|
5
|
+
type: string;
|
|
6
|
+
options?: IOptions;
|
|
7
|
+
}
|
|
8
|
+
export interface WriteJSONasXMLInputs extends JSONasXML {
|
|
9
|
+
path: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const standardOptions: IOptions;
|
|
12
|
+
export declare const writeJSONasXML: ({ path, json, type, options, }: WriteJSONasXMLInputs) => Promise<void>;
|
|
13
|
+
export declare const JsonAsXml: ({ json, type, options }: JSONasXML) => string;
|
|
14
|
+
export declare const fixExistingDollarSign: (existing: WriteJSONasXMLInputs['json']) => Record<string, unknown>;
|
|
@@ -0,0 +1,41 @@
|
|
|
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.fixExistingDollarSign = exports.JsonAsXml = exports.writeJSONasXML = exports.standardOptions = void 0;
|
|
10
|
+
const fs_1 = require("fs");
|
|
11
|
+
const jsToXml = require("js2xmlparser");
|
|
12
|
+
exports.standardOptions = {
|
|
13
|
+
declaration: {
|
|
14
|
+
include: true,
|
|
15
|
+
encoding: 'UTF-8',
|
|
16
|
+
version: '1.0',
|
|
17
|
+
},
|
|
18
|
+
format: {
|
|
19
|
+
doubleQuotes: true,
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
const writeJSONasXML = async ({ path, json, type, options = exports.standardOptions, }) => {
|
|
23
|
+
const xml = jsToXml.parse(type, (0, exports.fixExistingDollarSign)(json), options);
|
|
24
|
+
return await fs_1.promises.writeFile(path, xml);
|
|
25
|
+
};
|
|
26
|
+
exports.writeJSONasXML = writeJSONasXML;
|
|
27
|
+
const JsonAsXml = ({ json, type, options = exports.standardOptions }) => {
|
|
28
|
+
return jsToXml.parse(type, (0, exports.fixExistingDollarSign)(json), options);
|
|
29
|
+
};
|
|
30
|
+
exports.JsonAsXml = JsonAsXml;
|
|
31
|
+
const fixExistingDollarSign = (existing) => {
|
|
32
|
+
const existingCopy = { ...existing };
|
|
33
|
+
if (existingCopy.$) {
|
|
34
|
+
const temp = existingCopy.$;
|
|
35
|
+
delete existingCopy.$;
|
|
36
|
+
existingCopy['@'] = temp;
|
|
37
|
+
}
|
|
38
|
+
return existingCopy;
|
|
39
|
+
};
|
|
40
|
+
exports.fixExistingDollarSign = fixExistingDollarSign;
|
|
41
|
+
//# sourceMappingURL=jsonXmlTools.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use mapKeys to convert object keys to another format using the specified conversion function.
|
|
3
|
+
*
|
|
4
|
+
* E.g., to deep convert all object keys to camelCase: mapKeys(myObj, _.camelCase, true)
|
|
5
|
+
* to shallow convert object keys to lower case: mapKeys(myObj, _.toLower)
|
|
6
|
+
*
|
|
7
|
+
* NOTE: This mutates the object passed in for conversion.
|
|
8
|
+
*
|
|
9
|
+
* @param target - {Object} The object to convert the keys
|
|
10
|
+
* @param converter - {Function} The function that converts the object key
|
|
11
|
+
* @param deep - {boolean} Whether to do a deep object key conversion
|
|
12
|
+
* @return {Object} - the object with the converted keys
|
|
13
|
+
*/
|
|
14
|
+
export default function mapKeys(obj: any, converter: (key: string) => string, deep?: boolean): Record<string, unknown>;
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
+
const ts_types_1 = require("@salesforce/ts-types");
|
|
10
|
+
/**
|
|
11
|
+
* Use mapKeys to convert object keys to another format using the specified conversion function.
|
|
12
|
+
*
|
|
13
|
+
* E.g., to deep convert all object keys to camelCase: mapKeys(myObj, _.camelCase, true)
|
|
14
|
+
* to shallow convert object keys to lower case: mapKeys(myObj, _.toLower)
|
|
15
|
+
*
|
|
16
|
+
* NOTE: This mutates the object passed in for conversion.
|
|
17
|
+
*
|
|
18
|
+
* @param target - {Object} The object to convert the keys
|
|
19
|
+
* @param converter - {Function} The function that converts the object key
|
|
20
|
+
* @param deep - {boolean} Whether to do a deep object key conversion
|
|
21
|
+
* @return {Object} - the object with the converted keys
|
|
22
|
+
*/
|
|
23
|
+
function mapKeys(
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
|
|
25
|
+
obj, converter, deep) {
|
|
26
|
+
const target = Object.assign({}, obj);
|
|
27
|
+
return Object.fromEntries(Object.entries(target).map(([key, value]) => {
|
|
28
|
+
const k = converter.call(null, key);
|
|
29
|
+
if (deep) {
|
|
30
|
+
let v = value;
|
|
31
|
+
if (Array.isArray(value)) {
|
|
32
|
+
v = value.map((v1) => {
|
|
33
|
+
if ((0, ts_types_1.isPlainObject)(v1)) {
|
|
34
|
+
return mapKeys(v1, converter, deep);
|
|
35
|
+
}
|
|
36
|
+
return v1;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
else if ((0, ts_types_1.isPlainObject)(value)) {
|
|
40
|
+
v = mapKeys(value, converter, deep);
|
|
41
|
+
}
|
|
42
|
+
return [k, v];
|
|
43
|
+
}
|
|
44
|
+
return [k, value];
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
exports.default = mapKeys;
|
|
48
|
+
//# sourceMappingURL=mapKeys.js.map
|
package/lib/util/sfdcUrl.d.ts
CHANGED
|
@@ -43,7 +43,7 @@ export declare class SfdcUrl extends URL {
|
|
|
43
43
|
* If SFDX_DOMAIN_RETRY environment variable is set (number) it overrides the default timeout duration (240 seconds)
|
|
44
44
|
*
|
|
45
45
|
* @returns {Promise<true | never>} The resolved ip address or never
|
|
46
|
-
* @throws {@link
|
|
46
|
+
* @throws {@link SfError} If can't resolve DNS.
|
|
47
47
|
*/
|
|
48
48
|
checkLightningDomain(): Promise<true | never>;
|
|
49
49
|
/**
|
|
@@ -51,7 +51,7 @@ export declare class SfdcUrl extends URL {
|
|
|
51
51
|
* If SFDX_DOMAIN_RETRY environment variable is set (number) it overrides the default timeout duration (240 seconds)
|
|
52
52
|
*
|
|
53
53
|
* @returns the resolved ip address.
|
|
54
|
-
* @throws {@link
|
|
54
|
+
* @throws {@link SfError} If can't resolve DNS.
|
|
55
55
|
*/
|
|
56
56
|
lookup(): Promise<string>;
|
|
57
57
|
/**
|
package/lib/util/sfdcUrl.js
CHANGED
|
@@ -121,7 +121,7 @@ class SfdcUrl extends url_1.URL {
|
|
|
121
121
|
* If SFDX_DOMAIN_RETRY environment variable is set (number) it overrides the default timeout duration (240 seconds)
|
|
122
122
|
*
|
|
123
123
|
* @returns {Promise<true | never>} The resolved ip address or never
|
|
124
|
-
* @throws {@link
|
|
124
|
+
* @throws {@link SfError} If can't resolve DNS.
|
|
125
125
|
*/
|
|
126
126
|
async checkLightningDomain() {
|
|
127
127
|
const quantity = (0, ts_types_1.ensureNumber)(new kit_1.Env().getNumber('SFDX_DOMAIN_RETRY', 240));
|
|
@@ -142,7 +142,7 @@ class SfdcUrl extends url_1.URL {
|
|
|
142
142
|
* If SFDX_DOMAIN_RETRY environment variable is set (number) it overrides the default timeout duration (240 seconds)
|
|
143
143
|
*
|
|
144
144
|
* @returns the resolved ip address.
|
|
145
|
-
* @throws {@link
|
|
145
|
+
* @throws {@link SfError} If can't resolve DNS.
|
|
146
146
|
*/
|
|
147
147
|
async lookup() {
|
|
148
148
|
const quantity = (0, ts_types_1.ensureNumber)(new kit_1.Env().getNumber('SFDX_DOMAIN_RETRY', 240));
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { pipeline as cbPipeline, Readable, Writable } from 'stream';
|
|
3
|
+
export declare const pipeline: typeof cbPipeline.__promisify__;
|
|
4
|
+
export declare class ZipWriter extends Writable {
|
|
5
|
+
private rootDestination?;
|
|
6
|
+
private zip;
|
|
7
|
+
private buffers;
|
|
8
|
+
constructor(rootDestination?: string | undefined);
|
|
9
|
+
addToZip(contents: string | Readable | Buffer, path: string): void;
|
|
10
|
+
finalize(): Promise<void>;
|
|
11
|
+
private getOutputStream;
|
|
12
|
+
private getInputBuffer;
|
|
13
|
+
get buffer(): Buffer;
|
|
14
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
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.ZipWriter = exports.pipeline = void 0;
|
|
10
|
+
const fs_1 = require("fs");
|
|
11
|
+
const stream_1 = require("stream");
|
|
12
|
+
const util_1 = require("util");
|
|
13
|
+
const archiver_1 = require("archiver");
|
|
14
|
+
exports.pipeline = (0, util_1.promisify)(stream_1.pipeline);
|
|
15
|
+
class ZipWriter extends stream_1.Writable {
|
|
16
|
+
constructor(rootDestination) {
|
|
17
|
+
super({ objectMode: true });
|
|
18
|
+
this.rootDestination = rootDestination;
|
|
19
|
+
// compression-/speed+ (0)<---(3)---------->(9) compression+/speed-
|
|
20
|
+
// 3 appears to be a decent balance of compression and speed. It felt like
|
|
21
|
+
// higher values = diminishing returns on compression and made conversion slower
|
|
22
|
+
this.zip = (0, archiver_1.create)('zip', { zlib: { level: 3 } });
|
|
23
|
+
this.buffers = [];
|
|
24
|
+
void (0, exports.pipeline)(this.zip, this.getOutputStream());
|
|
25
|
+
}
|
|
26
|
+
addToZip(contents, path) {
|
|
27
|
+
this.zip.append(contents, { name: path });
|
|
28
|
+
}
|
|
29
|
+
async finalize() {
|
|
30
|
+
await this.zip.finalize();
|
|
31
|
+
await this.getInputBuffer();
|
|
32
|
+
}
|
|
33
|
+
getOutputStream() {
|
|
34
|
+
if (this.rootDestination) {
|
|
35
|
+
return (0, fs_1.createWriteStream)(this.rootDestination);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const bufferWritable = new stream_1.Writable();
|
|
39
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
40
|
+
bufferWritable._write = (chunk, encoding, cb) => {
|
|
41
|
+
this.buffers.push(chunk);
|
|
42
|
+
cb();
|
|
43
|
+
};
|
|
44
|
+
return bufferWritable;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async getInputBuffer() {
|
|
48
|
+
if (this.rootDestination) {
|
|
49
|
+
const inputStream = (0, fs_1.createReadStream)(this.rootDestination);
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
inputStream.on('data', (chunk) => {
|
|
52
|
+
this.buffers.push(chunk);
|
|
53
|
+
});
|
|
54
|
+
inputStream.once('end', () => {
|
|
55
|
+
return resolve();
|
|
56
|
+
});
|
|
57
|
+
inputStream.once('error', (error) => {
|
|
58
|
+
return reject(error);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
get buffer() {
|
|
64
|
+
return Buffer.concat(this.buffers);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.ZipWriter = ZipWriter;
|
|
68
|
+
//# sourceMappingURL=zipWriter.js.map
|
package/lib/webOAuthServer.js
CHANGED
|
@@ -16,9 +16,9 @@ const ts_types_1 = require("@salesforce/ts-types");
|
|
|
16
16
|
const jsforce_1 = require("jsforce");
|
|
17
17
|
const logger_1 = require("./logger");
|
|
18
18
|
const authInfo_1 = require("./org/authInfo");
|
|
19
|
-
const
|
|
19
|
+
const sfError_1 = require("./sfError");
|
|
20
20
|
const messages_1 = require("./messages");
|
|
21
|
-
const
|
|
21
|
+
const sfProject_1 = require("./sfProject");
|
|
22
22
|
messages_1.Messages.importMessagesDirectory(__dirname);
|
|
23
23
|
const messages = messages_1.Messages.load('@salesforce/core', 'auth', [
|
|
24
24
|
'invalidRequestUri',
|
|
@@ -56,8 +56,8 @@ class WebOAuthServer extends kit_1.AsyncCreatable {
|
|
|
56
56
|
*/
|
|
57
57
|
static async determineOauthPort() {
|
|
58
58
|
try {
|
|
59
|
-
const
|
|
60
|
-
return
|
|
59
|
+
const sfProject = await sfProject_1.SfProjectJson.create();
|
|
60
|
+
return sfProject.get('oauthLocalPort') || WebOAuthServer.DEFAULT_PORT;
|
|
61
61
|
}
|
|
62
62
|
catch {
|
|
63
63
|
return WebOAuthServer.DEFAULT_PORT;
|
|
@@ -144,7 +144,7 @@ class WebOAuthServer extends kit_1.AsyncCreatable {
|
|
|
144
144
|
async executeOauthRequest() {
|
|
145
145
|
return new Promise((resolve, reject) => {
|
|
146
146
|
this.logger.debug('Starting web auth flow');
|
|
147
|
-
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
147
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises, @typescript-eslint/no-explicit-any
|
|
148
148
|
this.webServer.server.on('request', async (request, response) => {
|
|
149
149
|
const url = (0, url_1.parse)(request.url);
|
|
150
150
|
this.logger.debug(`processing request for uri: ${url.pathname}`);
|
|
@@ -152,7 +152,7 @@ class WebOAuthServer extends kit_1.AsyncCreatable {
|
|
|
152
152
|
if (url.pathname && url.pathname.startsWith('/OauthRedirect')) {
|
|
153
153
|
request.query = (0, querystring_1.parse)(url.query);
|
|
154
154
|
if (request.query.error) {
|
|
155
|
-
const err = new
|
|
155
|
+
const err = new sfError_1.SfError(request.query.error_description || request.query.error, request.query.error);
|
|
156
156
|
this.webServer.reportError(err, response);
|
|
157
157
|
return reject(err);
|
|
158
158
|
}
|
|
@@ -169,14 +169,14 @@ class WebOAuthServer extends kit_1.AsyncCreatable {
|
|
|
169
169
|
this.webServer.sendError(404, 'Resource not found', response);
|
|
170
170
|
const errName = 'invalidRequestUri';
|
|
171
171
|
const errMessage = messages.getMessage(errName, [url.pathname]);
|
|
172
|
-
reject(new
|
|
172
|
+
reject(new sfError_1.SfError(errMessage, errName));
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
else {
|
|
176
176
|
this.webServer.sendError(405, 'Unsupported http methods', response);
|
|
177
177
|
const errName = 'invalidRequestMethod';
|
|
178
178
|
const errMessage = messages.getMessage(errName, [request.method]);
|
|
179
|
-
reject(new
|
|
179
|
+
reject(new sfError_1.SfError(errMessage, errName));
|
|
180
180
|
}
|
|
181
181
|
});
|
|
182
182
|
});
|
|
@@ -190,7 +190,7 @@ class WebOAuthServer extends kit_1.AsyncCreatable {
|
|
|
190
190
|
*/
|
|
191
191
|
parseAuthCodeFromRequest(response, request) {
|
|
192
192
|
if (!this.validateState(request)) {
|
|
193
|
-
const error = new
|
|
193
|
+
const error = new sfError_1.SfError('urlStateMismatch');
|
|
194
194
|
this.webServer.sendError(400, `${error.message}\n`, response);
|
|
195
195
|
this.closeRequest(request);
|
|
196
196
|
this.logger.warn('urlStateMismatchAttempt detected.');
|
|
@@ -343,13 +343,13 @@ class WebServer extends kit_1.AsyncCreatable {
|
|
|
343
343
|
const socket = new net_1.Socket();
|
|
344
344
|
socket.setTimeout(this.getSocketTimeout(), () => {
|
|
345
345
|
socket.destroy();
|
|
346
|
-
const error = new
|
|
346
|
+
const error = new sfError_1.SfError('timeout', 'SOCKET_TIMEOUT');
|
|
347
347
|
reject(error);
|
|
348
348
|
});
|
|
349
349
|
// An existing connection, means that the port is occupied
|
|
350
350
|
socket.connect(clientConfig, () => {
|
|
351
351
|
socket.destroy();
|
|
352
|
-
const error = new
|
|
352
|
+
const error = new sfError_1.SfError('Address in use', 'EADDRINUSE');
|
|
353
353
|
error.data = {
|
|
354
354
|
port: clientConfig.port,
|
|
355
355
|
address: clientConfig.host,
|