@nitra/cursor 5.3.3 → 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 +17 -0
- package/bin/n-cursor.js +43 -22
- package/lib/docs/llm.md +23 -12
- 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/rules/doc-files/js/docs/docgen-extract-anchors.md +45 -0
- package/rules/doc-files/js/docs/docgen-extract.md +39 -0
- package/rules/doc-files/js/docs/docgen-files-batch.md +35 -0
- package/rules/doc-files/js/docs/docgen-gen.md +46 -0
- package/rules/doc-files/js/docs/docgen-ignore.md +37 -0
- 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-0012.md +5 -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-extract-anchors.md +0 -27
- package/skills/doc-files/js/docs/docgen-extract.md +0 -29
- package/skills/doc-files/js/docs/docgen-files-batch.md +0 -25
- package/skills/doc-files/js/docs/docgen-gen.md +0 -30
- 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,263 +1,40 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
docgen:
|
|
3
|
+
source: npm/rules/js-mssql/js/deps.mjs
|
|
4
|
+
crc: d5bc32ba
|
|
5
|
+
score: 100
|
|
6
|
+
---
|
|
2
7
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Модуль `npm/rules/js-mssql/js/deps.mjs` — це автоматичний `check`-скрипт для правила `js-mssql.mdc`. Він виконує дві логічно різні перевірки на корені репозиторію:
|
|
6
|
-
|
|
7
|
-
1. **Версійний аудит** усіх `package.json` (у тому числі workspace-пакетів): якщо в секції `dependencies` присутній пакет `mssql`, його semver-діапазон має давати ефективну версію не нижче `12.5.0`.
|
|
8
|
-
2. **Статичний аналіз вихідного коду** (JS/TS) на безпечне використання драйвера `mssql`:
|
|
9
|
-
- заборона створення `new sql.ConnectionPool(...)` всередині функцій (пул має бути singleton на рівні модуля);
|
|
10
|
-
- заборона спільного (shared) `Request`, наприклад `export const request = pool.request()`;
|
|
11
|
-
- заборона викликів `query(\`...\`)`як звичайної функції — потрібен tagged template`query\`...\``;
|
|
12
|
-
- заборона динамічних SQL-списків через `.join(',')` у конструкціях `IN (...)` / `VALUES (...)` (треба TVP, `sql.Table`);
|
|
13
|
-
- вимога числового парсингу значень у `IN (${...})` (`parseInt` / `Number` / `BigInt` / `parseFloat` + фільтр від `NaN`);
|
|
14
|
-
- вимога винести значення для `IN (${...})` в окрему змінну і додати guard на пустоту з `throw`.
|
|
15
|
-
|
|
16
|
-
Скрипт використовує спільну інфраструктуру репорту (`createCheckReporter`) і повертає числовий exit code, придатний для CI. Усі повідомлення префіксовані `js-mssql:` для зручної фільтрації.
|
|
17
|
-
|
|
18
|
-
Файл є ESM-модулем (`.mjs`), без top-level side effects: експортується лише асинхронна функція `check()`, яка ініціює виконання.
|
|
19
|
-
|
|
20
|
-
## Експорти / API
|
|
21
|
-
|
|
22
|
-
| Символ | Тип | Призначення |
|
|
23
|
-
| ------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
24
|
-
| `check` | `async function(): Promise<number>` | Єдиний публічний експорт. Виконує повну перевірку правила `js-mssql.mdc` у поточному `process.cwd()` і повертає `0` (OK) або `1` (є порушення). |
|
|
25
|
-
|
|
26
|
-
Інші функції в модулі (`findAllSourcePathsForMssqlScan`, `asObject`, `getMssqlDependencyRange`, `parseLeadingSemver`, `semverGte`, `auditMssqlVersionInPackageJson`, `aggregateMssqlVersionsAcrossPackages`, `scanMssqlOneSourceFile`, `reportZeroMssqlSourceViolations`, `auditMssqlSources`) є **внутрішніми** — не експортуються і призначені лише для декомпозиції логіки `check()`.
|
|
27
|
-
|
|
28
|
-
### Константи
|
|
29
|
-
|
|
30
|
-
| Константа | Значення | Опис |
|
|
31
|
-
| ------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------ |
|
|
32
|
-
| `VERSION_PREFIX_RE` | `/^[\^~>=<]+\s*/u` | Регулярка для відрізання префіксів semver-діапазону (`^`, `~`, `>`, `=`, `<` та комбінацій) перед парсингом. |
|
|
33
|
-
| `SEMVER_RE` | `/^(\d+)\.(\d+)\.(\d+)/u` | Регулярка для захоплення першої semver-трійки `major.minor.patch` після очищення префіксу. |
|
|
34
|
-
| `MIN_MSSQL_VERSION` | `{ major: 12, minor: 5, patch: 0 }` | Мінімально дозволена версія `mssql`, як її задає правило `js-mssql.mdc`. |
|
|
35
|
-
|
|
36
|
-
## Функції
|
|
37
|
-
|
|
38
|
-
### `findAllSourcePathsForMssqlScan(repoRoot, ignorePaths)`
|
|
39
|
-
|
|
40
|
-
Внутрішня. Збирає абсолютні шляхи всіх JS/TS-файлів-кандидатів для скану `mssql`.
|
|
41
|
-
|
|
42
|
-
- **Сигнатура:** `async function findAllSourcePathsForMssqlScan(repoRoot: string, ignorePaths: string[]): Promise<string[]>`
|
|
43
|
-
- **Параметри:**
|
|
44
|
-
- `repoRoot` — абсолютний шлях до кореня репозиторію;
|
|
45
|
-
- `ignorePaths` — масив абсолютних шляхів каталогів, які повністю виключаються з обходу (зчитується з `.cursorignore`).
|
|
46
|
-
- **Повертає:** масив абсолютних шляхів файлів, відсортований за відносним шляхом (`localeCompare`), щоб порядок звітів був детермінованим.
|
|
47
|
-
- **Side effects:** читає файлову систему через `walkDir`; нормалізує windows-роздільники `\` у POSIX `/` перед перевіркою `isMssqlScanSourceFile`.
|
|
48
|
-
|
|
49
|
-
### `asObject(v)`
|
|
50
|
-
|
|
51
|
-
Внутрішня. Безпечне приведення невідомого значення до plain-object.
|
|
52
|
-
|
|
53
|
-
- **Сигнатура:** `function asObject(v: unknown): Record<string, unknown>`
|
|
54
|
-
- **Логіка:** повертає `{}`, якщо `v` falsy, не `object`, або масив; інакше повертає сам `v` як `Record<string, unknown>` (через JSDoc-cast).
|
|
55
|
-
- **Side effects:** немає.
|
|
56
|
-
|
|
57
|
-
### `getMssqlDependencyRange(deps)`
|
|
58
|
-
|
|
59
|
-
Внутрішня. Витягає рядок версії `dependencies.mssql`.
|
|
60
|
-
|
|
61
|
-
- **Сигнатура:** `function getMssqlDependencyRange(deps: unknown): string | null`
|
|
62
|
-
- **Параметри:** `deps` — значення поля `dependencies` з `package.json` (може бути будь-чим).
|
|
63
|
-
- **Повертає:** триманий (`trim`) рядок версії, або `null`, якщо ключ відсутній / значення не є непорожнім рядком.
|
|
64
|
-
- **Side effects:** немає.
|
|
65
|
-
|
|
66
|
-
### `parseLeadingSemver(range)`
|
|
67
|
-
|
|
68
|
-
Внутрішня. Парсить першу semver-трійку з діапазону виду `"^12.5.0"`, `">=12.5.0"`, `"12.5.0"`.
|
|
69
|
-
|
|
70
|
-
- **Сигнатура:** `function parseLeadingSemver(range: string): { major: number, minor: number, patch: number } | null`
|
|
71
|
-
- **Параметри:** `range` — версійний діапазон у синтаксисі npm.
|
|
72
|
-
- **Повертає:** об'єкт `{ major, minor, patch }` або `null`, якщо не вдалось розпарсити (або будь-який компонент — `NaN`).
|
|
73
|
-
- **Алгоритм:**
|
|
74
|
-
1. `String(range).trim()` → видалення префіксів через `VERSION_PREFIX_RE`;
|
|
75
|
-
2. `match(SEMVER_RE)` → захоплення трьох чисел;
|
|
76
|
-
3. конвертація через `Number`, перевірка `Number.isNaN`.
|
|
77
|
-
- **Side effects:** немає.
|
|
78
|
-
|
|
79
|
-
### `semverGte(a, b)`
|
|
80
|
-
|
|
81
|
-
Внутрішня. Порівняння semver "більше або дорівнює".
|
|
82
|
-
|
|
83
|
-
- **Сигнатура:** `function semverGte(a: SemverObj, b: SemverObj): boolean`
|
|
84
|
-
- **Параметри:** обидві трійки `{ major, minor, patch }`.
|
|
85
|
-
- **Повертає:** `true`, якщо `a >= b` за лексикографічним порядком `(major, minor, patch)`.
|
|
86
|
-
- **Side effects:** немає.
|
|
87
|
-
|
|
88
|
-
### `auditMssqlVersionInPackageJson(rel, parsed, pass, fail)`
|
|
89
|
-
|
|
90
|
-
Внутрішня. Аудит одного `package.json` на `dependencies.mssql`.
|
|
91
|
-
|
|
92
|
-
- **Сигнатура:** `function auditMssqlVersionInPackageJson(rel: string, parsed: unknown, pass: (msg: string) => void, fail: (msg: string) => void): { found: 0 | 1, bad: 0 | 1 }`
|
|
93
|
-
- **Параметри:**
|
|
94
|
-
- `rel` — людино-читабельний шлях (відносний, з `/` як роздільник);
|
|
95
|
-
- `parsed` — розпарсений JSON `package.json`;
|
|
96
|
-
- `pass`, `fail` — колбеки звіту з `createCheckReporter`.
|
|
97
|
-
- **Повертає:** інкремент лічильників:
|
|
98
|
-
- `found` — `1`, якщо в `dependencies` знайдено ключ `mssql`, інакше `0`;
|
|
99
|
-
- `bad` — `1`, якщо знайдено, але версія нечитабельна або менша за `MIN_MSSQL_VERSION`.
|
|
100
|
-
- **Side effects:** виклики `pass(...)` / `fail(...)` з конкретними повідомленнями (формат `js-mssql: <rel>: ... (js-mssql.mdc)`).
|
|
8
|
+
# deps.mjs
|
|
101
9
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
Внутрішня. Прогін усіх `package.json` із підсумками.
|
|
105
|
-
|
|
106
|
-
- **Сигнатура:** `async function aggregateMssqlVersionsAcrossPackages(repoRoot: string, pkgJsonPaths: string[], pass: (msg: string) => void, fail: (msg: string) => void): Promise<{ found: number, bad: number }>`
|
|
107
|
-
- **Параметри:**
|
|
108
|
-
- `repoRoot` — корінь репозиторію;
|
|
109
|
-
- `pkgJsonPaths` — абсолютні шляхи до всіх знайдених `package.json`.
|
|
110
|
-
- **Повертає:** сукупні лічильники `{ found, bad }` по всіх файлах.
|
|
111
|
-
- **Side effects:**
|
|
112
|
-
- читає кожен `package.json` через `readFile`;
|
|
113
|
-
- якщо файл — невалідний JSON, викликає `fail('js-mssql: <rel> — невалідний JSON')` і пропускає його (`continue`);
|
|
114
|
-
- акумулює інкременти з `auditMssqlVersionInPackageJson`.
|
|
115
|
-
|
|
116
|
-
### `scanMssqlOneSourceFile(rel, content, counters, fail)`
|
|
117
|
-
|
|
118
|
-
Внутрішня. Прогін **одного** JS/TS-файлу через шість сканерів з `../lib/mssql-pool-scan.mjs`.
|
|
119
|
-
|
|
120
|
-
- **Сигнатура:** `function scanMssqlOneSourceFile(rel: string, content: string, counters: Record<string, number>, fail: (msg: string) => void): void`
|
|
121
|
-
- **Параметри:**
|
|
122
|
-
- `rel` — relative-шлях файлу (для повідомлень);
|
|
123
|
-
- `content` — повний вихідний код файлу;
|
|
124
|
-
- `counters` — мутабельний агрегатор лічильників (див. нижче);
|
|
125
|
-
- `fail` — колбек звіту про порушення.
|
|
126
|
-
- **Лічильники в `counters` (інкрементуються по одному за порушення):**
|
|
127
|
-
- `violations` — `new sql.ConnectionPool(...)` всередині функції;
|
|
128
|
-
- `sharedRequestViolations` — shared `Request` (наприклад `export const request = pool.request()`);
|
|
129
|
-
- `unsafeQueryCalls` — `query(\`...\`)` як виклик функції замість tagged template;
|
|
130
|
-
- `unsafeDynamicSqlLists` — динамічні SQL-списки через `.join(',')` у `IN/VALUES`;
|
|
131
|
-
- `unparsedInLists` — `IN (${...})` без числового парсера значень;
|
|
132
|
-
- `inListGuardViolations` — відсутній або неправильно розташований guard на пустоту IN-списку (розгалуження за `v.reason === 'missing_guard'` дає різні тексти повідомлень).
|
|
133
|
-
- **Side effects:** виклики `fail(...)` з конкретним `:line` та `snippet` для кожного знайденого порушення; мутує `counters`.
|
|
134
|
-
|
|
135
|
-
### `reportZeroMssqlSourceViolations(counters, pass)`
|
|
136
|
-
|
|
137
|
-
Внутрішня. Для кожного лічильника, що залишився `0`, дає один `pass`-рядок.
|
|
138
|
-
|
|
139
|
-
- **Сигнатура:** `function reportZeroMssqlSourceViolations(counters: Record<string, number>, pass: (msg: string) => void): void`
|
|
140
|
-
- **Семантика:** перетворює "відсутність порушень" на явні позитивні рядки звіту — щоб у вихідному логу було видно, які саме інваріанти виконано (а не лише сумарний `OK`).
|
|
141
|
-
- **Side effects:** виклики `pass(...)` (від 0 до 6, залежно від лічильників).
|
|
142
|
-
|
|
143
|
-
### `auditMssqlSources(repoRoot, ignorePaths, pass, fail)`
|
|
144
|
-
|
|
145
|
-
Внутрішня. Повний аудит усіх JS/TS-джерел репо щодо безпечного використання `mssql`.
|
|
146
|
-
|
|
147
|
-
- **Сигнатура:** `async function auditMssqlSources(repoRoot: string, ignorePaths: string[], pass: (msg: string) => void, fail: (msg: string) => void): Promise<void>`
|
|
148
|
-
- **Алгоритм:**
|
|
149
|
-
1. збирає список файлів через `findAllSourcePathsForMssqlScan`;
|
|
150
|
-
2. якщо файлів немає — один `pass`-рядок `'js-mssql: немає JS/TS файлів для скану singleton ConnectionPool'` і `return`;
|
|
151
|
-
3. ініціалізує `counters` нулями (`violations`, `sharedRequestViolations`, `unsafeQueryCalls`, `unsafeDynamicSqlLists`, `unparsedInLists`, `inListGuardViolations`);
|
|
152
|
-
4. послідовно читає кожен файл через `readFile(absPath, 'utf8')`, нормалізує `rel` і викликає `scanMssqlOneSourceFile`;
|
|
153
|
-
5. в кінці викликає `reportZeroMssqlSourceViolations(counters, pass)`.
|
|
154
|
-
- **Side effects:** I/O (читання файлів); виклики `pass` / `fail`.
|
|
155
|
-
|
|
156
|
-
### `check()` _(export)_
|
|
157
|
-
|
|
158
|
-
Публічна. Виконує повну перевірку правила.
|
|
159
|
-
|
|
160
|
-
- **Сигнатура:** `export async function check(): Promise<number>`
|
|
161
|
-
- **Параметри:** немає (працює відносно `process.cwd()`).
|
|
162
|
-
- **Повертає:** `number` — exit code від `reporter.getExitCode()` (`0` — OK, `1` — є проблеми).
|
|
163
|
-
- **Алгоритм:**
|
|
164
|
-
1. створює репортер: `createCheckReporter()` → деструктурує `{ pass, fail }`;
|
|
165
|
-
2. `repoRoot = process.cwd()`;
|
|
166
|
-
3. **early-return**: якщо в корені немає `package.json` (`existsSync`), записує `pass('js-mssql: package.json у корені відсутній — перевірку пропущено')` і повертає поточний exit code;
|
|
167
|
-
4. зчитує `ignorePaths` через `loadCursorIgnorePaths(repoRoot)`;
|
|
168
|
-
5. збирає всі `package.json` у репозиторії через `findAllPackageJsonPaths(repoRoot, ignorePaths)`;
|
|
169
|
-
6. **early-return**: якщо `package.json` не знайдено зовсім — `pass('js-mssql: package.json не знайдено — перевірку пропущено')` + повернення exit code;
|
|
170
|
-
7. виконує `aggregateMssqlVersionsAcrossPackages(...)` → `{ found, bad }`;
|
|
171
|
-
8. **early-return**: якщо `found === 0`, `pass('js-mssql: пакет mssql не знайдено в dependencies жодного package.json')` + повернення exit code (статичний аналіз не запускається, бо `mssql` у проєкті не використовується);
|
|
172
|
-
9. якщо `bad === 0` — `pass('js-mssql: всі знайдені dependencies.mssql відповідають мінімальній версії 12.5.0 (<found>)')`;
|
|
173
|
-
10. виконує `auditMssqlSources(repoRoot, ignorePaths, pass, fail)`;
|
|
174
|
-
11. повертає `reporter.getExitCode()`.
|
|
175
|
-
- **Side effects:** I/O (читання FS), звітування через `pass`/`fail` репортера.
|
|
176
|
-
|
|
177
|
-
## Залежності
|
|
178
|
-
|
|
179
|
-
### Стандартні модулі Node.js
|
|
180
|
-
|
|
181
|
-
| Імпорт | Звідки | Використання |
|
|
182
|
-
| ------------------ | ------------------ | ---------------------------------------------------------------------------------- |
|
|
183
|
-
| `existsSync` | `node:fs` | Перевірка наявності `package.json` у корені (швидкий синхронний guard). |
|
|
184
|
-
| `readFile` | `node:fs/promises` | Асинхронне читання `package.json` та джерельних файлів у UTF-8. |
|
|
185
|
-
| `join`, `relative` | `node:path` | Побудова шляху до `package.json` та нормалізація відносних шляхів для повідомлень. |
|
|
186
|
-
|
|
187
|
-
### Внутрішні модулі репозиторію
|
|
188
|
-
|
|
189
|
-
| Імпорт | Звідки | Призначення |
|
|
190
|
-
| ---------------------------------------------- | ---------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
191
|
-
| `createCheckReporter` | `../../../scripts/lib/check-reporter.mjs` | Уніфікований репортер для всіх `check`-скриптів: накопичує `pass`/`fail` рядки і формує exit code. |
|
|
192
|
-
| `findAllPackageJsonPaths` | `../../../scripts/utils/find-package-json-paths.mjs` | Рекурсивний пошук усіх `package.json` (моно-репо/workspaces) з урахуванням ignore-шляхів. |
|
|
193
|
-
| `findMssqlPerRequestConnectionInText` | `../lib/mssql-pool-scan.mjs` | Пошук `new sql.ConnectionPool(...)` всередині функцій. |
|
|
194
|
-
| `findSharedMssqlRequestInText` | `../lib/mssql-pool-scan.mjs` | Пошук shared `Request` (наприклад `export const request = pool.request()`). |
|
|
195
|
-
| `findUnsafeMssqlQueryTemplateCallInText` | `../lib/mssql-pool-scan.mjs` | Пошук `query(\`...\`)` як звичайного виклику замість tagged template. |
|
|
196
|
-
| `findUnsafeMssqlDynamicSqlListInText` | `../lib/mssql-pool-scan.mjs` | Пошук динамічних SQL-списків через `.join(',')` у `IN/VALUES`. |
|
|
197
|
-
| `findUnsafeMssqlInListUnparsedInText` | `../lib/mssql-pool-scan.mjs` | Пошук `IN (${...})` без числового парсингу значень. |
|
|
198
|
-
| `findUnsafeMssqlInListMissingEmptyGuardInText` | `../lib/mssql-pool-scan.mjs` | Пошук IN-списків без guard'у на пустоту з `throw`. |
|
|
199
|
-
| `isMssqlScanSourceFile` | `../lib/mssql-pool-scan.mjs` | Фільтр-предикат: чи треба сканувати файл за його relative-шляхом. |
|
|
200
|
-
| `loadCursorIgnorePaths` | `../../../scripts/lib/load-cursor-config.mjs` | Завантаження `.cursorignore` → масив абсолютних ignore-шляхів. |
|
|
201
|
-
| `walkDir` | `../../../scripts/utils/walkDir.mjs` | Рекурсивний обхід файлової системи з callback на кожен файл і ignore-каталогами. |
|
|
202
|
-
|
|
203
|
-
### Очікувана форма колбеків репортера
|
|
204
|
-
|
|
205
|
-
```js
|
|
206
|
-
const reporter = createCheckReporter()
|
|
207
|
-
// reporter: { pass(msg: string): void, fail(msg: string): void, getExitCode(): number }
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
`pass` додає позитивне повідомлення (не впливає на exit code), `fail` — фіксує порушення і змушує `getExitCode()` повернути `1`.
|
|
211
|
-
|
|
212
|
-
## Потік виконання / Використання
|
|
213
|
-
|
|
214
|
-
### Сценарій інтеграції
|
|
215
|
-
|
|
216
|
-
Модуль є частиною інфраструктури `n-cursor` правил `npm/rules/js-mssql/`. Він викликається універсальним runner'ом правил (наприклад через `bun run` або `n-cursor` CLI), який імпортує `check` і використовує її exit code як підсумок.
|
|
217
|
-
|
|
218
|
-
Типове використання:
|
|
219
|
-
|
|
220
|
-
```js
|
|
221
|
-
import { check } from './deps.mjs'
|
|
10
|
+
## Огляд
|
|
222
11
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
```
|
|
12
|
+
request
|
|
13
|
+
Витягує рядок версії `dependencies.mssql` з `package.json` (js-mssql.mdc)
|
|
226
14
|
|
|
227
|
-
|
|
15
|
+
check
|
|
16
|
+
Перевіряє використання `mssql` у джерелах коду та порівнює його версію з версією у `package.json` (package.json)
|
|
228
17
|
|
|
229
|
-
|
|
230
|
-
2. **Guard 1 — кореневий `package.json`.** Якщо в `process.cwd()` немає `package.json`, перевірка вважається непридатною; виставляється `pass` і повертається exit code (зазвичай `0`).
|
|
231
|
-
3. **Завантаження ignore-шляхів.** Зчитуються через `loadCursorIgnorePaths(repoRoot)`.
|
|
232
|
-
4. **Збір усіх `package.json`.** `findAllPackageJsonPaths(repoRoot, ignorePaths)` повертає масив абсолютних шляхів усіх `package.json` репозиторію (з урахуванням workspace-пакетів і ignore).
|
|
233
|
-
5. **Guard 2 — порожній список.** Якщо `package.json` зовсім немає — пропуск перевірки з відповідним `pass`.
|
|
234
|
-
6. **Версійний аудит.** `aggregateMssqlVersionsAcrossPackages` обходить кожен `package.json`, парсить JSON, для кожного знайденого `dependencies.mssql` запускає `auditMssqlVersionInPackageJson`. Підсумок — `{ found, bad }`.
|
|
235
|
-
7. **Guard 3 — `mssql` не використовується.** Якщо `found === 0`, фіксується позитивний рядок `'js-mssql: пакет mssql не знайдено в dependencies жодного package.json'` і виконання завершується — статичний аналіз джерел **не запускається** (немає сенсу шукати порушення для пакета, якого немає в залежностях).
|
|
236
|
-
8. **Підсумковий pass про версії.** Якщо `bad === 0` (всі версії OK), додається підсумковий `pass` з кількістю знайдених.
|
|
237
|
-
9. **Аудит джерел.** `auditMssqlSources` сканує всі JS/TS-файли (через `walkDir` + `isMssqlScanSourceFile`), застосовує шість сканерів безпеки і фіксує кожне порушення через `fail`. Відсутність порушень за кожним типом конвертується у явний `pass` через `reportZeroMssqlSourceViolations`.
|
|
238
|
-
10. **Повернення exit code.** `reporter.getExitCode()` → `0` якщо жодного `fail` не було, інакше `1`.
|
|
18
|
+
## Поведінка
|
|
239
19
|
|
|
240
|
-
|
|
20
|
+
request
|
|
21
|
+
Витягує рядок версії `dependencies.mssql` з package.json
|
|
241
22
|
|
|
242
|
-
|
|
23
|
+
request
|
|
24
|
+
Витягує рядок версії `dependencies.mssql` з package.json
|
|
243
25
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
- **Невалідний JSON:** `js-mssql: package.json — невалідний JSON`
|
|
247
|
-
- **Per-request pool:** `js-mssql: src/db.js:42 — не створюй new sql.ConnectionPool(...) на кожен запит; використовуй singleton sql.ConnectionPool: <snippet>`
|
|
248
|
-
- **Відсутній guard для IN:** `js-mssql: src/db.js:58 — перед IN-списком "ids" потрібна перевірка на пустоту з throw (наприклад if (!ids.length) throw ...), інакше можливі некоректні запити (js-mssql.mdc): <snippet>`
|
|
26
|
+
check
|
|
27
|
+
Аудитує використання mssql у джерелах коду та перевіряє відповідність версії mssql у package.json
|
|
249
28
|
|
|
250
|
-
|
|
29
|
+
## Публічний API
|
|
251
30
|
|
|
252
|
-
|
|
31
|
+
request: Створює запит для бази даних
|
|
32
|
+
request: Формує запит для бази даних
|
|
33
|
+
check: Перевіряє відповідність проєкту правилу js-mssql.mdc
|
|
253
34
|
|
|
254
|
-
|
|
35
|
+
## Гарантії поведінки
|
|
255
36
|
|
|
256
|
-
-
|
|
257
|
-
-
|
|
258
|
-
-
|
|
259
|
-
-
|
|
260
|
-
- **Версія дорівнює мінімуму** — `semverGte(parsedVer, MIN_MSSQL_VERSION)` дає `true`, фіксується `pass`.
|
|
261
|
-
- **`mssql` відсутній у всіх `package.json`** — статичний аналіз не запускається (оптимізація для проєктів, які не використовують MSSQL).
|
|
262
|
-
- **Файл — невалідний JSON** — фіксується `fail`, обхід продовжується (`continue`).
|
|
263
|
-
- **Жодного JS/TS-файлу** у репо для скану — фіксується позитивний `pass`, виконання продовжується нормально.
|
|
37
|
+
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
38
|
+
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
39
|
+
- За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
|
|
40
|
+
- Не звертається до мережі.
|
package/rules/js-run/docs/fix.md
CHANGED
|
@@ -1,153 +1,38 @@
|
|
|
1
1
|
---
|
|
2
2
|
docgen:
|
|
3
3
|
source: npm/rules/js-run/fix.mjs
|
|
4
|
-
crc:
|
|
4
|
+
crc: 38cf876b
|
|
5
|
+
score: 100
|
|
5
6
|
---
|
|
6
7
|
|
|
7
|
-
# fix.mjs
|
|
8
|
+
# fix.mjs
|
|
8
9
|
|
|
9
10
|
## Огляд
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
Виконує застосування політики JS-занепокоєних до mdc-refs на вхідному контексті прогону та повертає результат.
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
2. **Standalone-режим** — якщо файл запущено напряму (`bun rules/js-run/fix.mjs`), він поводиться як повноцінний entry-point: завантажує конфіг, застосовує whitelist, друкує підсумок і завершує процес із відповідним exit-code.
|
|
14
|
+
Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`, завантажує конфігурацію, перевіряє дозволені елементи та повертає код виходу.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
## Поведінка
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
1. Запуск правила.
|
|
19
|
+
* Приймає контекст прогону.
|
|
20
|
+
* Виконує застосування JS-занепокоєних до політики до mdc-refs.
|
|
21
|
+
* Повертає результат прогону.
|
|
22
|
+
2. Запуск правила у режимі CLI.
|
|
23
|
+
* Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
|
|
24
|
+
* Виконує завантаження конфігурації.
|
|
25
|
+
* Виконує перевірку дозволених елементів.
|
|
26
|
+
* Виконує підбиття підсумків.
|
|
27
|
+
* Повертає код виходу.
|
|
19
28
|
|
|
20
|
-
##
|
|
29
|
+
## Публічний API
|
|
21
30
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
| `run` | `function(ctx?: RuleContext): Promise<number>` | Library entry-point правила — викликається зовнішнім оркестратором у тому ж процесі. |
|
|
31
|
+
run — запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
32
|
+
Library mode — викликається CLI orchestration через `import + run`.
|
|
25
33
|
|
|
26
|
-
|
|
34
|
+
## Гарантії поведінки
|
|
27
35
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
### `run(ctx)`
|
|
33
|
-
|
|
34
|
-
```js
|
|
35
|
-
/**
|
|
36
|
-
*
|
|
37
|
-
*/
|
|
38
|
-
export function run(ctx) {
|
|
39
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
- **Сигнатура:** `run(ctx?: RuleContext): Promise<number>`
|
|
44
|
-
- **Параметри:**
|
|
45
|
-
- `ctx` _(необовʼязковий)_ — обʼєкт контексту прогону. Тип імпортується з `../../scripts/lib/run-standard-rule.mjs` як `RuleContext`. Зазвичай містить розділяємий між правилами кеш обходу файлової системи (`walkCache`) та інші cross-rule артефакти, які дозволяють зекономити IO при батч-прогоні. Якщо аргумент не передано, `runStandardRule` створює локальний контекст самостійно.
|
|
46
|
-
- **Повертає:** `Promise<number>` — exit-code прогону:
|
|
47
|
-
- `0` — порушень не знайдено (OK);
|
|
48
|
-
- `1` — знайдено хоча б одне порушення.
|
|
49
|
-
- **Side effects:** делегуються в `runStandardRule`. Можливі: читання файлів проєкту, читання `meta.json` правила, друк діагностики у stdout/stderr, запис у спільні структури `ctx`. Сам `run` `process.exit` не викликає — це принципово для library-режиму, де декілька правил мають викликатись підряд в одному процесі.
|
|
50
|
-
- **Алгоритм:** одна делегація — `runStandardRule(import.meta.dirname, ctx)`. `import.meta.dirname` — абсолютний шлях до директорії, в якій лежить `fix.mjs` (тобто `.../npm/rules/js-run/`). За цим шляхом `runStandardRule` знаходить `meta.json`, підправила в `js/`, `policy/`, а також `.mdc`-документ правила.
|
|
51
|
-
|
|
52
|
-
### Top-level CLI-блок
|
|
53
|
-
|
|
54
|
-
```js
|
|
55
|
-
if (isRunAsCli(import.meta.url)) {
|
|
56
|
-
process.exit(await runRuleCli(import.meta.dirname))
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
- **Умова активації:** `isRunAsCli(import.meta.url)` — повертає `true`, якщо файл запущено напряму як скрипт (`node`/`bun fix.mjs`), а не імпортовано як модуль. Конкретний механізм перевірки інкапсульований у `run-rule-cli.mjs`.
|
|
61
|
-
- **Що робить:** очікує (`await`) завершення `runRuleCli(import.meta.dirname)`, який окрім логіки `runStandardRule` додатково:
|
|
62
|
-
- завантажує конфіг проєкту (whitelist, exclusions);
|
|
63
|
-
- вирівнює аргументи CLI;
|
|
64
|
-
- друкує summary в кінці прогону;
|
|
65
|
-
- повертає exit-code.
|
|
66
|
-
- **Завершення:** `process.exit(<code>)` — обовʼязкове для standalone-режиму, бо CI/IDE очікують саме exit-code, а не повернене значення з `import()`.
|
|
67
|
-
- **ESLint suppression:** коментар `// eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit` свідомо вимикає правила, які забороняють `process.exit` у бібліотечному коді. Виключення виправдане роллю файлу як standalone-entry-point — це не лібра у вузькому сенсі.
|
|
68
|
-
|
|
69
|
-
## Залежності
|
|
70
|
-
|
|
71
|
-
Файл має рівно **дві** внутрішні залежності, обидві з `npm/scripts/lib/`:
|
|
72
|
-
|
|
73
|
-
| Імпорт | Звідки | Що звідти використовується |
|
|
74
|
-
| ----------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
|
|
75
|
-
| `isRunAsCli` | `../../scripts/lib/run-rule-cli.mjs` | Предикат: чи модуль запущено як CLI, а не імпортовано як бібліотека. Приймає `import.meta.url`. |
|
|
76
|
-
| `runRuleCli` | `../../scripts/lib/run-rule-cli.mjs` | Повна CLI-обгортка над `runStandardRule`: конфіг + whitelist + summary + повернення exit-code. Приймає `import.meta.dirname`. |
|
|
77
|
-
| `runStandardRule` | `../../scripts/lib/run-standard-rule.mjs` | Універсальний раннер «стандартного» правила: applies → JS-concerns → policy → mdc-refs. Приймає `(dirname, ctx?)`. |
|
|
78
|
-
|
|
79
|
-
Зовнішніх npm-залежностей файл не має. Опосередковано він залежить від:
|
|
80
|
-
|
|
81
|
-
- структури директорії правила (`meta.json`, підтеки `js/`, `policy/`, `.mdc`-файл);
|
|
82
|
-
- існування файлу `js-run.mdc` поруч (документ правила, на який спирається mdc-refs);
|
|
83
|
-
- API-контракту `RuleContext`, який тримається в `run-standard-rule.mjs`.
|
|
84
|
-
|
|
85
|
-
## Потік виконання / Використання
|
|
86
|
-
|
|
87
|
-
### Library-режим (батч-прогон правил)
|
|
88
|
-
|
|
89
|
-
```js
|
|
90
|
-
// Десь у CLI-оркестраторі @nitra/cursor
|
|
91
|
-
import { run as runJsRun } from '@nitra/cursor/rules/js-run/fix.mjs'
|
|
92
|
-
|
|
93
|
-
const ctx = createSharedContext() // walkCache, тощо
|
|
94
|
-
const code = await runJsRun(ctx) // 0 або 1
|
|
95
|
-
if (code !== 0) failures.push('js-run')
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
Послідовність:
|
|
99
|
-
|
|
100
|
-
1. Оркестратор створює спільний `ctx` (один на всі правила в прогоні).
|
|
101
|
-
2. Імпортує `run` з `fix.mjs` потрібного правила.
|
|
102
|
-
3. Викликає `run(ctx)` і чекає `Promise<number>`.
|
|
103
|
-
4. `run` делегує в `runStandardRule(dirname, ctx)`, яка читає `meta.json`, виконує applies → JS-concerns → policy → mdc-refs.
|
|
104
|
-
5. Результат — exit-code — повертається оркестратору, який агрегує всі коди й вирішує, з чим завершити сам процес.
|
|
105
|
-
|
|
106
|
-
### Standalone-режим (локальний дебаг або CI per-rule)
|
|
107
|
-
|
|
108
|
-
```bash
|
|
109
|
-
bun npm/rules/js-run/fix.mjs
|
|
110
|
-
# або
|
|
111
|
-
node npm/rules/js-run/fix.mjs
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Послідовність:
|
|
115
|
-
|
|
116
|
-
1. Інтерпретатор завантажує модуль.
|
|
117
|
-
2. Виконується top-level код: `isRunAsCli(import.meta.url)` повертає `true` (бо файл — entrypoint).
|
|
118
|
-
3. Викликається `await runRuleCli(import.meta.dirname)`:
|
|
119
|
-
- читає конфіг проєкту і whitelist;
|
|
120
|
-
- усередині запускає еквівалент `runStandardRule(dirname, ctx)`;
|
|
121
|
-
- друкує summary у stdout.
|
|
122
|
-
4. Повернений exit-code передається в `process.exit(...)`, який завершує процес з ним же.
|
|
123
|
-
5. CI/IDE/Husky отримують exit-code і вирішують, чи фейлити крок.
|
|
124
|
-
|
|
125
|
-
### Розширення / модифікація
|
|
126
|
-
|
|
127
|
-
- Щоб **додати специфічну логіку** для `js-run` за межами «стандартної» воронки — не правити цей файл, а додати чек у `js/` або `policy/` директорію правила. `runStandardRule` сам їх підхопить.
|
|
128
|
-
- Щоб **використати власний контекст** — передавати `ctx` із полем `walkCache: Map<string, FsEntry[]>` для шарингу обходу між правилами.
|
|
129
|
-
- Щоб **тимчасово виключити правило з batch** — оркестратор просто не імпортує `run` цього файлу. Сам файл такої логіки не містить.
|
|
130
|
-
|
|
131
|
-
### Інваріанти, які слід зберігати при змінах
|
|
132
|
-
|
|
133
|
-
1. Library-функція `run` **ніколи не викликає** `process.exit` — інакше зламається батч-прогон.
|
|
134
|
-
2. CLI-блок виконується **тільки** під охороною `isRunAsCli(import.meta.url)` — інакше імпорт зробить exit у чужому процесі.
|
|
135
|
-
3. У `runStandardRule` і `runRuleCli` передається `import.meta.dirname`, а не `import.meta.url` — це шлях, а не URL. Підміна типу зламає резолвінг `meta.json` і підправил.
|
|
136
|
-
4. Назва правила береться з імені директорії — не дублюй її рядком у цьому файлі.
|
|
137
|
-
|
|
138
|
-
## Rebuild Test
|
|
139
|
-
|
|
140
|
-
Виходячи з цього документа можна відновити еквівалентний файл `fix.mjs`:
|
|
141
|
-
|
|
142
|
-
1. Імпортувати `isRunAsCli` і `runRuleCli` з `../../scripts/lib/run-rule-cli.mjs`.
|
|
143
|
-
2. Імпортувати `runStandardRule` з `../../scripts/lib/run-standard-rule.mjs`.
|
|
144
|
-
3. Експортувати функцію `run(ctx)`, яка повертає `runStandardRule(import.meta.dirname, ctx)`.
|
|
145
|
-
4. Додати top-level `if (isRunAsCli(import.meta.url)) { process.exit(await runRuleCli(import.meta.dirname)) }` з ESLint-suppression-коментарем для `n/no-process-exit` і `unicorn/no-process-exit`.
|
|
146
|
-
5. JSDoc для `run`: параметр `ctx?: RuleContext` (тип із `run-standard-rule.mjs`), повертає `Promise<number>` (0 — OK, 1 — порушення).
|
|
147
|
-
|
|
148
|
-
Поведінкові ознаки для перевірки відновленого файлу:
|
|
149
|
-
|
|
150
|
-
- `import { run } from './fix.mjs'` працює без побічних ефектів (CLI-блок не активується).
|
|
151
|
-
- `bun fix.mjs` запускає повний CLI-прогон і завершує процес із кодом `0` або `1`.
|
|
152
|
-
- `run(ctx)` повертає `Promise`, який резолвиться у число.
|
|
153
|
-
- Файл не містить більше ніяких експортів і ніяких власних доменних перевірок.
|
|
36
|
+
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
37
|
+
- Кешує результати в межах одного прогону.
|
|
38
|
+
- Не звертається до мережі.
|