@salesforce/core 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +1 -1
- package/README.md +93 -44
- package/lib/config/aliasesConfig.d.ts +12 -0
- package/lib/config/aliasesConfig.js +28 -0
- package/lib/config/authInfoConfig.d.ts +19 -0
- package/lib/config/authInfoConfig.js +35 -0
- package/lib/config/config.d.ts +87 -22
- package/lib/config/config.js +117 -65
- package/lib/config/configAggregator.d.ts +41 -35
- package/lib/config/configAggregator.js +102 -73
- package/lib/config/configFile.d.ts +2 -2
- package/lib/config/configFile.js +38 -29
- package/lib/config/configGroup.d.ts +141 -0
- package/lib/config/configGroup.js +225 -0
- package/lib/config/configStore.d.ts +9 -9
- package/lib/config/configStore.js +17 -15
- package/lib/config/envVars.d.ts +15 -9
- package/lib/config/envVars.js +71 -47
- package/lib/config/orgUsersConfig.js +2 -0
- package/lib/config/sandboxOrgConfig.js +2 -0
- package/lib/config/sandboxProcessCache.d.ts +16 -0
- package/lib/config/sandboxProcessCache.js +38 -0
- package/lib/config/tokensConfig.d.ts +10 -0
- package/lib/config/tokensConfig.js +29 -0
- package/lib/config/ttlConfig.d.ts +34 -0
- package/lib/config/ttlConfig.js +50 -0
- package/lib/crypto/crypto.js +15 -22
- package/lib/crypto/keyChain.js +2 -3
- package/lib/crypto/keyChainImpl.d.ts +5 -3
- package/lib/crypto/keyChainImpl.js +58 -61
- package/lib/crypto/secureBuffer.d.ts +1 -1
- package/lib/deviceOauthService.d.ts +3 -3
- package/lib/deviceOauthService.js +27 -25
- package/lib/exported.d.ts +15 -12
- package/lib/exported.js +28 -16
- package/lib/global.d.ts +11 -3
- package/lib/global.js +39 -12
- package/lib/lifecycleEvents.d.ts +1 -1
- package/lib/lifecycleEvents.js +3 -0
- package/lib/logger.d.ts +19 -9
- package/lib/logger.js +112 -86
- package/lib/messages.d.ts +53 -36
- package/lib/messages.js +81 -91
- package/lib/org/authInfo.d.ts +56 -20
- package/lib/org/authInfo.js +232 -131
- package/lib/org/authRemover.d.ts +8 -7
- package/lib/org/authRemover.js +32 -28
- package/lib/org/connection.d.ts +13 -37
- package/lib/org/connection.js +78 -124
- package/lib/org/index.js +5 -1
- package/lib/org/org.d.ts +151 -48
- package/lib/org/org.js +466 -220
- package/lib/org/orgConfigProperties.d.ts +64 -3
- package/lib/org/orgConfigProperties.js +96 -4
- package/lib/org/permissionSetAssignment.js +4 -13
- package/lib/org/scratchOrgCache.d.ts +20 -0
- package/lib/org/scratchOrgCache.js +33 -0
- package/lib/org/scratchOrgCreate.d.ts +28 -17
- package/lib/org/scratchOrgCreate.js +125 -53
- package/lib/org/scratchOrgErrorCodes.d.ts +9 -3
- package/lib/org/scratchOrgErrorCodes.js +34 -17
- package/lib/org/scratchOrgFeatureDeprecation.js +1 -6
- package/lib/org/scratchOrgInfoApi.d.ts +21 -47
- package/lib/org/scratchOrgInfoApi.js +129 -63
- package/lib/org/scratchOrgInfoGenerator.d.ts +6 -5
- package/lib/org/scratchOrgInfoGenerator.js +76 -62
- package/lib/org/scratchOrgLifecycleEvents.d.ts +10 -0
- package/lib/org/scratchOrgLifecycleEvents.js +41 -0
- package/lib/org/scratchOrgSettingsGenerator.d.ts +44 -21
- package/lib/org/scratchOrgSettingsGenerator.js +165 -98
- package/lib/org/scratchOrgTypes.d.ts +43 -0
- package/lib/org/scratchOrgTypes.js +9 -0
- package/lib/org/user.d.ts +1 -1
- package/lib/org/user.js +25 -34
- package/lib/schema/printer.d.ts +6 -0
- package/lib/schema/printer.js +34 -31
- package/lib/schema/validator.d.ts +12 -10
- package/lib/schema/validator.js +56 -76
- package/lib/{sfdxError.d.ts → sfError.d.ts} +12 -20
- package/lib/{sfdxError.js → sfError.js} +40 -30
- package/lib/{sfdxProject.d.ts → sfProject.d.ts} +75 -35
- package/lib/sfProject.js +651 -0
- package/lib/{globalInfo → stateAggregator}/accessors/aliasAccessor.d.ts +27 -12
- package/lib/{globalInfo → stateAggregator}/accessors/aliasAccessor.js +47 -31
- package/lib/stateAggregator/accessors/orgAccessor.d.ts +101 -0
- package/lib/stateAggregator/accessors/orgAccessor.js +240 -0
- package/lib/stateAggregator/accessors/sandboxAccessor.d.ts +8 -0
- package/lib/stateAggregator/accessors/sandboxAccessor.js +28 -0
- package/lib/stateAggregator/accessors/tokenAccessor.d.ts +63 -0
- package/lib/stateAggregator/accessors/tokenAccessor.js +80 -0
- package/lib/stateAggregator/index.d.ts +4 -0
- package/lib/stateAggregator/index.js +27 -0
- package/lib/stateAggregator/stateAggregator.d.ts +25 -0
- package/lib/stateAggregator/stateAggregator.js +46 -0
- package/lib/status/myDomainResolver.d.ts +1 -1
- package/lib/status/myDomainResolver.js +4 -4
- package/lib/status/pollingClient.js +4 -4
- package/lib/status/streamingClient.d.ts +2 -2
- package/lib/status/streamingClient.js +58 -63
- package/lib/status/types.d.ts +2 -2
- package/lib/testSetup.d.ts +206 -75
- package/lib/testSetup.js +463 -165
- package/lib/util/cache.d.ts +2 -2
- package/lib/util/cache.js +6 -6
- package/lib/util/checkLightningDomain.js +3 -4
- package/lib/util/directoryWriter.d.ts +12 -0
- package/lib/util/directoryWriter.js +54 -0
- package/lib/util/getJwtAudienceUrl.js +1 -1
- package/lib/util/internal.d.ts +28 -2
- package/lib/util/internal.js +65 -8
- package/lib/util/jsonXmlTools.js +2 -4
- package/lib/util/mapKeys.d.ts +9 -9
- package/lib/util/mapKeys.js +13 -9
- package/lib/util/sfdc.d.ts +51 -51
- package/lib/util/sfdc.js +74 -79
- package/lib/util/sfdcUrl.d.ts +5 -19
- package/lib/util/sfdcUrl.js +40 -49
- package/lib/util/structuredWriter.d.ts +9 -0
- package/lib/util/structuredWriter.js +3 -0
- package/lib/util/zipWriter.d.ts +8 -6
- package/lib/util/zipWriter.js +13 -13
- package/lib/webOAuthServer.d.ts +20 -6
- package/lib/webOAuthServer.js +102 -56
- package/messageTransformer/messageTransformer.ts +93 -0
- package/messages/auth.md +9 -1
- package/messages/config.md +42 -6
- package/messages/connection.md +8 -0
- package/messages/core.md +10 -0
- package/messages/envVars.md +37 -3
- package/messages/org.md +21 -1
- package/messages/scratchOrgCreate.md +2 -6
- package/messages/scratchOrgErrorCodes.md +17 -1
- package/messages/scratchOrgInfoApi.md +9 -0
- package/messages/scratchOrgInfoGenerator.md +9 -1
- package/package.json +121 -46
- package/CHANGELOG.md +0 -1244
- package/lib/config/keychainConfig.d.ts +0 -19
- package/lib/config/keychainConfig.js +0 -43
- package/lib/globalInfo/accessors/orgAccessor.d.ts +0 -13
- package/lib/globalInfo/accessors/orgAccessor.js +0 -45
- package/lib/globalInfo/accessors/tokenAccessor.d.ts +0 -13
- package/lib/globalInfo/accessors/tokenAccessor.js +0 -35
- package/lib/globalInfo/globalInfoConfig.d.ts +0 -36
- package/lib/globalInfo/globalInfoConfig.js +0 -105
- package/lib/globalInfo/index.d.ts +0 -6
- package/lib/globalInfo/index.js +0 -29
- package/lib/globalInfo/sfdxDataHandler.d.ts +0 -43
- package/lib/globalInfo/sfdxDataHandler.js +0 -217
- package/lib/globalInfo/types.d.ts +0 -39
- package/lib/globalInfo/types.js +0 -10
- package/lib/sfdxProject.js +0 -557
- package/lib/util/fs.d.ts +0 -201
- package/lib/util/fs.js +0 -378
package/lib/webOAuthServer.js
CHANGED
|
@@ -5,29 +5,24 @@
|
|
|
5
5
|
* Licensed under the BSD 3-Clause license.
|
|
6
6
|
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
7
7
|
*/
|
|
8
|
+
/* eslint-disable class-methods-use-this */
|
|
9
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
8
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
11
|
exports.WebServer = exports.WebOAuthServer = void 0;
|
|
10
12
|
const http = require("http");
|
|
11
13
|
const querystring_1 = require("querystring");
|
|
12
14
|
const url_1 = require("url");
|
|
13
15
|
const net_1 = require("net");
|
|
16
|
+
const events_1 = require("events");
|
|
17
|
+
const jsforce_1 = require("jsforce");
|
|
14
18
|
const kit_1 = require("@salesforce/kit");
|
|
15
19
|
const ts_types_1 = require("@salesforce/ts-types");
|
|
16
|
-
const jsforce_1 = require("jsforce");
|
|
17
20
|
const logger_1 = require("./logger");
|
|
18
|
-
const
|
|
19
|
-
const
|
|
21
|
+
const org_1 = require("./org");
|
|
22
|
+
const sfError_1 = require("./sfError");
|
|
20
23
|
const messages_1 = require("./messages");
|
|
21
|
-
const
|
|
22
|
-
messages_1.Messages.importMessagesDirectory(__dirname);
|
|
23
|
-
const messages = messages_1.Messages.load('@salesforce/core', 'auth', [
|
|
24
|
-
'invalidRequestUri',
|
|
25
|
-
'invalidRequestMethod',
|
|
26
|
-
'missingAuthCode',
|
|
27
|
-
'serverErrorHTMLResponse',
|
|
28
|
-
'portInUse',
|
|
29
|
-
'portInUse.actions',
|
|
30
|
-
]);
|
|
24
|
+
const sfProject_1 = require("./sfProject");
|
|
25
|
+
const messages = new messages_1.Messages('@salesforce/core', 'auth', new Map([["targetOrgNotSet", "A default user is not set."], ["targetOrgNotSet.actions", ["Run the \"sfdx auth\" commands with --setdefaultusername to connect to an org and set it as your default org.", "Run \"force:org:create\" with --setdefaultusername to create a scratch org and set it as your default org.", "Run \"sfdx config:set defaultusername=<username>\" to set your default username."]], ["portInUse", "Cannot start the OAuth redirect server on port %s."], ["portInUse.actions", ["Kill the process running on port %s or use a custom connected app and update OauthLocalPort in the sfdx-project.json file."]], ["invalidRequestMethod", "Invalid request method: %s"], ["invalidRequestUri", "Invalid request uri: %s"], ["pollingTimeout", "The device authorization request timed out. After executing force:auth:device:login, you must approve access to the device within 10 minutes. This can happen if the URL wasn\u2019t copied into the browser, login was not attempted, or the 2FA process was not completed within 10 minutes. Request authorization again."], ["serverErrorHTMLResponse", "<html><head><style>body {background-color:#F4F6F9; font-family: Arial, sans-serif; font-size: 0.8125rem; line-height: 1.5rem; color: #16325c;} #center {margin: auto; width: 370px; padding: 100px 0px 20px;} #logo-container {margin-left: auto; margin-right: auto; text-align: center;} #logo {max-width: 180px; max-height: 113px; margin-bottom: 2rem; border: 0;} #header {font-size: 1.5rem; text-align: center; margin-bottom: 1rem;} #message {background-color: #FFFFFF; margin: 0px auto; padding: 1.25rem; border-radius: 0.25rem; border: 1px solid #D8DDE6;} #footer {height: 24px; width: 370px; text-align: center; font-size: .75rem; position: absolute; bottom: 10;}</style></head><body><div id=\"center\"><div id=\"logo-container\"><img id=\"logo\" aria-hidden=\"true\" name=\"logo\" alt=\"Salesforce\" src=\"data:image/svg+xml;base64,%s\"></div><div id=\"header\">%s</div><div id=\"message\">%s<br/><br/>This is most likely <b>not</b> an error with the Salesforce CLI. Please ensure all information is accurate and try again.</div><div id=\"footer\">© %s Salesforce, Inc. All rights reserved.</div></div></body></html>"], ["missingAuthCode", "No authentication code found on login response."], ["serverSuccessHTMLResponse", "<html><head><style>body {background-color:#F4F6F9; font-family: Arial, sans-serif; font-size: 0.8125rem; line-height: 1.5rem; color: #16325c;} #center {margin: auto; width: 300px; padding: 100px 0px 20px;} #logo-container {margin-left: auto; margin-right: auto; text-align: center;} #logo {max-width: 180px; max-height: 113px; margin-bottom: 2rem; border: 0;} #header {font-size: 1.5rem; text-align: center; margin-bottom: 1rem;} #message {background-color: #FFFFFF; margin: 0px auto; padding: 1.25rem; border-radius: 0.25rem; border: 1px solid #D8DDE6;} #footer {height: 24px; width: 300px; text-align: center; font-size: .75rem; position: absolute; bottom: 10;}</style></head><body><div id=\"center\"><div id=\"logo-container\"><img id=\"logo\" aria-hidden=\"true\" name=\"logo\" alt=\"Salesforce\" src=\"data:image/svg+xml;base64,%s\"></div><div id=\"header\">Authentication Successful</div><div id=\"message\">You've successfully logged in. You can now close this browser tab or window.</div><div id=\"footer\">© %s Salesforce, Inc. All rights reserved.</div></div></body></html>"], ["serverSfdcImage", "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjEuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAyNjIgMTg0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNjIgMTg0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzAwQTFFMDt9Cgkuc3Qxe2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+Cjx0aXRsZT5sb2dvLXNhbGVzZm9yY2U8L3RpdGxlPgo8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KPGcgaWQ9IlRlc3QtQiI+Cgk8ZyBpZD0iTW9iaWxlLU5hdi0tLVRlc3QtQi1feDI4XzBfeDI5XyI+CgkJPGcgaWQ9Ikdyb3VwIj4KCQkJPGcgaWQ9ImxvZ28tc2FsZXNmb3JjZSI+CgkJCQk8cGF0aCBpZD0iRmlsbC0xIiBjbGFzcz0ic3QwIiBkPSJNMTA5LjIsMjAuOWM4LjQtOC43LDIwLjEtMTQuMiwzMy0xNC4yYzE3LjIsMCwzMi4xLDkuNiw0MC4xLDIzLjhjNi45LTMuMSwxNC42LTQuOCwyMi43LTQuOAoJCQkJCWMzMSwwLDU2LDI1LjMsNTYsNTYuNXMtMjUuMSw1Ni41LTU2LDU2LjVjLTMuOCwwLTcuNS0wLjQtMTEtMS4xYy03LDEyLjUtMjAuNCwyMS0zNS44LDIxYy02LjQsMC0xMi41LTEuNS0xNy45LTQuMQoJCQkJCWMtNy4xLDE2LjctMjMuNywyOC41LTQzLDI4LjVjLTIwLjEsMC0zNy4zLTEyLjctNDMuOS0zMC42Yy0yLjksMC42LTUuOSwwLjktOC45LDAuOWMtMjQsMC00My40LTE5LjYtNDMuNC00My45CgkJCQkJYzAtMTYuMiw4LjctMzAuNCwyMS43LTM4Yy0yLjctNi4xLTQuMi0xMi45LTQuMi0yMC4xQzE4LjUsMjMuNiw0MS4yLDEsNjksMUM4NS40LDEsMTAwLDguOCwxMDkuMiwyMC45Ii8+CgkJCQk8cGF0aCBpZD0iQ29tYmluZWQtU2hhcGUiIGNsYXNzPSJzdDEiIGQ9Ik0zOC43LDk1LjRsMS4xLTIuOWMwLjItMC41LDAuNS0wLjMsMC43LTAuMmMwLjMsMC4yLDAuNSwwLjMsMC45LDAuNmMzLjEsMiw2LDIsNi45LDIKCQkJCQljMi4zLDAsMy44LTEuMiwzLjgtMi45di0wLjFjMC0xLjgtMi4yLTIuNS00LjgtMy4zbC0wLjYtMC4yYy0zLjUtMS03LjMtMi41LTcuMy02Ljl2LTAuMWMwLTQuMiwzLjQtNy4yLDguMy03LjJsMC41LDAKCQkJCQljMi45LDAsNS42LDAuOCw3LjYsMi4xYzAuMiwwLjEsMC40LDAuMywwLjMsMC42Yy0wLjEsMC4zLTEsMi42LTEuMSwyLjljLTAuMiwwLjUtMC43LDAuMi0wLjcsMC4yYy0xLjgtMS00LjUtMS43LTYuOC0xLjcKCQkJCQljLTIuMSwwLTMuNCwxLjEtMy40LDIuNnYwLjFjMCwxLjcsMi4zLDIuNSw0LjksMy4zbDAuNSwwLjFjMy41LDEuMSw3LjIsMi42LDcuMiw2Ljl2MC4xYzAsNC42LTMuMyw3LjQtOC42LDcuNAoJCQkJCWMtMi42LDAtNS4xLTAuNC03LjgtMS44Yy0wLjUtMC4zLTEtMC41LTEuNS0wLjlDMzguNyw5NS45LDM4LjUsOTUuOCwzOC43LDk1LjR6IE0xMTYuNyw5NS40bDEuMS0yLjljMC4yLTAuNSwwLjYtMC4zLDAuNy0wLjIKCQkJCQljMC4zLDAuMiwwLjUsMC4zLDAuOSwwLjZjMy4xLDIsNiwyLDYuOSwyYzIuMywwLDMuOC0xLjIsMy44LTIuOXYtMC4xYzAtMS44LTIuMi0yLjUtNC44LTMuM2wtMC42LTAuMmMtMy41LTEtNy4zLTIuNS03LjMtNi45CgkJCQkJdi0wLjFjMC00LjIsMy40LTcuMiw4LjMtNy4ybDAuNSwwYzIuOSwwLDUuNiwwLjgsNy42LDIuMWMwLjIsMC4xLDAuNCwwLjMsMC4zLDAuNmMtMC4xLDAuMy0xLDIuNi0xLjEsMi45CgkJCQkJYy0wLjIsMC41LTAuNywwLjItMC43LDAuMmMtMS44LTEtNC41LTEuNy02LjgtMS43Yy0yLjEsMC0zLjQsMS4xLTMuNCwyLjZ2MC4xYzAsMS43LDIuMywyLjUsNC45LDMuM2wwLjUsMC4xCgkJCQkJYzMuNSwxLjEsNy4yLDIuNiw3LjIsNi45djAuMWMwLDQuNi0zLjMsNy40LTguNiw3LjRjLTIuNiwwLTUuMS0wLjQtNy44LTEuOGMtMC41LTAuMy0xLTAuNS0xLjUtMC45CgkJCQkJQzExNi44LDk1LjksMTE2LjYsOTUuOCwxMTYuNyw5NS40eiBNMTc0LjUsODEuN2MwLjQsMS41LDAuNywzLjEsMC43LDQuOHMtMC4yLDMuMy0wLjcsNC44Yy0wLjQsMS41LTEuMSwyLjgtMiwzLjkKCQkJCQljLTAuOSwxLjEtMi4xLDItMy40LDIuNmMtMS40LDAuNi0zLDAuOS00LjgsMC45Yy0xLjgsMC0zLjQtMC4zLTQuOC0wLjljLTEuNC0wLjYtMi41LTEuNS0zLjQtMi42Yy0wLjktMS4xLTEuNi0yLjQtMi0zLjkKCQkJCQljLTAuNC0xLjUtMC43LTMuMS0wLjctNC44YzAtMS43LDAuMi0zLjMsMC43LTQuOGMwLjQtMS41LDEuMS0yLjgsMi0zLjljMC45LTEuMSwyLjEtMiwzLjQtMi42YzEuNC0wLjYsMy0xLDQuOC0xCgkJCQkJYzEuOCwwLDMuNCwwLjMsNC44LDFjMS40LDAuNiwyLjUsMS41LDMuNCwyLjZDMTczLjQsNzguOSwxNzQuMSw4MC4yLDE3NC41LDgxLjd6IE0xNzAsODYuNGMwLTIuNi0wLjUtNC42LTEuNC02CgkJCQkJYy0wLjktMS40LTIuNC0yLjEtNC4zLTIuMWMtMiwwLTMuNCwwLjctNC4zLDIuMWMtMC45LDEuNC0xLjQsMy40LTEuNCw2YzAsMi42LDAuNSw0LjYsMS40LDYuMWMwLjksMS40LDIuMywyLjEsNC4zLDIuMQoJCQkJCWMyLDAsMy40LTAuNyw0LjMtMi4xQzE2OS42LDkxLjEsMTcwLDg5LDE3MCw4Ni40eiBNMjExLjEsOTMuOWwxLjEsM2MwLjEsMC40LTAuMiwwLjUtMC4yLDAuNWMtMS43LDAuNy00LDEuMS02LjMsMS4xCgkJCQkJYy0zLjksMC02LjgtMS4xLTguOC0zLjNjLTItMi4yLTMtNS4yLTMtOC45YzAtMS43LDAuMi0zLjMsMC43LTQuOGMwLjUtMS41LDEuMi0yLjgsMi4yLTMuOWMxLTEuMSwyLjItMiwzLjYtMi42CgkJCQkJYzEuNC0wLjYsMy4xLTEsNS0xYzEuMywwLDIuNCwwLjEsMy4zLDAuMmMxLDAuMiwyLjQsMC41LDMsMC44YzAuMSwwLDAuNCwwLjIsMC4zLDAuNWMtMC40LDEuMi0wLjcsMi0xLjEsMwoJCQkJCWMtMC4yLDAuNS0wLjUsMC4zLTAuNSwwLjNjLTEuNS0wLjUtMi45LTAuNy00LjctMC43Yy0yLjIsMC0zLjksMC43LTQuOSwyLjJjLTEuMSwxLjQtMS43LDMuMy0xLjcsNS45YzAsMi44LDAuNyw0LjgsMS45LDYuMQoJCQkJCWMxLjIsMS4zLDIuOSwxLjksNS4xLDEuOWMwLjksMCwxLjctMC4xLDIuNC0wLjJjMC43LTAuMSwxLjQtMC4zLDIuMS0wLjZDMjEwLjUsOTMuNiwyMTAuOSw5My41LDIxMS4xLDkzLjl6IE0yMzMuOCw4MC44CgkJCQkJYzEsMy40LDAuNSw2LjMsMC40LDYuNWMwLDAuNC0wLjQsMC40LTAuNCwwLjRsLTE1LjEsMGMwLjEsMi4zLDAuNiwzLjksMS44LDVjMS4xLDEuMSwyLjgsMS44LDUuMiwxLjhjMy42LDAsNS4xLTAuNyw2LjItMS4xCgkJCQkJYzAsMCwwLjQtMC4xLDAuNiwwLjNsMSwyLjhjMC4yLDAuNSwwLDAuNi0wLjEsMC43Yy0wLjksMC41LTMuMiwxLjUtNy42LDEuNWMtMi4xLDAtNC0wLjMtNS41LTAuOWMtMS41LTAuNi0yLjgtMS40LTMuOC0yLjUKCQkJCQljLTEtMS4xLTEuNy0yLjQtMi4yLTMuOGMtMC41LTEuNS0wLjctMy4xLTAuNy00LjhjMC0xLjcsMC4yLTMuMywwLjctNC44YzAuNC0xLjUsMS4xLTIuOCwyLTMuOWMwLjktMS4xLDIuMS0yLDMuNS0yLjYKCQkJCQljMS40LTAuNywzLjEtMSw1LTFjMS42LDAsMy4xLDAuMyw0LjMsMC45YzAuOSwwLjQsMS45LDEuMSwyLjksMi4yQzIzMi41LDc3LjksMjMzLjQsNzkuNCwyMzMuOCw4MC44eiBNMjE4LjgsODRoMTAuNwoJCQkJCWMtMC4xLTEuNC0wLjQtMi42LTEtMy42Yy0wLjktMS40LTIuMi0yLjItNC4yLTIuMmMtMiwwLTMuNCwwLjgtNC4zLDIuMkMyMTkuNCw4MS4zLDIxOS4xLDgyLjUsMjE4LjgsODR6IE0xMTMuMSw4MC44CgkJCQkJYzEsMy40LDAuNSw2LjMsMC41LDYuNWMwLDAuNC0wLjQsMC40LTAuNCwwLjRsLTE1LjEsMGMwLjEsMi4zLDAuNiwzLjksMS44LDVjMS4xLDEuMSwyLjgsMS44LDUuMiwxLjhjMy42LDAsNS4xLTAuNyw2LjItMS4xCgkJCQkJYzAsMCwwLjQtMC4xLDAuNiwwLjNsMSwyLjhjMC4yLDAuNSwwLDAuNi0wLjEsMC43Yy0wLjksMC41LTMuMiwxLjUtNy42LDEuNWMtMi4xLDAtNC0wLjMtNS41LTAuOWMtMS41LTAuNi0yLjgtMS40LTMuOC0yLjUKCQkJCQljLTEtMS4xLTEuNy0yLjQtMi4yLTMuOGMtMC41LTEuNS0wLjctMy4xLTAuNy00LjhjMC0xLjcsMC4yLTMuMywwLjctNC44YzAuNC0xLjUsMS4xLTIuOCwyLTMuOWMwLjktMS4xLDIuMS0yLDMuNS0yLjYKCQkJCQljMS40LTAuNywzLjEtMSw1LTFjMS42LDAsMy4xLDAuMyw0LjMsMC45YzAuOSwwLjQsMS45LDEuMSwyLjksMi4yQzExMS44LDc3LjksMTEyLjgsNzkuNCwxMTMuMSw4MC44eiBNOTguMSw4NGgxMC44CgkJCQkJYy0wLjEtMS40LTAuNC0yLjYtMS0zLjZjLTAuOS0xLjQtMi4yLTIuMi00LjItMi4yYy0yLDAtMy40LDAuOC00LjMsMi4yQzk4LjcsODEuMyw5OC40LDgyLjUsOTguMSw4NHogTTcxLjYsODMuMgoJCQkJCWMwLDAsMS4yLDAuMSwyLjUsMC4zdi0wLjZjMC0yLTAuNC0zLTEuMi0zLjZjLTAuOC0wLjYtMi4xLTEtMy43LTFjMCwwLTMuNywwLTYuNiwxLjVjLTAuMSwwLjEtMC4yLDAuMS0wLjIsMC4xCgkJCQkJcy0wLjQsMC4xLTAuNS0wLjJsLTEuMS0yLjljLTAuMi0wLjQsMC4xLTAuNiwwLjEtMC42YzEuNC0xLjEsNC42LTEuNyw0LjYtMS43YzEuMS0wLjIsMi45LTAuNCw0LTAuNGMzLDAsNS4zLDAuNyw2LjksMi4xCgkJCQkJYzEuNiwxLjQsMi40LDMuNiwyLjQsNi43bDAsMTMuOGMwLDAsMCwwLjQtMC4zLDAuNWMwLDAtMC42LDAuMi0xLjEsMC4zYy0wLjUsMC4xLTIuMywwLjUtMy44LDAuN2MtMS41LDAuMy0zLDAuNC00LjYsMC40CgkJCQkJYy0xLjUsMC0yLjgtMC4xLTQtMC40Yy0xLjItMC4zLTIuMi0wLjctMy4xLTEuM2MtMC44LTAuNi0xLjUtMS40LTItMi40Yy0wLjUtMC45LTAuNy0yLjEtMC43LTMuNGMwLTEuMywwLjMtMi41LDAuOC0zLjUKCQkJCQljMC41LTEsMS4zLTEuOCwyLjItMi41YzAuOS0wLjcsMi0xLjEsMy4xLTEuNWMxLjItMC4zLDIuNC0wLjUsMy43LTAuNUM3MC4yLDgzLjIsNzEsODMuMiw3MS42LDgzLjJ6IE02NS42LDkzLjgKCQkJCQljMCwwLDEuNCwxLjEsNC40LDAuOWMyLjItMC4xLDQuMS0wLjUsNC4xLTAuNXYtNi45YzAsMC0xLjktMC4zLTQuMS0wLjNjLTMuMSwwLTQuNCwxLjEtNC40LDEuMWMtMC45LDAuNi0xLjMsMS42LTEuMywyLjkKCQkJCQljMCwwLjgsMC4yLDEuNSwwLjUsMkM2NC45LDkzLjIsNjUsOTMuNCw2NS42LDkzLjh6IE0xOTMuMSw3NS41Yy0wLjEsMC40LTAuOSwyLjUtMS4xLDMuMmMtMC4xLDAuMy0wLjMsMC40LTAuNiwwLjQKCQkJCQljMCwwLTAuOS0wLjItMS43LTAuMmMtMC41LDAtMS4zLDAuMS0yLDAuM2MtMC43LDAuMi0xLjMsMC42LTEuOSwxLjFjLTAuNiwwLjUtMSwxLjMtMS4zLDIuMmMtMC4zLDAuOS0wLjUsMi40LTAuNSw0djExLjIKCQkJCQljMCwwLjMtMC4yLDAuNS0wLjUsMC41aC00Yy0wLjMsMC0wLjUtMC4yLTAuNS0wLjVWNzUuMmMwLTAuMywwLjItMC41LDAuNC0wLjVoMy45YzAuMywwLDAuNCwwLjIsMC40LDAuNVY3NwoJCQkJCWMwLjYtMC44LDEuNi0xLjUsMi41LTEuOWMwLjktMC40LDItMC43LDMuOS0wLjZjMSwwLjEsMi4zLDAuMywyLjUsMC40QzE5Myw3NSwxOTMuMiw3NS4xLDE5My4xLDc1LjV6IE0xNTYsNjUuMQoJCQkJCWMwLjEsMCwwLjQsMC4yLDAuMywwLjVsLTEuMiwzLjJjLTAuMSwwLjItMC4yLDAuNC0wLjcsMC4yYy0wLjEsMC0wLjMtMC4xLTAuOC0wLjJjLTAuMy0wLjEtMC44LTAuMS0xLjItMC4xCgkJCQkJYy0wLjYsMC0xLjEsMC4xLTEuNiwwLjJjLTAuNSwwLjEtMC45LDAuNC0xLjMsMC44Yy0wLjQsMC40LTAuOCwwLjktMS4xLDEuNmMtMC42LDEuNi0wLjgsMy4zLTAuOCwzLjRoNC44CgkJCQkJYzAuNCwwLDAuNSwwLjIsMC41LDAuNWwtMC42LDMuMWMtMC4xLDAuNS0wLjUsMC40LTAuNSwwLjRoLTVMMTQzLjYsOThjLTAuNCwyLTAuOCwzLjctMS4zLDUuMWMtMC41LDEuNC0xLjEsMi40LTIsMy40CgkJCQkJYy0wLjgsMC45LTEuNywxLjYtMi44LDEuOWMtMSwwLjQtMi4zLDAuNi0zLjcsMC42Yy0wLjcsMC0xLjQsMC0yLjItMC4yYy0wLjYtMC4xLTAuOS0wLjItMS40LTAuNGMtMC4yLTAuMS0wLjMtMC4zLTAuMi0wLjYKCQkJCQljMC4xLTAuMywxLTIuNywxLjEtMy4xYzAuMi0wLjQsMC41LTAuMiwwLjUtMC4yYzAuMywwLjEsMC41LDAuMiwwLjgsMC4zYzAuNCwwLjEsMC44LDAuMSwxLjIsMC4xYzAuNywwLDEuMy0wLjEsMS44LTAuMwoJCQkJCWMwLjYtMC4yLDEtMC42LDEuNC0xLjFjMC40LTAuNSwwLjctMS4yLDEuMS0yLjFjMC4zLTAuOSwwLjYtMi4yLDAuOS0zLjdsMy40LTE4LjloLTMuM2MtMC40LDAtMC41LTAuMi0wLjUtMC41bDAuNi0zLjEKCQkJCQljMC4xLTAuNSwwLjUtMC40LDAuNS0wLjRoMy40bDAuMi0xYzAuNS0zLDEuNS01LjMsMy02LjhjMS41LTEuNSwzLjctMi4zLDYuNC0yLjNjMC44LDAsMS41LDAuMSwyLjEsMC4yCgkJCQkJQzE1NSw2NC44LDE1NS41LDY0LjksMTU2LDY1LjF6IE04OC42LDk3LjZjMCwwLjMtMC4yLDAuNS0wLjQsMC41aC00Yy0wLjMsMC0wLjQtMC4yLTAuNC0wLjVWNjUuNWMwLTAuMiwwLjItMC41LDAuNC0wLjVoNAoJCQkJCWMwLjMsMCwwLjQsMC4yLDAuNCwwLjVWOTcuNnoiLz4KCQkJPC9nPgoJCTwvZz4KCTwvZz4KPC9nPgo8L3N2Zz4K"]]));
|
|
31
26
|
/**
|
|
32
27
|
* Handles the creation of a web server for web based login flows.
|
|
33
28
|
*
|
|
@@ -47,6 +42,7 @@ const messages = messages_1.Messages.load('@salesforce/core', 'auth', [
|
|
|
47
42
|
class WebOAuthServer extends kit_1.AsyncCreatable {
|
|
48
43
|
constructor(options) {
|
|
49
44
|
super(options);
|
|
45
|
+
this.oauthError = new Error('Oauth Error');
|
|
50
46
|
this.oauthConfig = options.oauthConfig;
|
|
51
47
|
}
|
|
52
48
|
/**
|
|
@@ -56,8 +52,8 @@ class WebOAuthServer extends kit_1.AsyncCreatable {
|
|
|
56
52
|
*/
|
|
57
53
|
static async determineOauthPort() {
|
|
58
54
|
try {
|
|
59
|
-
const
|
|
60
|
-
return
|
|
55
|
+
const sfProject = await sfProject_1.SfProjectJson.create();
|
|
56
|
+
return sfProject.get('oauthLocalPort') || WebOAuthServer.DEFAULT_PORT;
|
|
61
57
|
}
|
|
62
58
|
catch {
|
|
63
59
|
return WebOAuthServer.DEFAULT_PORT;
|
|
@@ -85,17 +81,18 @@ class WebOAuthServer extends kit_1.AsyncCreatable {
|
|
|
85
81
|
this.executeOauthRequest()
|
|
86
82
|
.then(async (response) => {
|
|
87
83
|
try {
|
|
88
|
-
const authInfo = await
|
|
84
|
+
const authInfo = await org_1.AuthInfo.create({
|
|
89
85
|
oauth2Options: this.oauthConfig,
|
|
90
86
|
oauth2: this.oauth2,
|
|
91
87
|
});
|
|
92
88
|
await authInfo.save();
|
|
93
|
-
this.webServer.
|
|
89
|
+
await this.webServer.handleSuccess(response);
|
|
94
90
|
response.end();
|
|
95
91
|
resolve(authInfo);
|
|
96
92
|
}
|
|
97
93
|
catch (err) {
|
|
98
|
-
this.
|
|
94
|
+
this.oauthError = err;
|
|
95
|
+
await this.webServer.handleError(response);
|
|
99
96
|
reject(err);
|
|
100
97
|
}
|
|
101
98
|
})
|
|
@@ -127,14 +124,14 @@ class WebOAuthServer extends kit_1.AsyncCreatable {
|
|
|
127
124
|
this.logger = await logger_1.Logger.child(this.constructor.name);
|
|
128
125
|
const port = await WebOAuthServer.determineOauthPort();
|
|
129
126
|
if (!this.oauthConfig.clientId)
|
|
130
|
-
this.oauthConfig.clientId =
|
|
127
|
+
this.oauthConfig.clientId = org_1.DEFAULT_CONNECTED_APP_INFO.clientId;
|
|
131
128
|
if (!this.oauthConfig.loginUrl)
|
|
132
|
-
this.oauthConfig.loginUrl =
|
|
129
|
+
this.oauthConfig.loginUrl = org_1.AuthInfo.getDefaultInstanceUrl();
|
|
133
130
|
if (!this.oauthConfig.redirectUri)
|
|
134
131
|
this.oauthConfig.redirectUri = `http://localhost:${port}/OauthRedirect`;
|
|
135
132
|
this.webServer = await WebServer.create({ port });
|
|
136
133
|
this.oauth2 = new jsforce_1.OAuth2(this.oauthConfig);
|
|
137
|
-
this.authUrl =
|
|
134
|
+
this.authUrl = org_1.AuthInfo.getAuthorizationUrl(this.oauthConfig, this.oauth2);
|
|
138
135
|
}
|
|
139
136
|
/**
|
|
140
137
|
* Executes the oauth request
|
|
@@ -144,40 +141,52 @@ class WebOAuthServer extends kit_1.AsyncCreatable {
|
|
|
144
141
|
async executeOauthRequest() {
|
|
145
142
|
return new Promise((resolve, reject) => {
|
|
146
143
|
this.logger.debug('Starting web auth flow');
|
|
147
|
-
//
|
|
144
|
+
// - async method when sync expected
|
|
145
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
148
146
|
this.webServer.server.on('request', async (request, response) => {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
147
|
+
if (request.url) {
|
|
148
|
+
const url = (0, url_1.parse)(request.url);
|
|
149
|
+
this.logger.debug(`processing request for uri: ${url.pathname}`);
|
|
150
|
+
if (request.method === 'GET') {
|
|
151
|
+
if (url.pathname?.startsWith('/OauthRedirect') && url.query) {
|
|
152
|
+
request.query = (0, querystring_1.parse)(url.query);
|
|
153
|
+
if (request.query.error) {
|
|
154
|
+
const errorName = typeof request.query.error_description === 'string'
|
|
155
|
+
? request.query.error_description
|
|
156
|
+
: request.query.error;
|
|
157
|
+
this.oauthError = new sfError_1.SfError(errorName, request.query.error);
|
|
158
|
+
await this.webServer.handleError(response);
|
|
159
|
+
return reject(this.oauthError);
|
|
160
|
+
}
|
|
161
|
+
this.logger.debug(`request.query.state: ${request.query.state}`);
|
|
162
|
+
try {
|
|
163
|
+
this.oauthConfig.authCode = (0, ts_types_1.asString)(this.parseAuthCodeFromRequest(response, request));
|
|
164
|
+
resolve(response);
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
reject(err);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else if (url.pathname === '/OauthSuccess') {
|
|
171
|
+
this.webServer.reportSuccess(response);
|
|
158
172
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
this.oauthConfig.authCode = (0, ts_types_1.asString)(this.parseAuthCodeFromRequest(response, request));
|
|
162
|
-
resolve(response);
|
|
173
|
+
else if (url.pathname === '/OauthError') {
|
|
174
|
+
this.webServer.reportError(this.oauthError, response);
|
|
163
175
|
}
|
|
164
|
-
|
|
165
|
-
|
|
176
|
+
else {
|
|
177
|
+
this.webServer.sendError(404, 'Resource not found', response);
|
|
178
|
+
const errName = 'invalidRequestUri';
|
|
179
|
+
const errMessage = messages.getMessage(errName, [url.pathname]);
|
|
180
|
+
reject(new sfError_1.SfError(errMessage, errName));
|
|
166
181
|
}
|
|
167
182
|
}
|
|
168
183
|
else {
|
|
169
|
-
this.webServer.sendError(
|
|
170
|
-
const errName = '
|
|
171
|
-
const errMessage = messages.getMessage(errName, [
|
|
172
|
-
reject(new
|
|
184
|
+
this.webServer.sendError(405, 'Unsupported http methods', response);
|
|
185
|
+
const errName = 'invalidRequestMethod';
|
|
186
|
+
const errMessage = messages.getMessage(errName, [request.method]);
|
|
187
|
+
reject(new sfError_1.SfError(errMessage, errName));
|
|
173
188
|
}
|
|
174
189
|
}
|
|
175
|
-
else {
|
|
176
|
-
this.webServer.sendError(405, 'Unsupported http methods', response);
|
|
177
|
-
const errName = 'invalidRequestMethod';
|
|
178
|
-
const errMessage = messages.getMessage(errName, [request.method]);
|
|
179
|
-
reject(new sfdxError_1.SfdxError(errMessage, errName));
|
|
180
|
-
}
|
|
181
190
|
});
|
|
182
191
|
});
|
|
183
192
|
}
|
|
@@ -190,7 +199,7 @@ class WebOAuthServer extends kit_1.AsyncCreatable {
|
|
|
190
199
|
*/
|
|
191
200
|
parseAuthCodeFromRequest(response, request) {
|
|
192
201
|
if (!this.validateState(request)) {
|
|
193
|
-
const error = new
|
|
202
|
+
const error = new sfError_1.SfError('urlStateMismatch');
|
|
194
203
|
this.webServer.sendError(400, `${error.message}\n`, response);
|
|
195
204
|
this.closeRequest(request);
|
|
196
205
|
this.logger.warn('urlStateMismatchAttempt detected.');
|
|
@@ -248,6 +257,7 @@ class WebServer extends kit_1.AsyncCreatable {
|
|
|
248
257
|
this.port = WebOAuthServer.DEFAULT_PORT;
|
|
249
258
|
this.host = 'localhost';
|
|
250
259
|
this.sockets = [];
|
|
260
|
+
this.redirectStatus = new events_1.EventEmitter();
|
|
251
261
|
if (options.port)
|
|
252
262
|
this.port = options.port;
|
|
253
263
|
if (options.host)
|
|
@@ -293,7 +303,7 @@ class WebServer extends kit_1.AsyncCreatable {
|
|
|
293
303
|
/**
|
|
294
304
|
* sends a response error.
|
|
295
305
|
*
|
|
296
|
-
* @param
|
|
306
|
+
* @param status the statusCode for the response.
|
|
297
307
|
* @param message the message for the http body.
|
|
298
308
|
* @param response the response to write the error to.
|
|
299
309
|
*/
|
|
@@ -305,11 +315,12 @@ class WebServer extends kit_1.AsyncCreatable {
|
|
|
305
315
|
/**
|
|
306
316
|
* sends a response redirect.
|
|
307
317
|
*
|
|
308
|
-
* @param
|
|
318
|
+
* @param status the statusCode for the response.
|
|
309
319
|
* @param url the url to redirect to.
|
|
310
320
|
* @param response the response to write the redirect to.
|
|
311
321
|
*/
|
|
312
322
|
doRedirect(status, url, response) {
|
|
323
|
+
this.logger.debug(`Redirecting to ${url}`);
|
|
313
324
|
response.setHeader('Content-Type', 'text/plain');
|
|
314
325
|
const body = `${status} - Redirecting to ${url}`;
|
|
315
326
|
response.setHeader('Content-Length', Buffer.byteLength(body));
|
|
@@ -319,18 +330,53 @@ class WebServer extends kit_1.AsyncCreatable {
|
|
|
319
330
|
/**
|
|
320
331
|
* sends a response to the browser reporting an error.
|
|
321
332
|
*
|
|
322
|
-
* @param error the error
|
|
323
|
-
* @param response the response
|
|
333
|
+
* @param error the oauth error
|
|
334
|
+
* @param response the HTTP response.
|
|
324
335
|
*/
|
|
325
336
|
reportError(error, response) {
|
|
326
337
|
response.setHeader('Content-Type', 'text/html');
|
|
327
|
-
const
|
|
328
|
-
|
|
338
|
+
const currentYear = new Date().getFullYear();
|
|
339
|
+
const encodedImg = messages.getMessage('serverSfdcImage');
|
|
340
|
+
const body = messages.getMessage('serverErrorHTMLResponse', [encodedImg, error.name, error.message, currentYear]);
|
|
341
|
+
response.setHeader('Content-Length', Buffer.byteLength(body, 'utf8'));
|
|
342
|
+
response.end(body);
|
|
343
|
+
if (error.stack) {
|
|
344
|
+
this.logger.debug(error.stack);
|
|
345
|
+
}
|
|
346
|
+
this.redirectStatus.emit('complete');
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* sends a response to the browser reporting the success.
|
|
350
|
+
*
|
|
351
|
+
* @param response the HTTP response.
|
|
352
|
+
*/
|
|
353
|
+
reportSuccess(response) {
|
|
354
|
+
response.setHeader('Content-Type', 'text/html');
|
|
355
|
+
const currentYear = new Date().getFullYear();
|
|
356
|
+
const encodedImg = messages.getMessage('serverSfdcImage');
|
|
357
|
+
const body = messages.getMessage('serverSuccessHTMLResponse', [encodedImg, currentYear]);
|
|
358
|
+
response.setHeader('Content-Length', Buffer.byteLength(body, 'utf8'));
|
|
329
359
|
response.end(body);
|
|
360
|
+
this.redirectStatus.emit('complete');
|
|
361
|
+
}
|
|
362
|
+
async handleSuccess(response) {
|
|
363
|
+
return this.handleRedirect(response, '/OauthSuccess');
|
|
364
|
+
}
|
|
365
|
+
async handleError(response) {
|
|
366
|
+
return this.handleRedirect(response, '/OauthError');
|
|
330
367
|
}
|
|
331
368
|
async init() {
|
|
332
369
|
this.logger = await logger_1.Logger.child(this.constructor.name);
|
|
333
370
|
}
|
|
371
|
+
async handleRedirect(response, url) {
|
|
372
|
+
return new Promise((resolve) => {
|
|
373
|
+
this.redirectStatus.on('complete', () => {
|
|
374
|
+
this.logger.debug('Redirect complete');
|
|
375
|
+
resolve();
|
|
376
|
+
});
|
|
377
|
+
this.doRedirect(303, url, response);
|
|
378
|
+
});
|
|
379
|
+
}
|
|
334
380
|
/**
|
|
335
381
|
* Make sure we can't open a socket on the localhost/host port. It's important because we don't want to send
|
|
336
382
|
* auth tokens to a random strange port listener. We want to make sure we can startup our server first.
|
|
@@ -343,13 +389,13 @@ class WebServer extends kit_1.AsyncCreatable {
|
|
|
343
389
|
const socket = new net_1.Socket();
|
|
344
390
|
socket.setTimeout(this.getSocketTimeout(), () => {
|
|
345
391
|
socket.destroy();
|
|
346
|
-
const error = new
|
|
392
|
+
const error = new sfError_1.SfError('timeout', 'SOCKET_TIMEOUT');
|
|
347
393
|
reject(error);
|
|
348
394
|
});
|
|
349
395
|
// An existing connection, means that the port is occupied
|
|
350
396
|
socket.connect(clientConfig, () => {
|
|
351
397
|
socket.destroy();
|
|
352
|
-
const error = new
|
|
398
|
+
const error = new sfError_1.SfError('Address in use', 'EADDRINUSE');
|
|
353
399
|
error.data = {
|
|
354
400
|
port: clientConfig.port,
|
|
355
401
|
address: clientConfig.host,
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023, salesforce.com, inc.
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* Licensed under the BSD 3-Clause license.
|
|
5
|
+
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
6
|
+
*/
|
|
7
|
+
/* eslint-disable no-console */
|
|
8
|
+
/* eslint-disable complexity */
|
|
9
|
+
|
|
10
|
+
import * as ts from 'typescript';
|
|
11
|
+
import { Messages, StoredMessageMap } from '../src/messages';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
*
|
|
15
|
+
* @experimental
|
|
16
|
+
* transforms `messages` references from dynamic run-time to static compile-time values
|
|
17
|
+
*/
|
|
18
|
+
const transformer = (program: ts.Program, pluginOptions: {}) => {
|
|
19
|
+
Messages.importMessagesDirectory(process.cwd());
|
|
20
|
+
const transformerFactory: ts.TransformerFactory<ts.SourceFile> = (context) => {
|
|
21
|
+
return (sourceFile) => {
|
|
22
|
+
// if there are no messages, no transformation is needed
|
|
23
|
+
if (
|
|
24
|
+
!sourceFile.statements.some((i) => ts.isImportDeclaration(i) && i.importClause?.getText().includes('Messages'))
|
|
25
|
+
) {
|
|
26
|
+
return sourceFile;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const visitor = (node: ts.Node): ts.VisitResult<ts.Node> => {
|
|
30
|
+
if (ts.isExpressionStatement(node) && node.getText().includes('importMessagesDirectory')) {
|
|
31
|
+
// importMessagesDirectory now happens at compile, not in runtime
|
|
32
|
+
// returning undefined removes the node
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
if (
|
|
36
|
+
// transform a runtime load call into hardcoded messages values
|
|
37
|
+
// const foo = Messages.load|loadMessages('pluginName', 'messagesFile' ...) =>
|
|
38
|
+
// const foo = new Messages('pluginName', 'messagesFile', new Map([['key', 'value']]))
|
|
39
|
+
ts.isCallExpression(node) &&
|
|
40
|
+
ts.isPropertyAccessExpression(node.expression) &&
|
|
41
|
+
node.expression.expression.getText() === 'Messages' &&
|
|
42
|
+
node.expression.name.getText().includes('load')
|
|
43
|
+
) {
|
|
44
|
+
// we always want the first two arguments, which are the plugin name and the messages file name
|
|
45
|
+
const arrayMembers = node.arguments.slice(0, 2);
|
|
46
|
+
const arrayMembersText = arrayMembers.map(getTextWithoutQuotes);
|
|
47
|
+
|
|
48
|
+
// Messages doesn't care whether you call messages.load or loadMessages, it loads the whole file
|
|
49
|
+
const messagesInstance = Messages.loadMessages(arrayMembersText[0], arrayMembersText[1]);
|
|
50
|
+
return context.factory.createNewExpression(node.expression.expression, undefined, [
|
|
51
|
+
arrayMembers[0],
|
|
52
|
+
arrayMembers[1],
|
|
53
|
+
context.factory.createNewExpression(context.factory.createIdentifier('Map'), undefined, [
|
|
54
|
+
messageMapToHardcodedMap(messagesInstance.messages),
|
|
55
|
+
]),
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
// it might be a node that contains one of the things we're interested in, so keep digging
|
|
59
|
+
return ts.visitEachChild(node, visitor, context);
|
|
60
|
+
};
|
|
61
|
+
return ts.visitNode(sourceFile, visitor);
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
return transformerFactory;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export default transformer;
|
|
68
|
+
|
|
69
|
+
const getTextWithoutQuotes = (node: ts.Node): string => node.getText().replace(/'/g, '');
|
|
70
|
+
|
|
71
|
+
/** turn a loaded message map into */
|
|
72
|
+
const messageMapToHardcodedMap = (messages: StoredMessageMap): ts.ArrayLiteralExpression => {
|
|
73
|
+
return ts.factory.createArrayLiteralExpression(
|
|
74
|
+
Array.from(messages).map(([key, value]) => {
|
|
75
|
+
// case 1: string
|
|
76
|
+
if (typeof value === 'string') {
|
|
77
|
+
return ts.factory.createArrayLiteralExpression([
|
|
78
|
+
ts.factory.createStringLiteral(key),
|
|
79
|
+
ts.factory.createStringLiteral(value),
|
|
80
|
+
]);
|
|
81
|
+
} else if (Array.isArray(value)) {
|
|
82
|
+
// case 2: string[]
|
|
83
|
+
return ts.factory.createArrayLiteralExpression([
|
|
84
|
+
ts.factory.createStringLiteral(key),
|
|
85
|
+
ts.factory.createArrayLiteralExpression(value.map((v) => ts.factory.createStringLiteral(v))),
|
|
86
|
+
]);
|
|
87
|
+
} else {
|
|
88
|
+
// turn the object into a map and recurse!
|
|
89
|
+
return messageMapToHardcodedMap(new Map(Object.entries(value)));
|
|
90
|
+
}
|
|
91
|
+
})
|
|
92
|
+
);
|
|
93
|
+
};
|
package/messages/auth.md
CHANGED
|
@@ -30,8 +30,16 @@ The device authorization request timed out. After executing force:auth:device:lo
|
|
|
30
30
|
|
|
31
31
|
# serverErrorHTMLResponse
|
|
32
32
|
|
|
33
|
-
<
|
|
33
|
+
<html><head><style>body {background-color:#F4F6F9; font-family: Arial, sans-serif; font-size: 0.8125rem; line-height: 1.5rem; color: #16325c;} #center {margin: auto; width: 370px; padding: 100px 0px 20px;} #logo-container {margin-left: auto; margin-right: auto; text-align: center;} #logo {max-width: 180px; max-height: 113px; margin-bottom: 2rem; border: 0;} #header {font-size: 1.5rem; text-align: center; margin-bottom: 1rem;} #message {background-color: #FFFFFF; margin: 0px auto; padding: 1.25rem; border-radius: 0.25rem; border: 1px solid #D8DDE6;} #footer {height: 24px; width: 370px; text-align: center; font-size: .75rem; position: absolute; bottom: 10;}</style></head><body><div id="center"><div id="logo-container"><img id="logo" aria-hidden="true" name="logo" alt="Salesforce" src="data:image/svg+xml;base64,%s"></div><div id="header">%s</div><div id="message">%s<br/><br/>This is most likely <b>not</b> an error with the Salesforce CLI. Please ensure all information is accurate and try again.</div><div id="footer">© %s Salesforce, Inc. All rights reserved.</div></div></body></html>
|
|
34
34
|
|
|
35
35
|
# missingAuthCode
|
|
36
36
|
|
|
37
37
|
No authentication code found on login response.
|
|
38
|
+
|
|
39
|
+
# serverSuccessHTMLResponse
|
|
40
|
+
|
|
41
|
+
<html><head><style>body {background-color:#F4F6F9; font-family: Arial, sans-serif; font-size: 0.8125rem; line-height: 1.5rem; color: #16325c;} #center {margin: auto; width: 300px; padding: 100px 0px 20px;} #logo-container {margin-left: auto; margin-right: auto; text-align: center;} #logo {max-width: 180px; max-height: 113px; margin-bottom: 2rem; border: 0;} #header {font-size: 1.5rem; text-align: center; margin-bottom: 1rem;} #message {background-color: #FFFFFF; margin: 0px auto; padding: 1.25rem; border-radius: 0.25rem; border: 1px solid #D8DDE6;} #footer {height: 24px; width: 300px; text-align: center; font-size: .75rem; position: absolute; bottom: 10;}</style></head><body><div id="center"><div id="logo-container"><img id="logo" aria-hidden="true" name="logo" alt="Salesforce" src="data:image/svg+xml;base64,%s"></div><div id="header">Authentication Successful</div><div id="message">You've successfully logged in. You can now close this browser tab or window.</div><div id="footer">© %s Salesforce, Inc. All rights reserved.</div></div></body></html>
|
|
42
|
+
|
|
43
|
+
# serverSfdcImage
|
|
44
|
+
|
|
45
|
+
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjEuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAyNjIgMTg0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNjIgMTg0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzAwQTFFMDt9Cgkuc3Qxe2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+Cjx0aXRsZT5sb2dvLXNhbGVzZm9yY2U8L3RpdGxlPgo8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KPGcgaWQ9IlRlc3QtQiI+Cgk8ZyBpZD0iTW9iaWxlLU5hdi0tLVRlc3QtQi1feDI4XzBfeDI5XyI+CgkJPGcgaWQ9Ikdyb3VwIj4KCQkJPGcgaWQ9ImxvZ28tc2FsZXNmb3JjZSI+CgkJCQk8cGF0aCBpZD0iRmlsbC0xIiBjbGFzcz0ic3QwIiBkPSJNMTA5LjIsMjAuOWM4LjQtOC43LDIwLjEtMTQuMiwzMy0xNC4yYzE3LjIsMCwzMi4xLDkuNiw0MC4xLDIzLjhjNi45LTMuMSwxNC42LTQuOCwyMi43LTQuOAoJCQkJCWMzMSwwLDU2LDI1LjMsNTYsNTYuNXMtMjUuMSw1Ni41LTU2LDU2LjVjLTMuOCwwLTcuNS0wLjQtMTEtMS4xYy03LDEyLjUtMjAuNCwyMS0zNS44LDIxYy02LjQsMC0xMi41LTEuNS0xNy45LTQuMQoJCQkJCWMtNy4xLDE2LjctMjMuNywyOC41LTQzLDI4LjVjLTIwLjEsMC0zNy4zLTEyLjctNDMuOS0zMC42Yy0yLjksMC42LTUuOSwwLjktOC45LDAuOWMtMjQsMC00My40LTE5LjYtNDMuNC00My45CgkJCQkJYzAtMTYuMiw4LjctMzAuNCwyMS43LTM4Yy0yLjctNi4xLTQuMi0xMi45LTQuMi0yMC4xQzE4LjUsMjMuNiw0MS4yLDEsNjksMUM4NS40LDEsMTAwLDguOCwxMDkuMiwyMC45Ii8+CgkJCQk8cGF0aCBpZD0iQ29tYmluZWQtU2hhcGUiIGNsYXNzPSJzdDEiIGQ9Ik0zOC43LDk1LjRsMS4xLTIuOWMwLjItMC41LDAuNS0wLjMsMC43LTAuMmMwLjMsMC4yLDAuNSwwLjMsMC45LDAuNmMzLjEsMiw2LDIsNi45LDIKCQkJCQljMi4zLDAsMy44LTEuMiwzLjgtMi45di0wLjFjMC0xLjgtMi4yLTIuNS00LjgtMy4zbC0wLjYtMC4yYy0zLjUtMS03LjMtMi41LTcuMy02Ljl2LTAuMWMwLTQuMiwzLjQtNy4yLDguMy03LjJsMC41LDAKCQkJCQljMi45LDAsNS42LDAuOCw3LjYsMi4xYzAuMiwwLjEsMC40LDAuMywwLjMsMC42Yy0wLjEsMC4zLTEsMi42LTEuMSwyLjljLTAuMiwwLjUtMC43LDAuMi0wLjcsMC4yYy0xLjgtMS00LjUtMS43LTYuOC0xLjcKCQkJCQljLTIuMSwwLTMuNCwxLjEtMy40LDIuNnYwLjFjMCwxLjcsMi4zLDIuNSw0LjksMy4zbDAuNSwwLjFjMy41LDEuMSw3LjIsMi42LDcuMiw2Ljl2MC4xYzAsNC42LTMuMyw3LjQtOC42LDcuNAoJCQkJCWMtMi42LDAtNS4xLTAuNC03LjgtMS44Yy0wLjUtMC4zLTEtMC41LTEuNS0wLjlDMzguNyw5NS45LDM4LjUsOTUuOCwzOC43LDk1LjR6IE0xMTYuNyw5NS40bDEuMS0yLjljMC4yLTAuNSwwLjYtMC4zLDAuNy0wLjIKCQkJCQljMC4zLDAuMiwwLjUsMC4zLDAuOSwwLjZjMy4xLDIsNiwyLDYuOSwyYzIuMywwLDMuOC0xLjIsMy44LTIuOXYtMC4xYzAtMS44LTIuMi0yLjUtNC44LTMuM2wtMC42LTAuMmMtMy41LTEtNy4zLTIuNS03LjMtNi45CgkJCQkJdi0wLjFjMC00LjIsMy40LTcuMiw4LjMtNy4ybDAuNSwwYzIuOSwwLDUuNiwwLjgsNy42LDIuMWMwLjIsMC4xLDAuNCwwLjMsMC4zLDAuNmMtMC4xLDAuMy0xLDIuNi0xLjEsMi45CgkJCQkJYy0wLjIsMC41LTAuNywwLjItMC43LDAuMmMtMS44LTEtNC41LTEuNy02LjgtMS43Yy0yLjEsMC0zLjQsMS4xLTMuNCwyLjZ2MC4xYzAsMS43LDIuMywyLjUsNC45LDMuM2wwLjUsMC4xCgkJCQkJYzMuNSwxLjEsNy4yLDIuNiw3LjIsNi45djAuMWMwLDQuNi0zLjMsNy40LTguNiw3LjRjLTIuNiwwLTUuMS0wLjQtNy44LTEuOGMtMC41LTAuMy0xLTAuNS0xLjUtMC45CgkJCQkJQzExNi44LDk1LjksMTE2LjYsOTUuOCwxMTYuNyw5NS40eiBNMTc0LjUsODEuN2MwLjQsMS41LDAuNywzLjEsMC43LDQuOHMtMC4yLDMuMy0wLjcsNC44Yy0wLjQsMS41LTEuMSwyLjgtMiwzLjkKCQkJCQljLTAuOSwxLjEtMi4xLDItMy40LDIuNmMtMS40LDAuNi0zLDAuOS00LjgsMC45Yy0xLjgsMC0zLjQtMC4zLTQuOC0wLjljLTEuNC0wLjYtMi41LTEuNS0zLjQtMi42Yy0wLjktMS4xLTEuNi0yLjQtMi0zLjkKCQkJCQljLTAuNC0xLjUtMC43LTMuMS0wLjctNC44YzAtMS43LDAuMi0zLjMsMC43LTQuOGMwLjQtMS41LDEuMS0yLjgsMi0zLjljMC45LTEuMSwyLjEtMiwzLjQtMi42YzEuNC0wLjYsMy0xLDQuOC0xCgkJCQkJYzEuOCwwLDMuNCwwLjMsNC44LDFjMS40LDAuNiwyLjUsMS41LDMuNCwyLjZDMTczLjQsNzguOSwxNzQuMSw4MC4yLDE3NC41LDgxLjd6IE0xNzAsODYuNGMwLTIuNi0wLjUtNC42LTEuNC02CgkJCQkJYy0wLjktMS40LTIuNC0yLjEtNC4zLTIuMWMtMiwwLTMuNCwwLjctNC4zLDIuMWMtMC45LDEuNC0xLjQsMy40LTEuNCw2YzAsMi42LDAuNSw0LjYsMS40LDYuMWMwLjksMS40LDIuMywyLjEsNC4zLDIuMQoJCQkJCWMyLDAsMy40LTAuNyw0LjMtMi4xQzE2OS42LDkxLjEsMTcwLDg5LDE3MCw4Ni40eiBNMjExLjEsOTMuOWwxLjEsM2MwLjEsMC40LTAuMiwwLjUtMC4yLDAuNWMtMS43LDAuNy00LDEuMS02LjMsMS4xCgkJCQkJYy0zLjksMC02LjgtMS4xLTguOC0zLjNjLTItMi4yLTMtNS4yLTMtOC45YzAtMS43LDAuMi0zLjMsMC43LTQuOGMwLjUtMS41LDEuMi0yLjgsMi4yLTMuOWMxLTEuMSwyLjItMiwzLjYtMi42CgkJCQkJYzEuNC0wLjYsMy4xLTEsNS0xYzEuMywwLDIuNCwwLjEsMy4zLDAuMmMxLDAuMiwyLjQsMC41LDMsMC44YzAuMSwwLDAuNCwwLjIsMC4zLDAuNWMtMC40LDEuMi0wLjcsMi0xLjEsMwoJCQkJCWMtMC4yLDAuNS0wLjUsMC4zLTAuNSwwLjNjLTEuNS0wLjUtMi45LTAuNy00LjctMC43Yy0yLjIsMC0zLjksMC43LTQuOSwyLjJjLTEuMSwxLjQtMS43LDMuMy0xLjcsNS45YzAsMi44LDAuNyw0LjgsMS45LDYuMQoJCQkJCWMxLjIsMS4zLDIuOSwxLjksNS4xLDEuOWMwLjksMCwxLjctMC4xLDIuNC0wLjJjMC43LTAuMSwxLjQtMC4zLDIuMS0wLjZDMjEwLjUsOTMuNiwyMTAuOSw5My41LDIxMS4xLDkzLjl6IE0yMzMuOCw4MC44CgkJCQkJYzEsMy40LDAuNSw2LjMsMC40LDYuNWMwLDAuNC0wLjQsMC40LTAuNCwwLjRsLTE1LjEsMGMwLjEsMi4zLDAuNiwzLjksMS44LDVjMS4xLDEuMSwyLjgsMS44LDUuMiwxLjhjMy42LDAsNS4xLTAuNyw2LjItMS4xCgkJCQkJYzAsMCwwLjQtMC4xLDAuNiwwLjNsMSwyLjhjMC4yLDAuNSwwLDAuNi0wLjEsMC43Yy0wLjksMC41LTMuMiwxLjUtNy42LDEuNWMtMi4xLDAtNC0wLjMtNS41LTAuOWMtMS41LTAuNi0yLjgtMS40LTMuOC0yLjUKCQkJCQljLTEtMS4xLTEuNy0yLjQtMi4yLTMuOGMtMC41LTEuNS0wLjctMy4xLTAuNy00LjhjMC0xLjcsMC4yLTMuMywwLjctNC44YzAuNC0xLjUsMS4xLTIuOCwyLTMuOWMwLjktMS4xLDIuMS0yLDMuNS0yLjYKCQkJCQljMS40LTAuNywzLjEtMSw1LTFjMS42LDAsMy4xLDAuMyw0LjMsMC45YzAuOSwwLjQsMS45LDEuMSwyLjksMi4yQzIzMi41LDc3LjksMjMzLjQsNzkuNCwyMzMuOCw4MC44eiBNMjE4LjgsODRoMTAuNwoJCQkJCWMtMC4xLTEuNC0wLjQtMi42LTEtMy42Yy0wLjktMS40LTIuMi0yLjItNC4yLTIuMmMtMiwwLTMuNCwwLjgtNC4zLDIuMkMyMTkuNCw4MS4zLDIxOS4xLDgyLjUsMjE4LjgsODR6IE0xMTMuMSw4MC44CgkJCQkJYzEsMy40LDAuNSw2LjMsMC41LDYuNWMwLDAuNC0wLjQsMC40LTAuNCwwLjRsLTE1LjEsMGMwLjEsMi4zLDAuNiwzLjksMS44LDVjMS4xLDEuMSwyLjgsMS44LDUuMiwxLjhjMy42LDAsNS4xLTAuNyw2LjItMS4xCgkJCQkJYzAsMCwwLjQtMC4xLDAuNiwwLjNsMSwyLjhjMC4yLDAuNSwwLDAuNi0wLjEsMC43Yy0wLjksMC41LTMuMiwxLjUtNy42LDEuNWMtMi4xLDAtNC0wLjMtNS41LTAuOWMtMS41LTAuNi0yLjgtMS40LTMuOC0yLjUKCQkJCQljLTEtMS4xLTEuNy0yLjQtMi4yLTMuOGMtMC41LTEuNS0wLjctMy4xLTAuNy00LjhjMC0xLjcsMC4yLTMuMywwLjctNC44YzAuNC0xLjUsMS4xLTIuOCwyLTMuOWMwLjktMS4xLDIuMS0yLDMuNS0yLjYKCQkJCQljMS40LTAuNywzLjEtMSw1LTFjMS42LDAsMy4xLDAuMyw0LjMsMC45YzAuOSwwLjQsMS45LDEuMSwyLjksMi4yQzExMS44LDc3LjksMTEyLjgsNzkuNCwxMTMuMSw4MC44eiBNOTguMSw4NGgxMC44CgkJCQkJYy0wLjEtMS40LTAuNC0yLjYtMS0zLjZjLTAuOS0xLjQtMi4yLTIuMi00LjItMi4yYy0yLDAtMy40LDAuOC00LjMsMi4yQzk4LjcsODEuMyw5OC40LDgyLjUsOTguMSw4NHogTTcxLjYsODMuMgoJCQkJCWMwLDAsMS4yLDAuMSwyLjUsMC4zdi0wLjZjMC0yLTAuNC0zLTEuMi0zLjZjLTAuOC0wLjYtMi4xLTEtMy43LTFjMCwwLTMuNywwLTYuNiwxLjVjLTAuMSwwLjEtMC4yLDAuMS0wLjIsMC4xCgkJCQkJcy0wLjQsMC4xLTAuNS0wLjJsLTEuMS0yLjljLTAuMi0wLjQsMC4xLTAuNiwwLjEtMC42YzEuNC0xLjEsNC42LTEuNyw0LjYtMS43YzEuMS0wLjIsMi45LTAuNCw0LTAuNGMzLDAsNS4zLDAuNyw2LjksMi4xCgkJCQkJYzEuNiwxLjQsMi40LDMuNiwyLjQsNi43bDAsMTMuOGMwLDAsMCwwLjQtMC4zLDAuNWMwLDAtMC42LDAuMi0xLjEsMC4zYy0wLjUsMC4xLTIuMywwLjUtMy44LDAuN2MtMS41LDAuMy0zLDAuNC00LjYsMC40CgkJCQkJYy0xLjUsMC0yLjgtMC4xLTQtMC40Yy0xLjItMC4zLTIuMi0wLjctMy4xLTEuM2MtMC44LTAuNi0xLjUtMS40LTItMi40Yy0wLjUtMC45LTAuNy0yLjEtMC43LTMuNGMwLTEuMywwLjMtMi41LDAuOC0zLjUKCQkJCQljMC41LTEsMS4zLTEuOCwyLjItMi41YzAuOS0wLjcsMi0xLjEsMy4xLTEuNWMxLjItMC4zLDIuNC0wLjUsMy43LTAuNUM3MC4yLDgzLjIsNzEsODMuMiw3MS42LDgzLjJ6IE02NS42LDkzLjgKCQkJCQljMCwwLDEuNCwxLjEsNC40LDAuOWMyLjItMC4xLDQuMS0wLjUsNC4xLTAuNXYtNi45YzAsMC0xLjktMC4zLTQuMS0wLjNjLTMuMSwwLTQuNCwxLjEtNC40LDEuMWMtMC45LDAuNi0xLjMsMS42LTEuMywyLjkKCQkJCQljMCwwLjgsMC4yLDEuNSwwLjUsMkM2NC45LDkzLjIsNjUsOTMuNCw2NS42LDkzLjh6IE0xOTMuMSw3NS41Yy0wLjEsMC40LTAuOSwyLjUtMS4xLDMuMmMtMC4xLDAuMy0wLjMsMC40LTAuNiwwLjQKCQkJCQljMCwwLTAuOS0wLjItMS43LTAuMmMtMC41LDAtMS4zLDAuMS0yLDAuM2MtMC43LDAuMi0xLjMsMC42LTEuOSwxLjFjLTAuNiwwLjUtMSwxLjMtMS4zLDIuMmMtMC4zLDAuOS0wLjUsMi40LTAuNSw0djExLjIKCQkJCQljMCwwLjMtMC4yLDAuNS0wLjUsMC41aC00Yy0wLjMsMC0wLjUtMC4yLTAuNS0wLjVWNzUuMmMwLTAuMywwLjItMC41LDAuNC0wLjVoMy45YzAuMywwLDAuNCwwLjIsMC40LDAuNVY3NwoJCQkJCWMwLjYtMC44LDEuNi0xLjUsMi41LTEuOWMwLjktMC40LDItMC43LDMuOS0wLjZjMSwwLjEsMi4zLDAuMywyLjUsMC40QzE5Myw3NSwxOTMuMiw3NS4xLDE5My4xLDc1LjV6IE0xNTYsNjUuMQoJCQkJCWMwLjEsMCwwLjQsMC4yLDAuMywwLjVsLTEuMiwzLjJjLTAuMSwwLjItMC4yLDAuNC0wLjcsMC4yYy0wLjEsMC0wLjMtMC4xLTAuOC0wLjJjLTAuMy0wLjEtMC44LTAuMS0xLjItMC4xCgkJCQkJYy0wLjYsMC0xLjEsMC4xLTEuNiwwLjJjLTAuNSwwLjEtMC45LDAuNC0xLjMsMC44Yy0wLjQsMC40LTAuOCwwLjktMS4xLDEuNmMtMC42LDEuNi0wLjgsMy4zLTAuOCwzLjRoNC44CgkJCQkJYzAuNCwwLDAuNSwwLjIsMC41LDAuNWwtMC42LDMuMWMtMC4xLDAuNS0wLjUsMC40LTAuNSwwLjRoLTVMMTQzLjYsOThjLTAuNCwyLTAuOCwzLjctMS4zLDUuMWMtMC41LDEuNC0xLjEsMi40LTIsMy40CgkJCQkJYy0wLjgsMC45LTEuNywxLjYtMi44LDEuOWMtMSwwLjQtMi4zLDAuNi0zLjcsMC42Yy0wLjcsMC0xLjQsMC0yLjItMC4yYy0wLjYtMC4xLTAuOS0wLjItMS40LTAuNGMtMC4yLTAuMS0wLjMtMC4zLTAuMi0wLjYKCQkJCQljMC4xLTAuMywxLTIuNywxLjEtMy4xYzAuMi0wLjQsMC41LTAuMiwwLjUtMC4yYzAuMywwLjEsMC41LDAuMiwwLjgsMC4zYzAuNCwwLjEsMC44LDAuMSwxLjIsMC4xYzAuNywwLDEuMy0wLjEsMS44LTAuMwoJCQkJCWMwLjYtMC4yLDEtMC42LDEuNC0xLjFjMC40LTAuNSwwLjctMS4yLDEuMS0yLjFjMC4zLTAuOSwwLjYtMi4yLDAuOS0zLjdsMy40LTE4LjloLTMuM2MtMC40LDAtMC41LTAuMi0wLjUtMC41bDAuNi0zLjEKCQkJCQljMC4xLTAuNSwwLjUtMC40LDAuNS0wLjRoMy40bDAuMi0xYzAuNS0zLDEuNS01LjMsMy02LjhjMS41LTEuNSwzLjctMi4zLDYuNC0yLjNjMC44LDAsMS41LDAuMSwyLjEsMC4yCgkJCQkJQzE1NSw2NC44LDE1NS41LDY0LjksMTU2LDY1LjF6IE04OC42LDk3LjZjMCwwLjMtMC4yLDAuNS0wLjQsMC41aC00Yy0wLjMsMC0wLjQtMC4yLTAuNC0wLjVWNjUuNWMwLTAuMiwwLjItMC41LDAuNC0wLjVoNAoJCQkJCWMwLjMsMCwwLjQsMC4yLDAuNCwwLjVWOTcuNnoiLz4KCQkJPC9nPgoJCTwvZz4KCTwvZz4KPC9nPgo8L3N2Zz4K
|
package/messages/config.md
CHANGED
|
@@ -75,11 +75,11 @@ In sfdx-project.json, indicate only one package directory (path) as the default.
|
|
|
75
75
|
|
|
76
76
|
The sfdx-project.json file must include one, and only one, default package directory (path). Because your sfdx-project.json file contains only one package directory, it must be the default. Remove the `"default": false` key and try again.
|
|
77
77
|
|
|
78
|
-
#
|
|
78
|
+
# target-org
|
|
79
79
|
|
|
80
80
|
Username or alias of the org that all commands run against by default. (sf only)
|
|
81
81
|
|
|
82
|
-
#
|
|
82
|
+
# target-dev-hub
|
|
83
83
|
|
|
84
84
|
Username or alias of your default Dev Hub org. (sf only)
|
|
85
85
|
|
|
@@ -93,28 +93,64 @@ Username or alias of your default Dev Hub org. (sfdx only)
|
|
|
93
93
|
|
|
94
94
|
# isvDebuggerSid
|
|
95
95
|
|
|
96
|
-
ISV debugger SID
|
|
96
|
+
ISV debugger SID (sfdx only)
|
|
97
97
|
|
|
98
98
|
# isvDebuggerUrl
|
|
99
99
|
|
|
100
|
-
ISV debugger URL
|
|
100
|
+
ISV debugger URL (sfdx only)
|
|
101
|
+
|
|
102
|
+
# org-isv-debugger-sid
|
|
103
|
+
|
|
104
|
+
ISV debugger SID.
|
|
105
|
+
|
|
106
|
+
# org-isv-debugger-url
|
|
107
|
+
|
|
108
|
+
ISV debugger URL.
|
|
101
109
|
|
|
102
110
|
# apiVersion
|
|
103
111
|
|
|
112
|
+
API version of your project. Default: API version of your Dev Hub org. (sfdx only)
|
|
113
|
+
|
|
114
|
+
# org-api-version
|
|
115
|
+
|
|
104
116
|
API version of your project. Default: API version of your Dev Hub org.
|
|
105
117
|
|
|
106
118
|
# disableTelemetry
|
|
107
119
|
|
|
108
|
-
Disables the collection of usage and user environment information, etc. Default:
|
|
120
|
+
Disables the collection of usage and user environment information, etc. Default: false. (sfdx only)
|
|
121
|
+
|
|
122
|
+
# disable-telemetry
|
|
123
|
+
|
|
124
|
+
Disables the collection of usage and user environment information, etc. Default: false.
|
|
109
125
|
|
|
110
126
|
# maxQueryLimit
|
|
111
127
|
|
|
128
|
+
Maximum number of Salesforce records returned by a CLI command. Default: 10,000. (sfdx only)
|
|
129
|
+
|
|
130
|
+
# org-max-query-limit
|
|
131
|
+
|
|
112
132
|
Maximum number of Salesforce records returned by a CLI command. Default: 10,000.
|
|
113
133
|
|
|
114
134
|
# restDeploy
|
|
115
135
|
|
|
116
|
-
Whether deployments use the Metadata REST API (true) or SOAP API (false, default value).
|
|
136
|
+
Whether deployments use the Metadata REST API (true) or SOAP API (false, default value). (sfdx only)
|
|
117
137
|
|
|
118
138
|
# instanceUrl
|
|
119
139
|
|
|
140
|
+
URL of the Salesforce instance hosting your org. Default: https://login.salesforce.com. (sfdx only)
|
|
141
|
+
|
|
142
|
+
# org-instance-url
|
|
143
|
+
|
|
120
144
|
URL of the Salesforce instance hosting your org. Default: https://login.salesforce.com.
|
|
145
|
+
|
|
146
|
+
# customOrgMetadataTemplates
|
|
147
|
+
|
|
148
|
+
A valid repository URL or directory for the custom org metadata templates.
|
|
149
|
+
|
|
150
|
+
# org-custom-metadata-templates
|
|
151
|
+
|
|
152
|
+
A valid repository URL or directory for the custom org metadata templates.
|
|
153
|
+
|
|
154
|
+
# invalidId
|
|
155
|
+
|
|
156
|
+
The given id %s is not a valid 15 or 18 character Salesforce ID.
|
package/messages/connection.md
CHANGED
|
@@ -20,3 +20,11 @@ Connection has no instanceUrl.
|
|
|
20
20
|
# noInstanceUrlError.actions
|
|
21
21
|
|
|
22
22
|
Make sure the instanceUrl is set in your command or config.
|
|
23
|
+
|
|
24
|
+
# noApiVersionsError
|
|
25
|
+
|
|
26
|
+
Org failed to respond with its list of API versions. This is usually the result of domain changes like activating MyDomain or Enhanced Domains
|
|
27
|
+
|
|
28
|
+
# noApiVersionsError.actions
|
|
29
|
+
|
|
30
|
+
Re-authenticate to the org.
|
package/messages/core.md
CHANGED
|
@@ -24,6 +24,12 @@ Due to: %s
|
|
|
24
24
|
|
|
25
25
|
Error authenticating with JWT config due to: %s
|
|
26
26
|
|
|
27
|
+
# jwtAuthErrors
|
|
28
|
+
|
|
29
|
+
Error authenticating with JWT.
|
|
30
|
+
Errors encountered:
|
|
31
|
+
%s
|
|
32
|
+
|
|
27
33
|
# refreshTokenAuthError
|
|
28
34
|
|
|
29
35
|
Error authenticating with the refresh token due to: %s
|
|
@@ -55,3 +61,7 @@ Setting aliases must be in the format <key>=<value> but found: [%s].
|
|
|
55
61
|
|
|
56
62
|
All JSON input must have heads down camelcase keys. E.g., `{ sfdcLoginUrl: "https://login.salesforce.com" }`
|
|
57
63
|
Found "%s" at %s
|
|
64
|
+
|
|
65
|
+
# missingClientId
|
|
66
|
+
|
|
67
|
+
Client ID is required for JWT authentication.
|
package/messages/envVars.md
CHANGED
|
@@ -90,10 +90,22 @@ URL of the Salesforce instance that is hosting your org. Default value is https:
|
|
|
90
90
|
|
|
91
91
|
Set to true to send messages resulting from failed Salesforce CLI commands to stdout instead of stderr.
|
|
92
92
|
|
|
93
|
+
# sfdxDisableLogFile
|
|
94
|
+
|
|
95
|
+
Set to true to disable log file writing
|
|
96
|
+
|
|
93
97
|
# sfdxLogLevel
|
|
94
98
|
|
|
95
99
|
Level of messages that the CLI writes to the log file. Valid values are trace, debug, info, warn, error, fatal. Default value is warn.
|
|
96
100
|
|
|
101
|
+
# sfdxLogRotationCount
|
|
102
|
+
|
|
103
|
+
The default rotation period for logs. Example '1d' will rotate logs daily (at midnight).
|
|
104
|
+
|
|
105
|
+
# sfdxLogRotationPeriod
|
|
106
|
+
|
|
107
|
+
The number of backup rotated log files to keep. Example: '3' will have the base sf.log file, and the past 3 (period) log files.
|
|
108
|
+
|
|
97
109
|
# sfdxMaxQueryLimit
|
|
98
110
|
|
|
99
111
|
Maximum number of Salesforce records returned by a CLI command. Default value is 10,000. Overrides the maxQueryLimit configuration value.
|
|
@@ -166,7 +178,7 @@ Username or alias of your default Dev Hub org. Overrides the target-dev-hub conf
|
|
|
166
178
|
|
|
167
179
|
Specifies an access token when using a login command that uses access tokens.
|
|
168
180
|
|
|
169
|
-
#
|
|
181
|
+
# sfOrgApiVersion
|
|
170
182
|
|
|
171
183
|
API version for a specific project or all projects. Default value is the API version of your Dev Hub. Overrides the apiVersion configuration variable.
|
|
172
184
|
|
|
@@ -210,7 +222,7 @@ Time, in seconds, that Salesforce CLI waits for the Lightning Experience custom
|
|
|
210
222
|
|
|
211
223
|
Set to true to scope Apex test results to the classes entered during a test run when running the Apex test commands.
|
|
212
224
|
|
|
213
|
-
#
|
|
225
|
+
# sfOrgInstanceUrl
|
|
214
226
|
|
|
215
227
|
URL of the Salesforce instance that is hosting your org. Default value is https://login.salesforce.com. Overrides the instanceUrl configuration variable.
|
|
216
228
|
|
|
@@ -218,11 +230,23 @@ URL of the Salesforce instance that is hosting your org. Default value is https:
|
|
|
218
230
|
|
|
219
231
|
Set to true to send messages resulting from failed Salesforce CLI commands to stdout instead of stderr.
|
|
220
232
|
|
|
233
|
+
# sfDisableLogFile
|
|
234
|
+
|
|
235
|
+
Set to true to disable log file writing
|
|
236
|
+
|
|
221
237
|
# sfLogLevel
|
|
222
238
|
|
|
223
239
|
Level of messages that the CLI writes to the log file. Valid values are trace, debug, info, warn, error, fatal. Default value is warn.
|
|
224
240
|
|
|
225
|
-
#
|
|
241
|
+
# sfLogRotationCount
|
|
242
|
+
|
|
243
|
+
The default rotation period for logs. Example '1d' will rotate logs daily (at midnight).
|
|
244
|
+
|
|
245
|
+
# sfLogRotationPeriod
|
|
246
|
+
|
|
247
|
+
The number of backup rotated log files to keep. Example: '3' will have the base sf.log file, and the past 3 (period) log files.
|
|
248
|
+
|
|
249
|
+
# sfOrgMaxQueryLimit
|
|
226
250
|
|
|
227
251
|
Maximum number of Salesforce records returned by a CLI command. Default value is 10,000. Overrides the maxQueryLimit configuration variable.
|
|
228
252
|
|
|
@@ -277,3 +301,13 @@ Boolean indicating that the installer is running
|
|
|
277
301
|
# sfEnv
|
|
278
302
|
|
|
279
303
|
Describes if sf is in "demo" mode
|
|
304
|
+
|
|
305
|
+
# deprecatedEnv
|
|
306
|
+
|
|
307
|
+
Deprecated environment variable: %s. Please use %s instead.
|
|
308
|
+
|
|
309
|
+
# deprecatedEnvDisagreement
|
|
310
|
+
|
|
311
|
+
Deprecated environment variable: %s. Please use %s instead.
|
|
312
|
+
|
|
313
|
+
Your environment has both variables populated, and with different values. The value from %s will be used.
|