Skip to content

feat!: better error handling in SfCommand.catch #568

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jun 13, 2024

Conversation

shetzel
Copy link
Contributor

@shetzel shetzel commented Jun 11, 2024

Changes SfCommandError to be a class that extends SfError so that it can be thrown, handle error conversion, and a JSON conversion. More properties from the error in the catch are displayed, returned, and sent to telemetry.

This is a new major version since:

  1. SfCommand.toErrorJson() was removed. This is now handled by SfCommandError.toJson().
  2. SfCommandError.code has changed from being a number to a string. The value for this is from the original error first, followed by the error name if it's an SfError, followed by the exit code as a string.
  3. SfCommandError is now a class instead of a type.

@W-14625499@

@mdonnalley
Copy link
Contributor

QA

setup: checkout branch, build, yarn link to global sf npm folder

🟢 prints error with actions

❯ sf config set target-org d    
Error (InvalidProjectWorkspaceError): This directory does not contain a valid Salesforce DX project.

Try this:

Run with --global to set for your entire workspace.

🟢 error json

❯ sf config set target-org d --json
{
  "name": "InvalidProjectWorkspaceError",
  "message": "This directory does not contain a valid Salesforce DX project.",
  "exitCode": 1,
  "actions": [
    "Run with --global to set for your entire workspace."
  ],
  "context": "Set",
  "stack": "InvalidProjectWorkspaceError: This directory does not contain a valid Salesforce DX project.\n    at SfCommandError.from (file:///Users/mdonnalley/repos/salesforcecli/sf-plugins-core/lib/SfCommandError.js:40:16)\n    at Set.catch (file:///Users/mdonnalley/repos/salesforcecli/sf-plugins-core/lib/sfCommand.js:315:47)\n    at Set._run (/Users/mdonnalley/repos/salesforcecli/sf-plugins-core/node_modules/@oclif/core/lib/command.js:306:29)\n    at async Config.runCommand (/Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/node_modules/@oclif/core/lib/config/config.js:424:25)\n    at async run (/Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/node_modules/@oclif/core/lib/main.js:94:16)\n    at async file:///Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/bin/run.js:15:1",
  "cause": {
    "name": "InvalidProjectWorkspaceError",
    "actions": [
      "Run with --global to set for your entire workspace."
    ],
    "exitCode": 1
  },
  "warnings": [],
  "code": "InvalidProjectWorkspaceError",
  "status": 1,
  "commandName": "Set"
}

🟢 error telemetry is recorded

~/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli via ⬢ v20.13.1 
❯ DEBUG=*telemetry SF_TELEMETRY_DEBUG=true sf config set target-org d --json
  sf:telemetry Usage acknowledgement file already exists +0ms
  sf:telemetry Using telemetry logging file /var/folders/4l/6tqf4pm156j751spjj1qppwr0000gp/T/sf-telemetry/telemetry-ac5f9adcb6af1e3abc5e050d07adcab5af3edbb8.log +0ms
  sf:telemetry Setting up process exit handler +2ms
{
  "name": "InvalidProjectWorkspaceError",
  "message": "This directory does not contain a valid Salesforce DX project.",
  "exitCode": 1,
  "actions": [
    "Run with --global to set for your entire workspace."
  ],
  "context": "Set",
  "stack": "InvalidProjectWorkspaceError: This directory does not contain a valid Salesforce DX project.\n    at SfCommandError.from (file:///Users/mdonnalley/repos/salesforcecli/sf-plugins-core/lib/SfCommandError.js:40:16)\n    at Set.catch (file:///Users/mdonnalley/repos/salesforcecli/sf-plugins-core/lib/sfCommand.js:315:47)\n    at Set._run (/Users/mdonnalley/repos/salesforcecli/sf-plugins-core/node_modules/@oclif/core/lib/command.js:306:29)\n    at async Config.runCommand (/Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/node_modules/@oclif/core/lib/config/config.js:424:25)\n    at async run (/Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/node_modules/@oclif/core/lib/main.js:94:16)\n    at async file:///Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/bin/run.js:15:1",
  "cause": {
    "name": "InvalidProjectWorkspaceError",
    "actions": [
      "Run with --global to set for your entire workspace."
    ],
    "exitCode": 1
  },
  "warnings": [],
  "code": "InvalidProjectWorkspaceError",
  "status": 1,
  "commandName": "Set"
}
  sf:telemetry DEBUG MODE. Run the uploader manually with the following command:
  sf:telemetry /Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/node_modules/@salesforce/plugin-telemetry/processes/upload.js /Users/mdonnalley/Library/Caches/sf /var/folders/4l/6tqf4pm156j751spjj1qppwr0000gp/T/sf-telemetry/telemetry-ac5f9adcb6af1e3abc5e050d07adcab5af3edbb8.log +52ms

~/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli via ⬢ v20.13.1 
❯ jq . /var/folders/4l/6tqf4pm156j751spjj1qppwr0000gp/T/sf-telemetry/telemetry-ac5f9adcb6af1e3abc5e050d07adcab5af3edbb8.log
{
  "eventName": "COMMAND_ERROR",
  "platform": "darwin",
  "shell": "zsh",
  "arch": "arm64",
  "nodeVersion": "v20.13.1",
  "processUptime": 635.2690829999999,
  "version": "2.46.4",
  "channel": "stable",
  "executable": "sf",
  "origin": "@salesforce/cli/2.46.4 darwin-arm64 node-v20.13.1",
  "plugin": "@salesforce/plugin-settings",
  "plugin_version": "2.3.1",
  "command": "config:set",
  "specifiedFlags": "json",
  "specifiedFlagFullNames": "json",
  "deprecatedFlagsUsed": "",
  "date": "Wed, 12 Jun 2024 18:41:21 GMT",
  "timestamp": "1718217681148",
  "specifiedEnvs": "SF_AUTOUPDATE_DISABLE SF_DISABLE_AUTOUPDATE SF_TELEMETRY_DEBUG SF_UPDATE_INSTRUCTIONS SF_USER_TYPE",
  "uniqueEnvs": "SF_AUTOUPDATE_DISABLE SF_DISABLE_AUTOUPDATE SF_TELEMETRY_DEBUG SF_UPDATE_INSTRUCTIONS SF_USER_TYPE",
  "argKeys": "target-org",
  "oclif.commandLoadMs": 0,
  "oclif.commandRunMs": 307.63583300000005,
  "oclif.configLoadMs": 7.783042000000023,
  "oclif.corePluginsLoadMs": 16.156749999999988,
  "oclif.initHookMs": 18.38470799999999,
  "oclif.initMs": 19.18270799999999,
  "oclif.linkedPluginsLoadMs": 167.62433299999998,
  "oclif.postrunHookMs": 0,
  "oclif.prerunHookMs": 13.921499999999924,
  "oclif.runMs": 326.79591700000003,
  "oclif.userPluginsLoadMs": 0,
  "type": "EXCEPTION",
  "errorName": "InvalidProjectWorkspaceError",
  "errorMessage": "This directory does not contain a valid Salesforce DX project.",
  "error": {
    "name": "InvalidProjectWorkspaceError",
    "message": "This directory does not contain a valid Salesforce DX project.",
    "stack": "InvalidProjectWorkspaceError: This directory does not contain a valid Salesforce DX project.\n    at SfCommandError.from (file:///Users/mdonnalley/repos/salesforcecli/sf-plugins-core/lib/SfCommandError.js:40:16)\n    at Set.catch (file:///Users/mdonnalley/repos/salesforcecli/sf-plugins-core/lib/sfCommand.js:315:47)\n    at Set._run (/Users/mdonnalley/repos/salesforcecli/sf-plugins-core/node_modules/@oclif/core/lib/command.js:306:29)\n    at async Config.runCommand (/Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/node_modules/@oclif/core/lib/config/config.js:424:25)\n    at async run (/Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/node_modules/@oclif/core/lib/main.js:94:16)\n    at async file:///Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/bin/run.js:15:1",
    "actions": [
      "Run with --global to set for your entire workspace."
    ],
    "exitCode": 1,
    "context": "Set",
    "cause": {
      "name": "InvalidProjectWorkspaceError",
      "actions": [
        "Run with --global to set for your entire workspace."
      ],
      "exitCode": 1
    },
    "status": 1,
    "commandName": "Set",
    "warnings": [],
    "skipOclifErrorHandling": true,
    "oclif": {
      "exit": 1
    }
  },
  "cliId": "f06bf072c27f2f3a469e718fe7775808582d7cea"
}
{
  "eventName": "COMMAND_EXECUTION",
  "platform": "darwin",
  "shell": "zsh",
  "arch": "arm64",
  "nodeVersion": "v20.13.1",
  "processUptime": 669.213166,
  "version": "2.46.4",
  "channel": "stable",
  "executable": "sf",
  "origin": "@salesforce/cli/2.46.4 darwin-arm64 node-v20.13.1",
  "plugin": "@salesforce/plugin-settings",
  "plugin_version": "2.3.1",
  "command": "config:set",
  "specifiedFlags": "json",
  "specifiedFlagFullNames": "json",
  "deprecatedFlagsUsed": "",
  "date": "Wed, 12 Jun 2024 18:41:21 GMT",
  "status": "1",
  "timestamp": "1718217681181",
  "specifiedEnvs": "SF_AUTOUPDATE_DISABLE SF_DISABLE_AUTOUPDATE SF_TELEMETRY_DEBUG SF_UPDATE_INSTRUCTIONS SF_USER_TYPE",
  "uniqueEnvs": "SF_AUTOUPDATE_DISABLE SF_DISABLE_AUTOUPDATE SF_TELEMETRY_DEBUG SF_UPDATE_INSTRUCTIONS SF_USER_TYPE",
  "argKeys": "target-org",
  "oclif.commandLoadMs": 0,
  "oclif.commandRunMs": 307.63583300000005,
  "oclif.configLoadMs": 7.783042000000023,
  "oclif.corePluginsLoadMs": 16.156749999999988,
  "oclif.initHookMs": 18.38470799999999,
  "oclif.initMs": 19.18270799999999,
  "oclif.linkedPluginsLoadMs": 167.62433299999998,
  "oclif.postrunHookMs": 0,
  "oclif.prerunHookMs": 13.921499999999924,
  "oclif.runMs": 326.79591700000003,
  "oclif.userPluginsLoadMs": 0,
  "type": "EVENT",
  "cliId": "f06bf072c27f2f3a469e718fe7775808582d7cea"
}

🔴 custom oclif error codes aren't applied

❯ sf config set target-dev-hub=devhub --INVALID                                                                            
Error (Error): Nonexistent flag: --INVALID
See more help with --help


~/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli via ⬢ v20.13.1 
❯ echo $?
1

Should be a 2 - https://github.com/salesforcecli/cli/blob/main/package.json#L130. I think this just needs to account for oclif: {exit: number} on the errors coming from oclif/core

@mdonnalley
Copy link
Contributor

QA round 2

🟢 custom oclif error codes are applied

❯ sf config set target-dev-hub=devhub --INVALID   
Error (2): Nonexistent flag: --INVALID
See more help with --help

❯ echo $?
2

🟢 SF_ENV=development shows extra stuff

❯ SF_ENV=development sf config set target-dev-hub=devhub --INVALID 
Error (2): Nonexistent flag: --INVALID
See more help with --help

*** Internal Diagnostic ***

SfCommandError: Nonexistent flag: --INVALID
See more help with --help
    at SfCommandError.from (file:///Users/mdonnalley/repos/salesforcecli/sf-plugins-core/lib/SfCommandError.js:39:16)
    at Set.catch (file:///Users/mdonnalley/repos/salesforcecli/sf-plugins-core/lib/sfCommand.js:315:47)
    at Set._run (/Users/mdonnalley/repos/salesforcecli/sf-plugins-core/node_modules/@oclif/core/lib/command.js:306:29)
    at async Config.runCommand (/Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/node_modules/@oclif/core/lib/config/config.js:424:25)
    at async run (/Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/node_modules/@oclif/core/lib/main.js:94:16)
    at async file:///Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/bin/run.js:15:1 {
  actions: undefined,
  exitCode: 2,
  context: 'Set',
  data: undefined,
  cause: NonExistentFlagsError: Nonexistent flag: --INVALID
  See more help with --help
      at validateArgs (/Users/mdonnalley/repos/salesforcecli/sf-plugins-core/node_modules/@oclif/core/lib/parser/validate.js:10:19)
      at validate (/Users/mdonnalley/repos/salesforcecli/sf-plugins-core/node_modules/@oclif/core/lib/parser/validate.js:190:5)
      at Object.parse (/Users/mdonnalley/repos/salesforcecli/sf-plugins-core/node_modules/@oclif/core/lib/parser/index.js:19:35)
      at async Set.parse (/Users/mdonnalley/repos/salesforcecli/sf-plugins-core/node_modules/@oclif/core/lib/command.js:244:25)
      at async Set.run (file:///Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/node_modules/@salesforce/plugin-settings/lib/commands/config/set.js:28:39)
      at async Set._run (/Users/mdonnalley/repos/salesforcecli/sf-plugins-core/node_modules/@oclif/core/lib/command.js:302:22)
      at async Config.runCommand (/Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/node_modules/@oclif/core/lib/config/config.js:424:25)
      at async run (/Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/node_modules/@oclif/core/lib/main.js:94:16)
      at async file:///Users/mdonnalley/.volta/tools/image/packages/@salesforce/cli/lib/node_modules/@salesforce/cli/bin/run.js:15:1 {
    code: undefined,
    oclif: { exit: 2 },
    skipOclifErrorHandling: undefined,
    suggestions: undefined,
    parse: { input: [Object], output: [Object] },
    showHelp: true,
    flags: [ '--INVALID' ]
  },
  status: 2,
  commandName: 'Set',
  warnings: [],
  result: undefined,
  skipOclifErrorHandling: true,
  oclif: { exit: 2 }
}
******

@mdonnalley mdonnalley merged commit 93885ae into main Jun 13, 2024
45 of 47 checks passed
@mdonnalley mdonnalley deleted the sh/better-error-handling branch June 13, 2024 19:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants