@nitra/cursor 1.40.0 → 1.41.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/CHANGELOG.md +13 -0
- package/package.json +1 -1
- package/rules/js-lint/js/data/tooling/oxlint-canonical.json +13 -0
- package/rules/js-lint/js/tooling.mjs +1 -1
- package/rules/js-lint/js-lint.mdc +5 -5
- package/rules/js-lint/policy/package_json/package_json.rego +29 -20
- package/rules/js-lint/policy/package_json/template/package.json.snippet.json +3 -0
- package/schemas/v8r-catalog.json +2 -0
- package/rules/js-lint/js/data/tooling/oxlint-canonical-skeleton.json +0 -27
- package/rules/js-lint/js/data/tooling/oxlint-rules.tsv +0 -359
- package/rules/js-lint/lib/rebuild-oxlint-canonical.mjs +0 -29
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.41.0] - 2026-05-31
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- js-lint: канон oxlint оновлено — додано 13 правил @e18e/eslint-plugin і ignorePatterns (npm/types/**, demo/node/rules-demo.js)
|
|
8
|
+
- js-lint: мінімальна версія @nitra/eslint-config піднята до 3.10.0 (Rego package_json + js-lint.mdc v1.27)
|
|
9
|
+
|
|
10
|
+
## [1.40.1] - 2026-05-31
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- js-lint: oxlint-canonical.json тепер source-of-truth — прибрано генерацію (rebuild-oxlint-canonical.mjs, oxlint-canonical-skeleton.json, oxlint-rules.tsv)
|
|
15
|
+
|
|
3
16
|
## [1.40.0] - 2026-05-31
|
|
4
17
|
|
|
5
18
|
### Added
|
package/package.json
CHANGED
|
@@ -5,6 +5,19 @@
|
|
|
5
5
|
"categories": {},
|
|
6
6
|
"rules": {
|
|
7
7
|
"e18e/prefer-includes": "error",
|
|
8
|
+
"e18e/prefer-array-fill": "deny",
|
|
9
|
+
"e18e/prefer-array-to-reversed": "deny",
|
|
10
|
+
"e18e/prefer-array-to-sorted": "deny",
|
|
11
|
+
"e18e/prefer-array-to-spliced": "deny",
|
|
12
|
+
"e18e/prefer-nullish-coalescing": "deny",
|
|
13
|
+
"e18e/prefer-spread-syntax": "deny",
|
|
14
|
+
"e18e/prefer-url-canparse": "deny",
|
|
15
|
+
"e18e/ban-dependencies": "deny",
|
|
16
|
+
"e18e/prefer-array-from-map": "deny",
|
|
17
|
+
"e18e/prefer-timer-args": "deny",
|
|
18
|
+
"e18e/prefer-static-regex": "deny",
|
|
19
|
+
"e18e/prefer-date-now": "deny",
|
|
20
|
+
"e18e/prefer-regex-test": "deny",
|
|
8
21
|
"array-callback-return": "deny",
|
|
9
22
|
"no-new-wrappers": "deny",
|
|
10
23
|
"import/no-named-as-default": "deny",
|
|
@@ -213,7 +213,7 @@ async function checkEslintConfig(passFn, failFn, cwd) {
|
|
|
213
213
|
}
|
|
214
214
|
|
|
215
215
|
// Перевірки `prettier` / `@nitra/prettier-config` у залежностях (text.mdc) і
|
|
216
|
-
// `@nitra/eslint-config ≥ 3.
|
|
216
|
+
// `@nitra/eslint-config ≥ 3.10.0` тепер у Rego: відповідно
|
|
217
217
|
// `npm/policy/text/package_json/` і `npm/policy/js_lint/package_json/`. Тут
|
|
218
218
|
// лишилася лише workspace-ітерація для `type: "module"` і engines, бо js_lint
|
|
219
219
|
// Rego запускається лише на кореневому `package.json`.
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
description: Перевірка JavaScript коду
|
|
3
3
|
globs: "**/{.oxlintrc.json,eslint.config.js,.jscpd.json,knip.json,package.json},**/*.{js,mjs,cjs,jsx,ts,tsx}"
|
|
4
4
|
alwaysApply: false
|
|
5
|
-
version: '1.
|
|
5
|
+
version: '1.28'
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
**oxlint**, **ESLint**, **jscpd**, **knip**. У скрипті **`lint-js`** і в CI — **`bunx oxlint`**, **`bunx eslint`**, **`bunx jscpd`**, **`bunx knip`** (у CI без **`--fix`** для oxlint/eslint — див. приклад workflow нижче). Без **prettier** і **@nitra/prettier-config**. У **`devDependencies`** має бути **`@nitra/eslint-config
|
|
8
|
+
**oxlint**, **ESLint**, **jscpd**, **knip**. У скрипті **`lint-js`** і в CI — **`bunx oxlint`**, **`bunx eslint`**, **`bunx jscpd`**, **`bunx knip`** (у CI без **`--fix`** для oxlint/eslint — див. приклад workflow нижче). Без **prettier** і **@nitra/prettier-config**. У **`devDependencies`** має бути **`@nitra/eslint-config`** — версія не нижче канонічного мінімуму зі snippet нижче (semver-поріг, єдине джерело істини) (з **3.8.0** правило `no-restricted-syntax` забороняє `for...in`; з **3.9.2** у `getConfig` вбудовано ignore для **`**/adr/**`** — ADR-документи не валідуються ESLint, локально цей glob додавати не потрібно; також транзитивно йде **`@e18e/eslint-plugin`** для oxlint); пакет **`@e18e/eslint-plugin`** окремо не додавай. Пакети oxlint/eslint/jscpd/knip не додавай без потреби монорепо.
|
|
9
9
|
|
|
10
10
|
У кожному **`package.json`** проєкту (корінь і всі workspace-пакети) має бути **`"type": "module"`** — весь код у ESM.
|
|
11
11
|
|
|
@@ -16,16 +16,16 @@ version: '1.26'
|
|
|
16
16
|
"lint-js": "bunx oxlint --fix && bunx eslint --fix . && bunx jscpd . && bunx knip --no-config-hints"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"@nitra/eslint-config": "^3.
|
|
19
|
+
"@nitra/eslint-config": "^3.10.0"
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
Канон `type` + `scripts.lint-js` (substring requirement): [package.json.snippet.json](./policy/package_json/template/package.json.snippet.json)
|
|
24
|
+
Канон `type` + `scripts.lint-js` (substring requirement) і мінімальна `@nitra/eslint-config` (semver-поріг `devDependencies`): [package.json.snippet.json](./policy/package_json/template/package.json.snippet.json)
|
|
25
25
|
|
|
26
26
|
У `.vscode/extensions.json` `recommendations` мають містити `dbaeumer.vscode-eslint`, `github.vscode-github-actions`, `oxc.oxc-vscode`: [extensions.json.snippet.json](./policy/vscode_extensions/template/extensions.json.snippet.json)
|
|
27
27
|
|
|
28
|
-
У корені має бути **`.oxlintrc.json`**, який **збігається з каноном** oxlint з пакета **`@nitra/cursor`**: файл **`npm/rules/js-lint/js/tooling/oxlint-canonical.json`** (plugins, jsPlugins з **`@e18e/eslint-plugin`**, categories, повний набір **rules** із канону — додаткові записи в **`rules`** дозволені; також **`settings`**, **`env`**, **`globals`**). Поле **`ignorePatterns`** працює як **`rules`**: канонічні патерни з **`oxlint-canonical.json`** (наразі **`**/schema.graphql`**, **`**/auto-imports.d.ts`**) мають бути присутні, додаткові локальні glob-и дозволені.
|
|
28
|
+
У корені має бути **`.oxlintrc.json`**, який **збігається з каноном** oxlint з пакета **`@nitra/cursor`**: файл **`npm/rules/js-lint/js/data/tooling/oxlint-canonical.json`** (plugins, jsPlugins з **`@e18e/eslint-plugin`**, categories, повний набір **rules** із канону — додаткові записи в **`rules`** дозволені; також **`settings`**, **`env`**, **`globals`**). Поле **`ignorePatterns`** працює як **`rules`**: канонічні патерни з **`oxlint-canonical.json`** (наразі **`**/schema.graphql`**, **`**/auto-imports.d.ts`**) мають бути присутні, додаткові локальні glob-и дозволені. Канон **`oxlint-canonical.json`** — source-of-truth, редагується напряму; у споживачі оновлюється копіюванням файлу з репозиторію пакета. Модуль **`@e18e/eslint-plugin`** не оголошуй окремо в **`package.json`** — він уже в залежностях **`@nitra/eslint-config`** (з **3.8.0**), oxlint підвантажує його з **`node_modules`**.
|
|
29
29
|
|
|
30
30
|
Мінімум для розуміння структури (реальний корінь конфігу має збігатися з каноном повністю):
|
|
31
31
|
|
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
#
|
|
3
3
|
# Канон надходить через --data: { "template": { "snippet": ... } }
|
|
4
4
|
# Структура --data сформована з template/package.json.snippet.json
|
|
5
|
-
# (canonical `type` + `scripts.lint-js`).
|
|
5
|
+
# (canonical `type` + `scripts.lint-js` + `devDependencies.@nitra/eslint-config` як мін-поріг).
|
|
6
6
|
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
7
|
+
# Мінімальна версія `@nitra/eslint-config` — ЄДИНЕ джерело в snippet
|
|
8
|
+
# (`devDependencies.@nitra/eslint-config`); rego лише парсить поріг і робить semver-порівняння.
|
|
9
|
+
#
|
|
10
|
+
# Логіка, що ЛИШАЄТЬСЯ у rego (inverse, без template-значення):
|
|
11
|
+
# - `engines.node` >= 24, `engines.bun` >= 1.3 (semver range parsing).
|
|
10
12
|
package js_lint.package_json
|
|
11
13
|
|
|
12
14
|
import rego.v1
|
|
@@ -44,7 +46,7 @@ deny contains msg if {
|
|
|
44
46
|
msg := "package.json: engines.bun має бути >= 1.3 (js-lint.mdc)"
|
|
45
47
|
}
|
|
46
48
|
|
|
47
|
-
# ── deny: @nitra/eslint-config >=
|
|
49
|
+
# ── deny: @nitra/eslint-config >= snippet-поріг ─────────────────────────
|
|
48
50
|
|
|
49
51
|
deny contains msg if {
|
|
50
52
|
dev := object.get(input, "devDependencies", {})
|
|
@@ -56,11 +58,17 @@ deny contains msg if {
|
|
|
56
58
|
range := object.get(object.get(input, "devDependencies", {}), "@nitra/eslint-config", "")
|
|
57
59
|
range != ""
|
|
58
60
|
not eslint_config_meets_min(range)
|
|
59
|
-
msg := sprintf("package.json: @nitra/eslint-config має бути >=
|
|
61
|
+
msg := sprintf("package.json: @nitra/eslint-config має бути >= %s (зараз %q) (js-lint.mdc)", [eslint_min_display, range])
|
|
60
62
|
}
|
|
61
63
|
|
|
62
64
|
# ── helpers ──────────────────────────────────────────────────────────────
|
|
63
65
|
|
|
66
|
+
# Канонічний мін-поріг `@nitra/eslint-config` із snippet (напр. "^3.10.0").
|
|
67
|
+
eslint_min_range := object.get(object.get(data.template.snippet, "devDependencies", {}), "@nitra/eslint-config", "")
|
|
68
|
+
|
|
69
|
+
# Поріг для повідомлення без діапазонних префіксів (напр. "3.10.0").
|
|
70
|
+
eslint_min_display := trim_left(eslint_min_range, "^~>=v ")
|
|
71
|
+
|
|
64
72
|
normalize_script(s) := regex.replace(trim_space(s), `\s+`, " ")
|
|
65
73
|
|
|
66
74
|
engines_node_meets(spec) if {
|
|
@@ -84,24 +92,25 @@ engines_bun_meets(spec) if {
|
|
|
84
92
|
eslint_config_meets_min(range) if startswith(trim_space(range), "workspace:")
|
|
85
93
|
|
|
86
94
|
eslint_config_meets_min(range) if {
|
|
87
|
-
|
|
88
|
-
count(
|
|
89
|
-
|
|
95
|
+
actual := split_to_numbers(range)
|
|
96
|
+
count(actual) >= 3
|
|
97
|
+
min_parts := split_to_numbers(eslint_min_range)
|
|
98
|
+
count(min_parts) >= 3
|
|
99
|
+
semver_gte(actual, min_parts)
|
|
90
100
|
}
|
|
91
101
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
102
|
+
# actual >= min_parts за major.minor.patch (лексикографічно).
|
|
103
|
+
semver_gte(a, b) if a[0] > b[0]
|
|
104
|
+
|
|
105
|
+
semver_gte(a, b) if {
|
|
106
|
+
a[0] == b[0]
|
|
107
|
+
a[1] > b[1]
|
|
97
108
|
}
|
|
98
109
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
parts[1] == 9
|
|
104
|
-
parts[2] >= 2
|
|
110
|
+
semver_gte(a, b) if {
|
|
111
|
+
a[0] == b[0]
|
|
112
|
+
a[1] == b[1]
|
|
113
|
+
a[2] >= b[2]
|
|
105
114
|
}
|
|
106
115
|
|
|
107
116
|
first_major(spec) := major if {
|
package/schemas/v8r-catalog.json
CHANGED
|
@@ -28,11 +28,13 @@
|
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"name": "n-cursor skill meta",
|
|
31
|
+
"description": "Маніфест skill-пакета n-cursor (npm/skills/<id>/meta.json) — назва, тригери, дозволи",
|
|
31
32
|
"fileMatch": ["npm/skills/*/meta.json"],
|
|
32
33
|
"url": "https://unpkg.com/@nitra/cursor/schemas/skill-meta.json"
|
|
33
34
|
},
|
|
34
35
|
{
|
|
35
36
|
"name": "n-cursor rule meta",
|
|
37
|
+
"description": "Маніфест rule-пакета n-cursor (npm/rules/<id>/meta.json) — назва, опис, версія правила",
|
|
36
38
|
"fileMatch": ["npm/rules/*/meta.json"],
|
|
37
39
|
"url": "https://unpkg.com/@nitra/cursor/schemas/rule-meta.json"
|
|
38
40
|
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
|
3
|
-
"plugins": ["unicorn", "oxc", "import", "jsdoc", "promise", "node", "vue"],
|
|
4
|
-
"jsPlugins": ["@e18e/eslint-plugin"],
|
|
5
|
-
"categories": {},
|
|
6
|
-
"rules": {},
|
|
7
|
-
"settings": {
|
|
8
|
-
"next": {
|
|
9
|
-
"rootDir": []
|
|
10
|
-
},
|
|
11
|
-
"jsdoc": {
|
|
12
|
-
"ignorePrivate": false,
|
|
13
|
-
"ignoreInternal": false,
|
|
14
|
-
"ignoreReplacesDocs": true,
|
|
15
|
-
"overrideReplacesDocs": true,
|
|
16
|
-
"augmentsExtendsReplacesDocs": false,
|
|
17
|
-
"implementsReplacesDocs": false,
|
|
18
|
-
"exemptDestructuredRootsFromChecks": false,
|
|
19
|
-
"tagNamePreference": {}
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
"env": {
|
|
23
|
-
"builtin": true
|
|
24
|
-
},
|
|
25
|
-
"globals": {},
|
|
26
|
-
"ignorePatterns": ["**/schema.graphql", "**/auto-imports.d.ts"]
|
|
27
|
-
}
|
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
e18e/prefer-includes error
|
|
2
|
-
array-callback-return deny
|
|
3
|
-
no-new-wrappers deny
|
|
4
|
-
import/no-named-as-default deny
|
|
5
|
-
oxc/uninvoked-array-callback deny
|
|
6
|
-
typescript/no-non-null-assertion deny
|
|
7
|
-
unicorn/prefer-date-now deny
|
|
8
|
-
no-obj-calls deny
|
|
9
|
-
default-case-last deny
|
|
10
|
-
import/no-webpack-loader-syntax deny
|
|
11
|
-
promise/no-promise-in-callback deny
|
|
12
|
-
typescript/no-unnecessary-type-constraint deny
|
|
13
|
-
unicorn/prefer-dom-node-remove deny
|
|
14
|
-
for-direction deny
|
|
15
|
-
no-prototype-builtins deny
|
|
16
|
-
typescript/no-useless-empty-export deny
|
|
17
|
-
unicorn/prefer-includes deny
|
|
18
|
-
guard-for-in deny
|
|
19
|
-
no-restricted-globals deny
|
|
20
|
-
promise/prefer-await-to-then off
|
|
21
|
-
typescript/prefer-as-const deny
|
|
22
|
-
unicorn/prefer-math-trunc deny
|
|
23
|
-
no-self-assign deny
|
|
24
|
-
max-params off
|
|
25
|
-
react/button-has-type deny
|
|
26
|
-
typescript/prefer-function-type deny
|
|
27
|
-
unicorn/prefer-native-coercion-functions deny
|
|
28
|
-
no-extra-label deny
|
|
29
|
-
no-shadow-restricted-names deny
|
|
30
|
-
react/iframe-missing-sandbox deny
|
|
31
|
-
typescript/prefer-ts-expect-error deny
|
|
32
|
-
unicorn/prefer-number-properties off
|
|
33
|
-
no-labels deny
|
|
34
|
-
no-ternary off
|
|
35
|
-
react/jsx-key deny
|
|
36
|
-
unicorn/consistent-empty-array-spread deny
|
|
37
|
-
unicorn/prefer-query-selector deny
|
|
38
|
-
no-object-constructor deny
|
|
39
|
-
react/jsx-no-script-url deny
|
|
40
|
-
unicorn/empty-brace-spaces deny
|
|
41
|
-
unicorn/prefer-set-has deny
|
|
42
|
-
no-array-constructor deny
|
|
43
|
-
react/jsx-no-useless-fragment deny
|
|
44
|
-
unicorn/explicit-length-check off
|
|
45
|
-
unicorn/prefer-string-replace-all deny
|
|
46
|
-
no-bitwise deny
|
|
47
|
-
no-unsafe-optional-chaining deny
|
|
48
|
-
react/no-children-prop deny
|
|
49
|
-
unicorn/no-abusive-eslint-disable deny
|
|
50
|
-
unicorn/prefer-string-trim-start-end deny
|
|
51
|
-
no-class-assign deny
|
|
52
|
-
no-unused-private-class-members deny
|
|
53
|
-
react/no-direct-mutation-state deny
|
|
54
|
-
unicorn/no-array-reduce deny
|
|
55
|
-
unicorn/require-array-join-separator deny
|
|
56
|
-
no-console off
|
|
57
|
-
no-useless-concat deny
|
|
58
|
-
react/no-render-return-value deny
|
|
59
|
-
unicorn/no-console-spaces deny
|
|
60
|
-
unicorn/text-encoding-identifier-case deny
|
|
61
|
-
no-constant-condition deny
|
|
62
|
-
no-useless-rename deny
|
|
63
|
-
react/no-unescaped-entities deny
|
|
64
|
-
unicorn/no-hex-escape deny
|
|
65
|
-
no-control-regex deny
|
|
66
|
-
no-with deny
|
|
67
|
-
react/react-in-jsx-scope deny
|
|
68
|
-
unicorn/no-length-as-slice-end deny
|
|
69
|
-
no-div-regex deny
|
|
70
|
-
prefer-numeric-literals deny
|
|
71
|
-
react/self-closing-comp deny
|
|
72
|
-
unicorn/no-negation-in-equality-check deny
|
|
73
|
-
no-dupe-keys deny
|
|
74
|
-
prefer-rest-params deny
|
|
75
|
-
unicorn/no-new-buffer deny
|
|
76
|
-
no-empty-character-class deny
|
|
77
|
-
require-await deny
|
|
78
|
-
node/no-exports-assign deny
|
|
79
|
-
unicorn/no-process-exit deny
|
|
80
|
-
no-empty-static-block deny
|
|
81
|
-
sort-keys off
|
|
82
|
-
oxc/bad-array-method-on-arguments deny
|
|
83
|
-
unicorn/no-thenable deny
|
|
84
|
-
typescript/ban-ts-comment deny
|
|
85
|
-
no-eval deny
|
|
86
|
-
unicode-bom deny
|
|
87
|
-
jsdoc/check-access deny
|
|
88
|
-
oxc/bad-comparison-sequence deny
|
|
89
|
-
unicorn/no-unnecessary-await deny
|
|
90
|
-
typescript/consistent-generic-constructors deny
|
|
91
|
-
no-extra-boolean-cast deny
|
|
92
|
-
vars-on-top deny
|
|
93
|
-
jsdoc/empty-tags deny
|
|
94
|
-
oxc/bad-replace-all-arg deny
|
|
95
|
-
unicorn/no-useless-fallback-in-spread deny
|
|
96
|
-
no-global-assign deny
|
|
97
|
-
jsdoc/require-param deny
|
|
98
|
-
oxc/erasing-op deny
|
|
99
|
-
unicorn/no-useless-spread deny
|
|
100
|
-
typescript/no-confusing-non-null-assertion deny
|
|
101
|
-
no-invalid-regexp deny
|
|
102
|
-
import/no-namespace off
|
|
103
|
-
jsdoc/require-param-type deny
|
|
104
|
-
oxc/no-accumulating-spread deny
|
|
105
|
-
typescript/no-empty-interface deny
|
|
106
|
-
unicorn/no-zero-fractions deny
|
|
107
|
-
import/namespace deny
|
|
108
|
-
jsdoc/require-property-name deny
|
|
109
|
-
no-label-var deny
|
|
110
|
-
typescript/no-extra-non-null-assertion deny
|
|
111
|
-
oxc/no-barrel-file deny
|
|
112
|
-
unicorn/prefer-spread deny
|
|
113
|
-
no-negated-condition deny
|
|
114
|
-
import/no-cycle deny
|
|
115
|
-
jsdoc/require-returns-description deny
|
|
116
|
-
typescript/no-misused-new deny
|
|
117
|
-
oxc/no-optional-chaining off
|
|
118
|
-
unicorn/prefer-array-flat-map deny
|
|
119
|
-
no-new-native-nonconstructor deny
|
|
120
|
-
import/no-dynamic-require deny
|
|
121
|
-
oxc/only-used-in-recursion deny
|
|
122
|
-
typescript/no-non-null-asserted-optional-chain deny
|
|
123
|
-
unicorn/prefer-code-point deny
|
|
124
|
-
default-case off
|
|
125
|
-
no-nonoctal-decimal-escape deny
|
|
126
|
-
import/no-self-import deny
|
|
127
|
-
promise/catch-or-return deny
|
|
128
|
-
typescript/no-this-alias deny
|
|
129
|
-
unicorn/prefer-dom-node-dataset deny
|
|
130
|
-
eqeqeq deny
|
|
131
|
-
no-proto deny
|
|
132
|
-
promise/no-new-statics deny
|
|
133
|
-
typescript/no-unsafe-function-type deny
|
|
134
|
-
unicorn/prefer-event-target deny
|
|
135
|
-
no-regex-spaces deny
|
|
136
|
-
promise/prefer-await-to-callbacks off
|
|
137
|
-
typescript/no-wrapper-object-types deny
|
|
138
|
-
unicorn/prefer-math-min-max deny
|
|
139
|
-
max-lines off
|
|
140
|
-
no-script-url deny
|
|
141
|
-
promise/valid-params deny
|
|
142
|
-
typescript/prefer-for-of deny
|
|
143
|
-
unicorn/prefer-modern-math-apis deny
|
|
144
|
-
no-useless-call deny
|
|
145
|
-
no-setter-return deny
|
|
146
|
-
typescript/prefer-namespace-keyword deny
|
|
147
|
-
unicorn/prefer-node-protocol deny
|
|
148
|
-
no-nested-ternary off
|
|
149
|
-
no-template-curly-in-string deny
|
|
150
|
-
react/jsx-curly-brace-presence deny
|
|
151
|
-
unicorn/catch-error-name deny
|
|
152
|
-
unicorn/prefer-prototype-methods deny
|
|
153
|
-
no-throw-literal deny
|
|
154
|
-
react/jsx-no-duplicate-props deny
|
|
155
|
-
unicorn/consistent-function-scoping deny
|
|
156
|
-
unicorn/prefer-regexp-test deny
|
|
157
|
-
no-alert deny
|
|
158
|
-
no-unexpected-multiline deny
|
|
159
|
-
react/jsx-no-undef deny
|
|
160
|
-
unicorn/escape-case deny
|
|
161
|
-
unicorn/prefer-string-raw deny
|
|
162
|
-
no-await-in-loop off
|
|
163
|
-
no-unsafe-negation deny
|
|
164
|
-
react/no-array-index-key deny
|
|
165
|
-
unicorn/new-for-builtins deny
|
|
166
|
-
unicorn/prefer-string-starts-ends-with deny
|
|
167
|
-
no-case-declarations deny
|
|
168
|
-
no-unused-labels deny
|
|
169
|
-
react/no-danger deny
|
|
170
|
-
unicorn/no-array-for-each deny
|
|
171
|
-
unicorn/prefer-type-error deny
|
|
172
|
-
no-cond-assign deny
|
|
173
|
-
no-useless-catch deny
|
|
174
|
-
react/no-is-mounted deny
|
|
175
|
-
unicorn/no-await-in-promise-methods deny
|
|
176
|
-
unicorn/switch-case-braces deny
|
|
177
|
-
no-constant-binary-expression deny
|
|
178
|
-
no-useless-escape deny
|
|
179
|
-
react/no-string-refs deny
|
|
180
|
-
unicorn/no-empty-file deny
|
|
181
|
-
no-void deny
|
|
182
|
-
unicorn/no-invalid-remove-event-listener deny
|
|
183
|
-
react/prefer-es6-class deny
|
|
184
|
-
no-delete-var deny
|
|
185
|
-
prefer-exponentiation-operator deny
|
|
186
|
-
react/rules-of-hooks deny
|
|
187
|
-
unicorn/no-magic-array-flat-depth deny
|
|
188
|
-
no-dupe-else-if deny
|
|
189
|
-
prefer-object-spread deny
|
|
190
|
-
react/void-dom-elements-no-children deny
|
|
191
|
-
unicorn/no-new-array deny
|
|
192
|
-
no-else-return deny
|
|
193
|
-
radix off
|
|
194
|
-
unicorn/no-object-as-default-parameter deny
|
|
195
|
-
no-empty-pattern deny
|
|
196
|
-
sort-imports off
|
|
197
|
-
oxc/approx-constant deny
|
|
198
|
-
typescript/array-type deny
|
|
199
|
-
unicorn/no-static-only-class deny
|
|
200
|
-
no-eq-null deny
|
|
201
|
-
symbol-description deny
|
|
202
|
-
oxc/bad-char-at-comparison deny
|
|
203
|
-
typescript/ban-types deny
|
|
204
|
-
unicorn/no-typeof-undefined deny
|
|
205
|
-
no-extend-native deny
|
|
206
|
-
valid-typeof deny
|
|
207
|
-
jsdoc/check-tag-names deny
|
|
208
|
-
oxc/bad-object-literal-comparison deny
|
|
209
|
-
typescript/consistent-type-definitions deny
|
|
210
|
-
unicorn/no-unreadable-iife deny
|
|
211
|
-
no-func-assign deny
|
|
212
|
-
import/default deny
|
|
213
|
-
jsdoc/no-defaults deny
|
|
214
|
-
oxc/double-comparisons deny
|
|
215
|
-
typescript/no-inferrable-types deny
|
|
216
|
-
unicorn/no-useless-promise-resolve-reject deny
|
|
217
|
-
no-inner-declarations deny
|
|
218
|
-
import/no-named-default deny
|
|
219
|
-
oxc/missing-throw deny
|
|
220
|
-
jsdoc/require-param-name deny
|
|
221
|
-
typescript/no-dynamic-delete deny
|
|
222
|
-
unicorn/no-useless-undefined deny
|
|
223
|
-
no-iterator deny
|
|
224
|
-
jsdoc/require-property-description deny
|
|
225
|
-
oxc/no-async-endpoint-handlers deny
|
|
226
|
-
typescript/no-explicit-any deny
|
|
227
|
-
unicorn/numeric-separators-style off
|
|
228
|
-
no-magic-numbers off
|
|
229
|
-
import/no-commonjs off
|
|
230
|
-
jsdoc/require-returns deny
|
|
231
|
-
typescript/no-import-type-side-effects deny
|
|
232
|
-
unicorn/prefer-array-flat deny
|
|
233
|
-
no-new-func deny
|
|
234
|
-
import/no-duplicates deny
|
|
235
|
-
jsdoc/require-yields deny
|
|
236
|
-
oxc/number-arg-out-of-range deny
|
|
237
|
-
typescript/no-non-null-asserted-nullish-coalescing deny
|
|
238
|
-
unicorn/prefer-blob-reading-methods deny
|
|
239
|
-
no-new deny
|
|
240
|
-
import/no-named-as-default-member off
|
|
241
|
-
promise/avoid-new deny
|
|
242
|
-
typescript/no-require-imports deny
|
|
243
|
-
unicorn/prefer-dom-node-append deny
|
|
244
|
-
default-param-last deny
|
|
245
|
-
no-plusplus off
|
|
246
|
-
import/unambiguous off
|
|
247
|
-
promise/no-callback-in-promise deny
|
|
248
|
-
typescript/no-unsafe-declaration-merging deny
|
|
249
|
-
unicorn/prefer-dom-node-text-content deny
|
|
250
|
-
func-names off
|
|
251
|
-
no-redeclare deny
|
|
252
|
-
promise/param-names deny
|
|
253
|
-
typescript/no-var-requires deny
|
|
254
|
-
unicorn/prefer-logical-operator-over-ternary deny
|
|
255
|
-
max-classes-per-file deny
|
|
256
|
-
no-return-assign deny
|
|
257
|
-
promise/spec-only deny
|
|
258
|
-
typescript/prefer-enum-initializers deny
|
|
259
|
-
unicorn/prefer-modern-dom-apis deny
|
|
260
|
-
new-cap off
|
|
261
|
-
no-self-compare deny
|
|
262
|
-
react/checked-requires-onchange-or-readonly deny
|
|
263
|
-
typescript/prefer-literal-enum-member deny
|
|
264
|
-
unicorn/prefer-negative-index deny
|
|
265
|
-
no-multi-assign deny
|
|
266
|
-
no-sparse-arrays deny
|
|
267
|
-
typescript/triple-slash-reference deny
|
|
268
|
-
react/jsx-boolean-value deny
|
|
269
|
-
unicorn/prefer-optional-catch-binding deny
|
|
270
|
-
no-lone-blocks deny
|
|
271
|
-
no-this-before-super deny
|
|
272
|
-
react/jsx-no-comment-textnodes deny
|
|
273
|
-
unicorn/consistent-existence-index-check deny
|
|
274
|
-
unicorn/prefer-reflect-apply deny
|
|
275
|
-
no-duplicate-imports deny
|
|
276
|
-
no-undefined off
|
|
277
|
-
react/jsx-no-target-blank deny
|
|
278
|
-
unicorn/prefer-set-size deny
|
|
279
|
-
unicorn/error-message deny
|
|
280
|
-
no-async-promise-executor deny
|
|
281
|
-
no-unsafe-finally deny
|
|
282
|
-
react/jsx-props-no-spread-multi deny
|
|
283
|
-
unicorn/filename-case off
|
|
284
|
-
unicorn/prefer-string-slice deny
|
|
285
|
-
no-caller deny
|
|
286
|
-
no-unused-expressions deny
|
|
287
|
-
react/no-danger-with-children deny
|
|
288
|
-
unicorn/no-anonymous-default-export off
|
|
289
|
-
unicorn/prefer-structured-clone deny
|
|
290
|
-
no-compare-neg-zero deny
|
|
291
|
-
no-unused-vars deny
|
|
292
|
-
react/no-find-dom-node deny
|
|
293
|
-
unicorn/no-await-expression-member deny
|
|
294
|
-
unicorn/require-number-to-fixed-digits-argument deny
|
|
295
|
-
no-const-assign deny
|
|
296
|
-
no-useless-constructor deny
|
|
297
|
-
react/no-set-state deny
|
|
298
|
-
unicorn/no-document-cookie deny
|
|
299
|
-
unicorn/throw-new-error deny
|
|
300
|
-
no-constructor-return deny
|
|
301
|
-
no-var deny
|
|
302
|
-
react/no-unknown-property deny
|
|
303
|
-
unicorn/no-instanceof-array deny
|
|
304
|
-
no-debugger deny
|
|
305
|
-
prefer-promise-reject-errors deny
|
|
306
|
-
unicorn/no-lonely-if deny
|
|
307
|
-
no-dupe-class-members deny
|
|
308
|
-
prefer-object-has-own deny
|
|
309
|
-
react/style-prop-object deny
|
|
310
|
-
unicorn/no-nested-ternary off
|
|
311
|
-
no-duplicate-case deny
|
|
312
|
-
prefer-spread deny
|
|
313
|
-
unicorn/no-null off
|
|
314
|
-
no-empty-function deny
|
|
315
|
-
require-yield deny
|
|
316
|
-
node/no-new-require deny
|
|
317
|
-
typescript/adjacent-overload-signatures deny
|
|
318
|
-
unicorn/no-single-promise-in-promise-methods deny
|
|
319
|
-
no-empty deny
|
|
320
|
-
sort-vars deny
|
|
321
|
-
oxc/bad-bitwise-operator deny
|
|
322
|
-
typescript/ban-tslint-comment deny
|
|
323
|
-
unicorn/no-this-assignment deny
|
|
324
|
-
no-ex-assign deny
|
|
325
|
-
use-isnan deny
|
|
326
|
-
jsdoc/check-property-names deny
|
|
327
|
-
oxc/bad-min-max-func deny
|
|
328
|
-
typescript/consistent-indexed-object-style deny
|
|
329
|
-
unicorn/no-unreadable-array-destructuring deny
|
|
330
|
-
no-fallthrough deny
|
|
331
|
-
yoda deny
|
|
332
|
-
jsdoc/implements-on-classes deny
|
|
333
|
-
oxc/const-comparisons deny
|
|
334
|
-
unicorn/no-useless-length-check deny
|
|
335
|
-
typescript/explicit-function-return-type deny
|
|
336
|
-
no-import-assign deny
|
|
337
|
-
import/first deny
|
|
338
|
-
jsdoc/require-param-description deny
|
|
339
|
-
typescript/no-duplicate-enum-values deny
|
|
340
|
-
oxc/misrefactored-assign-op deny
|
|
341
|
-
unicorn/no-useless-switch-case deny
|
|
342
|
-
no-irregular-whitespace deny
|
|
343
|
-
import/max-dependencies off
|
|
344
|
-
jsdoc/require-property deny
|
|
345
|
-
oxc/no-async-await off
|
|
346
|
-
typescript/no-empty-object-type deny
|
|
347
|
-
unicorn/number-literal-case deny
|
|
348
|
-
no-loss-of-precision deny
|
|
349
|
-
import/no-amd deny
|
|
350
|
-
jsdoc/require-property-type deny
|
|
351
|
-
oxc/no-const-enum deny
|
|
352
|
-
typescript/no-extraneous-class deny
|
|
353
|
-
unicorn/prefer-add-event-listener deny
|
|
354
|
-
no-multi-str deny
|
|
355
|
-
import/no-default-export off
|
|
356
|
-
jsdoc/require-returns-type deny
|
|
357
|
-
oxc/no-rest-spread-properties off
|
|
358
|
-
typescript/no-namespace deny
|
|
359
|
-
unicorn/prefer-array-some deny
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Збирає `oxlint-canonical.json` з `oxlint-canonical-skeleton.json` (без поля rules) та списку
|
|
3
|
-
* правил у `oxlint-rules.tsv` (колонки: ім’я правила, TAB, severity: deny | off | error).
|
|
4
|
-
*
|
|
5
|
-
* Після змін у TSV або скелеті запускай з каталогу пакета: `bun ./rules/js-lint/lib/rebuild-oxlint-canonical.mjs`,
|
|
6
|
-
* потім скопіюй оновлений канон у корінь споживача як `.oxlintrc.json` за потреби.
|
|
7
|
-
*/
|
|
8
|
-
import { readFileSync, writeFileSync } from 'node:fs'
|
|
9
|
-
import { dirname, join } from 'node:path'
|
|
10
|
-
import { fileURLToPath } from 'node:url'
|
|
11
|
-
|
|
12
|
-
const dir = join(dirname(fileURLToPath(import.meta.url)), '..', 'js', 'data', 'tooling')
|
|
13
|
-
const rules = {}
|
|
14
|
-
for (const line of readFileSync(join(dir, 'oxlint-rules.tsv'), 'utf8').split('\n')) {
|
|
15
|
-
const t = line.trim()
|
|
16
|
-
if (!t) {
|
|
17
|
-
continue
|
|
18
|
-
}
|
|
19
|
-
const i = t.indexOf('\t')
|
|
20
|
-
if (i === -1) {
|
|
21
|
-
throw new Error(`oxlint-rules.tsv: очікується TAB між ключем і значенням: ${t}`)
|
|
22
|
-
}
|
|
23
|
-
rules[t.slice(0, i)] = t.slice(i + 1)
|
|
24
|
-
}
|
|
25
|
-
const skeleton = JSON.parse(readFileSync(join(dir, 'oxlint-canonical-skeleton.json'), 'utf8'))
|
|
26
|
-
skeleton.rules = rules
|
|
27
|
-
const out = join(dir, 'oxlint-canonical.json')
|
|
28
|
-
writeFileSync(out, `${JSON.stringify(skeleton, null, 2)}\n`)
|
|
29
|
-
console.log(`wrote ${out} (${Object.keys(rules).length} rules)`)
|