From d3b9d1f95a39e499da4ec458d8d1cdb2fc14bd92 Mon Sep 17 00:00:00 2001 From: Daniil Dubrava Date: Thu, 10 Nov 2022 18:34:56 +0300 Subject: [PATCH] feat(eslint-config-angular): add decorator position package (#217) * feat(eslint-config-angular): add decorator position package * ci: remove 10.x, 12.x node versions & add 18.x node version --- .github/workflows/check.yml | 2 +- packages/eslint-config-angular/README.md | 1 + .../decorator-position/index.js | 19 ++++++++++++++ packages/eslint-config-angular/package.json | 4 ++- .../decorator-position-happy.fixture.ts | 15 +++++++++++ .../decorator-position-unhappy.fixture.ts | 13 ++++++++++ .../decorator-position-happy.test.js.snap | 3 +++ .../decorator-position-unhappy.test.js.snap | 25 +++++++++++++++++++ .../decorator-position-happy.test.js | 25 +++++++++++++++++++ .../decorator-position-unhappy.test.js | 25 +++++++++++++++++++ 10 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 packages/eslint-config-angular/decorator-position/index.js create mode 100644 packages/eslint-config-angular/test/decorator-position/__fixtures__/decorator-position-happy.fixture.ts create mode 100644 packages/eslint-config-angular/test/decorator-position/__fixtures__/decorator-position-unhappy.fixture.ts create mode 100644 packages/eslint-config-angular/test/decorator-position/__snapshots__/decorator-position-happy.test.js.snap create mode 100644 packages/eslint-config-angular/test/decorator-position/__snapshots__/decorator-position-unhappy.test.js.snap create mode 100644 packages/eslint-config-angular/test/decorator-position/decorator-position-happy.test.js create mode 100644 packages/eslint-config-angular/test/decorator-position/decorator-position-unhappy.test.js diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 6d0a083..9cd0cae 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -11,7 +11,7 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x, 14.x, 16.x] + node-version: [14.x, 16.x, 18.x] steps: - uses: actions/checkout@v2 diff --git a/packages/eslint-config-angular/README.md b/packages/eslint-config-angular/README.md index 2c2b2a0..88d9a5e 100644 --- a/packages/eslint-config-angular/README.md +++ b/packages/eslint-config-angular/README.md @@ -36,6 +36,7 @@ You can also include `optional` configurations, however, you are responsible for '@tinkoff/eslint-config-angular/file-progress', '@tinkoff/eslint-config-angular/line-statements', '@tinkoff/eslint-config-angular/member-ordering', + '@tinkoff/eslint-config-angular/decorator-position', ], } ``` diff --git a/packages/eslint-config-angular/decorator-position/index.js b/packages/eslint-config-angular/decorator-position/index.js new file mode 100644 index 0000000..8e59ae0 --- /dev/null +++ b/packages/eslint-config-angular/decorator-position/index.js @@ -0,0 +1,19 @@ +module.exports = { + overrides: [ + { + files: ['*.ts'], + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint', 'decorator-position'], + rules: { + 'decorator-position/decorator-position': [ + 'error', + { + printWidth: 120, + properties: 'above', + methods: 'above', + }, + ], + }, + }, + ], +}; diff --git a/packages/eslint-config-angular/package.json b/packages/eslint-config-angular/package.json index 4abfe19..b05fdab 100644 --- a/packages/eslint-config-angular/package.json +++ b/packages/eslint-config-angular/package.json @@ -15,6 +15,7 @@ "member-ordering", "promise", "file-progress", + "decorator-position", "recommended", "rxjs", "index.js", @@ -35,7 +36,8 @@ "eslint-plugin-html": "^6.2.0", "eslint-plugin-rxjs": "^5.0.2", "eslint-plugin-rxjs-angular": "^2.0.0", - "eslint-plugin-simple-import-sort": "^7.0.0" + "eslint-plugin-simple-import-sort": "^7.0.0", + "eslint-plugin-decorator-position": "^5.0.1" }, "peerDependencies": { "@tinkoff/eslint-config": "^1.31.1", diff --git a/packages/eslint-config-angular/test/decorator-position/__fixtures__/decorator-position-happy.fixture.ts b/packages/eslint-config-angular/test/decorator-position/__fixtures__/decorator-position-happy.fixture.ts new file mode 100644 index 0000000..8df887c --- /dev/null +++ b/packages/eslint-config-angular/test/decorator-position/__fixtures__/decorator-position-happy.fixture.ts @@ -0,0 +1,15 @@ +function Output() { + return function (target: any, propertyKey: string) {}; +} + +function enumerable() { + return function (target: any, propertyKey: string) {}; +} + +class A { + @Output() + name: any; + + @enumerable() + foo() {} +} diff --git a/packages/eslint-config-angular/test/decorator-position/__fixtures__/decorator-position-unhappy.fixture.ts b/packages/eslint-config-angular/test/decorator-position/__fixtures__/decorator-position-unhappy.fixture.ts new file mode 100644 index 0000000..c65a46c --- /dev/null +++ b/packages/eslint-config-angular/test/decorator-position/__fixtures__/decorator-position-unhappy.fixture.ts @@ -0,0 +1,13 @@ +function Input() { + return function (target: any, propertyKey: string) {}; +} + +function pure() { + return function (target: any, propertyKey: string) {}; +} + +class B { + @Input() name: any; + + @pure() foo() {} +} diff --git a/packages/eslint-config-angular/test/decorator-position/__snapshots__/decorator-position-happy.test.js.snap b/packages/eslint-config-angular/test/decorator-position/__snapshots__/decorator-position-happy.test.js.snap new file mode 100644 index 0000000..6863e7a --- /dev/null +++ b/packages/eslint-config-angular/test/decorator-position/__snapshots__/decorator-position-happy.test.js.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`decorator-position / happy path happy 1`] = `""`; diff --git a/packages/eslint-config-angular/test/decorator-position/__snapshots__/decorator-position-unhappy.test.js.snap b/packages/eslint-config-angular/test/decorator-position/__snapshots__/decorator-position-unhappy.test.js.snap new file mode 100644 index 0000000..31f5e29 --- /dev/null +++ b/packages/eslint-config-angular/test/decorator-position/__snapshots__/decorator-position-unhappy.test.js.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`decorator-position / unhappy path unhappy 1`] = ` +"error: Expected @Input to be on the line above (decorator-position/decorator-position) at packages/eslint-config-angular/test/decorator-position/__fixtures__/decorator-position-unhappy.fixture.ts:10:3: + 8 | + 9 | class B { +> 10 | @Input() name: any; + | ^ + 11 | + 12 | @pure() foo() {} + 13 | } + + +error: Expected @pure to be on the line above (decorator-position/decorator-position) at packages/eslint-config-angular/test/decorator-position/__fixtures__/decorator-position-unhappy.fixture.ts:12:3: + 10 | @Input() name: any; + 11 | +> 12 | @pure() foo() {} + | ^ + 13 | } + 14 | + + +2 errors found. +2 errors potentially fixable with the \`--fix\` option." +`; diff --git a/packages/eslint-config-angular/test/decorator-position/decorator-position-happy.test.js b/packages/eslint-config-angular/test/decorator-position/decorator-position-happy.test.js new file mode 100644 index 0000000..823d3df --- /dev/null +++ b/packages/eslint-config-angular/test/decorator-position/decorator-position-happy.test.js @@ -0,0 +1,25 @@ +import ESlint from 'eslint'; +import path from 'path'; + +describe('decorator-position / happy path', () => { + const cli = new ESlint.CLIEngine({ + cwd: path.join(__dirname, '..'), + useEslintrc: false, + baseConfig: { + extends: ['../decorator-position'], + }, + }); + + it('happy', () => { + const codeframe = cli.getFormatter('codeframe'); + + const report = cli.executeOnFiles([ + path.join( + __dirname, + './__fixtures__/decorator-position-happy.fixture.ts' + ), + ]); + + expect(codeframe(report.results)).toMatchSnapshot(); + }); +}); diff --git a/packages/eslint-config-angular/test/decorator-position/decorator-position-unhappy.test.js b/packages/eslint-config-angular/test/decorator-position/decorator-position-unhappy.test.js new file mode 100644 index 0000000..fdcdc04 --- /dev/null +++ b/packages/eslint-config-angular/test/decorator-position/decorator-position-unhappy.test.js @@ -0,0 +1,25 @@ +import ESlint from 'eslint'; +import path from 'path'; + +describe('decorator-position / unhappy path', () => { + const cli = new ESlint.CLIEngine({ + cwd: path.join(__dirname, '..'), + useEslintrc: false, + baseConfig: { + extends: ['../decorator-position'], + }, + }); + + it('unhappy', () => { + const codeframe = cli.getFormatter('codeframe'); + + const report = cli.executeOnFiles([ + path.join( + __dirname, + './__fixtures__/decorator-position-unhappy.fixture.ts' + ), + ]); + + expect(codeframe(report.results)).toMatchSnapshot(); + }); +});