@nitra/cursor 1.5.1 → 1.5.2
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/mdc/js-lint.mdc +19 -5
- package/mdc/text.mdc +4 -3
- package/package.json +1 -1
- package/scripts/check-js-lint.mjs +38 -1
package/mdc/js-lint.mdc
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Перевірка JavaScript коду
|
|
3
3
|
alwaysApply: true
|
|
4
|
-
version: '1.
|
|
4
|
+
version: '1.4'
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Перевірка виконується за допомогою **oxlint** та **
|
|
7
|
+
Перевірка виконується за допомогою **oxlint**, **ESLint** та **jscpd** (дублікати коду).
|
|
8
8
|
|
|
9
9
|
У файлі `.vscode/extensions.json` мають бути рекомендації розширень:
|
|
10
10
|
|
|
@@ -18,18 +18,30 @@ version: '1.2'
|
|
|
18
18
|
}
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
У кореневому `package.json` додай скрипт і
|
|
21
|
+
У кореневому `package.json` додай скрипт і залежності:
|
|
22
22
|
|
|
23
23
|
```json title="package.json"
|
|
24
24
|
"scripts": {
|
|
25
|
-
"lint-js": "oxlint --fix && bunx eslint --fix ."
|
|
25
|
+
"lint-js": "oxlint --fix && bunx eslint --fix . && bunx jscpd ."
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@nitra/eslint-config": "^3.3.0"
|
|
29
29
|
}
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
У `devDependencies` достатньо `@nitra/eslint-config` (залежності ESLint підтягуються разом із ним). **oxlint**
|
|
32
|
+
У `devDependencies` достатньо `@nitra/eslint-config` (залежності ESLint підтягуються разом із ним). **oxlint**, **eslint** та **jscpd** у скриптах викликай через `bunx`; окремо не додавай пакети `oxlint` / `eslint` / `jscpd`, якщо цього не вимагає ваш монорепо.
|
|
33
|
+
|
|
34
|
+
У корені проєкту має бути `.jscpd.json`. Мінімум: увімкнути облік `.gitignore`, ненульовий код виходу при знаходженні клонів, консольний звіт. За потреби додай `ignore` (дзеркальні каталоги, шаблони) та `minLines`, щоб відсікти дрібні збіги:
|
|
35
|
+
|
|
36
|
+
```json title=".jscpd.json"
|
|
37
|
+
{
|
|
38
|
+
"gitignore": true,
|
|
39
|
+
"exitCode": 1,
|
|
40
|
+
"reporters": ["console"],
|
|
41
|
+
"minLines": 25,
|
|
42
|
+
"ignore": []
|
|
43
|
+
}
|
|
44
|
+
```
|
|
33
45
|
|
|
34
46
|
Додай workflow `.github/workflows/lint-js.yml`:
|
|
35
47
|
|
|
@@ -49,6 +61,7 @@ on:
|
|
|
49
61
|
- '**/*.tsx'
|
|
50
62
|
- '**/*.vue'
|
|
51
63
|
- '**/eslint.config.*'
|
|
64
|
+
- '.jscpd.json'
|
|
52
65
|
|
|
53
66
|
pull_request:
|
|
54
67
|
branches:
|
|
@@ -83,6 +96,7 @@ jobs:
|
|
|
83
96
|
run: |
|
|
84
97
|
bunx oxlint
|
|
85
98
|
bunx eslint .
|
|
99
|
+
bunx jscpd .
|
|
86
100
|
```
|
|
87
101
|
|
|
88
102
|
**Без дублювання CI:** якщо в `.github/workflows` уже є `lint.yml` з тими самими кроками `oxlint` або `eslint`, видали зайвий workflow, а саме `lint.yml` — лінт JS має виконуватися в одному місці.
|
package/mdc/text.mdc
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Обробка та перевірка текстових файлів (cspell, markdownlint-cli2, v8r, CI)
|
|
3
3
|
alwaysApply: true
|
|
4
|
-
version: '1.
|
|
4
|
+
version: '1.12'
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
Правило описує роботу з **текстовими файлами** в репозиторії: перевірка правопису через **cspell**, стиль **Markdown** через **markdownlint-cli2**, валідація **JSON/YAML/TOML** через **[v8r](https://chris48s.github.io/v8r/)** ([Schema Store](https://www.schemastore.org/)), розширення **DavidAnson.vscode-markdownlint** у Cursor/VS Code та інтеграція в CI.
|
|
@@ -42,7 +42,9 @@ version: '1.10'
|
|
|
42
42
|
|
|
43
43
|
**Код 98:** якщо для glob **немає жодного файлу**, v8r дає **98**. Це стосується не лише TOML: репозиторій без `.yml`/`.yaml` зламає **один** спільний виклик `v8r` уже на `**/*.yml`. Окремі виклики з дозволом лише **98** покривають і такі репозиторії.
|
|
44
44
|
|
|
45
|
-
За замовчуванням v8r враховує **`.gitignore
|
|
45
|
+
За замовчуванням v8r враховує **`.gitignore`**. **`.v8rignore` не створюй завчасно** — файл потрібен **лише коли** `bunx v8r` падає на JSON/YAML без схеми в каталозі (тоді додай у ignore відповідні glob’и).
|
|
46
|
+
|
|
47
|
+
Пакет **`v8r` у `devDependencies` не додавай** — у скрипті достатньо **`bunx v8r`**.
|
|
46
48
|
|
|
47
49
|
## Конфігурація markdownlint-cli2
|
|
48
50
|
|
|
@@ -84,7 +86,6 @@ on:
|
|
|
84
86
|
- '.cspell.json'
|
|
85
87
|
- '.gitignore'
|
|
86
88
|
- '.markdownlint-cli2.jsonc'
|
|
87
|
-
- '.v8rignore'
|
|
88
89
|
- '**/*.js'
|
|
89
90
|
- '**/*.ts'
|
|
90
91
|
- '**/*.vue'
|
package/package.json
CHANGED
|
@@ -27,8 +27,15 @@ export async function check() {
|
|
|
27
27
|
|
|
28
28
|
if (pkg.scripts?.['lint-js']) {
|
|
29
29
|
pass('package.json містить скрипт lint-js')
|
|
30
|
+
if (String(pkg.scripts['lint-js']).includes('jscpd')) {
|
|
31
|
+
pass('lint-js містить jscpd')
|
|
32
|
+
} else {
|
|
33
|
+
fail('lint-js має викликати jscpd — додай "&& bunx jscpd ." у кінець скрипта')
|
|
34
|
+
}
|
|
30
35
|
} else {
|
|
31
|
-
fail(
|
|
36
|
+
fail(
|
|
37
|
+
'package.json не містить скрипт "lint-js" — додай: "oxlint --fix && bunx eslint --fix . && bunx jscpd ."'
|
|
38
|
+
)
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
if (pkg.devDependencies?.['@nitra/eslint-config']) {
|
|
@@ -63,10 +70,40 @@ export async function check() {
|
|
|
63
70
|
} else {
|
|
64
71
|
fail('lint-js.yml не містить eslint')
|
|
65
72
|
}
|
|
73
|
+
if (content.includes('jscpd')) {
|
|
74
|
+
pass('lint-js.yml містить jscpd')
|
|
75
|
+
} else {
|
|
76
|
+
fail('lint-js.yml не містить jscpd — додай крок bunx jscpd .')
|
|
77
|
+
}
|
|
66
78
|
} else {
|
|
67
79
|
fail('.github/workflows/lint-js.yml не існує — створи його')
|
|
68
80
|
}
|
|
69
81
|
|
|
82
|
+
if (existsSync('.jscpd.json')) {
|
|
83
|
+
let jscpdCfg
|
|
84
|
+
try {
|
|
85
|
+
jscpdCfg = JSON.parse(await readFile('.jscpd.json', 'utf8'))
|
|
86
|
+
} catch {
|
|
87
|
+
fail('.jscpd.json не є валідним JSON')
|
|
88
|
+
jscpdCfg = null
|
|
89
|
+
}
|
|
90
|
+
if (jscpdCfg) {
|
|
91
|
+
pass('.jscpd.json існує')
|
|
92
|
+
if (jscpdCfg.gitignore === true) {
|
|
93
|
+
pass('.jscpd.json: gitignore увімкнено')
|
|
94
|
+
} else {
|
|
95
|
+
fail('.jscpd.json має містити "gitignore": true')
|
|
96
|
+
}
|
|
97
|
+
if (jscpdCfg.exitCode === 1) {
|
|
98
|
+
pass('.jscpd.json: exitCode 1 при дублікатах')
|
|
99
|
+
} else {
|
|
100
|
+
fail('.jscpd.json має містити "exitCode": 1 (інакше CI не впаде на клонах)')
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
fail('.jscpd.json не існує — створи з gitignore, exitCode та reporters згідно js-lint.mdc')
|
|
105
|
+
}
|
|
106
|
+
|
|
70
107
|
for (const dup of ['.eslintrc', '.eslintrc.js', '.eslintrc.json', '.eslintrc.yml']) {
|
|
71
108
|
if (existsSync(dup)) fail(`Знайдено застарілий конфіг ESLint: ${dup} — видали, використовуй eslint.config.js`)
|
|
72
109
|
}
|