# Kysely: SQL с проверкой типов TypeScript

Реальные Kysely 0.29.9, better-sqlite3 13.1.1 (SQLite 3.54.1 в проверенной сборке), TypeScript 7.0.2 и Bootstrap 5.3.9. Девять задач, 18 вариантов, 20 тестов и 39 проверок при записи каждой платформы. Node.js 24 LTS >=24.15.0. Наш код MIT; лицензии зависимостей в THIRD-PARTY-LICENSES.txt.

Публичная мастерская **воспроизводит запись настоящего Node/SQL/TypeScript-выполнения**. Она не запускает SQLite или TypeScript в браузере и не принимает запросы к рабочей базе. Поиск фильтрует уже сохранённые строки. Для другого SQL измените исходник и выполните capture.

## Windows / PowerShell

Установите Node.js24 LTS с nodejs.org, распакуйте архив и откройте PowerShell в kysely-project:

```powershell
node --version
npm ci --ignore-scripts
npm test
npm run capture
npm run build
npm run serve
```

Откройте http://127.0.0.1:8532/. Остановка Ctrl+C. При занятом порте измените собственный tools/serve.mjs; чужие процессы не останавливайте. Уже готовую public можно раздавать без Node через установленный PHP: `php -S 127.0.0.1:8532 -t public`. file:// не подходит: интерфейс загружает JSON через fetch.

Версия better-sqlite3 содержит платформенные prebuilds, TypeScript7 — платформенный компилятор. `npm ci --ignore-scripts` проверен на Windows x64 и Linux x64. Не копируйте node_modules между ОС; другие архитектуры требуют отдельной проверки. package-lock.json фиксирует зависимости.

## Linux / Bash

Установите поддерживаемый Node24 LTS из официального источника для своей архитектуры. Проверьте контрольную сумму дистрибутива. Запускайте npm от обычного пользователя:

```bash
cd kysely-project
node --version
npm ci --ignore-scripts
npm test
npm run capture
npm run build
npm run serve
```

Capture определяет ОС через os.platform(): Windows пишет public/recording.json, Linux — public/recording-linux.json. При Linux-разработке **чтобы мастерская показывала ваш новый Linux-запуск**, после capture явно выполните `cp public/recording-linux.json public/recording.json`, затем build. В распространённом архиве основная запись Windows и отдельная запись Linux. Если сохраняете обе записи, `npm run verify` проверяет их SHA исходников. После изменения реализации заново получите оба результата или учитывайте, что вторая запись относится к прежней версии.

## Что запускается

- src/database.ts: настоящая SQLite в памяти, схема, foreign_keys, CHECK и начальные синтетические данные. Ни один опыт не подключает существующий файл БД.
- src/scenarios.ts: SELECT, параметры, INNER/LEFT JOIN, агрегаты, INSERT/UNIQUE, транзакция commit/rollback, keyset, реальные вызовы tsc, миграции.
- src/migrations.ts: самодостаточные исторические UP/DOWN, импорт Migrator из `kysely/migration`.
- fixtures/type-errors.ts и type-fixed.ts: до/после; плохой файл намеренно исключён из обычной сборки.
- tools/capture.ts: проверяет результат каждого варианта, сохраняет SQL, параметры, строки, до/после, диагностику и SHA файлов.
- tests/runtime.test.ts:18 вариантов плюс валидация входа и настоящие ограничения SQLite.

Восьмая задача запускает TypeScript CLI с ограничением30секунд; её source не исполняется. Отсутствие ошибок типов не означает, что входной JSON корректен, права проверены, столбец реально существует или UNIQUE не нарушен. TypeScript описывает ожидаемый контракт. SQL и данные исполняет драйвер.

## Сменить данные и повторить

Начальные заявки и клиенты в seed(). Четыре клиента, шесть заявок, одна заявка без клиента, один клиент без заявок, две заявки с одинаковым created_at. Суммы — целые копейки. Изменив данные, обновите ожидания тестов осознанно, затем test/capture/build. Запись содержит реальные длительности одного запуска: это не универсальный benchmark.

TypeScript-диагностика отдельно:

```bash
node node_modules/typescript/bin/tsc -p tsconfig.type-errors.json --pretty false
# Намеренно ненулевой exit code и три диагностики.
node node_modules/typescript/bin/tsc -p tsconfig.type-fixed.json --pretty false
# Нулевой exit code.
```

## Политика данных

Все запросы пишутся в запись вместе с параметрами только потому, что вход полностью учебный. Не переносите такой полный SQL-log на рабочие запросы с персональными данными или секретами. Публичная папка содержит исходники по намерению автора.

Keyset использует created_at+id и составной индекс. Новая запись до курсора не сдвигает следующую страницу, но уже пройденная часть не обновляется автоматически. Это не транзакционный snapshot. Миграция DOWN удаляет столбец и его данные; показанное сохранение строки не делает любой откат безопасным.

## Сайт и VPS

Готовая public — статика. Сервер БД для её показа не нужен. Практические правила подключения SQLite-файла, резервной копии, миграций и публикации на Linux описаны в docs/LINUX-VPS.md. Развёртывание на внешнем VPS здесь не выполнялось; Linux-проверка — отдельный контейнер Node24, те же исходники и настоящий native SQLite.

Документация: https://kysely.dev/docs/getting-started?dialect=sqlite ; https://kysely.dev/docs/recipes/data-types ; https://kysely.dev/docs/migrations ; https://github.com/WiseLibs/better-sqlite3 .
