@nitra/cursor 5.3.4 → 5.4.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/.claude-template/settings.template.json +2 -2
- package/.pi-template/extensions/n-cursor-adr/docs/index.md +13 -24
- package/CHANGELOG.md +11 -0
- package/bin/n-cursor.js +43 -22
- package/lib/docs/models.md +29 -18
- package/lib/docs/omlx-trace.md +51 -0
- package/lib/docs/omlx.md +31 -15
- package/lib/omlx.mjs +2 -5
- package/package.json +1 -1
- package/rules/abie/docs/fix.md +17 -11
- package/rules/adr/docs/fix.md +25 -140
- package/rules/bun/docs/fix.md +18 -151
- package/rules/capacitor/docs/fix.md +16 -13
- package/rules/capacitor/js/docs/platforms.md +31 -43
- package/rules/changelog/docs/fix.md +25 -169
- package/rules/ci4/docs/fix.md +11 -14
- package/rules/doc-files/doc-files.mdc +60 -0
- package/rules/doc-files/docs/fix.md +31 -0
- package/rules/doc-files/fix.mjs +19 -0
- package/{skills → rules}/doc-files/js/docgen-extract.mjs +42 -19
- package/{skills → rules}/doc-files/js/docgen-ignore.mjs +2 -1
- package/{skills → rules}/doc-files/js/docgen-scan.mjs +9 -1
- package/{skills → rules}/doc-files/js/docs/docgen-crc.md +1 -1
- package/{skills → rules}/doc-files/js/docs/docgen-extract-anchors.md +1 -1
- package/{skills → rules}/doc-files/js/docs/docgen-extract.md +2 -2
- package/{skills → rules}/doc-files/js/docs/docgen-files-batch.md +1 -1
- package/{skills → rules}/doc-files/js/docs/docgen-gen.md +1 -1
- package/{skills → rules}/doc-files/js/docs/docgen-ignore.md +4 -4
- package/rules/doc-files/js/docs/docgen-prompts.md +39 -0
- package/rules/doc-files/js/docs/docgen-scan.md +54 -0
- package/rules/doc-files/js/docs/lint.md +36 -0
- package/rules/doc-files/js/docs/units-js.md +31 -0
- package/rules/doc-files/js/docs/units-rs.md +35 -0
- package/rules/doc-files/js/docs/units.md +30 -0
- package/rules/doc-files/js/lint.mjs +96 -0
- package/{skills → rules}/doc-files/js/units-rs.mjs +37 -17
- package/rules/doc-files/lint/docs/lint.md +37 -0
- package/rules/doc-files/lint/lint.mjs +105 -0
- package/rules/doc-files/meta.json +1 -0
- package/rules/docker/docs/fix.md +21 -161
- package/rules/efes/docs/fix.md +23 -194
- package/rules/feedback/docs/fix.md +10 -8
- package/rules/ga/docs/fix.md +10 -5
- package/rules/graphql/docs/fix.md +23 -119
- package/rules/hasura/docs/fix.md +19 -5
- package/rules/hasura/js/docs/internal_urls.md +34 -307
- package/rules/image-avif/docs/fix.md +16 -127
- package/rules/image-compress/docs/fix.md +20 -141
- package/rules/image-compress/js/docs/package_setup.md +22 -182
- package/rules/js-bun-db/docs/fix.md +23 -139
- package/rules/js-bun-db/js/docs/safety.md +33 -221
- package/rules/js-bun-redis/docs/fix.md +25 -114
- package/rules/js-bun-redis/js/docs/imports.md +18 -166
- package/rules/js-lint/docs/fix.md +30 -108
- package/rules/js-lint/js/docs/lint-findings.md +37 -17
- package/rules/js-lint/js/docs/lint.md +22 -238
- package/rules/js-lint/js/docs/tooling.md +34 -331
- package/rules/js-lint-ci/docs/fix.md +16 -149
- package/rules/js-lint-ci/js/docs/lint.md +16 -136
- package/rules/js-mssql/docs/fix.md +18 -123
- package/rules/js-mssql/js/docs/deps.md +28 -251
- package/rules/js-run/docs/fix.md +23 -138
- package/rules/js-run/js/docs/runtime.md +24 -378
- package/rules/k8s/docs/fix.md +18 -123
- package/rules/nginx-default-tpl/docs/fix.md +22 -118
- package/rules/nginx-default-tpl/js/docs/template.md +38 -360
- package/rules/npm-module/docs/fix.md +27 -89
- package/rules/npm-module/js/docs/header_doc_pointer.md +15 -15
- package/rules/npm-module/js/docs/package_structure.md +36 -258
- package/rules/npm-module/js/docs/rule_meta.md +25 -127
- package/rules/npm-module/js/docs/skill_meta.md +18 -180
- package/rules/php/docs/fix.md +21 -98
- package/rules/php/js/docs/tooling.md +20 -143
- package/rules/python/docs/fix.md +25 -157
- package/rules/python/js/docs/applies.md +20 -98
- package/rules/python/js/docs/tooling.md +27 -144
- package/rules/rego/docs/fix.md +24 -112
- package/rules/rego/js/docs/applies.md +20 -164
- package/rules/rego/js/docs/lint.md +15 -110
- package/rules/release/docs/fix.md +16 -114
- package/rules/rust/docs/fix.md +24 -119
- package/rules/rust/js/docs/applies.md +20 -129
- package/rules/security/docs/fix.md +21 -78
- package/rules/security/js/docs/sample_secret.md +23 -182
- package/rules/security/js/docs/trufflehog.md +19 -128
- package/rules/style-lint/docs/fix.md +16 -150
- package/rules/style-lint/js/docs/lint.md +21 -172
- package/rules/style-lint/js/docs/tooling.md +19 -184
- package/rules/tauri/docs/fix.md +26 -152
- package/rules/tauri/js/docs/cargo_mutants_config.md +21 -159
- package/rules/tauri/js/docs/tooling.md +20 -217
- package/rules/test/docs/fix.md +19 -127
- package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +15 -127
- package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +17 -153
- package/rules/test/js/docs/cargo_mutants_config.md +24 -164
- package/rules/test/js/docs/location.md +24 -126
- package/rules/test/js/docs/no-process-chdir.md +20 -151
- package/rules/test/js/docs/no-relative-fs-path.md +24 -261
- package/rules/test/js/docs/stryker_config.md +48 -148
- package/rules/test/js/docs/vitest-config-pool-forks.md +21 -164
- package/rules/text/docs/fix.md +25 -113
- package/rules/text/js/docs/forbidden-prettier.md +21 -132
- package/rules/text/js/docs/formatting.md +60 -251
- package/rules/text/js/docs/lint.md +17 -114
- package/rules/vue/docs/fix.md +25 -118
- package/rules/vue/js/docs/packages.md +25 -323
- package/rules/worktree/docs/fix.md +31 -150
- package/scripts/coverage-classify/docs/index.md +23 -209
- package/scripts/coverage-classify/docs/verdict-schema.md +14 -159
- package/scripts/dispatcher/docs/trace.md +35 -0
- package/scripts/docs/auto-rules.md +37 -361
- package/scripts/docs/lint-cli.md +12 -13
- package/scripts/docs/post-tool-use-fix.md +16 -15
- package/scripts/docs/skills-cli.md +26 -23
- package/scripts/docs/sync-claude-config.md +94 -34
- package/scripts/docs/worktree-cli.md +11 -34
- package/scripts/lib/docs/assert-project-root.md +14 -16
- package/scripts/lib/docs/changed-files.md +24 -139
- package/scripts/lib/docs/discover-check-rules-from-cursor.md +14 -146
- package/scripts/lib/docs/rule-predicates.md +20 -17
- package/scripts/lib/docs/run-rule-cli.md +14 -18
- package/scripts/lib/docs/run-rule.md +13 -20
- package/scripts/lib/docs/run-standard-rule.md +12 -15
- package/scripts/lib/docs/sync-gitignore-worktree.md +15 -18
- package/scripts/lib/rule-predicates.mjs +1 -1
- package/scripts/sync-claude-config.mjs +4 -1
- package/scripts/utils/docs/with-lock.md +19 -12
- package/scripts/utils/with-lock.mjs +4 -2
- package/skills/doc-aggregate/SKILL.md +2 -2
- package/skills/doc-aggregate/js/docgen-ignore.mjs +6 -6
- package/skills/doc-aggregate/js/docs/docgen-ignore.md +1 -1
- package/skills/doc-aggregate/js/docs/docgen-scan.md +78 -0
- package/skills/doc-files/.changes/260612-0031.md +5 -0
- package/skills/doc-files/.changes/260612-0036.md +5 -0
- package/skills/doc-files/.changes/260612-0114.md +5 -0
- package/skills/doc-files/SKILL.md +6 -6
- package/skills/fix/js/docs/llm-worker.md +17 -15
- package/skills/fix/js/docs/orchestrator.md +30 -23
- package/skills/fix/js/docs/t0.md +26 -16
- package/skills/start-check/js/docs/check.md +26 -22
- package/skills/taze/js/docs/diff.md +44 -20
- package/skills/doc-files/js/docs/docgen-prompts.md +0 -32
- package/skills/doc-files/js/docs/docgen-scan.md +0 -25
- package/skills/doc-files/js/docs/units-rs.md +0 -35
- /package/{skills → rules}/doc-files/js/docgen-crc.mjs +0 -0
- /package/{skills → rules}/doc-files/js/docgen-extract-anchors.mjs +0 -0
- /package/{skills → rules}/doc-files/js/docgen-files-batch.mjs +0 -0
- /package/{skills → rules}/doc-files/js/docgen-gen.mjs +0 -0
- /package/{skills → rules}/doc-files/js/docgen-prompts.mjs +0 -0
- /package/{skills → rules}/doc-files/js/units-js.mjs +0 -0
- /package/{skills → rules}/doc-files/js/units.mjs +0 -0
|
@@ -1,250 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
docgen:
|
|
3
|
+
source: npm/rules/js-lint/js/lint.mjs
|
|
4
|
+
crc: c90c15eb
|
|
5
|
+
score: 100
|
|
6
|
+
---
|
|
7
|
+
|
|
1
8
|
# lint.mjs
|
|
2
9
|
|
|
3
10
|
## Огляд
|
|
4
11
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Поведінка має два режими, які перемикаються типом вхідного параметра `files`:
|
|
8
|
-
|
|
9
|
-
- **Quick-режим** (`files` — масив рядків): із переданого списку відбираються лише js-подібні файли за розширенням; якщо таких немає — крок завершується успішно без запуску інструментів; інакше `oxlint`/`eslint` отримують точковий перелік цих файлів.
|
|
10
|
-
- **CI-режим / повний прогін** (`files === undefined`): `oxlint` викликається без шляхів (бінар сам обходить корінь за своєю конфігурацією), `eslint` отримує явну ціль `.` (поточна директорія).
|
|
11
|
-
|
|
12
|
-
Крос-файлові перевірки (наприклад `jscpd`, `knip`) у цей модуль **не входять** — вони реалізовані в окремому правилі `js-lint-ci` і виконуються виключно у CI-фазі.
|
|
13
|
-
|
|
14
|
-
Запуск зовнішніх бінарів робиться через `bunx` (з тулчейну Bun) і успадковує stdio батьківського процесу, тому увесь stdout/stderr лінтерів видно у консолі викликача в реальному часі. Семантика виходу: при ненульовому коді `oxlint` модуль одразу повертає його — `eslint` у такому випадку **не** запускається (fail-fast). Якщо `oxlint` успішний — повертається код виходу `eslint`.
|
|
15
|
-
|
|
16
|
-
## Експорти / API
|
|
17
|
-
|
|
18
|
-
Модуль є ES-модулем (`.mjs`) із двома іменованими експортами:
|
|
19
|
-
|
|
20
|
-
| Експорт | Тип | Призначення |
|
|
21
|
-
| --------------- | ----------------------------------------------------------------- | ------------------------------------------------------------- |
|
|
22
|
-
| `filterJsFiles` | `(files: string[]) => string[]` | Фільтрує список шляхів, залишаючи лише js-подібні розширення. |
|
|
23
|
-
| `lint` | `(files: string[] \| undefined, cwd?: string) => Promise<number>` | Точка входу quick-кроку: запускає oxlint+eslint з автофіксом. |
|
|
24
|
-
|
|
25
|
-
Default-експорту немає. Внутрішня функція `run` приватна та не реекспортується.
|
|
26
|
-
|
|
27
|
-
## Функції
|
|
28
|
-
|
|
29
|
-
### `filterJsFiles(files)`
|
|
30
|
-
|
|
31
|
-
**Сигнатура:** `filterJsFiles(files: string[]): string[]`
|
|
32
|
-
|
|
33
|
-
**Параметри:**
|
|
34
|
-
|
|
35
|
-
- `files` — масив рядків зі шляхами файлів (відносними або абсолютними; модуль шляхи не нормалізує).
|
|
36
|
-
|
|
37
|
-
**Повертає:** новий масив, що містить лише ті елементи `files`, чий шлях завершується одним із розширень:
|
|
38
|
-
`.mjs`, `.cjs`, `.js`, `.jsx`, `.ts`, `.tsx`, `.vue`.
|
|
39
|
-
|
|
40
|
-
Перевірка виконується регулярним виразом `JS_EXT_RE = /\.(?:mjs|cjs|js|jsx|ts|tsx|vue)$/u` — match за кінцем рядка, регістрозалежний, з прапорцем `u` (Unicode). Порядок та дублікати оригінального масиву зберігаються; вхідний масив не мутується (використовується `Array.prototype.filter`).
|
|
41
|
-
|
|
42
|
-
**Side effects:** немає (pure-функція).
|
|
43
|
-
|
|
44
|
-
**Граничні випадки:**
|
|
45
|
-
|
|
46
|
-
- Порожній масив → порожній масив.
|
|
47
|
-
- Файл без розширення або з не-js розширенням → відкидається.
|
|
48
|
-
- `.d.ts` — формально матчиться (хвіст `.ts`), тож потрапить у вихід; модуль не виключає декларацій типів спеціально.
|
|
49
|
-
- Шлях із крапкою у директорії, але без js-розширення наприкінці (наприклад `a.b/c.txt`) → не матчиться (через якір `$`).
|
|
50
|
-
|
|
51
|
-
### `run(args, cwd)` _(приватна)_
|
|
52
|
-
|
|
53
|
-
**Сигнатура:** `run(args: string[], cwd: string): number`
|
|
54
|
-
|
|
55
|
-
**Параметри:**
|
|
56
|
-
|
|
57
|
-
- `args` — масив аргументів, що передаються `bunx` (перший елемент — назва бінаря лінтера, далі його аргументи/таргети).
|
|
58
|
-
- `cwd` — робоча директорія для дочірнього процесу.
|
|
59
|
-
|
|
60
|
-
**Повертає:** числовий exit code. Якщо `spawnSync` повернув `r.status` числом — повертається саме він; інакше (наприклад процес завершився сигналом і `status === null`) повертається `1`.
|
|
61
|
-
|
|
62
|
-
**Side effects:**
|
|
63
|
-
|
|
64
|
-
- Синхронно (блокуюче) запускає дочірній процес `bunx <args>` через `node:child_process.spawnSync`.
|
|
65
|
-
- Успадковує stdio батьківського процесу (`stdio: 'inherit'`) — тобто весь вивід лінтера йде напряму в термінал/лог поточного процесу.
|
|
66
|
-
- Може записувати файли на диск опосередковано: лінтери викликаються з `--fix` і модифікують вихідний код.
|
|
67
|
-
|
|
68
|
-
**Помилки запуску:** `spawnSync` не кидає виняток за нульового статусу запуску, але у разі помилки спавна повертає об’єкт із `error` та `status === null` — у цьому випадку функція повертає `1` (м’яка інтерпретація як «не OK»).
|
|
69
|
-
|
|
70
|
-
### `lint(files, cwd?)`
|
|
71
|
-
|
|
72
|
-
**Сигнатура:** `lint(files: string[] | undefined, cwd: string = process.cwd()): Promise<number>`
|
|
73
|
-
|
|
74
|
-
**Параметри:**
|
|
75
|
-
|
|
76
|
-
- `files`:
|
|
77
|
-
- `string[]` — quick-режим: лінтити **лише** ці файли (після фільтрації js-розширень).
|
|
78
|
-
- `undefined` — режим повного прогону: лінтити **весь** проєкт.
|
|
79
|
-
- `cwd` — корінь, у якому виконуються `bunx oxlint` та `bunx eslint`. За замовчуванням — `process.cwd()`.
|
|
80
|
-
|
|
81
|
-
**Повертає:** `Promise<number>`. Резолвиться зі значенням exit code:
|
|
82
|
-
|
|
83
|
-
- `0` — обидва лінтери (або один із них у спеціальному випадку) завершилися успішно.
|
|
84
|
-
- `≠0` — є порушення або помилка запуску; повертається код того лінтера, що першим завершився ненульовим (oxlint має пріоритет).
|
|
85
|
-
|
|
86
|
-
**Логіка побудови аргументів:**
|
|
87
|
-
|
|
88
|
-
1. Стартові значення: `oxArgs = ['oxlint', '--fix']`, `esArgs = ['eslint', '--fix']`.
|
|
89
|
-
2. Якщо `files === undefined`:
|
|
90
|
-
- `oxArgs` лишаються без явних таргетів (oxlint обходить проєкт сам).
|
|
91
|
-
- До `esArgs` додається `.` → стає `['eslint', '--fix', '.']`.
|
|
92
|
-
3. Інакше (масив):
|
|
93
|
-
- Фільтрація через `filterJsFiles(files)`.
|
|
94
|
-
- Якщо фільтрований список порожній — функція **одразу** повертає `Promise.resolve(0)` (немає чого лінтити; oxlint/eslint **не** запускаються).
|
|
95
|
-
- Інакше: `oxArgs = ['oxlint', '--fix', ...js]`, `esArgs = ['eslint', '--fix', ...js]`.
|
|
96
|
-
|
|
97
|
-
**Послідовність виконання:**
|
|
98
|
-
|
|
99
|
-
1. Синхронно запускається `oxlint` через `run(oxArgs, cwd)` → отримуємо `ox`.
|
|
100
|
-
2. Якщо `ox !== 0` → негайно повертається `Promise.resolve(ox)` (eslint **не** запускається — fail-fast).
|
|
101
|
-
3. Якщо `ox === 0` → синхронно запускається `eslint` через `run(esArgs, cwd)`; результат загорнуто у `Promise.resolve(...)` і повернуто.
|
|
102
|
-
|
|
103
|
-
**Тип повертаного значення:** функція синхронна по суті (внутрішні `spawnSync` блокують event-loop), але інтерфейс — `Promise<number>`, що дозволяє оркестратору однаково обробляти async- та sync-кроки.
|
|
104
|
-
|
|
105
|
-
**Side effects:**
|
|
106
|
-
|
|
107
|
-
- Спавнить до двох дочірніх процесів (`bunx oxlint`, `bunx eslint`).
|
|
108
|
-
- Через прапорець `--fix` лінтери модифікують вихідні файли на диску (автофікс).
|
|
109
|
-
- Виводить stdout/stderr лінтерів напряму в консоль батьківського процесу.
|
|
110
|
-
|
|
111
|
-
**Граничні випадки:**
|
|
112
|
-
|
|
113
|
-
- `files = []` → після фільтрації порожній список → resolve(0), запусків немає.
|
|
114
|
-
- `files = ['README.md']` → після фільтрації порожній список → resolve(0), запусків немає.
|
|
115
|
-
- `files = undefined` + порожній проєкт → oxlint/eslint самі обходять корінь і повертають свій код (часто 0).
|
|
116
|
-
- Невказаний `cwd` → `process.cwd()` на момент виклику (а не на момент імпорту).
|
|
117
|
-
|
|
118
|
-
## Залежності
|
|
119
|
-
|
|
120
|
-
### Зовнішні (рантайм)
|
|
121
|
-
|
|
122
|
-
| Залежність | Звідки | Призначення |
|
|
123
|
-
| ------------------------------ | ----------------------------- | ------------------------------------------------------------------------------------------- |
|
|
124
|
-
| `node:child_process.spawnSync` | Стандартна бібліотека Node.js | Синхронний запуск дочірніх процесів `bunx oxlint` / `bunx eslint` зі спадкуванням stdio. |
|
|
125
|
-
| `bunx` | Тулчейн Bun (PATH) | Резолвер/раннер бінарів пакетів — використовується для виклику `oxlint` та `eslint`. |
|
|
126
|
-
| `oxlint` | Доступний через `bunx` | Швидкий лінтер на Rust; перший етап quick-кроку, виконується з `--fix`. |
|
|
127
|
-
| `eslint` | Доступний через `bunx` | Основний лінтер на JavaScript; другий етап, виконується з `--fix` після успішного `oxlint`. |
|
|
128
|
-
|
|
129
|
-
### Внутрішні
|
|
130
|
-
|
|
131
|
-
Модуль **не** імпортує локальних модулів проєкту — повністю автономний у межах файлу. Контекст використання задає зовнішній lint-оркестратор (правило `js-lint`), який передає аргументи `files`/`cwd`.
|
|
132
|
-
|
|
133
|
-
### Споживачі
|
|
134
|
-
|
|
135
|
-
Викликається lint-оркестратором правил `js-lint` (quick-фаза). Модуль `lint-ci` (повний CI) реалізований окремо і додає крос-файлові інструменти (`jscpd`, `knip`) — у поточному файлі їх немає.
|
|
136
|
-
|
|
137
|
-
## Потік виконання / Використання
|
|
138
|
-
|
|
139
|
-
### Загальний потік (псевдо-діаграма)
|
|
140
|
-
|
|
141
|
-
```
|
|
142
|
-
викликач (n-cursor lint / lint-ci)
|
|
143
|
-
|
|
|
144
|
-
v
|
|
145
|
-
lint(files, cwd)
|
|
146
|
-
|
|
|
147
|
-
files === undefined ? --- так ---> oxArgs=['oxlint','--fix']
|
|
148
|
-
| esArgs=['eslint','--fix','.']
|
|
149
|
-
| ні
|
|
150
|
-
v
|
|
151
|
-
js = filterJsFiles(files)
|
|
152
|
-
|
|
|
153
|
-
js.length === 0 ? --- так ---> Promise.resolve(0) (вихід)
|
|
154
|
-
| ні
|
|
155
|
-
v
|
|
156
|
-
oxArgs=['oxlint','--fix',...js]
|
|
157
|
-
esArgs=['eslint','--fix',...js]
|
|
158
|
-
|
|
|
159
|
-
v
|
|
160
|
-
ox = run(oxArgs, cwd) // bunx oxlint ...
|
|
161
|
-
|
|
|
162
|
-
ox !== 0 ? --- так ---> Promise.resolve(ox) (eslint не запускається)
|
|
163
|
-
| ні
|
|
164
|
-
v
|
|
165
|
-
es = run(esArgs, cwd) // bunx eslint ...
|
|
166
|
-
|
|
|
167
|
-
v
|
|
168
|
-
Promise.resolve(es)
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
### Приклад: quick-режим (масив файлів)
|
|
172
|
-
|
|
173
|
-
```js
|
|
174
|
-
import { lint } from './lint.mjs'
|
|
175
|
-
|
|
176
|
-
const changed = [
|
|
177
|
-
'src/foo.ts',
|
|
178
|
-
'src/bar.vue',
|
|
179
|
-
'README.md', // буде відфільтровано
|
|
180
|
-
'scripts/baz.mjs'
|
|
181
|
-
]
|
|
182
|
-
|
|
183
|
-
const code = await lint(changed)
|
|
184
|
-
// 1) filterJsFiles → ['src/foo.ts','src/bar.vue','scripts/baz.mjs']
|
|
185
|
-
// 2) bunx oxlint --fix src/foo.ts src/bar.vue scripts/baz.mjs
|
|
186
|
-
// 3) якщо ox === 0 → bunx eslint --fix src/foo.ts src/bar.vue scripts/baz.mjs
|
|
187
|
-
process.exit(code)
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
### Приклад: CI-режим (повний прогін)
|
|
191
|
-
|
|
192
|
-
```js
|
|
193
|
-
import { lint } from './lint.mjs'
|
|
194
|
-
|
|
195
|
-
const code = await lint(undefined, '/path/to/repo')
|
|
196
|
-
// 1) bunx oxlint --fix (oxlint сам обходить проєкт)
|
|
197
|
-
// 2) якщо ox === 0 → bunx eslint --fix .
|
|
198
|
-
process.exit(code)
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
### Приклад: масив без js-файлів
|
|
202
|
-
|
|
203
|
-
```js
|
|
204
|
-
import { lint } from './lint.mjs'
|
|
205
|
-
|
|
206
|
-
const code = await lint(['CHANGELOG.md', 'docs/spec.md'])
|
|
207
|
-
// filterJsFiles → [] → Promise.resolve(0)
|
|
208
|
-
// жодного процесу не спавниться
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
### Семантика кодів виходу
|
|
12
|
+
filterJsFiles
|
|
13
|
+
Перевіряє шляхи та повертає лише ті, що відповідають розширенням js-подібних файлів.
|
|
212
14
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
- exit code `eslint` — повертається, якщо `oxlint` був успішний, а `eslint` — ні.
|
|
216
|
-
- `1` (з `run`) — фолбек, коли `spawnSync` не повернув числового `status` (наприклад, процес убитий сигналом).
|
|
15
|
+
lint
|
|
16
|
+
Запускає інструмент для перевірки лінтування, працюючи з вибраними файлами або з усім проєктом.
|
|
217
17
|
|
|
218
|
-
|
|
18
|
+
## Поведінка
|
|
219
19
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
- `--fix` модифікує файли на диску; якщо потрібно «чисто перевірити без правок» — цей модуль такого режиму не пропонує, доведеться обійти його або змінити аргументи.
|
|
223
|
-
- За правилами проєкту (див. `n-js-lint` / `n-lint`) **заборонені** паралельні запуски `eslint` — оркестратор має викликати `lint` **послідовно**, без фонових/підзадачних дублів.
|
|
224
|
-
- `oxlint` має пріоритет (fail-fast): якщо він валиться — `eslint` не запускається, тож звіт про помилки у тій самій сесії покаже лише результати oxlint.
|
|
20
|
+
filterJsFiles
|
|
21
|
+
Фільтрує список шляхів, повертаючи лише ті, що відповідають розширенням js-подібних файлів.
|
|
225
22
|
|
|
226
|
-
|
|
23
|
+
lint
|
|
24
|
+
Запускає інструмент для перевірки лінтування. Може працювати з вибраними файлами або з усім проєктом.
|
|
227
25
|
|
|
228
|
-
|
|
26
|
+
## Публічний API
|
|
229
27
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
3. Константа `JS_EXT_RE` — регекс `^.*\.(mjs|cjs|js|jsx|ts|tsx|vue)$` (формально: `/\.(?:mjs|cjs|js|jsx|ts|tsx|vue)$/u`).
|
|
233
|
-
4. Експорт `filterJsFiles(files)`: `return files.filter(f => JS_EXT_RE.test(f))`.
|
|
234
|
-
5. Приватна `run(args, cwd)`: `spawnSync('bunx', args, { cwd, stdio: 'inherit' })`; повертає `r.status` якщо це `number`, інакше `1`.
|
|
235
|
-
6. Експорт `lint(files, cwd = process.cwd())`:
|
|
236
|
-
- стартові аргументи: `oxArgs=['oxlint','--fix']`, `esArgs=['eslint','--fix']`;
|
|
237
|
-
- якщо `files === undefined` → `esArgs.push('.')`;
|
|
238
|
-
- інакше: `js = filterJsFiles(files)`; якщо `js.length === 0` → `Promise.resolve(0)`;
|
|
239
|
-
інакше переписати: `oxArgs=['oxlint','--fix',...js]`, `esArgs=['eslint','--fix',...js]`;
|
|
240
|
-
- `ox = run(oxArgs, cwd)`; якщо `ox !== 0` → `Promise.resolve(ox)`;
|
|
241
|
-
- інакше → `Promise.resolve(run(esArgs, cwd))`.
|
|
28
|
+
filterJsFiles — відбирає лише файли з розширенням .js.
|
|
29
|
+
lint — запускає oxlint та eslint з можливістю автоматичного виправлення помилок.
|
|
242
30
|
|
|
243
|
-
|
|
31
|
+
## Гарантії поведінки
|
|
244
32
|
|
|
245
|
-
-
|
|
246
|
-
-
|
|
247
|
-
- `await lint([])` ⇒ `0`, без побічних спавнів.
|
|
248
|
-
- `await lint(['x.md'])` ⇒ `0`, без побічних спавнів.
|
|
249
|
-
- `await lint(undefined)` ⇒ запускає `bunx oxlint --fix`, далі (якщо OK) `bunx eslint --fix .`.
|
|
250
|
-
- При ненульовому коді `oxlint` `eslint` не запускається.
|
|
33
|
+
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
34
|
+
- Не звертається до мережі.
|