@7n/rules-lang-js 0.3.1 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/package.json +14 -4
- package/rules/bun/bunfig/bunfig.mdc +17 -0
- package/rules/bun/bunfig/bunfig.rego +29 -0
- package/rules/bun/bunfig/concern.json +9 -0
- package/rules/bun/bunfig/template/bunfig.toml.snippet.toml +2 -0
- package/rules/bun/docs/index.md +11 -0
- package/rules/bun/layout/concern.json +16 -0
- package/rules/bun/layout/docs/fix-layout.md +29 -0
- package/rules/bun/layout/docs/main.md +34 -0
- package/rules/bun/layout/fix-layout.mjs +63 -0
- package/rules/bun/layout/layout.mdc +60 -0
- package/rules/bun/layout/main.mjs +53 -0
- package/rules/bun/licensee/concern.json +7 -0
- package/rules/bun/licensee/docs/fix-licensee.md +27 -0
- package/rules/bun/licensee/docs/index.md +12 -0
- package/rules/bun/licensee/docs/main.md +30 -0
- package/rules/bun/licensee/fix-licensee.mjs +31 -0
- package/rules/bun/licensee/main.mjs +68 -0
- package/rules/bun/lint-surface/concern.json +3 -0
- package/rules/bun/lint-surface/lint-surface.mdc +13 -0
- package/rules/bun/main.json +1 -0
- package/rules/bun/main.mdc +11 -0
- package/rules/bun/package_json/concern.json +9 -0
- package/rules/bun/package_json/docs/fix-package_json.md +28 -0
- package/rules/bun/package_json/docs/index.md +9 -0
- package/rules/bun/package_json/fix-package_json.mjs +311 -0
- package/rules/bun/package_json/package_json.mdc +14 -0
- package/rules/bun/package_json/package_json.rego +64 -0
- package/rules/bun/package_json/template/package.json.deny.json +4 -0
- package/rules/js/check/check.mdc +26 -0
- package/rules/js/check/concern.json +19 -0
- package/rules/js/check/docs/eslint-config.md +56 -0
- package/rules/js/check/docs/fix-check.md +48 -0
- package/rules/js/check/docs/index.md +13 -0
- package/rules/js/check/docs/main.md +48 -0
- package/rules/js/check/eslint-config.mjs +262 -0
- package/rules/js/check/fix-check.mjs +82 -0
- package/rules/js/check/main.mjs +310 -0
- package/rules/js/dep-policy/concern.json +4 -0
- package/rules/js/dep-policy/dep-policy.mdc +36 -0
- package/rules/js/dep-policy/docs/main.md +35 -0
- package/rules/js/dep-policy/main.mjs +99 -0
- package/rules/js/docs/index.md +11 -0
- package/rules/js/eslint/concern.json +8 -0
- package/rules/js/eslint/docs/fix-eslint.md +50 -0
- package/rules/js/eslint/docs/fix-worker.md +31 -0
- package/rules/js/eslint/docs/index.md +11 -0
- package/rules/js/eslint/docs/main.md +35 -0
- package/rules/js/eslint/fix-eslint.mjs +160 -0
- package/rules/js/eslint/fix-worker.mjs +139 -0
- package/rules/js/eslint/main.mjs +115 -0
- package/rules/js/file-extensions/concern.json +3 -0
- package/rules/js/file-extensions/file-extensions.mdc +12 -0
- package/rules/js/jscpd_config/concern.json +11 -0
- package/rules/js/jscpd_config/docs/fix-jscpd_config.md +25 -0
- package/rules/js/jscpd_config/docs/index.md +9 -0
- package/rules/js/jscpd_config/fix-jscpd_config.mjs +3 -0
- package/rules/js/jscpd_config/jscpd_config.mdc +42 -0
- package/rules/js/jscpd_config/jscpd_config.rego +44 -0
- package/rules/js/jscpd_config/template/.jscpd.json.snippet.json +7 -0
- package/rules/js/jscpd_duplicates/concern.json +7 -0
- package/rules/js/jscpd_duplicates/docs/main.md +29 -0
- package/rules/js/jscpd_duplicates/main.mjs +69 -0
- package/rules/js/knip/concern.json +7 -0
- package/rules/js/knip/docs/main.md +31 -0
- package/rules/js/knip/knip.mdc +15 -0
- package/rules/js/knip/main.mjs +89 -0
- package/rules/js/lint-findings/concern.json +3 -0
- package/rules/js/lint-findings/docs/main.md +40 -0
- package/rules/js/lint-findings/main.mjs +125 -0
- package/rules/js/main.json +1 -0
- package/rules/js/main.mdc +18 -0
- package/rules/js/package_json/concern.json +9 -0
- package/rules/js/package_json/docs/fix-package_json.md +25 -0
- package/rules/js/package_json/docs/index.md +9 -0
- package/rules/js/package_json/fix-package_json.mjs +3 -0
- package/rules/js/package_json/package_json.mdc +15 -0
- package/rules/js/package_json/package_json.rego +142 -0
- package/rules/js/package_json/template/package.json.snippet.json +6 -0
- package/rules/js/tooling/concern.json +3 -0
- package/rules/js/tooling/data/tooling/knip-canonical.json +30 -0
- package/rules/js/tooling/data/tooling/oxlint-canonical.json +400 -0
- package/rules/js/tooling/docs/main.md +53 -0
- package/rules/js/tooling/main.mjs +183 -0
- package/rules/js/utils_imports/concern.json +4 -0
- package/rules/js/utils_imports/docs/main.md +50 -0
- package/rules/js/utils_imports/main.mjs +185 -0
- package/rules/js/utils_imports/utils_imports.mdc +15 -0
- package/rules/js/vscode_extensions/concern.json +11 -0
- package/rules/js/vscode_extensions/docs/fix-vscode_extensions.md +24 -0
- package/rules/js/vscode_extensions/docs/index.md +11 -0
- package/rules/js/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/js/vscode_extensions/template/extensions.json.snippet.json +6 -0
- package/rules/js/vscode_extensions/vscode_extensions.mdc +11 -0
- package/rules/js/vscode_extensions/vscode_extensions.rego +12 -0
- package/rules/js-bun-db/connection/concern.json +3 -0
- package/rules/js-bun-db/connection/connection.mdc +42 -0
- package/rules/js-bun-db/docs/index.md +11 -0
- package/rules/js-bun-db/lib/bun-sql-scan.mjs +1047 -0
- package/rules/js-bun-db/lib/docs/bun-sql-scan.md +63 -0
- package/rules/js-bun-db/lib/docs/index.md +11 -0
- package/rules/js-bun-db/main.json +1 -0
- package/rules/js-bun-db/main.mdc +8 -0
- package/rules/js-bun-db/package_json/concern.json +9 -0
- package/rules/js-bun-db/package_json/package_json.mdc +31 -0
- package/rules/js-bun-db/package_json/package_json.rego +15 -0
- package/rules/js-bun-db/package_json/template/package.json.deny.json +6 -0
- package/rules/js-bun-db/pg_format_identifiers/concern.json +3 -0
- package/rules/js-bun-db/pg_format_identifiers/pg_format_identifiers.mdc +104 -0
- package/rules/js-bun-db/safety/concern.json +4 -0
- package/rules/js-bun-db/safety/docs/main.md +34 -0
- package/rules/js-bun-db/safety/main.mjs +430 -0
- package/rules/js-bun-db/safety/safety.mdc +458 -0
- package/rules/js-bun-redis/docs/index.md +11 -0
- package/rules/js-bun-redis/imports/concern.json +4 -0
- package/rules/js-bun-redis/imports/docs/main.md +36 -0
- package/rules/js-bun-redis/imports/imports.mdc +47 -0
- package/rules/js-bun-redis/imports/main.mjs +88 -0
- package/rules/js-bun-redis/lib/docs/index.md +11 -0
- package/rules/js-bun-redis/lib/docs/redis-imports.md +227 -0
- package/rules/js-bun-redis/lib/redis-imports.mjs +130 -0
- package/rules/js-bun-redis/main.json +1 -0
- package/rules/js-bun-redis/main.mdc +8 -0
- package/rules/js-bun-redis/package_json/concern.json +9 -0
- package/rules/js-bun-redis/package_json/package_json.mdc +11 -0
- package/rules/js-bun-redis/package_json/package_json.rego +15 -0
- package/rules/js-bun-redis/package_json/template/package.json.deny.json +12 -0
- package/rules/js-mssql/deps/concern.json +4 -0
- package/rules/js-mssql/deps/docs/main.md +33 -0
- package/rules/js-mssql/deps/main.mjs +297 -0
- package/rules/js-mssql/docs/index.md +11 -0
- package/rules/js-mssql/lib/docs/index.md +11 -0
- package/rules/js-mssql/lib/docs/mssql-pool-scan.md +380 -0
- package/rules/js-mssql/lib/mssql-pool-scan.mjs +610 -0
- package/rules/js-mssql/main.json +1 -0
- package/rules/js-mssql/main.mdc +144 -0
- package/rules/js-mssql/mssql-tvp/concern.json +3 -0
- package/rules/js-mssql/mssql-tvp/mssql-tvp.mdc +77 -0
- package/rules/js-mssql/package_json/concern.json +9 -0
- package/rules/js-mssql/package_json/package_json.mdc +9 -0
- package/rules/js-mssql/package_json/package_json.rego +57 -0
- package/rules/js-run/configmap/concern.json +9 -0
- package/rules/js-run/configmap/configmap.mdc +37 -0
- package/rules/js-run/configmap/configmap.rego +21 -0
- package/rules/js-run/configmap/template/configmap.yaml.contains.yml +4 -0
- package/rules/js-run/docs/index.md +11 -0
- package/rules/js-run/jsconfig/concern.json +9 -0
- package/rules/js-run/jsconfig/docs/fix-jsconfig.md +28 -0
- package/rules/js-run/jsconfig/docs/index.md +9 -0
- package/rules/js-run/jsconfig/fix-jsconfig.mjs +119 -0
- package/rules/js-run/jsconfig/jsconfig.mdc +48 -0
- package/rules/js-run/jsconfig/jsconfig.rego +59 -0
- package/rules/js-run/jsconfig/template/jsconfig.json.snippet.json +10 -0
- package/rules/js-run/lib/bunyan-imports.mjs +98 -0
- package/rules/js-run/lib/check-env-scan.mjs +338 -0
- package/rules/js-run/lib/conn-file-rules.mjs +214 -0
- package/rules/js-run/lib/conn-imports-scan.mjs +154 -0
- package/rules/js-run/lib/docs/bunyan-imports.md +121 -0
- package/rules/js-run/lib/docs/check-env-scan.md +438 -0
- package/rules/js-run/lib/docs/conn-file-rules.md +304 -0
- package/rules/js-run/lib/docs/conn-imports-scan.md +208 -0
- package/rules/js-run/lib/docs/index.md +16 -0
- package/rules/js-run/lib/docs/promise-settimeout-scan.md +334 -0
- package/rules/js-run/lib/docs/temporal-scan.md +29 -0
- package/rules/js-run/lib/promise-settimeout-scan.mjs +128 -0
- package/rules/js-run/lib/temporal-scan.mjs +52 -0
- package/rules/js-run/main.json +1 -0
- package/rules/js-run/main.mdc +16 -0
- package/rules/js-run/package_json/concern.json +9 -0
- package/rules/js-run/package_json/package_json.mdc +44 -0
- package/rules/js-run/package_json/package_json.rego +37 -0
- package/rules/js-run/package_json/template/package.json.deny.json +22 -0
- package/rules/js-run/project-structure/concern.json +3 -0
- package/rules/js-run/project-structure/project-structure.mdc +11 -0
- package/rules/js-run/runtime/concern.json +12 -0
- package/rules/js-run/runtime/docs/fix-runtime.md +27 -0
- package/rules/js-run/runtime/docs/main.md +35 -0
- package/rules/js-run/runtime/fix-runtime.mjs +46 -0
- package/rules/js-run/runtime/main.mjs +496 -0
- package/rules/js-run/runtime/runtime.mdc +184 -0
- package/rules/js-run/scope/concern.json +3 -0
- package/rules/js-run/scope/scope.mdc +11 -0
- package/rules/npm-module/docs/index.md +11 -0
- package/rules/npm-module/emit_types_config/concern.json +9 -0
- package/rules/npm-module/emit_types_config/docs/fix-emit_types_config.md +25 -0
- package/rules/npm-module/emit_types_config/docs/index.md +9 -0
- package/rules/npm-module/emit_types_config/emit_types_config.mdc +43 -0
- package/rules/npm-module/emit_types_config/emit_types_config.rego +28 -0
- package/rules/npm-module/emit_types_config/fix-emit_types_config.mjs +5 -0
- package/rules/npm-module/emit_types_config/template/tsconfig.emit-types.json.snippet.json +9 -0
- package/rules/npm-module/header_doc_pointer/concern.json +5 -0
- package/rules/npm-module/header_doc_pointer/docs/main.md +40 -0
- package/rules/npm-module/header_doc_pointer/header_doc_pointer.mdc +18 -0
- package/rules/npm-module/header_doc_pointer/main.mjs +131 -0
- package/rules/npm-module/main.json +1 -0
- package/rules/npm-module/main.mdc +36 -0
- package/rules/npm-module/npm_package_json/concern.json +9 -0
- package/rules/npm-module/npm_package_json/docs/fix-npm_package_json.md +26 -0
- package/rules/npm-module/npm_package_json/docs/index.md +9 -0
- package/rules/npm-module/npm_package_json/fix-npm_package_json.mjs +5 -0
- package/rules/npm-module/npm_package_json/npm_package_json.mdc +57 -0
- package/rules/npm-module/npm_package_json/npm_package_json.rego +73 -0
- package/rules/npm-module/npm_package_json/template/package.json.snippet.json +1 -0
- package/rules/npm-module/package_structure/concern.json +5 -0
- package/rules/npm-module/package_structure/docs/main.md +37 -0
- package/rules/npm-module/package_structure/main.mjs +448 -0
- package/rules/npm-module/package_structure/package_structure.mdc +63 -0
- package/rules/npm-module/root_package_json/concern.json +9 -0
- package/rules/npm-module/root_package_json/docs/fix-root_package_json.md +25 -0
- package/rules/npm-module/root_package_json/docs/index.md +9 -0
- package/rules/npm-module/root_package_json/fix-root_package_json.mjs +5 -0
- package/rules/npm-module/root_package_json/root_package_json.mdc +41 -0
- package/rules/npm-module/root_package_json/root_package_json.rego +28 -0
- package/rules/npm-module/root_package_json/template/package.json.snippet.json +1 -0
- package/rules/npm-module/rule_meta/concern.json +8 -0
- package/rules/npm-module/rule_meta/docs/main.md +35 -0
- package/rules/npm-module/rule_meta/main.mjs +119 -0
- package/rules/npm-module/rule_meta/rule_meta.mdc +11 -0
- package/rules/npm-module/skill_meta/concern.json +5 -0
- package/rules/npm-module/skill_meta/docs/main.md +149 -0
- package/rules/npm-module/skill_meta/main.mjs +91 -0
- package/rules/npm-module/skill_meta/skill_meta.mdc +11 -0
- package/rules/tool-surface/docs/index.md +11 -0
- package/rules/tool-surface/main.json +6 -0
- package/rules/tool-surface/main.mdc +72 -0
- package/rules/vue/composition-api/composition-api.mdc +82 -0
- package/rules/vue/composition-api/concern.json +3 -0
- package/rules/vue/docs/index.md +11 -0
- package/rules/vue/lib/docs/index.md +11 -0
- package/rules/vue/lib/docs/vue-forbidden-imports.md +265 -0
- package/rules/vue/lib/vue-forbidden-imports.mjs +240 -0
- package/rules/vue/main.json +1 -0
- package/rules/vue/main.mdc +18 -0
- package/rules/vue/nheader-layout/concern.json +3 -0
- package/rules/vue/nheader-layout/nheader-layout.mdc +171 -0
- package/rules/vue/package_json/concern.json +9 -0
- package/rules/vue/package_json/package_json.mdc +30 -0
- package/rules/vue/package_json/package_json.rego +140 -0
- package/rules/vue/packages/concern.json +6 -0
- package/rules/vue/packages/docs/index.md +11 -0
- package/rules/vue/packages/docs/main.md +35 -0
- package/rules/vue/packages/main.mjs +575 -0
- package/rules/vue/packages/packages.mdc +56 -0
- package/rules/vue/quasar-ui/concern.json +3 -0
- package/rules/vue/quasar-ui/quasar-ui.mdc +32 -0
- package/rules/vue/structure/concern.json +3 -0
- package/rules/vue/structure/structure.mdc +101 -0
- package/rules/vue/testing/concern.json +3 -0
- package/rules/vue/testing/testing.mdc +40 -0
- package/rules/vue/tfm-translations/concern.json +7 -0
- package/rules/vue/tfm-translations/docs/main.md +29 -0
- package/rules/vue/tfm-translations/main.mjs +55 -0
- package/rules/vue/tfm-translations/tfm-translations.mdc +32 -0
- package/rules/vue/vite-config/concern.json +3 -0
- package/rules/vue/vite-config/vite-config.mdc +153 -0
- package/rules/vue/vite-env/concern.json +3 -0
- package/rules/vue/vite-env/vite-env.mdc +61 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Directory Index
|
|
3
|
+
title: npm/rules/js-bun-redis/lib
|
|
4
|
+
resource: plugins/lang-js/rules/js-bun-redis/lib/
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# npm/rules/js-bun-redis/lib
|
|
8
|
+
|
|
9
|
+
| Файл | Тип |
|
|
10
|
+
| ------------------------------------- | --------- |
|
|
11
|
+
| [redis-imports.mjs](redis-imports.md) | JS Module |
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: redis-imports.mjs
|
|
4
|
+
resource: plugins/lang-js/rules/js-bun-redis/lib/redis-imports.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: e150f3a1
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Модуль `redis-imports.mjs` — це сканер вихідного коду, який знаходить **заборонені** імпорти Redis-клієнтів (`ioredis`, `node-redis`, кореневий пакет `redis` та супутні підпакети сімейства `@redis/*`) у JavaScript/TypeScript-файлах. Метою сканера є **виявлення місць, які треба замінити на Bun native Redis** — стандартизований API `import { redis } from 'bun'` (див. `https://bun.com/docs/runtime/redis`).
|
|
10
|
+
|
|
11
|
+
Семантичне розпізнавання імпортів виконується через AST-парсер **`oxc-parser`** (а не regex по тілу файлу), тож сканер коректно відрізняє рядкові літерали, коментарі та реальні `import`/`require`. Підтримуються три форми входу модулів:
|
|
12
|
+
|
|
13
|
+
1. **Статичні ES-імпорти** — через `result.module.staticImports`.
|
|
14
|
+
2. **CommonJS `require('...')`** — через обхід AST і утиліту `requireCallModule`.
|
|
15
|
+
3. **Динамічні `import('...')`** — через обхід AST і утиліту `dynamicImportModule`.
|
|
16
|
+
|
|
17
|
+
Це дає змогу єдиним проходом покривати і ESM-код, і CommonJS, і змішані сценарії з динамічним підвантаженням у межах одного файлу.
|
|
18
|
+
|
|
19
|
+
Сканер є **частиною правила** `js-bun-redis.mdc` у системі правил `n-rules` (директорія `npm/rules/js-bun-redis/`) і використовується чек-скриптами правила для пошуку порушень у пакетах монорепо.
|
|
20
|
+
|
|
21
|
+
Сканер **не вимагає**, щоб файл був синтаксично коректним: якщо `oxc-parser` повертає помилку або `result.errors` непорожній, функція повертає порожній масив порушень. Тобто спершу треба полагодити синтаксис, а вже потім перезапускати перевірку — інакше сканер просто «нічого не знайде».
|
|
22
|
+
|
|
23
|
+
## Експорти / API
|
|
24
|
+
|
|
25
|
+
Модуль експортує **три** іменовані функції:
|
|
26
|
+
|
|
27
|
+
| Експорт | Тип | Призначення |
|
|
28
|
+
| ----------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------- |
|
|
29
|
+
| `findRedisImportsInText(content, virtualPath?)` | `function` | Повертає масив знайдених заборонених імпортів Redis у переданому коді. |
|
|
30
|
+
| `isRedisScanSourceFile(relativePath)` | `function` | Предикат: чи треба сканувати файл за розширенням (`.js/.mjs/.cjs/.jsx/.ts/.mts/.cts/.tsx`). |
|
|
31
|
+
| `shouldSkipFileForRedisScan(relativePosix)` | `function` | Предикат: чи слід пропустити файл (декларації типів `.d.ts`). |
|
|
32
|
+
|
|
33
|
+
Default export відсутній.
|
|
34
|
+
|
|
35
|
+
## Функції
|
|
36
|
+
|
|
37
|
+
### `isForbiddenRedisModule(mod)` (внутрішня)
|
|
38
|
+
|
|
39
|
+
**Сигнатура:** `function isForbiddenRedisModule(mod: string): boolean`
|
|
40
|
+
|
|
41
|
+
**Параметри:**
|
|
42
|
+
|
|
43
|
+
- `mod` — рядкове значення специфікатора модуля з конструкцій `import '...'`, `require('...')` або `import('...')`.
|
|
44
|
+
|
|
45
|
+
**Повертає:** `true`, якщо `mod`:
|
|
46
|
+
|
|
47
|
+
- входить у множину точних збігів `FORBIDDEN_MODULE_NAMES`: `'ioredis'`, `'node-redis'`, `'redis'`, `'@redis/client'`, `'@redis/json'`, `'@redis/search'`, `'@redis/time-series'`, `'@redis/bloom'`;
|
|
48
|
+
- **або** починається з префіксу `'ioredis/'`, `'redis/'`, `'@redis/'` — для підшляхів (`ioredis/built/utils`, `redis/dist/...`, `@redis/<sub>`).
|
|
49
|
+
|
|
50
|
+
Інакше повертає `false`. Префіксний підхід **навмисно** ловить підшляхи Redis-пакетів, але **не зачіпає** сторонні пакети-сусіди типу `redis-mock` (бо вони не починаються з `redis/`, а саме з `redis-`).
|
|
51
|
+
|
|
52
|
+
**Side effects:** немає (чиста функція).
|
|
53
|
+
|
|
54
|
+
**Видимість:** локальна для модуля; не експортується.
|
|
55
|
+
|
|
56
|
+
### `findRedisImportsInText(content, virtualPath = 'scan.ts')`
|
|
57
|
+
|
|
58
|
+
**Сигнатура:**
|
|
59
|
+
|
|
60
|
+
```js
|
|
61
|
+
export function findRedisImportsInText(
|
|
62
|
+
content: string,
|
|
63
|
+
virtualPath?: string
|
|
64
|
+
): { line: number, snippet: string, module: string }[]
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Параметри:**
|
|
68
|
+
|
|
69
|
+
- `content` — повний текст вихідного файлу як рядок.
|
|
70
|
+
- `virtualPath` _(необовʼязковий, дефолт `'scan.ts'`)_ — шлях, який передається в парсер і використовується для визначення мови через `langFromPath(...)`. Може бути «віртуальним», тобто не існувати на ФС — потрібен лише для вибору режиму парсингу (наприклад, `.ts` vs `.tsx`). Якщо передати порожній рядок чи `undefined`, всередині буде підставлено `'scan.ts'`.
|
|
71
|
+
|
|
72
|
+
**Повертає:** масив обʼєктів-порушень, де кожен елемент має поля:
|
|
73
|
+
|
|
74
|
+
- `line: number` — 1-based номер рядка, де починається `import`/`require`/`import(...)` (через `offsetToLine(content, start)`);
|
|
75
|
+
- `snippet: string` — нормалізований фрагмент коду цього вузла (через `normalizeSnippet(content.slice(start, end))`);
|
|
76
|
+
- `module: string` — фактичний специфікатор модуля (`'ioredis'`, `'redis/dist/...'`, `'@redis/json'` тощо).
|
|
77
|
+
|
|
78
|
+
Якщо файл синтаксично некоректний (`parseSync` кинув виключення) або `result.errors` непорожній — повертає `[]`.
|
|
79
|
+
|
|
80
|
+
**Side effects:** немає (чиста функція; не звертається до ФС, не пише в stdout).
|
|
81
|
+
|
|
82
|
+
**Алгоритм:**
|
|
83
|
+
|
|
84
|
+
1. Обирає `lang` для парсера через `langFromPath(pathForLang)`.
|
|
85
|
+
2. Викликає `parseSync(pathForLang, content, { lang, sourceType: 'module' })` у `try/catch`.
|
|
86
|
+
3. Якщо парсинг кинув / повернув помилки — `return []`.
|
|
87
|
+
4. Проходить **статичні імпорти** через `result.module?.staticImports ?? []`; для кожного, де `imp.moduleRequest?.value` — рядок і `isForbiddenRedisModule(...)` істинне, додає запис у вихідний масив.
|
|
88
|
+
5. Проходить AST програми через `walkAstWithAncestors(result.program, [], node => {...})`:
|
|
89
|
+
- якщо `requireCallModule(node)` повертає рядок із забороненим модулем — додає запис і **повертається** (`return`), щоб не дублювати спробу як динамічний `import` для того самого вузла;
|
|
90
|
+
- інакше пробує `dynamicImportModule(node)` і так само додає запис при збігу.
|
|
91
|
+
6. Повертає накопичений масив `out`.
|
|
92
|
+
|
|
93
|
+
### `isRedisScanSourceFile(relativePath)`
|
|
94
|
+
|
|
95
|
+
**Сигнатура:** `export function isRedisScanSourceFile(relativePath: string): boolean`
|
|
96
|
+
|
|
97
|
+
**Параметри:**
|
|
98
|
+
|
|
99
|
+
- `relativePath` — відносний шлях до файлу.
|
|
100
|
+
|
|
101
|
+
**Повертає:** `true`, якщо шлях підпадає під регулярний вираз `SOURCE_FILE_RE = /\.([cm]?[jt]sx?)$/u`, тобто має одне з розширень `.js`, `.mjs`, `.cjs`, `.jsx`, `.ts`, `.mts`, `.cts`, `.tsx`. Інакше — `false`.
|
|
102
|
+
|
|
103
|
+
**Side effects:** немає.
|
|
104
|
+
|
|
105
|
+
### `shouldSkipFileForRedisScan(relativePosix)`
|
|
106
|
+
|
|
107
|
+
**Сигнатура:** `export function shouldSkipFileForRedisScan(relativePosix: string): boolean`
|
|
108
|
+
|
|
109
|
+
**Параметри:**
|
|
110
|
+
|
|
111
|
+
- `relativePosix` — шлях з POSIX-роздільниками (`/`).
|
|
112
|
+
|
|
113
|
+
**Повертає:** `true`, якщо файл закінчується на `.d.ts` — декларації типів TypeScript не виконуваний код, у них не може бути «реальних» імпортів-споживачів Redis, тому їх сканувати не варто. Для решти файлів — `false`.
|
|
114
|
+
|
|
115
|
+
**Side effects:** немає.
|
|
116
|
+
|
|
117
|
+
## Залежності
|
|
118
|
+
|
|
119
|
+
### Зовнішні (npm)
|
|
120
|
+
|
|
121
|
+
- **`oxc-parser`** — використовується через іменований імпорт `parseSync` для отримання AST програми та переліку статичних імпортів модуля.
|
|
122
|
+
|
|
123
|
+
### Внутрішні (репозиторій)
|
|
124
|
+
|
|
125
|
+
Імпорт із `'../../../scripts/utils/ast-scan-utils.mjs'` — спільні утиліти AST-сканера для всіх правил у `npm/rules/*/lib/`:
|
|
126
|
+
|
|
127
|
+
- `dynamicImportModule(node)` — якщо вузол AST є динамічним `import('mod')`, повертає рядок `'mod'`, інакше `null`/`undefined`.
|
|
128
|
+
- `langFromPath(path)` — обчислює `lang` для `oxc-parser` за розширенням шляху.
|
|
129
|
+
- `normalizeSnippet(src)` — нормалізує сирий зріз коду (приведення пробілів/обрізання) для зручного звіту.
|
|
130
|
+
- `offsetToLine(content, offset)` — конвертує абсолютний offset символа у 1-based номер рядка.
|
|
131
|
+
- `requireCallModule(node)` — якщо вузол є викликом `require('mod')`, повертає рядок `'mod'`, інакше `null`/`undefined`.
|
|
132
|
+
- `walkAstWithAncestors(program, ancestors, visitor)` — обхід AST програми з накопиченням предків.
|
|
133
|
+
|
|
134
|
+
### Константи модуля
|
|
135
|
+
|
|
136
|
+
- `SOURCE_FILE_RE = /\.([cm]?[jt]sx?)$/u` — регекс розширень JS/TS-сімʼї.
|
|
137
|
+
- `FORBIDDEN_MODULE_NAMES` — `Set<string>` із вісьмома точними іменами заборонених модулів.
|
|
138
|
+
|
|
139
|
+
## Потік виконання / Використання
|
|
140
|
+
|
|
141
|
+
### Типовий сценарій
|
|
142
|
+
|
|
143
|
+
1. Обхідник пакета монорепо отримує список файлів через `readdir/walk`.
|
|
144
|
+
2. Для кожного файлу:
|
|
145
|
+
- перевіряє `shouldSkipFileForRedisScan(relativePosix)` → якщо `true`, файл пропускається (наприклад, `*.d.ts`);
|
|
146
|
+
- перевіряє `isRedisScanSourceFile(relativePosix)` → якщо `false`, файл пропускається (нерелевантне розширення);
|
|
147
|
+
- інакше читає вміст файлу та викликає `findRedisImportsInText(content, virtualPath)`.
|
|
148
|
+
3. Отриманий масив порушень агрегується у звіт правила `js-bun-redis`.
|
|
149
|
+
|
|
150
|
+
### Приклад
|
|
151
|
+
|
|
152
|
+
```js
|
|
153
|
+
import { readFileSync } from 'node:fs'
|
|
154
|
+
import { findRedisImportsInText, isRedisScanSourceFile, shouldSkipFileForRedisScan } from './redis-imports.mjs'
|
|
155
|
+
|
|
156
|
+
const file = 'pkg/src/cache.ts'
|
|
157
|
+
if (!shouldSkipFileForRedisScan(file) && isRedisScanSourceFile(file)) {
|
|
158
|
+
const content = readFileSync(file, 'utf8')
|
|
159
|
+
const violations = findRedisImportsInText(content, file)
|
|
160
|
+
for (const v of violations) {
|
|
161
|
+
console.log(`${file}:${v.line} forbidden import of ${v.module} -> ${v.snippet}`)
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Що саме розпізнається як порушення
|
|
167
|
+
|
|
168
|
+
Усі наступні форми у `cache.ts` будуть знайдені:
|
|
169
|
+
|
|
170
|
+
```ts
|
|
171
|
+
import Redis from 'ioredis' // ESM static, точна назва
|
|
172
|
+
import { createClient } from 'redis' // ESM static, кореневий node-redis
|
|
173
|
+
import json from '@redis/json' // ESM static, підпакет @redis/*
|
|
174
|
+
import utils from 'ioredis/built/utils' // ESM static, підшлях ioredis/
|
|
175
|
+
const Redis2 = require('ioredis') // CommonJS require
|
|
176
|
+
const lib = await import('node-redis') // динамічний ESM import
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
А ось такі **не** будуть позначені (бо це сторонні пакети):
|
|
180
|
+
|
|
181
|
+
```ts
|
|
182
|
+
import { mock } from 'redis-mock' // not ioredis/redis/@redis
|
|
183
|
+
import x from 'my-redis-helpers' // довільний сторонній пакет
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Поведінка на помилках
|
|
187
|
+
|
|
188
|
+
- Якщо `parseSync` кинув виняток — порожній результат `[]`.
|
|
189
|
+
- Якщо `result.errors?.length` істинний — порожній результат `[]`.
|
|
190
|
+
- Користувач має спершу полагодити синтаксис файлу, тільки тоді повторно запускати перевірку.
|
|
191
|
+
|
|
192
|
+
### Інтеграція з правилом
|
|
193
|
+
|
|
194
|
+
Модуль є **бібліотечним** шаром (`lib/`) правила `js-bun-redis`. Чек-скрипт правила (типово `npm/rules/js-bun-redis/check-*.mjs`) імпортує ці три функції, обходить файли пакета і формує звіт. Заміна — на Bun native Redis (`import { redis } from 'bun'`).
|
|
195
|
+
|
|
196
|
+
## Rebuild Test
|
|
197
|
+
|
|
198
|
+
Контрольний перелік, за яким можна **відтворити** функціонал модуля «з нуля»:
|
|
199
|
+
|
|
200
|
+
1. Створити файл `redis-imports.mjs`, що імпортує `parseSync` з `oxc-parser`.
|
|
201
|
+
2. Імпортувати з `'../../../scripts/utils/ast-scan-utils.mjs'` шість утиліт: `dynamicImportModule`, `langFromPath`, `normalizeSnippet`, `offsetToLine`, `requireCallModule`, `walkAstWithAncestors`.
|
|
202
|
+
3. Оголосити константу `SOURCE_FILE_RE = /\.([cm]?[jt]sx?)$/u`.
|
|
203
|
+
4. Оголосити константу `FORBIDDEN_MODULE_NAMES` як `Set` із елементами: `'ioredis'`, `'node-redis'`, `'redis'`, `'@redis/client'`, `'@redis/json'`, `'@redis/search'`, `'@redis/time-series'`, `'@redis/bloom'`.
|
|
204
|
+
5. Реалізувати приватну функцію `isForbiddenRedisModule(mod)`: повертає `true`, якщо `FORBIDDEN_MODULE_NAMES.has(mod)` **або** `mod.startsWith('ioredis/')` **або** `mod.startsWith('redis/')` **або** `mod.startsWith('@redis/')`.
|
|
205
|
+
6. Експортувати функцію `findRedisImportsInText(content, virtualPath = 'scan.ts')`:
|
|
206
|
+
1. `pathForLang = virtualPath || 'scan.ts'`;
|
|
207
|
+
2. `lang = langFromPath(pathForLang)`;
|
|
208
|
+
3. у `try { parseSync(pathForLang, content, { lang, sourceType: 'module' }) } catch { return [] }`;
|
|
209
|
+
4. якщо `result.errors?.length` — `return []`;
|
|
210
|
+
5. ініціалізувати `out = []`;
|
|
211
|
+
6. пройти `result.module?.staticImports ?? []` — для кожного, де `imp.moduleRequest?.value` рядок і `isForbiddenRedisModule(...)` істинне, пушити `{ line: offsetToLine(content, imp.start), snippet: normalizeSnippet(content.slice(imp.start, imp.end)), module: mod }`;
|
|
212
|
+
7. викликати `walkAstWithAncestors(result.program, [], node => {...})`:
|
|
213
|
+
- спершу спробувати `requireCallModule(node)`; на збігу пушити запис і `return`;
|
|
214
|
+
- потім `dynamicImportModule(node)`; на збігу пушити запис;
|
|
215
|
+
8. повернути `out`.
|
|
216
|
+
7. Експортувати функцію `isRedisScanSourceFile(relativePath)`: `return SOURCE_FILE_RE.test(relativePath)`.
|
|
217
|
+
8. Експортувати функцію `shouldSkipFileForRedisScan(relativePosix)`: `return relativePosix.endsWith('.d.ts')`.
|
|
218
|
+
|
|
219
|
+
Контрольні очікування:
|
|
220
|
+
|
|
221
|
+
- Виклик `findRedisImportsInText("import x from 'ioredis'", 'a.ts')` повертає масив із одного елемента, де `module === 'ioredis'`, `line === 1`.
|
|
222
|
+
- Виклик `findRedisImportsInText("import x from 'redis-mock'", 'a.ts')` повертає `[]`.
|
|
223
|
+
- Виклик `findRedisImportsInText("const r = require('@redis/json')", 'a.js')` повертає масив із одного елемента, де `module === '@redis/json'`.
|
|
224
|
+
- Виклик `findRedisImportsInText("await import('redis/dist/x')", 'a.mjs')` повертає масив із одного елемента, де `module === 'redis/dist/x'`.
|
|
225
|
+
- Виклик `findRedisImportsInText("import 'ioredis'; syntax error here {{", 'a.ts')` повертає `[]` (через помилку парсингу/`errors`).
|
|
226
|
+
- `isRedisScanSourceFile('foo.ts')` → `true`; `isRedisScanSourceFile('foo.md')` → `false`.
|
|
227
|
+
- `shouldSkipFileForRedisScan('types/foo.d.ts')` → `true`; `shouldSkipFileForRedisScan('src/foo.ts')` → `false`.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Знаходить імпорти з `ioredis` та `node-redis` (та підшляхів `redis/...`) у джерелах —
|
|
3
|
+
* їх треба замінити на Bun native Redis (`import { redis } from 'bun'`) згідно з
|
|
4
|
+
* `js-bun-redis.mdc` (<https://bun.com/docs/runtime/redis>).
|
|
5
|
+
*
|
|
6
|
+
* Семантика береться з **oxc-parser** (`module.staticImports`) — без regex по тілу файлу.
|
|
7
|
+
* Додатково по AST програми ловимо `require('ioredis')` і динамічний `import('ioredis')`,
|
|
8
|
+
* щоб правило працювало і у CommonJS, і при динамічному `import` у межах одного файлу.
|
|
9
|
+
*
|
|
10
|
+
* `node-redis` публікується під рядом імен:
|
|
11
|
+
* - кореневий пакет `redis` (саме так його імпортують у v4+);
|
|
12
|
+
* - історичний `node-redis` (рідше);
|
|
13
|
+
* - підпакети, які тягнуться разом: `@redis/client`, `@redis/json`, `@redis/search`,
|
|
14
|
+
* `@redis/time-series`, `@redis/bloom` — їх теж треба прибирати разом із основним
|
|
15
|
+
* клієнтом, щоб не лишилось «половини» інтеграції після переходу на Bun.
|
|
16
|
+
*
|
|
17
|
+
* Сканер не вимагає, щоб файл компілювався: при синтаксичних помилках повертається порожній
|
|
18
|
+
* результат — спочатку треба полагодити синтаксис, потім перезапустити перевірку.
|
|
19
|
+
*/
|
|
20
|
+
import { parseSync } from 'oxc-parser'
|
|
21
|
+
|
|
22
|
+
import {
|
|
23
|
+
dynamicImportModule,
|
|
24
|
+
langFromPath,
|
|
25
|
+
normalizeSnippet,
|
|
26
|
+
offsetToLine,
|
|
27
|
+
requireCallModule,
|
|
28
|
+
walkAstWithAncestors
|
|
29
|
+
} from '@7n/rules/scripts/utils/ast-scan-utils.mjs'
|
|
30
|
+
|
|
31
|
+
const SOURCE_FILE_RE = /\.([cm]?[jt]sx?)$/u
|
|
32
|
+
const FORBIDDEN_MODULE_NAMES = new Set([
|
|
33
|
+
'ioredis',
|
|
34
|
+
'node-redis',
|
|
35
|
+
'redis',
|
|
36
|
+
'@redis/client',
|
|
37
|
+
'@redis/json',
|
|
38
|
+
'@redis/search',
|
|
39
|
+
'@redis/time-series',
|
|
40
|
+
'@redis/bloom'
|
|
41
|
+
])
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Чи є рядок-специфікатор імпорту забороненим (`ioredis`, `node-redis`, `redis`, `redis/...`,
|
|
45
|
+
* `ioredis/...`, `@redis/<sub>`).
|
|
46
|
+
*
|
|
47
|
+
* Використовуємо префікс-збіг для `ioredis/` та `redis/` — щоб ловити підшляхи
|
|
48
|
+
* (`ioredis/built/utils`, `redis/dist/...`), але не зачепити сторонні пакети
|
|
49
|
+
* на кшталт `redis-mock`, які треба валідувати окремо.
|
|
50
|
+
* @param {string} mod рядкове значення з `import '...'` / `require('...')`
|
|
51
|
+
* @returns {boolean} true, якщо такий specifier треба викинути на користь Bun native Redis
|
|
52
|
+
*/
|
|
53
|
+
function isForbiddenRedisModule(mod) {
|
|
54
|
+
if (FORBIDDEN_MODULE_NAMES.has(mod)) return true
|
|
55
|
+
return mod.startsWith('ioredis/') || mod.startsWith('redis/') || mod.startsWith('@redis/')
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Знаходить заборонені імпорти/require з `ioredis` / `node-redis` у тексті.
|
|
60
|
+
* @param {string} content вихідний код
|
|
61
|
+
* @param {string} [virtualPath] шлях для вибору `lang` (наприклад `pkg/src/foo.ts`)
|
|
62
|
+
* @returns {{ line: number, snippet: string, module: string }[]} список порушень
|
|
63
|
+
*/
|
|
64
|
+
export function findRedisImportsInText(content, virtualPath = 'scan.ts') {
|
|
65
|
+
const pathForLang = virtualPath || 'scan.ts'
|
|
66
|
+
const lang = langFromPath(pathForLang)
|
|
67
|
+
let result
|
|
68
|
+
try {
|
|
69
|
+
result = parseSync(pathForLang, content, { lang, sourceType: 'module' })
|
|
70
|
+
} catch {
|
|
71
|
+
return []
|
|
72
|
+
}
|
|
73
|
+
if (result.errors?.length) {
|
|
74
|
+
return []
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** @type {{ line: number, snippet: string, module: string }[]} */
|
|
78
|
+
const out = []
|
|
79
|
+
|
|
80
|
+
for (const imp of result.module?.staticImports ?? []) {
|
|
81
|
+
const mod = imp.moduleRequest?.value
|
|
82
|
+
if (typeof mod === 'string' && isForbiddenRedisModule(mod)) {
|
|
83
|
+
out.push({
|
|
84
|
+
line: offsetToLine(content, imp.start),
|
|
85
|
+
snippet: normalizeSnippet(content.slice(imp.start, imp.end)),
|
|
86
|
+
module: mod
|
|
87
|
+
})
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
walkAstWithAncestors(result.program, [], node => {
|
|
92
|
+
const reqMod = requireCallModule(node)
|
|
93
|
+
if (reqMod && isForbiddenRedisModule(reqMod)) {
|
|
94
|
+
out.push({
|
|
95
|
+
line: offsetToLine(content, node.start),
|
|
96
|
+
snippet: normalizeSnippet(content.slice(node.start, node.end)),
|
|
97
|
+
module: reqMod
|
|
98
|
+
})
|
|
99
|
+
return
|
|
100
|
+
}
|
|
101
|
+
const dynMod = dynamicImportModule(node)
|
|
102
|
+
if (dynMod && isForbiddenRedisModule(dynMod)) {
|
|
103
|
+
out.push({
|
|
104
|
+
line: offsetToLine(content, node.start),
|
|
105
|
+
snippet: normalizeSnippet(content.slice(node.start, node.end)),
|
|
106
|
+
module: dynMod
|
|
107
|
+
})
|
|
108
|
+
}
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
return out
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Чи сканувати цей файл за розширенням (JS/TS-сімʼя).
|
|
116
|
+
* @param {string} relativePath відносний шлях до файлу
|
|
117
|
+
* @returns {boolean} `true`, якщо розширення підходить для пошуку імпорту
|
|
118
|
+
*/
|
|
119
|
+
export function isRedisScanSourceFile(relativePath) {
|
|
120
|
+
return SOURCE_FILE_RE.test(relativePath)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Чи слід пропустити файл під час обходу пакета (декларації типів — лише типи, не виконувані).
|
|
125
|
+
* @param {string} relativePosix шлях з posix-слешами
|
|
126
|
+
* @returns {boolean} `true`, якщо файл не сканувати
|
|
127
|
+
*/
|
|
128
|
+
export function shouldSkipFileForRedisScan(relativePosix) {
|
|
129
|
+
return relativePosix.endsWith('.d.ts')
|
|
130
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "predicate": "depInAnyPackageJson", "arg": ["ioredis", "node-redis"] } }
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Використання Redis/Valkey з Bun
|
|
3
|
+
globs: "**/package.json,**/src/conn/**"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
version: '1.2'
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Правило забороняє використання застарілих redis-клієнтів (`ioredis`, `node-redis`, `redis`, `@redis/*`) і вимагає переходу на **Bun native Redis** (`import { redis } from 'bun'`). Підтримувана версія Redis: **7.2+**.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
## Rego gate: заборонені redis-залежності у `package.json`
|
|
2
|
+
|
|
3
|
+
Rego-пакет: `js-bun-redis.package_json`
|
|
4
|
+
|
|
5
|
+
**Цільовий файл:** `package.json` (поле `dependencies`)
|
|
6
|
+
|
|
7
|
+
Перевіряє наявність заборонених redis-пакетів у `dependencies`. Список заборон надходить через `--data` з канонічного шаблону:
|
|
8
|
+
|
|
9
|
+
[package.json.deny.json](./template/package.json.deny.json)
|
|
10
|
+
|
|
11
|
+
Повідомлення про порушення формується як `dependencies.<pkg> — <reason>`.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Перевірка `dependencies` (js-bun-redis.mdc).
|
|
2
|
+
#
|
|
3
|
+
# Канон надходить через --data: { "template": { "deny": ... } }
|
|
4
|
+
# Структура --data сформована з template/package.json.deny.json.
|
|
5
|
+
# AST-скан коду (`import`/`require`/dynamic `import()` тих самих пакетів)
|
|
6
|
+
# лишається у `js-bun-redis/js/imports.mjs`.
|
|
7
|
+
package js_bun_redis.package_json
|
|
8
|
+
|
|
9
|
+
import rego.v1
|
|
10
|
+
|
|
11
|
+
deny contains msg if {
|
|
12
|
+
some pkg, reason in data.template.deny.dependencies
|
|
13
|
+
pkg in object.keys(object.get(input, "dependencies", {}))
|
|
14
|
+
msg := sprintf("dependencies.%s — %s", [pkg, reason])
|
|
15
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"dependencies": {
|
|
3
|
+
"ioredis": "заміни на Bun native Redis (js-bun-redis.mdc)",
|
|
4
|
+
"node-redis": "заміни на Bun native Redis (js-bun-redis.mdc)",
|
|
5
|
+
"redis": "заміни на Bun native Redis (js-bun-redis.mdc)",
|
|
6
|
+
"@redis/client": "заміни на Bun native Redis (js-bun-redis.mdc)",
|
|
7
|
+
"@redis/json": "заміни на Bun native Redis (js-bun-redis.mdc)",
|
|
8
|
+
"@redis/search": "заміни на Bun native Redis (js-bun-redis.mdc)",
|
|
9
|
+
"@redis/time-series": "заміни на Bun native Redis (js-bun-redis.mdc)",
|
|
10
|
+
"@redis/bloom": "заміни на Bun native Redis (js-bun-redis.mdc)"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: main.mjs
|
|
4
|
+
resource: plugins/lang-js/rules/js-mssql/deps/main.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 3b2370ca
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 85
|
|
9
|
+
issues: anchor-miss:(js-mssql.mdc),surzhik,judge:inaccurate:0.99
|
|
10
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Огляд
|
|
14
|
+
|
|
15
|
+
Огляд
|
|
16
|
+
Виконує перевірку відповідності проєкту стандартам безпечного використання `mssql`. Гарантує, що підхід до доступу до бази даних відповідає мінімальним вимогам безпеки, визначеним у `package.json`, та враховує маркери повідомлень згідно з js-mssql.mdc.
|
|
17
|
+
|
|
18
|
+
Поведінка
|
|
19
|
+
main: Перевіряє відповідність проєкту стандарту безпечного використання mssql, зокрема мінімальної версії та паттернів доступу до бази даних, згідно з конфігурацією, що базується на package.json. Код здійснює звернення до мережі.
|
|
20
|
+
|
|
21
|
+
## Поведінка
|
|
22
|
+
|
|
23
|
+
main: Перевіряє відповідність проєкту стандарту безпечного використання mssql, зокрема мінімальної версії та паттернів доступу до бази даних, згідно з конфігурацією, що базується на package.json.
|
|
24
|
+
request: (Немає публічних функцій з цим ім'ям, згідно з наданим кодом.)
|
|
25
|
+
request: (Немає публічних функцій з цим ім'ям, згідно з наданим кодом.)
|
|
26
|
+
|
|
27
|
+
## Публічний API
|
|
28
|
+
|
|
29
|
+
Надайте, будь ласка, код, до якого потрібно написати документацію.
|
|
30
|
+
|
|
31
|
+
## Гарантії поведінки
|
|
32
|
+
|
|
33
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|