@nitra/eslint-config 3.6.14 → 3.8.0
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/README.md +27 -0
- package/graphql-eslint-anchor.js +30 -0
- package/index.js +19 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -84,3 +84,30 @@ export default [
|
|
|
84
84
|
- Для **Node**: eslint-plugin-n
|
|
85
85
|
- Для **Vue**: eslint-plugin-vue з правилами атрибутів та порядку
|
|
86
86
|
- Oxlint (recommended)
|
|
87
|
+
|
|
88
|
+
## Стиль коду
|
|
89
|
+
|
|
90
|
+
### `for...in` заборонено — рефакторити на `for...of`
|
|
91
|
+
|
|
92
|
+
`no-restricted-syntax` із селектором `ForInStatement` забороняє `for...in` у всіх JS-подібних файлах (`.js`, `.mjs`, `.cjs`, `.vue`). Разом із цим зникає потреба в `Object.hasOwn`-guard — він має зникнути з кодом одночасно з `for...in`.
|
|
93
|
+
|
|
94
|
+
```js
|
|
95
|
+
// ❌ погано
|
|
96
|
+
for (const k in obj) {
|
|
97
|
+
if (!Object.hasOwn(obj, k)) continue
|
|
98
|
+
use(k, obj[k])
|
|
99
|
+
}
|
|
100
|
+
for (const i in arr) {
|
|
101
|
+
use(arr[i])
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ✅ добре
|
|
105
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
106
|
+
use(k, v)
|
|
107
|
+
}
|
|
108
|
+
for (const item of arr) {
|
|
109
|
+
use(item)
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Альтернативи залежно від потреби: `Object.keys(obj)`, `Object.values(obj)`, `Object.entries(obj)` — або пряма ітерація масиву через `for...of`.
|
package/graphql-eslint-anchor.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* @see upstream graphql-eslint (MIT) on GitHub
|
|
6
6
|
*/
|
|
7
7
|
import { relative } from 'node:path'
|
|
8
|
+
import { CodeFileLoader } from '@graphql-tools/code-file-loader'
|
|
8
9
|
import { gqlPluckFromCodeStringSync } from '@graphql-tools/graphql-tag-pluck'
|
|
9
10
|
import { asArray } from '@graphql-tools/utils'
|
|
10
11
|
import graphqlEslintPlugin from '@graphql-eslint/eslint-plugin'
|
|
@@ -12,6 +13,35 @@ import { loadOnDiskGraphQLConfig } from '@graphql-eslint/eslint-plugin/graphql-c
|
|
|
12
13
|
import { version } from '@graphql-eslint/eslint-plugin/meta'
|
|
13
14
|
import { CWD, REPORT_ON_FIRST_CHARACTER } from '@graphql-eslint/eslint-plugin/utils'
|
|
14
15
|
|
|
16
|
+
/**
|
|
17
|
+
* Дефолтні негативні globs для CodeFileLoader: апстрім `createGlobbyOptions` хардкодить
|
|
18
|
+
* `ignore: []`, тож широкі patterns у `.graphqlrc.yml documents` (наприклад,
|
|
19
|
+
* `**\/*.{vue,js,ts,tsx}`) сканують `node_modules` синхронно через Babel pluck і вішають
|
|
20
|
+
* eslint на хвилини. Patches `_buildGlobs` додає `!`-префіксні globs у сам список патернів —
|
|
21
|
+
* це працює, на відміну від спроби пропатчити free function `createGlobbyOptions`.
|
|
22
|
+
*/
|
|
23
|
+
const CODE_FILE_LOADER_DEFAULT_IGNORES = [
|
|
24
|
+
'!**/node_modules/**',
|
|
25
|
+
'!**/.git/**',
|
|
26
|
+
'!**/dist/**',
|
|
27
|
+
'!**/.yarn/**',
|
|
28
|
+
'!**/.cursor/**',
|
|
29
|
+
'!**/.claude/**',
|
|
30
|
+
'!**/.github/**',
|
|
31
|
+
'!**/.vscode/**',
|
|
32
|
+
'!**/coverage/**'
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
const CODE_FILE_LOADER_PATCH_FLAG = Symbol.for('@nitra/eslint-config/code-file-loader-default-ignores')
|
|
36
|
+
if (!CodeFileLoader.prototype[CODE_FILE_LOADER_PATCH_FLAG]) {
|
|
37
|
+
const originalBuildGlobs = CodeFileLoader.prototype._buildGlobs
|
|
38
|
+
CodeFileLoader.prototype._buildGlobs = function patchedBuildGlobs(glob, options) {
|
|
39
|
+
const globs = originalBuildGlobs.call(this, glob, options)
|
|
40
|
+
return [...globs, ...CODE_FILE_LOADER_DEFAULT_IGNORES]
|
|
41
|
+
}
|
|
42
|
+
CodeFileLoader.prototype[CODE_FILE_LOADER_PATCH_FLAG] = true
|
|
43
|
+
}
|
|
44
|
+
|
|
15
45
|
const blocksMap = /* @__PURE__ */ new Map()
|
|
16
46
|
let onDiskConfig
|
|
17
47
|
let onDiskConfigLoaded = false
|
package/index.js
CHANGED
|
@@ -27,6 +27,18 @@ const GRAPHQL_EXTRACTED_IGNORES = ['**/node_modules/**']
|
|
|
27
27
|
/** Glob-патерни файлів для eslint-plugin-unicorn (JS-подібні джерела; без сирих YAML/Markdown). */
|
|
28
28
|
const UNICORN_FILES = ['**/*.{js,mjs,cjs,vue}']
|
|
29
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Заборона `for...in`: підказує рефакторинг на `for...of` з `Object.entries/keys/values` чи прямою ітерацією масиву.
|
|
32
|
+
* Разом із цим зникає потреба в `Object.hasOwn`-guard.
|
|
33
|
+
*/
|
|
34
|
+
const NO_FOR_IN_RESTRICTED_SYNTAX = [
|
|
35
|
+
'error',
|
|
36
|
+
{
|
|
37
|
+
selector: 'ForInStatement',
|
|
38
|
+
message: 'Use for...of with Object.entries/keys/values or iterate arrays directly'
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
|
|
30
42
|
/** Узгоджені опції `no-unused-vars` для `.js` і Vue SFC (`eslint-plugin-oxlint` не вимикає це правило для `.vue`, тож oxlint CLI його там не покриває). */
|
|
31
43
|
const NO_UNUSED_VARS_RULE = ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }]
|
|
32
44
|
|
|
@@ -288,6 +300,13 @@ const all = [
|
|
|
288
300
|
]
|
|
289
301
|
}
|
|
290
302
|
},
|
|
303
|
+
// Заборона `for...in` для всіх JS-подібних файлів, включно з Vue SFC (див. `NO_FOR_IN_RESTRICTED_SYNTAX`).
|
|
304
|
+
{
|
|
305
|
+
files: UNICORN_FILES,
|
|
306
|
+
rules: {
|
|
307
|
+
'no-restricted-syntax': NO_FOR_IN_RESTRICTED_SYNTAX
|
|
308
|
+
}
|
|
309
|
+
},
|
|
291
310
|
// eslint-plugin-security (лише JS-подібні файли — як unicorn)
|
|
292
311
|
{ ...securityPlugin.configs.recommended, files: UNICORN_FILES },
|
|
293
312
|
{
|