@nitra/cursor 3.22.0 → 3.23.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/.pi-template/extensions/n-cursor-adr/docs/index.md +181 -0
- package/CHANGELOG.md +31 -3
- package/bin/docs/n-cursor.md +636 -0
- package/bin/docs/rename-yaml-extensions.md +207 -0
- package/bin/n-cursor.js +30 -3
- package/package.json +1 -1
- package/rules/abie/docs/fix.md +18 -0
- package/rules/abie/js/docs/applies.md +26 -0
- package/rules/abie/js/docs/env_dns.md +32 -0
- package/rules/abie/js/docs/firebase_hosting.md +23 -0
- package/rules/abie/js/docs/hc_pairing.md +35 -0
- package/rules/abie/js/docs/ua_http_route.md +28 -0
- package/rules/abie/js/docs/ua_node_selector.md +28 -0
- package/rules/abie/lib/docs/enabled.md +29 -0
- package/rules/abie/lib/docs/env-dns.md +35 -0
- package/rules/abie/lib/docs/hc-yaml.md +33 -0
- package/rules/abie/lib/docs/http-route.md +44 -0
- package/rules/abie/lib/docs/k8s-tree.md +40 -0
- package/rules/abie/lib/docs/kustomization-patches.md +47 -0
- package/rules/abie/lib/docs/overlay-paths.md +38 -0
- package/rules/abie/lib/docs/yaml.md +29 -0
- package/rules/adr/docs/fix.md +148 -0
- package/rules/adr/js/docs/hooks.md +259 -0
- package/rules/bun/docs/fix.md +156 -0
- package/rules/bun/js/docs/layout.md +393 -0
- package/rules/capacitor/docs/fix.md +121 -0
- package/rules/capacitor/js/docs/platforms.md +295 -0
- package/rules/changelog/changelog.mdc +2 -2
- package/rules/changelog/docs/fix.md +174 -0
- package/rules/changelog/js/consistency.mjs +114 -13
- package/rules/changelog/js/docs/consistency.md +387 -0
- package/rules/changelog/lib/docs/package-manifest.md +210 -0
- package/rules/ci4/docs/fix.md +179 -0
- package/rules/ci4/js/docs/marksman_config.md +128 -0
- package/rules/docker/docker.mdc +8 -3
- package/rules/docker/docs/fix.md +171 -0
- package/rules/docker/js/docs/lint.md +258 -0
- package/rules/docker/lib/docs/docker-hadolint.md +184 -0
- package/rules/docker/lib/docs/docker-mirror.md +247 -0
- package/rules/docker/lib/docs/docker-native-addon.md +170 -0
- package/rules/docker/lib/docs/docker-nginx-user.md +219 -0
- package/rules/docker/lint/docs/lint.md +193 -0
- package/rules/efes/docs/fix.md +203 -0
- package/rules/feedback/docs/fix.md +140 -0
- package/rules/flow/docs/fix.md +152 -0
- package/rules/ga/docs/fix.md +158 -0
- package/rules/ga/js/docs/lint.md +100 -0
- package/rules/ga/js/docs/workflows.md +217 -0
- package/rules/ga/lint/docs/lint.md +209 -0
- package/rules/ga/policy/clean_merged_branch/clean_merged_branch.rego +11 -2
- package/rules/ga/policy/clean_merged_branch/template/clean-merged-branch.yml.snippet.yml +3 -4
- package/rules/graphql/docs/fix.md +126 -0
- package/rules/graphql/js/docs/tooling.md +264 -0
- package/rules/graphql/lib/docs/graphql-gql-scan.md +219 -0
- package/rules/hasura/docs/fix.md +120 -0
- package/rules/hasura/hasura.mdc +14 -0
- package/rules/hasura/js/docs/internal_urls.md +326 -0
- package/rules/image-avif/docs/fix.md +132 -0
- package/rules/image-avif/js/docs/avif_generation.md +241 -0
- package/rules/image-compress/docs/fix.md +150 -0
- package/rules/image-compress/js/docs/package_setup.md +191 -0
- package/rules/js-bun-db/docs/fix.md +148 -0
- package/rules/js-bun-db/js/docs/safety.md +231 -0
- package/rules/js-bun-db/js-bun-db.mdc +42 -13
- package/rules/js-bun-db/lib/docs/bun-sql-scan.md +347 -0
- package/rules/js-bun-redis/docs/fix.md +123 -0
- package/rules/js-bun-redis/js/docs/imports.md +176 -0
- package/rules/js-bun-redis/lib/docs/redis-imports.md +223 -0
- package/rules/js-lint/docs/fix.md +117 -0
- package/rules/js-lint/js/docs/lint.md +250 -0
- package/rules/js-lint/js/docs/tooling.md +348 -0
- package/rules/js-lint/js/docs/utils_imports.md +207 -0
- package/rules/js-lint-ci/docs/fix.md +154 -0
- package/rules/js-lint-ci/js/docs/lint.md +144 -0
- package/rules/js-mssql/docs/fix.md +128 -0
- package/rules/js-mssql/js/docs/deps.md +263 -0
- package/rules/js-mssql/lib/docs/mssql-pool-scan.md +367 -0
- package/rules/js-run/docs/fix.md +144 -0
- package/rules/js-run/js/docs/runtime.md +388 -0
- package/rules/js-run/lib/docs/bunyan-imports.md +117 -0
- package/rules/js-run/lib/docs/check-env-scan.md +433 -0
- package/rules/js-run/lib/docs/conn-file-rules.md +300 -0
- package/rules/js-run/lib/docs/conn-imports-scan.md +204 -0
- package/rules/js-run/lib/docs/promise-settimeout-scan.md +326 -0
- package/rules/k8s/docs/fix.md +129 -0
- package/rules/k8s/js/docs/manifests.md +344 -0
- package/rules/k8s/js/manifests.mjs +6 -2
- package/rules/k8s/k8s.mdc +4 -2
- package/rules/k8s/lint/docs/lint.md +411 -0
- package/rules/k8s/policy/network_policy/template/deployment.snippet.yaml +2 -0
- package/rules/k8s/policy/network_policy/template/stateful-set.snippet.yaml +2 -0
- package/rules/nginx-default-tpl/docs/fix.md +124 -0
- package/rules/nginx-default-tpl/js/docs/template.md +378 -0
- package/rules/npm-module/docs/fix.md +98 -0
- package/rules/npm-module/js/docs/package_structure.md +274 -0
- package/rules/npm-module/js/docs/rule_meta.md +137 -0
- package/rules/npm-module/js/docs/skill_meta.md +190 -0
- package/rules/php/docs/fix.md +107 -0
- package/rules/php/js/docs/tooling.md +152 -0
- package/rules/php/lint/docs/lint.md +215 -0
- package/rules/python/docs/fix.md +163 -0
- package/rules/python/js/docs/applies.md +108 -0
- package/rules/python/js/docs/tooling.md +153 -0
- package/rules/python/lint/docs/lint.md +322 -0
- package/rules/rego/docs/fix.md +121 -0
- package/rules/rego/js/docs/applies.md +174 -0
- package/rules/rego/js/docs/lint.md +118 -0
- package/rules/rego/lint/docs/lint.md +204 -0
- package/rules/release/docs/change.md +185 -0
- package/rules/release/docs/fix.md +119 -0
- package/rules/release/docs/release.md +222 -0
- package/rules/release/lib/docs/aggregate.md +246 -0
- package/rules/release/lib/docs/change-file.md +200 -0
- package/rules/release/lib/docs/fallback.md +203 -0
- package/rules/rust/docs/fix.md +129 -0
- package/rules/rust/js/docs/applies.md +140 -0
- package/rules/rust/lib/docs/has-cargo-toml.md +130 -0
- package/rules/security/docs/fix.md +86 -0
- package/rules/security/js/docs/lint.md +171 -0
- package/rules/security/js/docs/sample_secret.md +190 -0
- package/rules/security/js/docs/trufflehog.md +137 -0
- package/rules/security/js/lint.mjs +9 -1
- package/rules/style-lint/docs/fix.md +155 -0
- package/rules/style-lint/js/docs/lint.md +184 -0
- package/rules/style-lint/js/docs/tooling.md +194 -0
- package/rules/tauri/docs/fix.md +158 -0
- package/rules/tauri/js/docs/cargo_mutants_config.md +168 -0
- package/rules/tauri/js/docs/tooling.md +228 -0
- package/rules/test/coverage/coverage.mjs +15 -3
- package/rules/test/docs/fix.md +132 -0
- package/rules/test/js/data/stryker_config/docs/stryker-vue-macros-ignorer.md +138 -0
- package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +134 -0
- package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +160 -0
- package/rules/test/js/data/vitest_config/docs/vitest.config.baseline.md +195 -0
- package/rules/test/js/docs/cargo_mutants_config.md +173 -0
- package/rules/test/js/docs/location.md +136 -0
- package/rules/test/js/docs/no-process-chdir.md +160 -0
- package/rules/test/js/docs/no-relative-fs-path.md +271 -0
- package/rules/test/js/docs/stryker_config.md +152 -0
- package/rules/test/js/docs/vitest-config-pool-forks.md +174 -0
- package/rules/text/docs/fix.md +118 -0
- package/rules/text/js/docs/forbidden-prettier.md +143 -0
- package/rules/text/js/docs/formatting.md +256 -0
- package/rules/text/js/docs/lint.md +122 -0
- package/rules/text/lint/docs/lint.md +220 -0
- package/rules/text/lint/docs/run-dotenv-linter.md +157 -0
- package/rules/text/lint/docs/run-shellcheck.md +212 -0
- package/rules/text/lint/docs/run-v8r.md +197 -0
- package/rules/vue/docs/fix.md +127 -0
- package/rules/vue/js/docs/packages.md +335 -0
- package/rules/vue/lib/docs/vue-forbidden-imports.md +261 -0
- package/rules/worktree/docs/fix.md +161 -0
- package/schemas/rule-meta.json +5 -1
- package/scripts/auto-rules.mjs +7 -4
- package/scripts/coverage-classify/docs/apply.md +202 -0
- package/scripts/coverage-classify/docs/cache.md +203 -0
- package/scripts/coverage-classify/docs/index.md +218 -0
- package/scripts/coverage-classify/docs/prompt.md +132 -0
- package/scripts/coverage-classify/docs/verdict-schema.md +169 -0
- package/scripts/coverage-fix-extract.mjs +122 -0
- package/scripts/coverage-fix.mjs +1 -1
- package/scripts/dispatcher/docs/graph.md +346 -0
- package/scripts/dispatcher/docs/index.md +236 -0
- package/scripts/dispatcher/docs/trace.md +296 -0
- package/scripts/dispatcher/index.mjs +1 -1
- package/scripts/dispatcher/lib/active.mjs +4 -8
- package/scripts/dispatcher/lib/commands.mjs +7 -11
- package/scripts/dispatcher/lib/docs/active.md +348 -0
- package/scripts/dispatcher/lib/docs/artifact.md +232 -0
- package/scripts/dispatcher/lib/docs/budget.md +167 -0
- package/scripts/dispatcher/lib/docs/capability.md +196 -0
- package/scripts/dispatcher/lib/docs/commands.md +210 -0
- package/scripts/dispatcher/lib/docs/events.md +182 -0
- package/scripts/dispatcher/lib/docs/executor.md +190 -0
- package/scripts/dispatcher/lib/docs/flow-lock.md +161 -0
- package/scripts/dispatcher/lib/docs/flow-resolve.md +267 -0
- package/scripts/dispatcher/lib/docs/gate.md +231 -0
- package/scripts/dispatcher/lib/docs/level.md +335 -0
- package/scripts/dispatcher/lib/docs/plan-panel.md +181 -0
- package/scripts/dispatcher/lib/docs/plan.md +200 -0
- package/scripts/dispatcher/lib/docs/planner.md +269 -0
- package/scripts/dispatcher/lib/docs/review.md +255 -0
- package/scripts/dispatcher/lib/docs/reviewer.md +240 -0
- package/scripts/dispatcher/lib/docs/snapshot.md +247 -0
- package/scripts/dispatcher/lib/docs/spec.md +203 -0
- package/scripts/dispatcher/lib/docs/state-store.md +303 -0
- package/scripts/dispatcher/lib/docs/subagent-runner.md +173 -0
- package/scripts/dispatcher/lib/executor.mjs +6 -1
- package/scripts/dispatcher/lib/flow-resolve.mjs +3 -1
- package/scripts/dispatcher/lib/level.mjs +29 -3
- package/scripts/dispatcher/lib/review.mjs +1 -1
- package/scripts/dispatcher/lib/subagent-runner.mjs +5 -3
- package/scripts/docs/auto-rules.md +376 -0
- package/scripts/docs/auto-skills.md +173 -0
- package/scripts/docs/build-agents-commands.md +183 -0
- package/scripts/docs/cli-entry.md +153 -0
- package/scripts/docs/coverage-fix.md +177 -0
- package/scripts/docs/ensure-nitra-cursor-dev-dependencies.md +189 -0
- package/scripts/lib/changed-files.mjs +4 -1
- package/scripts/lib/docs/changed-files.md +149 -0
- package/scripts/lib/docs/check-mdc-template-refs.md +222 -0
- package/scripts/lib/docs/check-reporter.md +175 -0
- package/scripts/lib/docs/discover-check-rules-from-cursor.md +157 -0
- package/scripts/lib/docs/discover-checkable-rules.md +165 -0
- package/scripts/lib/docs/ensure-tool.md +254 -0
- package/scripts/lib/docs/generated-markdown.md +275 -0
- package/scripts/lib/docs/gha-workflow.md +326 -0
- package/scripts/lib/docs/inline-template-links.md +303 -0
- package/scripts/lib/docs/list-rule-ids.md +156 -0
- package/scripts/lib/docs/load-cursor-config.md +147 -0
- package/scripts/lib/docs/mirror-parity.md +167 -0
- package/scripts/lib/worktree.mjs +26 -0
- package/scripts/worktree-cli.mjs +12 -2
- package/skills/coverage-fix/SKILL.md +34 -45
- package/skills/docgen/SKILL.md +44 -23
- package/skills/docgen/bench/etalon/firebase_hosting.md +19 -0
- package/skills/docgen/bench/etalon/k8s-tree.md +24 -0
- package/skills/docgen/bench/etalon/overlay-paths.md +24 -0
- package/skills/docgen/js/docgen-ignore.mjs +54 -0
- package/skills/docgen/js/docgen-scan.mjs +37 -21
- package/skills/llm-patch/SKILL.md +23 -2
- package/skills/start-check/SKILL.md +26 -53
- package/skills/start-check/js/check.mjs +211 -0
- package/skills/taze/SKILL.md +9 -3
- package/skills/taze/js/diff.mjs +154 -0
- package/types/bin/n-cursor.d.ts +1 -1
- package/skills/fix-tests/SKILL.md +0 -119
- package/skills/fix-tests/meta.json +0 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# vitest-config-pool-forks.mjs
|
|
2
|
+
|
|
3
|
+
## Огляд
|
|
4
|
+
|
|
5
|
+
Модуль реалізує статичну перевірку конфігураційного файлу `vitest.config.js` у корені репозиторію: цей файл, якщо він присутній, повинен містити налаштування `pool: 'forks'`. Перевірка є частиною групи правил `test` (див. `test.mdc`, секція «Заборона `process.chdir` у тестах») і виконує роль **defense-in-depth** проти race-conditions у `process.cwd()` між паралельними test-файлами.
|
|
6
|
+
|
|
7
|
+
Контекст і мотивація:
|
|
8
|
+
|
|
9
|
+
- У `vitest` за замовчуванням використовується `pool: 'threads'`, де всі workers ділять один процес (Node.js worker_threads). Усі такі workers мають **спільний** `process.cwd()`. Якщо хоч один тест (або стороння залежність всередині нього) викликає `process.chdir(...)`, це впливає на всі інші тести, що виконуються паралельно — типовий race-bug.
|
|
10
|
+
- Простої заборони `process.chdir(` у тестах недостатньо: third-party код у залежностях може робити `chdir` всередині vitest worker'а непомітно.
|
|
11
|
+
- `pool: 'forks'` ізолює кожен test-файл у власному child-процесі, тож `process.cwd()` стає локальним для тесту.
|
|
12
|
+
|
|
13
|
+
Алгоритм перевірки — навмисно простий: substring/regex-пошук у сирому тексті `vitest.config.js`. AST-парсинг свідомо не використовується, бо конфіг може бути в довільному форматі експорту (ESM default, named export, CommonJS, factory-функція тощо), а сам ключ `pool: 'forks'` достатньо унікальний, щоб ідентифікувати його без парсера.
|
|
14
|
+
|
|
15
|
+
Скіп-семантика: якщо `vitest.config.js` відсутній — це означає, що в репозиторії немає налаштованого vitest, і правило **пропускається** (pass, не fail). Якщо файл є — `pool: 'forks'` обов'язковий.
|
|
16
|
+
|
|
17
|
+
## Експорти / API
|
|
18
|
+
|
|
19
|
+
| Експорт | Тип | Призначення |
|
|
20
|
+
| ------- | ------------------------------- | ---------------------------------------------------------------------------------------- |
|
|
21
|
+
| `check` | `async function` (named export) | Точка входу для виконання перевірки конфігу. Повертає exit-code сумісний з CI-runner'ом. |
|
|
22
|
+
|
|
23
|
+
Модуль не має default export. Регулярний вираз `POOL_FORKS_RE` оголошений на рівні модуля, але **не** експортується — це внутрішня деталь реалізації.
|
|
24
|
+
|
|
25
|
+
## Функції
|
|
26
|
+
|
|
27
|
+
### `check(cwdParam?)`
|
|
28
|
+
|
|
29
|
+
Асинхронна перевірка наявності `pool: 'forks'` у `vitest.config.js`.
|
|
30
|
+
|
|
31
|
+
**Сигнатура:**
|
|
32
|
+
|
|
33
|
+
```js
|
|
34
|
+
export async function check(cwdParam = process.cwd()): Promise<number>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Параметри:**
|
|
38
|
+
|
|
39
|
+
| Ім'я | Тип | За замовчуванням | Опис |
|
|
40
|
+
| ---------- | -------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
41
|
+
| `cwdParam` | `string` | `process.cwd()` | Абсолютний шлях до кореня репозиторію, в якому шукається `vitest.config.js`. Призначений насамперед для тестів (можна підставити фікстурну директорію). |
|
|
42
|
+
|
|
43
|
+
**Повертає:** `Promise<number>` — exit-code з `reporter.getExitCode()`:
|
|
44
|
+
|
|
45
|
+
- `0` — успіх (`pool: 'forks'` знайдено) **або** skip (`vitest.config.js` відсутній);
|
|
46
|
+
- `1` — помилка (файл є, але не містить `pool: 'forks'`).
|
|
47
|
+
|
|
48
|
+
**Side effects:**
|
|
49
|
+
|
|
50
|
+
- Створює локальний reporter через `createCheckReporter()`. Reporter виводить повідомлення `pass(...)` / `fail(...)` у консоль (формат залежить від реалізації reporter'а).
|
|
51
|
+
- Синхронно перевіряє існування файлу через `existsSync` (звернення до файлової системи).
|
|
52
|
+
- Якщо файл існує — асинхронно читає його повністю в пам'ять через `readFile(..., 'utf8')`.
|
|
53
|
+
- **Не** модифікує файлову систему та **не** мутує глобальний стан.
|
|
54
|
+
|
|
55
|
+
**Сценарії виконання:**
|
|
56
|
+
|
|
57
|
+
1. **`vitest.config.js` не існує** → `pass('vitest.config.js відсутній — pool-перевірку пропущено')` → повертає `0`.
|
|
58
|
+
2. **Файл існує, regex `/pool\s*:\s*['"]forks['"]/u` матчить** → `pass("vitest.config.js містить pool: 'forks' (test.mdc)")` → повертає `0`.
|
|
59
|
+
3. **Файл існує, але regex не матчить** → `fail("vitest.config.js має містити pool: 'forks' — defense-in-depth для race у process.cwd() між паралельними test files (test.mdc)")` → повертає `1`.
|
|
60
|
+
|
|
61
|
+
**Деталі регексу `POOL_FORKS_RE`:**
|
|
62
|
+
|
|
63
|
+
```js
|
|
64
|
+
const POOL_FORKS_RE = /pool\s*:\s*['"]forks['"]/u
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Регекс:
|
|
68
|
+
|
|
69
|
+
- `pool` — буквальний ключ;
|
|
70
|
+
- `\s*:\s*` — двокрапка з довільним whitespace навколо;
|
|
71
|
+
- `['"]forks['"]` — значення `forks` у одинарних або подвійних лапках;
|
|
72
|
+
- Прапор `u` — Unicode-мода для коректної семантики escape-послідовностей.
|
|
73
|
+
|
|
74
|
+
Регекс свідомо **не** перевіряє, що лапки парні (`'forks"` теоретично матчить). На практиці це не проблема, бо у валідному JS такі змішані лапки не зустрінуться (parse-error до того). Whitespace між токенами дозволений, але переноси рядка між `pool` і двокрапкою — лише ті, що покриваються `\s*`.
|
|
75
|
+
|
|
76
|
+
## Залежності
|
|
77
|
+
|
|
78
|
+
**Стандартна бібліотека Node.js:**
|
|
79
|
+
|
|
80
|
+
| Модуль | Імпортовані символи | Використання |
|
|
81
|
+
| ------------------ | ------------------- | --------------------------------------------------------------- |
|
|
82
|
+
| `node:fs` | `existsSync` | Синхронна перевірка існування `vitest.config.js`. |
|
|
83
|
+
| `node:fs/promises` | `readFile` | Асинхронне читання вмісту конфігу у utf-8. |
|
|
84
|
+
| `node:path` | `join` | Побудова шляху `${cwdParam}/vitest.config.js` крос-платформово. |
|
|
85
|
+
|
|
86
|
+
**Внутрішні модулі проєкту:**
|
|
87
|
+
|
|
88
|
+
| Шлях | Імпортовані символи | Використання |
|
|
89
|
+
| ----------------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
90
|
+
| `../../../scripts/lib/check-reporter.mjs` | `createCheckReporter` | Фабрика репортера з методами `pass(msg)`, `fail(msg)` та `getExitCode()`. Уніфікує вивід для всіх `check-*.mjs` правил у репозиторії. |
|
|
91
|
+
|
|
92
|
+
**Зовнішніх npm-залежностей не має.**
|
|
93
|
+
|
|
94
|
+
## Потік виконання / Використання
|
|
95
|
+
|
|
96
|
+
### Типовий потік виконання `check()`
|
|
97
|
+
|
|
98
|
+
1. Створюється reporter: `const reporter = createCheckReporter()`.
|
|
99
|
+
2. Деструктуризація методів: `const { pass, fail } = reporter`.
|
|
100
|
+
3. Будується шлях до конфігу: `configPath = join(cwdParam, 'vitest.config.js')`.
|
|
101
|
+
4. Перевіряється існування файлу через `existsSync(configPath)`:
|
|
102
|
+
- Якщо файла **немає** — викликається `pass(...)` з повідомленням про skip, і функція негайно повертає `reporter.getExitCode()`.
|
|
103
|
+
5. Якщо файл є — він читається повністю: `body = await readFile(configPath, 'utf8')`.
|
|
104
|
+
6. Виконується `POOL_FORKS_RE.test(body)`:
|
|
105
|
+
- `true` → `pass(...)` з підтвердженням;
|
|
106
|
+
- `false` → `fail(...)` з поясненням і покликанням на `test.mdc`.
|
|
107
|
+
7. Повертається `reporter.getExitCode()` — `0` або `1` залежно від того, чи був хоч один `fail`.
|
|
108
|
+
|
|
109
|
+
### Використання як npm/CI-перевірки
|
|
110
|
+
|
|
111
|
+
Модуль слідує конвенції rule-checker'ів проєкту (правила в `npm/rules/<group>/<lang>/check-*.mjs` або тематичних файлах). Запускається або:
|
|
112
|
+
|
|
113
|
+
- безпосередньо `node` як CLI-входу (якщо обгорнуто скриптом-раннером);
|
|
114
|
+
- з агрегованого runner'а, який послідовно викликає `check()` для кожного правила і збирає exit-коди.
|
|
115
|
+
|
|
116
|
+
Приклад прямого виклику з іншого модуля:
|
|
117
|
+
|
|
118
|
+
```js
|
|
119
|
+
import { check } from './vitest-config-pool-forks.mjs'
|
|
120
|
+
|
|
121
|
+
const exitCode = await check(process.cwd())
|
|
122
|
+
process.exit(exitCode)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Приклад виклику для нестандартного кореня (наприклад, у тесті):
|
|
126
|
+
|
|
127
|
+
```js
|
|
128
|
+
import { check } from './vitest-config-pool-forks.mjs'
|
|
129
|
+
|
|
130
|
+
const exitCode = await check('/tmp/fixture-repo-with-vitest')
|
|
131
|
+
// exitCode === 0 якщо у фікстурі є vitest.config.js з pool: 'forks',
|
|
132
|
+
// 1 якщо файл є без потрібного pool, 0 якщо файла нема взагалі
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Приклад валідного `vitest.config.js`
|
|
136
|
+
|
|
137
|
+
```js
|
|
138
|
+
import { defineConfig } from 'vitest/config'
|
|
139
|
+
|
|
140
|
+
export default defineConfig({
|
|
141
|
+
test: {
|
|
142
|
+
pool: 'forks'
|
|
143
|
+
// ... інші опції
|
|
144
|
+
}
|
|
145
|
+
})
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Приклад невалідного `vitest.config.js`
|
|
149
|
+
|
|
150
|
+
```js
|
|
151
|
+
import { defineConfig } from 'vitest/config'
|
|
152
|
+
|
|
153
|
+
export default defineConfig({
|
|
154
|
+
test: {
|
|
155
|
+
// pool не вказано → effective pool: 'threads' (default vitest) → race на process.cwd()
|
|
156
|
+
}
|
|
157
|
+
})
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
або
|
|
161
|
+
|
|
162
|
+
```js
|
|
163
|
+
export default {
|
|
164
|
+
test: { pool: 'threads' } // явно threads — те саме, що default
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Обидва варіанти призведуть до `fail` і exit-code `1`.
|
|
169
|
+
|
|
170
|
+
### Межі застосовності
|
|
171
|
+
|
|
172
|
+
- Перевірка **не** валідовує JS-синтаксис конфігу. Якщо `vitest.config.js` синтаксично битий, але містить рядок `pool: 'forks'` у коментарі чи рядковому літералі, перевірка пройде. Це усвідомлений trade-off на користь простоти — реальні false-positive у проєкті малоймовірні.
|
|
173
|
+
- Перевірка дивиться **тільки** на `vitest.config.js` у корені, переданому через `cwdParam`. Альтернативні імена (`vitest.config.ts`, `vitest.config.mjs`, `vite.config.js` зі вбудованою `test`-секцією) **не** обробляються — це окремі правила, якщо знадобляться.
|
|
174
|
+
- Skip при відсутності файлу — поведінка дизайну: правило не «обов'язково додай vitest», а «якщо ти вже маєш vitest, налаштуй pool правильно».
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# fix.mjs — entry-point правила `text`
|
|
2
|
+
|
|
3
|
+
## Огляд
|
|
4
|
+
|
|
5
|
+
Файл `npm/rules/text/fix.mjs` — це **подвійний entry-point** для правила `text` із пакета `@nitra/cursor`. Він виконує дві ролі одночасно:
|
|
6
|
+
|
|
7
|
+
1. **Library mode** — експортує функцію `run(ctx)`, яку імпортує зовнішня CLI-оркестрація (`npx @nitra/cursor fix text` або агрегований прогон усіх правил) для запуску стандартного fix-pipeline саме цього правила.
|
|
8
|
+
2. **Standalone mode** — якщо модуль виконується безпосередньо (`bun npm/rules/text/fix.mjs`), він самостійно піднімає повний CLI-оркестратор (`runRuleCli`) із завантаженням конфігурації, whitelist-фільтрацією та підсумковим виводом, повертаючи коректний `exit-code` для CI/IDE.
|
|
9
|
+
|
|
10
|
+
Сам файл не містить бізнес-логіки правила: він є **тонким адаптером** над двома утилітами (`runStandardRule` та `runRuleCli`) і покладається на конвенцію `import.meta.dirname` — тобто на те, що сусідні теки `lint/`, `policy/`, `js/` та файл `text.mdc` дають усю фактичну реалізацію (applies → JS-concerns → policy → mdc-refs).
|
|
11
|
+
|
|
12
|
+
Шлях фізично розміщений у директорії конкретного правила `text`, але код **повністю однаковий** для всіх правил репозиторію — `import.meta.dirname` робить його контекстно-залежним без жодних хардкодів `id` правила.
|
|
13
|
+
|
|
14
|
+
## Експорти / API
|
|
15
|
+
|
|
16
|
+
| Експорт | Тип | Призначення |
|
|
17
|
+
| ------- | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
|
|
18
|
+
| `run` | `function (ctx?: RuleContext): Promise<number>` | Іменований експорт для library mode. Викликається зовнішньою оркестрацією, повертає exit-code правила (`0` — OK, `1` — порушення). |
|
|
19
|
+
|
|
20
|
+
Файл **не має** default-експорту. Усі інші конструкції модуля (`if (isRunAsCli(...))`) виконуються при імпорті як side-effect, але активуються лише коли модуль є entry-point процесу — для звичайного `import` standalone-блок не спрацьовує.
|
|
21
|
+
|
|
22
|
+
## Функції
|
|
23
|
+
|
|
24
|
+
### `run(ctx)`
|
|
25
|
+
|
|
26
|
+
```js
|
|
27
|
+
export function run(ctx) {
|
|
28
|
+
return runStandardRule(import.meta.dirname, ctx)
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- **Сигнатура**: `function run(ctx?: RuleContext): Promise<number>`
|
|
33
|
+
- **Параметри**:
|
|
34
|
+
- `ctx` _(необов'язковий)_ — об'єкт контексту прогону типу `RuleContext`, описаний у JSDoc-import у `../../scripts/lib/run-standard-rule.mjs`. Передається оркестратором і зазвичай містить кешовані результати walk'у файлової системи (`walkCache`) та інші спільні для пакетного прогону структури, щоб уникнути повторного сканування репозиторію кожним правилом.
|
|
35
|
+
- **Повертає**: `Promise<number>` — exit-code, який повертає `runStandardRule`. За конвенцією репозиторію:
|
|
36
|
+
- `0` — порушень не знайдено (правило пройшло);
|
|
37
|
+
- `1` — знайдено хоча б одне порушення (правило впало).
|
|
38
|
+
- **Side effects**: усі побічні ефекти делеговані в `runStandardRule`. Це включає:
|
|
39
|
+
- читання файлів проєкту (без модифікацій);
|
|
40
|
+
- виконання сабмодулів `applies`, `JS-concerns`, `policy`, `mdc-refs` із сусідніх тек;
|
|
41
|
+
- друк діагностики у stdout/stderr (залежить від реалізації стандартного pipeline та `RuleContext`).
|
|
42
|
+
- **Передача `import.meta.dirname`**: ключова деталь — як перший аргумент передається **директорія цього файлу** (`npm/rules/text/`). Саме за нею `runStandardRule` ідентифікує правило (`id = basename(dirname)`) та знаходить його артефакти (mdc, applies, policy).
|
|
43
|
+
|
|
44
|
+
### Standalone-блок (top-level, не функція)
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
if (isRunAsCli(import.meta.url)) {
|
|
48
|
+
process.exit(await runRuleCli(import.meta.dirname))
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- **Призначення**: дозволяє запускати модуль як автономний скрипт — `bun npm/rules/text/fix.mjs`. У такому режимі він має дати **повний еквівалент** виклику `npx @nitra/cursor fix text`, включно з:
|
|
53
|
+
- завантаженням конфігурації проєкту;
|
|
54
|
+
- застосуванням whitelist (відсіюванням файлів, що не підпадають під правило);
|
|
55
|
+
- друком підсумку (summary) виконання.
|
|
56
|
+
- **Параметри**: немає (CLI-аргументи парсяться всередині `runRuleCli`).
|
|
57
|
+
- **Повертає / завершує**: `process.exit(n)` із `n`, який повернув `runRuleCli`. Це необхідно, щоб CI або IDE-інтеграція могли визначати успіх/невдачу за стандартним exit-code'ом.
|
|
58
|
+
- **Side effects**:
|
|
59
|
+
- читання конфігурації пакета та проєкту;
|
|
60
|
+
- читання й аналіз файлів проєкту;
|
|
61
|
+
- вивід summary у stdout/stderr;
|
|
62
|
+
- **завершення процесу** через `process.exit` (це окремо помічено `eslint-disable` коментарем `n/no-process-exit, unicorn/no-process-exit`, оскільки правила лінтера за замовчуванням забороняють `process.exit` поза entry-point файлами).
|
|
63
|
+
- **Перевірка `isRunAsCli`**: функція приймає `import.meta.url` і повертає `true` лише якщо саме цей файл — entry-point Node/Bun-процесу. Це класичний ідіоматичний еквівалент `if __name__ == "__main__"` із Python для ESM.
|
|
64
|
+
|
|
65
|
+
## Залежності
|
|
66
|
+
|
|
67
|
+
### Внутрішні (relative)
|
|
68
|
+
|
|
69
|
+
| Імпорт | Модуль | Що дає |
|
|
70
|
+
| ----------------- | ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
71
|
+
| `isRunAsCli` | `../../scripts/lib/run-rule-cli.mjs` | Предикат: чи запущений модуль як CLI entry-point (порівняння `import.meta.url` з `process.argv[1]`). |
|
|
72
|
+
| `runRuleCli` | `../../scripts/lib/run-rule-cli.mjs` | Повний CLI-оркестратор одного правила: завантаження конфігурації, whitelist, виклик `run`, друк summary, повернення exit-code. |
|
|
73
|
+
| `runStandardRule` | `../../scripts/lib/run-standard-rule.mjs` | Стандартний fix-pipeline правила: послідовно виконує етапи **applies → JS-concerns → policy → mdc-refs**. Знаходить артефакти за `dirname` правила. |
|
|
74
|
+
|
|
75
|
+
Усі три імпорти — це shared-утиліти рівня `scripts/lib/`, спроєктовані саме для подвійного entry-point'у правил. Жодних зовнішніх npm-залежностей файл не імпортує напряму.
|
|
76
|
+
|
|
77
|
+
### Неявні (контекст виконання)
|
|
78
|
+
|
|
79
|
+
- **`import.meta.dirname`** — стандартне поле ESM (Node ≥ 20 / Bun): абсолютний шлях до директорії, що містить модуль. Використовується **двічі** і є ключовим для ідентифікації правила.
|
|
80
|
+
- **`import.meta.url`** — стандартне поле ESM: URL-форма шляху до модуля; передається в `isRunAsCli` для порівняння з `process.argv[1]`.
|
|
81
|
+
- **`process.exit`** — глобальний Node/Bun API; викликається лише у standalone-режимі.
|
|
82
|
+
- **Сусідні теки правила** (`./lint`, `./policy`, `./js`, `./text.mdc`, `./meta.json`) — фактичні артефакти, які `runStandardRule` знаходить через переданий `import.meta.dirname`. Файл `fix.mjs` сам їх не імпортує, але pipeline без них не запрацює.
|
|
83
|
+
|
|
84
|
+
## Потік виконання / Використання
|
|
85
|
+
|
|
86
|
+
### Сценарій 1 — Library mode (typical)
|
|
87
|
+
|
|
88
|
+
1. Зовнішній код (наприклад, агрегатор `npx @nitra/cursor fix`) робить `await import('npm/rules/text/fix.mjs')`.
|
|
89
|
+
2. Перевірка `isRunAsCli(import.meta.url)` повертає `false` (бо entry-point процесу — інший файл), standalone-блок **не виконується**.
|
|
90
|
+
3. Агрегатор викликає експортовану `run(ctx)`, передаючи спільний `ctx` (наприклад, з прогрітим `walkCache`).
|
|
91
|
+
4. `run` делегує виклик у `runStandardRule(import.meta.dirname, ctx)`.
|
|
92
|
+
5. `runStandardRule` ідентифікує правило за `basename(dirname)` = `text`, послідовно виконує етапи pipeline (applies → JS-concerns → policy → mdc-refs), читає сусідні артефакти, повертає exit-code.
|
|
93
|
+
6. Агрегатор отримує `Promise<number>` і інтегрує його в загальний підсумок (наприклад, агрегує максимум по всіх правилах).
|
|
94
|
+
|
|
95
|
+
### Сценарій 2 — Standalone mode
|
|
96
|
+
|
|
97
|
+
1. Розробник або CI виконує `bun npm/rules/text/fix.mjs` (або через npm-script).
|
|
98
|
+
2. Імпорти `isRunAsCli`, `runRuleCli`, `runStandardRule` зчитуються.
|
|
99
|
+
3. Експорт `run` стає доступним, але **ніким не використовується** в цьому сценарії.
|
|
100
|
+
4. `isRunAsCli(import.meta.url)` повертає `true`.
|
|
101
|
+
5. Виконується `await runRuleCli(import.meta.dirname)` — повний CLI-цикл: парсинг аргументів, завантаження конфігурації, whitelist, виклик внутрішнього еквівалента `run`, друк summary.
|
|
102
|
+
6. Результат передається в `process.exit(...)` — процес завершується із належним exit-code'ом для CI.
|
|
103
|
+
|
|
104
|
+
### Чому саме така архітектура
|
|
105
|
+
|
|
106
|
+
- **Однаковий код для всіх правил** — `fix.mjs` кожного правила в `npm/rules/<id>/` ідентичний; диференціація — виключно через директорію (`import.meta.dirname`) та артефакти в ній. Це усуває дублювання логіки entry-point'у та робить додавання нового правила механічним (скопіювати теку, поправити mdc/policy).
|
|
107
|
+
- **Подвійна роль (library + standalone)** — дозволяє з одного файлу і дебажити правило локально (швидкий feedback `bun rules/text/fix.mjs`), і інтегрувати його у пакетний прогон агрегатора без зміни вихідного коду.
|
|
108
|
+
- **`process.exit` лише в standalone-гілці** — у library-режимі повернення exit-code'у через `Promise<number>` дає агрегатору можливість зібрати всі результати й завершитися одним викликом, не давши окремому правилу обірвати процес передчасно.
|
|
109
|
+
|
|
110
|
+
### Rebuild Test (інваріанти, які має зберегти будь-яка перебудова файлу)
|
|
111
|
+
|
|
112
|
+
- Файл **має експортувати** функцію `run(ctx)`, що повертає `Promise<number>`.
|
|
113
|
+
- `run` **має** передавати `import.meta.dirname` як перший аргумент у `runStandardRule` (без хардкоду шляху або `id`).
|
|
114
|
+
- `run` **не повинна** викликати `process.exit` — лише повертати exit-code.
|
|
115
|
+
- Standalone-гілка **має** бути захищена `isRunAsCli(import.meta.url)`, щоб не спрацьовувати при `import` із зовнішнього коду.
|
|
116
|
+
- Standalone-гілка **має** використовувати `runRuleCli` (а не `runStandardRule` напряму), бо саме `runRuleCli` додає config-loading, whitelist та summary.
|
|
117
|
+
- Standalone-гілка **має** завершуватися `process.exit(await runRuleCli(import.meta.dirname))` із поверненням коректного exit-code'у — інакше CI не зможе зловити порушення.
|
|
118
|
+
- Файл **не повинен** містити власної логіки правила: вся специфіка `text` живе в сусідніх теках (`lint/`, `policy/`, `js/`) та `text.mdc`.
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# forbidden-prettier.mjs
|
|
2
|
+
|
|
3
|
+
## Огляд
|
|
4
|
+
|
|
5
|
+
Модуль `forbidden-prettier.mjs` — це FS-перевірка (suspect FS-check) з категорії правил `text`, яка стежить за тим, щоб у корені проєкту не з'являвся жоден файл, який Prettier автоматично підхоплює як конфігурацію чи ignore-список.
|
|
6
|
+
|
|
7
|
+
Правило `text.mdc` (див. однойменну категорію `.cursor/rules/`) повністю забороняє використання Prettier, пакета `@nitra/prettier-config` і будь-яких прив'язок до Prettier у проєкті — заміна Prettier у репозиторії — це форматер `oxfmt`. Перевірка package.json-сторони (поля `scripts`, `dependencies`, `devDependencies`) виконується Rego-полісі `text.package_json`, а ця перевірка доповнює її і ловить саме FS-сторону: фізично присутні у корені файли конфігів і `.prettierignore`, які runner Prettier зчитує автоматично.
|
|
8
|
+
|
|
9
|
+
Список заборонених імен синхронізовано з документацією Prettier 3.x (https://prettier.io/docs/configuration). Якщо Prettier додасть новий формат конфігу — у константу треба додати відповідний рядок.
|
|
10
|
+
|
|
11
|
+
Файл є ES-модулем (`.mjs`). Експортує єдину функцію `check`, яка повертає exit code (0 — успіх, 1 — провал), що дозволяє запустити її з CLI або іншого скрипта-агрегатора перевірок.
|
|
12
|
+
|
|
13
|
+
## Експорти / API
|
|
14
|
+
|
|
15
|
+
| Експорт | Тип | Призначення |
|
|
16
|
+
| ------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------- |
|
|
17
|
+
| `check(cwd?)` | `function(string=): number` | Іменований експорт. Запускає перевірку відсутності Prettier-артефактів у вказаному корені й повертає exit code. |
|
|
18
|
+
|
|
19
|
+
Інших публічних експортів модуль не має. Константа `FORBIDDEN_PRETTIER_FILES` оголошена локально у модулі і назовні не експортується.
|
|
20
|
+
|
|
21
|
+
## Функції
|
|
22
|
+
|
|
23
|
+
### `check(cwd = process.cwd())`
|
|
24
|
+
|
|
25
|
+
Сигнатура:
|
|
26
|
+
|
|
27
|
+
```js
|
|
28
|
+
export function check(cwd = process.cwd()): number
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Параметри:
|
|
32
|
+
|
|
33
|
+
- `cwd` — `string`, опційний. Абсолютний шлях до кореня репозиторію (або іншої теки), в якому потрібно шукати Prettier-артефакти. Якщо не передано, використовується поточна робоча тека процесу (`process.cwd()`).
|
|
34
|
+
|
|
35
|
+
Повертає:
|
|
36
|
+
|
|
37
|
+
- `number` — exit code, отриманий від `reporter.getExitCode()`. За контрактом `createCheckReporter`:
|
|
38
|
+
- `0` — у корені не знайдено жодного забороненого Prettier-файлу;
|
|
39
|
+
- `1` — знайдено хоча б один заборонений файл; кожен факт повідомлено окремим `fail(...)`-рядком.
|
|
40
|
+
|
|
41
|
+
Side effects:
|
|
42
|
+
|
|
43
|
+
- Виводить повідомлення про статус перевірки через репортер (`pass` / `fail`). Конкретний канал виводу й формат рядків визначає реалізація `createCheckReporter()` (як правило — `stdout`/`stderr` з префіксами).
|
|
44
|
+
- Звертається до файлової системи: для кожного імені зі списку викликає `existsSync(join(cwd, file))`. Жодних читань вмісту файлів, жодних записів чи видалень не виконується — перевірка лише на факт існування шляху.
|
|
45
|
+
- Не змінює змінні оточення, не модифікує `process` (крім читання `process.cwd()` як дефолтного значення параметра).
|
|
46
|
+
|
|
47
|
+
Алгоритм:
|
|
48
|
+
|
|
49
|
+
1. Створити репортер через `createCheckReporter()`; з нього взяти методи `pass` і `fail`.
|
|
50
|
+
2. Ініціалізувати локальний прапорець `anyFound = false`.
|
|
51
|
+
3. Для кожного імені `file` зі списку `FORBIDDEN_PRETTIER_FILES`:
|
|
52
|
+
- обчислити повний шлях `join(cwd, file)`;
|
|
53
|
+
- якщо `existsSync(...)` повертає `true` — викликати `fail` з повідомленням виду `"<file> заборонено — Prettier не використовуємо, перейди на oxfmt (text.mdc)"` і виставити `anyFound = true`. Цикл не переривається — перевіряємо всі імена, щоб репорт містив повний список знайдених порушень за один прогін.
|
|
54
|
+
4. Якщо після циклу `anyFound === false` — викликати `pass('Prettier-конфігів і .prettierignore немає в корені')` (єдиний підсумковий success-рядок).
|
|
55
|
+
5. Повернути `reporter.getExitCode()`.
|
|
56
|
+
|
|
57
|
+
## Залежності
|
|
58
|
+
|
|
59
|
+
### Зовнішні (стандартна бібліотека Node.js)
|
|
60
|
+
|
|
61
|
+
- `node:fs` — імпортується `existsSync` для синхронної перевірки існування шляху.
|
|
62
|
+
- `node:path` — імпортується `join` для безпечного склеювання `cwd` з іменем файлу (працює коректно на всіх ОС).
|
|
63
|
+
|
|
64
|
+
### Внутрішні
|
|
65
|
+
|
|
66
|
+
- `../../../scripts/lib/check-reporter.mjs` — модуль із фабрикою `createCheckReporter()`. Фабрика повертає об'єкт із принаймні полями:
|
|
67
|
+
- `pass(message: string): void` — повідомити про успіх;
|
|
68
|
+
- `fail(message: string): void` — повідомити про порушення;
|
|
69
|
+
- `getExitCode(): number` — підсумковий exit code (зазвичай 0 при відсутності `fail` і 1 — якщо `fail` був хоча б раз).
|
|
70
|
+
|
|
71
|
+
Контракт репортера спільний для всіх FS-перевірок у `npm/rules/`, тож формат повідомлень уніфіковано.
|
|
72
|
+
|
|
73
|
+
### Дотичні правила
|
|
74
|
+
|
|
75
|
+
- `text.mdc` (`.cursor/rules/n-text.mdc` у проєкті) — джерело заборони Prettier. У повідомленнях `fail` явно посилається користувача на цей файл.
|
|
76
|
+
- Rego-полісі `text.package_json` — додаткова перевірка package.json-сторони (доповнює дану FS-перевірку, але не викликається з цього модуля).
|
|
77
|
+
|
|
78
|
+
## Потік виконання / Використання
|
|
79
|
+
|
|
80
|
+
Модуль розрахований на виклик із CLI-обгортки чи з агрегатора перевірок, який послідовно проганяє правила з категорії `text`.
|
|
81
|
+
|
|
82
|
+
Типовий сценарій використання:
|
|
83
|
+
|
|
84
|
+
1. Скрипт-агрегатор (або CLI на кшталт `n-cursor check` чи окремий runner) імпортує функцію:
|
|
85
|
+
|
|
86
|
+
```js
|
|
87
|
+
import { check } from './npm/rules/text/js/forbidden-prettier.mjs'
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
2. Викликає `check()` без аргументів (тоді корінь = `process.cwd()` процесу-агрегатора) або з явним коренем, наприклад при перевірці іншого workspace:
|
|
91
|
+
|
|
92
|
+
```js
|
|
93
|
+
const exitCode = check('/abs/path/to/repo/root')
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
3. Отриманий `exitCode` агрегатор підсумовує з іншими перевірками; на CI ненульовий код завалює job.
|
|
97
|
+
|
|
98
|
+
Локальний запуск як standalone-скрипта (за бажанням, оскільки модуль не має блоку `if (import.meta.url === ...)`) можна організувати тонкою обгорткою або запустити `check` через `node -e`:
|
|
99
|
+
|
|
100
|
+
```sh
|
|
101
|
+
node --input-type=module -e "import('./npm/rules/text/js/forbidden-prettier.mjs').then(m => process.exit(m.check()))"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Семантика результату:
|
|
105
|
+
|
|
106
|
+
- `0` — у корені немає жодного з 18 заборонених імен (різні формати `.prettierrc.*`, `prettier.config.*`, `.prettierignore`). Користувач бачить один success-рядок.
|
|
107
|
+
- `1` — знайдено N ≥ 1 файлів. Користувач бачить N окремих fail-рядків (по одному на кожен знайдений артефакт) і нульових success-рядків. Це дозволяє за одним прогоном CI-перевірки одразу побачити повний список того, що треба прибрати.
|
|
108
|
+
|
|
109
|
+
Чого функція **не** робить (важливо для контексту):
|
|
110
|
+
|
|
111
|
+
- не зчитує вмісту конфігів — лише факт їх присутності;
|
|
112
|
+
- не намагається автоматично видаляти знайдені файли (це задача користувача — мігрувати на `oxfmt` і прибрати артефакти);
|
|
113
|
+
- не перевіряє вкладені теки/workspaces — рекурсивного обходу немає, контролюється лише корінь `cwd`;
|
|
114
|
+
- не реагує на наявність полів `prettier` у `package.json` — це інша зона відповідальності (Rego `text.package_json`).
|
|
115
|
+
|
|
116
|
+
## Константи
|
|
117
|
+
|
|
118
|
+
### `FORBIDDEN_PRETTIER_FILES`
|
|
119
|
+
|
|
120
|
+
Локальний `const`-масив рядків — повний перелік імен, які Prettier 3.x шукає у корені проєкту. На момент створення модуля містить такі імена (у порядку оригіналу):
|
|
121
|
+
|
|
122
|
+
- `.prettierignore`
|
|
123
|
+
- `.prettierrc`
|
|
124
|
+
- `.prettierrc.json`
|
|
125
|
+
- `.prettierrc.jsonc`
|
|
126
|
+
- `.prettierrc.json5`
|
|
127
|
+
- `.prettierrc.yaml`
|
|
128
|
+
- `.prettierrc.yml`
|
|
129
|
+
- `.prettierrc.toml`
|
|
130
|
+
- `.prettierrc.js`
|
|
131
|
+
- `.prettierrc.cjs`
|
|
132
|
+
- `.prettierrc.mjs`
|
|
133
|
+
- `.prettierrc.ts`
|
|
134
|
+
- `.prettierrc.cts`
|
|
135
|
+
- `.prettierrc.mts`
|
|
136
|
+
- `prettier.config.js`
|
|
137
|
+
- `prettier.config.cjs`
|
|
138
|
+
- `prettier.config.mjs`
|
|
139
|
+
- `prettier.config.ts`
|
|
140
|
+
- `prettier.config.cts`
|
|
141
|
+
- `prettier.config.mts`
|
|
142
|
+
|
|
143
|
+
Поясняюча нотатка з коментаря у файлі: «Список синхронізовано з конфіг-форматами Prettier 3.x (https://prettier.io/docs/configuration). Якщо Prettier додасть новий формат — додай рядок.» — підтримка списку ручна; при апгрейді Prettier (як майбутньої версії) перевір документацію і за потреби розшир константу.
|