Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/nullvoxpopuli/eslint-plugin-decorator-position
ESLint plugin for enforcing decorator position
https://github.com/nullvoxpopuli/eslint-plugin-decorator-position
decorators eslint eslint-plugin hacktoberfest
Last synced: 4 days ago
JSON representation
ESLint plugin for enforcing decorator position
- Host: GitHub
- URL: https://github.com/nullvoxpopuli/eslint-plugin-decorator-position
- Owner: NullVoxPopuli
- License: mit
- Created: 2020-03-22T18:19:26.000Z (almost 5 years ago)
- Default Branch: main
- Last Pushed: 2024-12-30T00:12:39.000Z (25 days ago)
- Last Synced: 2025-01-12T20:03:12.258Z (11 days ago)
- Topics: decorators, eslint, eslint-plugin, hacktoberfest
- Language: JavaScript
- Homepage:
- Size: 3.03 MB
- Stars: 52
- Watchers: 4
- Forks: 10
- Open Issues: 15
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE.md
Awesome Lists containing this project
README
# eslint-plugin-decorator-position
[![NPM version](https://img.shields.io/npm/v/eslint-plugin-decorator-position.svg?style=flat)](https://npmjs.org/package/eslint-plugin-decorator-position)
[![NPM downloads](https://img.shields.io/npm/dm/eslint-plugin-decorator-position.svg?style=flat)](https://npmjs.org/package/eslint-plugin-decorator-position)> An ESlint plugin that provides set of rules enforcing consistent decorator positions
## βοΈRequirements
- [ESLint](https://eslint.org/) `>= 6`
- [Node.js](https://nodejs.org/) `>= 12`## π Usage
### 1. Install plugin
```shell
pnpm add -D eslint-plugin-decorator-position
```Or
```shell
yarn add --dev eslint-plugin-decorator-position
```Or
```shell
npm install --save-dev eslint-plugin-decorator-position
```### 2. Modify your eslint config
For modern 'flat config', append the eslint-plugin-decorator-position config to your `eslint.config.js` file:
```diff
module.exports = [
+ ...require('eslint-plugin-decorator-position/config/recommended'),
{
languageOptions: {
parser: require('@babel/eslint-parser'),
parserOptions: {
requireConfigFile: false,
babelOptions: {
plugins: [['@babel/plugin-proposal-decorators', { legacy: true }]],
},
},
},
},
];
```Or for the legacy eslint config format, extend the base config provided by eslint-plugin-decorator-position:
```javascript
// .eslintrc.js
module.exports = {
parser: '@babel/eslint-parser',
// parser: '@typescript-eslint/parser',
plugins: ['decorator-position'],
extends: [
'plugin:decorator-position/ember' // or other configuration
],
rules: {
// override rule settings from extends config here
// 'decorator-position/decorator-position': ['error', { /* your config */ }]
}
};
```### 3. Using with Prettier
Since eslint 8, the printWidth option must be specified to be compatible
with the eslint-plugin-prettier rule `prettier/prettier````diff
// eslint.config.js
module.exports = [
...require('eslint-plugin-decorator-position/config/recommended'),
{
languageOptions: {
parser: require('@babel/eslint-parser'),
parserOptions: {
requireConfigFile: false,
babelOptions: {
plugins: [['@babel/plugin-proposal-decorators', { legacy: true }]],
},
},
},
},
+ rules: {
+ 'decorator-position/decorator-position': ['error', { printWidth: 100 }],
+ 'prettier/prettier': ['error', { printWidth: 100 }]
+ }
]
```or
```javascript
// .eslintrc.js
module.exports = {
parser: '@babel/eslint-parser',
plugins: ['decorator-position'],
extends: [
'plugin:decorator-position/ember' // or other configuration
],
rules: {
'decorator-position/decorator-position': ['error', { printWidth: 100 }],
'prettier/prettier': ['error', { printWidth: 100 }]
}
};
```If there is a `.prettierrc.js` file, that will be read instead, and `printwidth` is not needed.
## π§° Configurations
'Flat' configurations:
| | Name | Description |
|:---|:-----|:------------|
| | [`/config/base`](./lib/config/base.js) | Only installs the plugin. You can use it to configure rules as you wish. |
| | [`/config/rules`](./lib/config/rules.js) | Only configures the rules. Expects the plugin to be installed. |
| | [`/config/recommended`](./lib/config/recommended.js) | Installs the plugin and configures the rules |Legacy configurations:
| | Name | Description |
|:---|:-----|:------------|
| | [base](./lib/config-legacy/base.js) | contains no rules settings, but the basic eslint configuration suitable for any project. You can use it to configure rules as you wish. |
| :hamster: | [ember](./lib/config-legacy/ember.js) | extends the `base` configuration by enabling the recommended rules for ember projects. |## Manual plugin installation
If you prefer to manage the config yourself, the plugin can be installed like this:
```diff
// eslint.config.js
module.exports = [
// ... your existing config
plugins: {
+ "decorator-position": require("eslint-plugin-decorator-position"),
},
rules: {
+ 'decorator-position/decorator-position': 'error',
}
]
```## π Rules
Rules are grouped by category to help you understand their purpose. Each rule has emojis denoting:
- What configuration it belongs to
- :wrench: if some problems reported by the rule are automatically fixable by the `--fix` [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) option### Style
| | Rule ID | Description |
|:---|:--------|:------------|
| :white_check_mark::wrench: | [decorator-position](./docs/rules/decorator-position.md) | enforce consistent decorator position on properties and methods |For the simplified list of rules, [go here](./lib/index.js).
## π» Contribution Guide
If you have any suggestions, ideas, or problems, feel free to [create an issue](https://github.com/NullVoxPopuli/eslint-plugin-decorator-position/issues/new), but first please make sure your question does not repeat [previous ones](https://github.com/NullVoxPopuli/eslint-plugin-decorator-position/issues).
### Creating a New Rule
- [Create an issue](https://github.com/NullVoxPopuli/eslint-plugin-decorator-position/issues/new) with a description of the proposed rule
- Create files for the [new rule](https://eslint.org/docs/developer-guide/working-with-rules):
- `lib/rules/new-rule.js` (implementation, see [no-proxies](lib/rules/no-proxies.js) for an example)
- `docs/rules/new-rule.md` (documentation, start from the template -- [raw](https://raw.githubusercontent.com/NullVoxPopuli/eslint-plugin-decorator-position/master/docs/rules/_TEMPLATE_.md), [rendered](docs/rules/_TEMPLATE_.md))
- `tests/lib/rules/new-rule.js` (tests, see [no-proxies](tests/lib/rules/no-proxies.js) for an example)
- Run `yarn update` to automatically update the README and other files (and re-run this if you change the rule name or description)
- Make sure your changes will pass [CI](.travis.yml) by running:
- `yarn test`
- `yarn lint` (`yarn lint:js --fix` can fix many errors)
- Create a PR and link the created issue in the descriptionNote that new rules should not immediately be added to the [recommended](./lib/recommended-rules.js) configuration, as we only consider such breaking changes during major version updates.
### Running smoke tests and creating reproductions
To run smoke tests:
```shell
./scripts/smoke-test.sh
```it will prompt you with which test to run.
To create a reproduction,
1. first make sure there is an open issue describing the problem your encountering.
2. then create a folder in `smoke-tests/issue-reproductions/` named ofter the issue number.
example: `smoke-tests/issue-reproductions/196/`
3. The minimum required files are:
- package.json - for declaring which dependencies are being tested (or `*` if it doesn't matter for your particular test)
- a js or ts file to demonstrate the "correct" state. After a smoke-test runs, a git diff is checked to ensure 0 changes.
- .eslintrc.js - to define what configuration / rules / plugins / etc may be relevant.## SemVer Policy
How does this project interpret patch / minor / breaking changes?
- **patch**: a change that fixes currently broken behavior. Does not cause formatting to change when people update unless a previous patch/feature accidentally broke formatting in a **breaking** way.
- **minor**: a change that does not impact formatting
- **breaking**: a major change that is not backwards compatible and would intentionally cause formatting changes to occur## π License
See the [LICENSE](LICENSE.md) file for license rights and limitations (MIT).