@nitra/cursor 1.8.216 → 1.8.217

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 CHANGED
@@ -4,6 +4,14 @@
4
4
 
5
5
  Формат — [Keep a Changelog](https://keepachangelog.com/uk/1.1.0/), нумерація — [SemVer](https://semver.org/lang/uk/).
6
6
 
7
+ ## [1.8.217] - 2026-05-09
8
+
9
+ ### Added
10
+
11
+ - **js-run / conn-нейминг:** префікс `mssql-` тепер прийнятний у `src/conn/` нарівні з `mysql-` (`mssql-read.js`, `mssql-write-<id>.js` тощо). Сам npm-пакет `mssql` і раніше згадувався у правилі (як драйвер для MS SQL Server), але філенейм ставився під спільний `mysql-` префікс — це плутало читачів коду, де `import sql from 'mssql'` сусідив з файлом `mysql-write.js`. Тепер MSSQL має власний префікс із власним camelCase-експортом (`mssql-write-b2b` → `mssqlWriteB2b`). **Backward-compat:** проєкти, що вже використовують `mysql-…` для MSSQL-файлів, валідні без змін; рекомендований, але не обов'язковий рефактор — `git mv` цих файлів на `mssql-…` і відповідне перейменування іменованого експорту (`mysqlWrite` → `mssqlWrite`) зі оновленням імпортів через `#conn/*`.
12
+ - Регекс `CONN_FILENAME_RE` у `npm/scripts/utils/conn-file-rules.mjs` розширено до `(pg|mysql|mssql)-(read|write)(-<id>)?`; повідомлення про порушення в `npm/scripts/check-js-run.mjs` оновлено під чотири альтернативи; `mdc/js-run.mdc` має окремі пункти для MySQL і MSSQL.
13
+ - Тести: `npm/tests/conn-file-rules.test.mjs` (юніт-тести `isConnFileNameValid` / `kebabToCamel` / `findConnFileRuleViolations` під `mssql-`) та два інтеграційні кейси у `npm/tests/check-js-run-fixture.test.mjs` (`mssql-write.js` з валідним і невалідним експортом).
14
+
7
15
  ## [1.8.216] - 2026-05-09
8
16
 
9
17
  ### Changed
package/mdc/js-run.mdc CHANGED
@@ -134,7 +134,8 @@ import { gql, graphQLClient } from '@nitra/graphql-request'
134
134
  - **PostgreSQL до кількох БД** — додатково ідентифікатор підключення після типу:
135
135
  - `src/conn/pg-read-smart.js`
136
136
  - `src/conn/pg-write-contract.js`
137
- - **MySQL / MSSQL** — префікс `mysql-` за тією ж схемою (`mysql-read.js`, `mysql-write-<id>.js` тощо).
137
+ - **MySQL** — префікс `mysql-` за тією ж схемою (`mysql-read.js`, `mysql-write-<id>.js` тощо).
138
+ - **MSSQL** — префікс `mssql-` за тією ж схемою (`mssql-read.js`, `mssql-write-<id>.js` тощо). Хоча npm-пакет один (`mssql`), а драйвер MS SQL Server під капотом T-SQL — у файловій назві відрізняємо MS SQL Server від MySQL, бо це різні СУБД, різні діалекти, різні рантаймні залежності. Якщо проєкт історично використовує `mysql-…` для MSSQL-підключень — він валідний і далі (для backward-compat), але новий код пишемо з префіксом `mssql-`.
138
139
 
139
140
  Підключення до БД **обов'язково** має бути ідентифіковано як `read` (репліка) або `write` (мастер). Якщо з імені змінної оточення (наприклад, `env.PG_CONN`) це не очевидно — визнач режим за операціями в коді: якщо немає операцій зміни даних (`INSERT`/`UPDATE`/`DELETE`/DDL) — це `pg-read.js`, інакше `pg-write.js`.
140
141
 
@@ -232,7 +233,7 @@ on:
232
233
 
233
234
  `npx @nitra/cursor check js-run` — зокрема для кожного backend workspace-пакета з каталогом **`src/`** перевіряє наявність **`jsconfig.json`** і збіг вмісту з каноном вище. Додатково для файлів у каталозі `#conn/` (за замовчуванням `src/conn/`) перевіряється:
234
235
 
235
- - **basename файла** відповідає канону: `ql-<id>` (GraphQL) / `(pg|mysql)-(read|write)[-<id>]` (БД), kebab-case `[a-z0-9-]`;
236
+ - **basename файла** відповідає канону: `ql-<id>` (GraphQL) / `(pg|mysql|mssql)-(read|write)[-<id>]` (БД), kebab-case `[a-z0-9-]`;
236
237
  - **відсутній `export default`** — лише іменований експорт;
237
238
  - **імʼя експорту** дорівнює camelCase від basename (`pg-write-contract.js` → `export const pgWriteContract`).
238
239
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.8.216",
3
+ "version": "1.8.217",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -13,7 +13,7 @@
13
13
  * `package.json#imports['#conn/*']` — у його цільовому каталозі); поза ним — порушення
14
14
  * (див. `utils/conn-imports-scan.mjs`);
15
15
  * - «Нейминг та експорти у `#conn/`»: всередині conn-каталогу basename файла має відповідати
16
- * канону `ql-<id>` / `(pg|mysql)-(read|write)[-<id>]`; `export default` заборонений; має бути
16
+ * канону `ql-<id>` / `(pg|mysql|mssql)-(read|write)[-<id>]`; `export default` заборонений; має бути
17
17
  * іменований експорт з імʼям, що дорівнює camelCase від basename файла (`pg-write-contract.js`
18
18
  * → `export const pgWriteContract`); `index.*` як reexport-барель пропускаємо
19
19
  * (див. `utils/conn-file-rules.mjs`);
@@ -192,7 +192,7 @@ async function checkConnImports(absPackageRoot, sourcePaths, pkgJson, label, fai
192
192
  /**
193
193
  * Перевіряє правила нейминга та експортів для файлів усередині `#conn/`.
194
194
  *
195
- * Канон імені: `ql-<id>` для GraphQL, `(pg|mysql)-(read|write)[-<id>]` для БД (js-run.mdc,
195
+ * Канон імені: `ql-<id>` для GraphQL, `(pg|mysql|mssql)-(read|write)[-<id>]` для БД (js-run.mdc,
196
196
  * розділ «Нейминг файлів у `src/conn/`»). Експорт у файлі — лише іменований, з імʼям, що
197
197
  * дорівнює camelCase від basename файла (`pg-write-contract.js` → `export const pgWriteContract`).
198
198
  * @param {string} absPackageRoot абсолютний корінь пакета
@@ -219,7 +219,8 @@ async function checkConnFileNamingAndExports(absPackageRoot, sourcePaths, pkgJso
219
219
  if (v.kind === 'name') {
220
220
  fail(
221
221
  `${label}${rel} — назва файла в '${connDir}/' не відповідає канону js-run: ` +
222
- `'ql-<id>', 'pg-{read|write}[-<id>]' або 'mysql-{read|write}[-<id>]' (kebab-case, [a-z0-9-])`
222
+ `'ql-<id>', 'pg-{read|write}[-<id>]', 'mysql-{read|write}[-<id>]' або 'mssql-{read|write}[-<id>]' ` +
223
+ `(kebab-case, [a-z0-9-])`
223
224
  )
224
225
  } else if (v.kind === 'default-export') {
225
226
  fail(`${label}${rel} — 'export default' заборонений у '${connDir}/'; зроби іменований експорт`)
@@ -326,7 +327,7 @@ async function checkWorkspacePackage(rootDir, ignorePaths, workflows, fail, pass
326
327
  if (connFileViolations === 0) {
327
328
  const connDir = resolveConnDirFromPackageJson(pkgJson)
328
329
  passFn(
329
- `${label}файли в '${connDir}/' дотримують канону js-run: нейминг (ql-/pg-/mysql-…) і іменований експорт у camelCase від basename`
330
+ `${label}файли в '${connDir}/' дотримують канону js-run: нейминг (ql-/pg-/mysql-/mssql-…) і іменований експорт у camelCase від basename`
330
331
  )
331
332
  }
332
333
 
@@ -5,7 +5,8 @@
5
5
  * Канонічна назва файла:
6
6
  * - GraphQL: `ql-<id>.{js|mjs|cjs|ts|mts|cts}` (id — kebab-case ідентифікатор endpoint);
7
7
  * - PostgreSQL: `pg-{read|write}.{ext}` або `pg-{read|write}-<id>.{ext}` (id — для multi-БД);
8
- * - MySQL/MSSQL: `mysql-{read|write}.{ext}` або `mysql-{read|write}-<id>.{ext}`.
8
+ * - MySQL: `mysql-{read|write}.{ext}` або `mysql-{read|write}-<id>.{ext}`;
9
+ * - MSSQL: `mssql-{read|write}.{ext}` або `mssql-{read|write}-<id>.{ext}`.
9
10
  *
10
11
  * Канонічний експорт — іменований, без `export default`. Імʼя константи має дорівнювати
11
12
  * camelCase від basename файла (`pg-write-contract` → `pgWriteContract`).
@@ -20,11 +21,11 @@ const SOURCE_FILE_RE = /\.([cm]?[jt]sx?)$/u
20
21
  /**
21
22
  * Канонічний шаблон імені файла в каталозі conn.
22
23
  * - `ql-<id>` для GraphQL;
23
- * - `(pg|mysql)-(read|write)(-<id>)?` для БД.
24
+ * - `(pg|mysql|mssql)-(read|write)(-<id>)?` для БД.
24
25
  * `<id>` — починається з [a-z0-9], далі [a-z0-9-]*.
25
26
  */
26
27
  const CONN_FILENAME_RE =
27
- /^(?:ql-[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|(?:pg|mysql)-(?:read|write)(?:-[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)?)\.([cm]?[jt]sx?)$/u
28
+ /^(?:ql-[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|(?:pg|mysql|mssql)-(?:read|write)(?:-[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)?)\.([cm]?[jt]sx?)$/u
28
29
 
29
30
  /**
30
31
  * Чи це файл, який сканується правилом «conn-file» (JS/TS-сімʼя, без `.d.ts`).