https://github.com/salesforcecli/eslint-plugin-sf-plugin
eslint rules for sf plugins
https://github.com/salesforcecli/eslint-plugin-sf-plugin
Last synced: 23 days ago
JSON representation
eslint rules for sf plugins
- Host: GitHub
- URL: https://github.com/salesforcecli/eslint-plugin-sf-plugin
- Owner: salesforcecli
- License: bsd-3-clause
- Created: 2022-06-08T21:00:56.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2026-03-24T16:29:36.000Z (3 months ago)
- Last Synced: 2026-03-25T21:26:44.266Z (3 months ago)
- Language: TypeScript
- Size: 3.07 MB
- Stars: 4
- Watchers: 5
- Forks: 0
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE.txt
- Code of conduct: CODE_OF_CONDUCT.md
- Codeowners: CODEOWNERS
- Security: SECURITY.md
Awesome Lists containing this project
README
# eslint-plugin-sf-plugin
Helpful eslint rules for sf plugins.
## Use these rules in a sf plugin
`yarn add --dev eslint-plugin-sf-plugin`
Then, in your plugin's `.eslintrc.js`, add `"plugin:sf-plugin/recommended"` to your `extends` property.
example:
```js
module.exports = {
extends: ['eslint-config-salesforce-typescript', 'eslint-config-salesforce-license', 'plugin:sf-plugin/recommended'],
};
```
To override how an individual rules behaves, add the plugin name and change the its `rules` value.
```js
plugins: ['sf-plugin'],
rules: {
'sf-plugin/no-hardcoded-messages': 'error'
}
```
## Use these rules to migrate a plugin based on sfdxCommand to use sfCommand
> These eslint rules are experimental and cause significant code changes. Please use with caution and test changes thoroughly
```shell
yarn add @salesforce/sf-plugins-core
yarn add --dev eslint-plugin-sf-plugin
```
[`migration` includes all of the `recommended` rules, so you don't have to include both]
```js
module.exports = {
extends: ['eslint-config-salesforce-typescript', 'eslint-config-salesforce-license', 'plugin:sf-plugin/migration'],
};
```
## Rules
πΌ Configurations enabled in.\
β οΈ Configurations set to warn in.\
π« Configurations disabled in.\
π Set in the `library` configuration.\
βοΈ Set in the `migration` configuration.\
β
Set in the `recommended` configuration.\
π§ Automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/user-guide/command-line-interface#--fix).\
π‘ Manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).
| NameΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β | Description | πΌ | β οΈ | π« | π§ | π‘ |
| :------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | :------ | :--- | :------ | :- | :- |
| [command-example](docs/rules/command-example.md) | Ensure commands have a summary, description, and examples | | βοΈ β
| | | |
| [command-summary](docs/rules/command-summary.md) | Ensure commands have a summary | βοΈ β
| | | π§ | |
| [dash-o](docs/rules/dash-o.md) | Warn on a flag that uses -o | | βοΈ β
| | | |
| [encourage-alias-deprecation](docs/rules/encourage-alias-deprecation.md) | Commands and flags aliases probably want to deprecate their old names to provide more warnings to users | | | | π§ | π‘ |
| [esm-message-import](docs/rules/esm-message-import.md) | Looks for the verbose `Messages.importMessagesDirectory(dirname(fileURLToPath(import.meta.url)))` to offer a simpler alternative | π βοΈ β
| | | π§ | |
| [flag-case](docs/rules/flag-case.md) | Enforce lowercase kebab-case flag names | βοΈ β
| | | π§ | |
| [flag-cross-references](docs/rules/flag-cross-references.md) | Enforce flag cross references for dependOn,exclusive,exactlyOne | βοΈ β
| | | | |
| [flag-min-max-default](docs/rules/flag-min-max-default.md) | Enforce that flags with min/max values have a default value | | βοΈ β
| | | |
| [flag-summary](docs/rules/flag-summary.md) | Enforce that flags have a summary property and that longDescription is renamed to description | βοΈ β
| | | π§ | |
| [get-connection-with-version](docs/rules/get-connection-with-version.md) | Calls to getConnection should pass in a version | | βοΈ β
| | | |
| [id-flag-suggestions](docs/rules/id-flag-suggestions.md) | Create better salesforceId flags with length and startsWith properties | | βοΈ β
| | π§ | π‘ |
| [no-args-parse-without-strict-false](docs/rules/no-args-parse-without-strict-false.md) | If you parse args/argv, the class should have strict set to false | βοΈ β
| | | π§ | |
| [no-builtin-flags](docs/rules/no-builtin-flags.md) | Handling for sfdxCommand's flags.builtin | βοΈ | | | π§ | |
| [no-classes-in-command-return-type](docs/rules/no-classes-in-command-return-type.md) | The return type of the run method should not contain a class. | βοΈ β
| | | π§ | |
| [no-default-and-depends-on-flags](docs/rules/no-default-and-depends-on-flags.md) | Do not allow creation of a flag with default value and dependsOn | βοΈ β
| | | | |
| [no-depends-on-boolean-flag](docs/rules/no-depends-on-boolean-flag.md) | Do not allow flags to depend on boolean flags | | βοΈ β
| | | |
| [no-deprecated-properties](docs/rules/no-deprecated-properties.md) | Removes non-existent properties left over from SfdxCommand | βοΈ | | | π§ | |
| [no-duplicate-short-characters](docs/rules/no-duplicate-short-characters.md) | Prevent duplicate use of short characters or conflicts between aliases and flags | βοΈ β
| | | | |
| [no-execcmd-double-quotes](docs/rules/no-execcmd-double-quotes.md) | Do not use double quotes in NUT examples. They will not work on windows | | | π βοΈ β
| π§ | |
| [no-filepath-flags](docs/rules/no-filepath-flags.md) | Change filepath flag to file flag | | | | π§ | |
| [no-h-short-char](docs/rules/no-h-short-char.md) | Do not allow creation of a flag with short char -h | βοΈ β
| | | | |
| [no-hardcoded-messages-commands](docs/rules/no-hardcoded-messages-commands.md) | Use loaded messages and separate files for messages | | βοΈ β
| | | |
| [no-hardcoded-messages-flags](docs/rules/no-hardcoded-messages-flags.md) | Use loaded messages and separate files for messages. Follow the message naming guidelines | | βοΈ β
| | π§ | |
| [no-hyphens-aliases](docs/rules/no-hyphens-aliases.md) | Mark when an alias starts with a hyphen, like -f or --foo | βοΈ β
| | | π§ | |
| [no-id-flags](docs/rules/no-id-flags.md) | Change Id flag to salesforceId | βοΈ | | | π§ | |
| [no-json-flag](docs/rules/no-json-flag.md) | Do not allow creation of json flag | βοΈ β
| | | | |
| [no-messages-load](docs/rules/no-messages-load.md) | Use Messages.loadMessages() instead of Messages.load() | π βοΈ β
| | | π§ | |
| [no-missing-messages](docs/rules/no-missing-messages.md) | Checks core Messages usage for correct usage of named messages and message tokens | π βοΈ β
| | | | |
| [no-number-flags](docs/rules/no-number-flags.md) | Change number flag to integer | | | | π§ | |
| [no-oclif-flags-command-import](docs/rules/no-oclif-flags-command-import.md) | Change import of flags and Command from oclif to use sf-plugins-core | βοΈ β
| | | π§ | |
| [no-sfdx-command-import](docs/rules/no-sfdx-command-import.md) | Change import and base class from SfdxCommand to sfCommand | βοΈ | | | π§ | |
| [no-split-examples](docs/rules/no-split-examples.md) | Arrays of messags should use getMessages instead of getMessage followed by EOL splitting | βοΈ β
| | | π§ | |
| [no-this-flags](docs/rules/no-this-flags.md) | Fix references to this.org (property on SfdxCommand) | βοΈ | | | π§ | π‘ |
| [no-this-org](docs/rules/no-this-org.md) | Fix references to this.org (property on SfdxCommand) | βοΈ | | | π§ | π‘ |
| [no-this-ux](docs/rules/no-this-ux.md) | SfCommand does not have a ux property | βοΈ | | | π§ | |
| [no-time-flags](docs/rules/no-time-flags.md) | Migrate time flags to Flags.duration | βοΈ | | | π§ | |
| [no-unnecessary-aliases](docs/rules/no-unnecessary-aliases.md) | Mark when an alias is unnecessary because its only an order permutation, not really a different name | βοΈ β
| | | π§ | |
| [no-unnecessary-properties](docs/rules/no-unnecessary-properties.md) | Boolean properties are false by default, so they should not be set to false | | βοΈ β
| | π§ | |
| [no-username-properties](docs/rules/no-username-properties.md) | Convert requiresUsername and supportusername to username flags | βοΈ | | | π§ | |
| [only-extend-SfCommand](docs/rules/only-extend-SfCommand.md) | Only allow commands that directly extend SfCommand | | βοΈ β
| | | |
| [read-only-properties](docs/rules/read-only-properties.md) | Class-level static properties, like flags or descriptions, should be marked public and read-only | | βοΈ β
| | π§ | |
| [run-matches-class-type](docs/rules/run-matches-class-type.md) | The return type of the run method should match the Type passed to sfCommand | βοΈ β
| | | π§ | |
| [sfdx-flags-property](docs/rules/sfdx-flags-property.md) | Change flag definitions to SfCommand version | βοΈ | | | π§ | |
| [should-parse-flags](docs/rules/should-parse-flags.md) | The run method should call this.parse when there are flags | βοΈ | | | π§ | |
| [spread-base-flags](docs/rules/spread-base-flags.md) | When not directly extending SfCommand, the parent's flags must be spread like flags = { ...{{parent}}.{{property}} } | βοΈ | β
| | | |
| [use-sf-command-flags](docs/rules/use-sf-command-flags.md) | Use Flags export from sf-plugins-core | βοΈ | | | π§ | |