# Kysely changelog > A type-safe SQL query builder for TypeScript with no runtime schema. - Vendor: Kysely - Category: Frameworks & Libraries - Official site: https://kysely.dev - Tracked by: What's New (https://whatsnew.fyi/product/kysely) - Harvested from: GitHub (kysely-org/kysely) - Entries below: 11 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## Releases ### v0.29.5 — 0.29.5 - Date: 2026-08-10 - Version: v0.29.5 - Original notes: https://github.com/kysely-org/kysely/releases/tag/v0.29.5 - Permalink: https://whatsnew.fyi/product/kysely/releases/v0.29.5 - **fixed** — Fix infinite type check recursion - **fixed** — Add missing beforeThrow calls in getInflightQueryAbortHandler Hey 👋 A small batch of bug fixes. Please report any issues. 🤞😰🤞 TypeScript 7 is allowing for deeper computations which now cause way more instantiations and wall clock times in various scenarios. We're diving deep into our types and finding optimizations. In this version @koskimas brought some nice wins for builder vs. builder assignability checks. We're also revamping the docs site, working on style, message and usefulness. Swing by our Discord and share your opinions/ideas. We got docs->apidocs search now. The playground is back supporting short links and will allow saving short links very soon. ##### 🚀 Features ##### 🐞 Bugfixes * fix infinite type check recursion by @koskimas in https://github.com/kysely-org/kysely/pull/1960 * Add missing beforeThrow calls in getInflightQueryAbortHandler by @lourd in https://github.com/kysely-org/kysely/pull/1971 ##### 📖 Documentation * Fix typo in `CreateTypeBuilder.asEnum` docstring by @anonpay-sh in https://github.com/kysely-org/kysely/pull/1949 * chore: revamp docs hero page. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1959 * fix(site): various issues with stats section. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1966 * chore(site): replace most text proof with logos. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1968 * feat(site): migrate to pagefind for cross-site search we own. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1972 * chore(site): drop self-narrating captions, make proof arrows a standing cue by @igalklebanov in https://github.com/kysely-org/kysely/pull/1973 * feat(site): grow the proof wall (Replicas, EmbedPDF) + fix production hover by @igalklebanov in https://github.com/kysely-org/kysely/pull/1974 * feat(site): add AirTrail, bknd, Civitai, Corsair.dev, Hot Updater, Profilarr and Tunarr to the proof wall. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1975 * feat(site): proof-strength gauges, query-module evidence, and new wall names by @igalklebanov in https://github.com/kysely-org/kysely/pull/1976 * feat(site): explain the proof gauge behind a (?) on the production wall by @igalklebanov in https://github.com/kysely-org/kysely/pull/1977 * feat(site): align docs code blocks with the landing page's VS Code themes by @igalklebanov in https://github.com/kysely-org/kysely/pull/1978 ##### 📦 CICD & Tooling * chore: bump deps. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1979 * chore: bump github actions. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1980 ##### ⚠️ Breaking Changes ##### 🐤 New Contributors * @anonpay-sh made their first contribution in https://github.com/kysely-org/kysely/pull/1949 * @lourd made their first contribution in https://github.com/kysely-org/kysely/pull/1971 ##### What's Changed **Full Changelog**: https://github.com/kysely-org/kysely/compare/v0.29.4...v0.29.5 ### v0.30.0-beta.1 — 0.30.0-beta.1 - Date: 2026-07-26 - Version: v0.30.0-beta.1 - Original notes: https://github.com/kysely-org/kysely/releases/tag/v0.30.0-beta.1 - Permalink: https://whatsnew.fyi/product/kysely/releases/v0.30.0-beta.1 - Labels: Pre-release - **added** — Add transactionMode property to Migrator accepting 'per-run', 'per-migration', or 'none' to control transaction behavior across migrations - **added** — Add defineMigration helper function to simplify migration writing and contract requirements - **added** — Add migrateTo(name, { direction: 'Up' | 'Down' }) method to Migrator to enforce migration direction - **added** — Support mysql2/promise in MysqlDialect in addition to the callback-based mysql2 import - **added** — Deny passing BLOB-like columns to SQLite JSON helpers with compile-time type errors - **deprecated** — Deprecate disableTransactions option in favor of transactionMode property - **changed** — Per-migration transaction configuration now allows each migration to specify whether it runs in its own transaction via config: { transaction: false } Hey 👋 0.30 season is upon us. `pnpm i kysely@next` and get a sneak peak into the future! We've got a new `transactionMode: 'per-run' | 'per-migration' | 'none'` property you can pass to `Migrator` or it's methods. - `'per-run'` is the classic behavior you're used to where `kysely` wrap the entire run in a transaction when your dialect supports transactional DDL. - `'per-migration'` enables each migration to pick whether it runs in its own transaction or not. Just expose `config: { transaction: false }` from the module, right next to the `up`/`down` functions. - `'none'` means no transactions are used, which is similar to the now deprecated `disableTransactions: true`. ```ts import * as fs from 'node:fs/promises' import * as path from 'node:path' import { FileMigrationProvider, Migrator } from 'kysely/migration' const migrator = new Migrator({ db, provider: new FileMigrationProvider({ fs, migrationFolder: path.join(import.meta.dirname, 'migrations'), }), transactionMode: 'per-migration', // <------------------------------- }) await migrator.migrateToLatest() ``` We've got a new `defineMigration` helper function that you can use to easily write your migrations and meet the contract requirements: ```ts import { defineMigration } from 'kysely/migration' export default defineMigration({ up: async (db) => { // ... }, config: { transaction: false }, // <-------------------- }) ``` You can now use `mysql2/promise`, where in the past it would hang forever since we only supported the callback style of `mysql2` root import. ##### 🚀 Features * feat(migrator): add `migrateTo(name, { direction: 'Up' | 'Down' })` to enforce direction. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1957 ###### PostgreSQL 🐘 / MSSQL 🥅 * feat: Per-migration transaction configuration by @lourd & @igalklebanov in https://github.com/kysely-org/kysely/pull/1671 ###### MySQL 🐬 * feat(mysql): support both `mysql2` and `mysql2/promise` in `MysqlDialect`. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1958 ###### SQLite 📘 * feat: deny passing BLOB-like columns to SQLite JSON helpers by @hwisu & @igalklebanov in https://github.com/kysely-org/kysely/pull/1698 ##### 🐞 Bugfixes ##### 📖 Documentation ##### 📦 CICD & Tooling ##### ⚠️ Breaking Changes * `disableTransactions` is deprecated. Use the new `transactionMode: 'none'`, or `transactionMode: 'per-migration'` with combination of `config: { transaction: false }`. ###### SQLite 📘 * Trying to pass records with `BLOB` columns in JSON helpers emits compile-time errors - e.g. ```ts KyselyTypeError<'SQLite does not support passing `BLOB` values to `json_object`. Cast to `TEXT`.'> ``` ##### 🐤 New Contributors * @lourd made their first contribution in https://github.com/kysely-org/kysely/pull/1671 ##### What's Changed **Full Changelog**: https://github.com/kysely-org/kysely/compare/4ba0bd495a4cbe11d8d58ef02537586dc4d56532...v0.30.0-beta.1 ### v0.30.0-beta.0 — 0.30.0-beta.0 - Date: 2026-07-25 - Version: v0.30.0-beta.0 - Original notes: https://github.com/kysely-org/kysely/releases/tag/v0.30.0-beta.0 - Permalink: https://whatsnew.fyi/product/kysely/releases/v0.30.0-beta.0 - Labels: Pre-release - **added** — Add transactionMode property to Migrator supporting 'per-run', 'per-migration', and 'none' modes - **added** — Add defineMigration helper function for writing migrations with explicit contract requirements - **added** — Enable per-migration transaction configuration via config.transaction property - **added** — Add compile-time errors when passing BLOB columns to SQLite JSON helpers - **deprecated** — Deprecate disableTransactions in favor of transactionMode - **changed** — SQLite JSON helpers now enforce compile-time type checking to prevent BLOB value usage Hey 👋 0.30 season is upon us. `pnpm i kysely@next` and get a sneak peak into the future! We've got a new `transactionMode: 'per-run' | 'per-migration' | 'none'` property you can pass to `Migrator` or it's methods. - `'per-run'` is the classic behavior you're used to where `kysely` wrap the entire run in a transaction when your dialect supports transactional DDL. - `'per-migration'` enables each migration to pick whether it runs in its own transaction or not. Just expose `config: { transaction: false }` from the module, right next to the `up`/`down` functions. - `'none'` means no transactions are used, which is similar to the now deprecated `disableTransactions: true`. ```ts import * as fs from 'node:fs/promises' import * as path from 'node:path' import { FileMigrationProvider, Migrator } from 'kysely/migration' const migrator = new Migrator({ db, provider: new FileMigrationProvider({ fs, migrationFolder: path.join(import.meta.dirname, 'migrations'), }), transactionMode: 'per-migration', // <------------------------------- }) await migrator.migrateToLatest() ``` We've got a new `defineMigration` helper function that you can use to easily write your migrations and meet the contract requirements: ```ts import { defineMigration } from 'kysely/migration' export default defineMigration({ up: async (db) => { // ... }, config: { transaction: false }, // <-------------------- }) ``` ##### 🚀 Features ###### PostgreSQL 🐘 / MSSQL 🥅 * feat: Per-migration transaction configuration by @lourd & @igalklebanov in https://github.com/kysely-org/kysely/pull/1671 ###### SQLite 📘 * feat: deny passing BLOB-like columns to SQLite JSON helpers by @hwisu & @igalklebanov in https://github.com/kysely-org/kysely/pull/1698 ##### 🐞 Bugfixes ##### 📖 Documentation ##### 📦 CICD & Tooling ##### ⚠️ Breaking Changes * `disableTransactions` is deprecated. Use the new `transactionMode: 'none'`, or `transactionMode: 'per-migration'` with combination of `config: { transaction: false }`. ###### SQLite 📘 * Trying to pass records with `BLOB` columns in JSON helpers emits compile-time errors - e.g. ```ts KyselyTypeError<'SQLite does not support passing `BLOB` values to `json_object`. Cast to `TEXT`.'> ``` ##### 🐤 New Contributors * @lourd made their first contribution in https://github.com/kysely-org/kysely/pull/1671 ##### What's Changed **Full Changelog**: https://github.com/kysely-org/kysely/compare/4ba0bd495a4cbe11d8d58ef02537586dc4d56532...v0.30.0-beta.0 ### v0.29.4 — 0.29.4 - Date: 2026-07-17 - Version: v0.29.4 - Original notes: https://github.com/kysely-org/kysely/releases/tag/v0.29.4 - Permalink: https://whatsnew.fyi/product/kysely/releases/v0.29.4 - **fixed** — Fix PostgreSQL password not being passed to control client - **fixed** — Fix SQLite returning clauses wrongly output after order by and limit in delete queries Hey 👋 A small batch of bug fixes. Please report any issues. 🤞😰🤞 ##### 🚀 Features ##### 🐞 Bugfixes ###### PostgreSQL 🐘 * fix: fix postgres password not being passed to control client by @CakeWithDivinity & @igalklebanov in https://github.com/kysely-org/kysely/pull/1944 ###### SQLite 📘 * fix(sqlite): returning clauses wrongfuly output after order by and limit in delete queries. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1946 ##### 📖 Documentation ##### 📦 CICD & Tooling * chore: bump dependencies. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1945 ##### ⚠️ Breaking Changes ##### 🐤 New Contributors * @CakeWithDivinity made their first contribution in https://github.com/kysely-org/kysely/pull/1944 ##### What's Changed **Full Changelog**: https://github.com/kysely-org/kysely/compare/v0.29.3...v0.29.4 ### v0.29.3 — 0.29.3 - Date: 2026-07-05 - Version: v0.29.3 - Original notes: https://github.com/kysely-org/kysely/releases/tag/v0.29.3 - Permalink: https://whatsnew.fyi/product/kysely/releases/v0.29.3 - **fixed** — PostgreSQL and MSSQL migrations are not running exclusively when disableTransactions: true Hey 👋 A small batch of bug fixes. Please report any issues. 🤞😰🤞 ##### 🚀 Features ##### 🐞 Bugfixes ###### PostgreSQL 🐘 / MSSQL 🥅 * fix: PostgreSQL and MSSQL migrations are not running exclusively when `disableTransactions: true`. by @morgan-coded & @igalklebanov in https://github.com/kysely-org/kysely/pull/1919 ##### 📖 Documentation * docs: add kysely-durable-objects to community dialects by @jeffwilde in https://github.com/kysely-org/kysely/pull/1805 * docs: use new play.kysely.dev domain for the playground. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1874 * docs(#1892): add marshift/kysely-deno-sqlite3 to community dialects by @ltianyi992 in https://github.com/kysely-org/kysely/pull/1901 ##### 📦 CICD & Tooling * chore(deps-dev): bump tsx from 4.22.0 to 4.22.1 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1855 * chore(deps): bump hono from 4.12.18 to 4.12.19 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1854 * chore(deps): bump zizmorcore/zizmor-action from 0.5.4 to 0.5.6 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1853 * chore(deps): bump github/codeql-action from 4.35.4 to 4.35.5 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1850 * chore(deps-dev): bump @types/node from 25.8.0 to 25.9.0 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1860 * chore(deps-dev): bump pg from 8.20.0 to 8.21.0 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1858 * chore(deps-dev): bump tsx from 4.22.1 to 4.22.3 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1863 * chore(deps): bump hono from 4.12.19 to 4.12.21 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1862 * chore(deps-dev): bump pg-cursor from 2.19.0 to 2.20.0 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1857 * chore(deps-dev): bump @types/node from 25.9.0 to 25.9.1 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1866 * chore(ci): use pedantic `zizmor` persona. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1869 * chore(deps-dev): bump @electric-sql/pglite from 0.4.5 to 0.4.6 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1881 * chore(deps): bump hono from 4.12.21 to 4.12.23 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1880 * chore: resolve audit vulnerabilities. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1882 * chore(ci): audit npm packages. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1883 * chore(deps-dev): bump mysql2 from 3.22.3 to 3.22.4 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1888 * chore(deps): bump github/codeql-action from 4.35.5 to 4.36.1 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1900 * chore(deps-dev): bump @arethetypeswrong/cli from 0.18.2 to 0.18.3 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1899 * chore(deps): bump actions/checkout from 6.0.2 to 6.0.3 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1896 * chore(deps): bump step-security/harden-runner from 2.19.3 to 2.19.4 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1870 * chore(deps-dev): bump semver from 7.8.0 to 7.8.1 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1877 * chore: bump dependencies. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1920 * chore(deps-dev): bump @types/node from 26.0.1 to 26.1.0 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1926 * chore(deps-dev): bump @ark/attest from 0.56.1 to 0.56.2 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1925 * chore(deps-dev): bump @types/sinon from 21.0.1 to 22.0.0 by @dependabot[bot] in https://github.com/kysely-org/kysely/pull/1924 * chore(deps-dev): bump prettier from 3.9.1 to 3.9.4 by @dependabot[bot] in https://github.com/kysely-org/kysely/pu _[Truncated at 4000 characters — full notes: https://github.com/kysely-org/kysely/releases/tag/v0.29.3]_ ### v0.29.2 — 0.29.2 - Date: 2026-05-16 - Version: v0.29.2 - Original notes: https://github.com/kysely-org/kysely/releases/tag/v0.29.2 - Permalink: https://whatsnew.fyi/product/kysely/releases/v0.29.2 - **fixed** — $narrowType mishandling branded types Hey 👋 A small batch of bug fixes. Please report any issues. 🤞😰🤞 ##### 🚀 Features ##### 🐞 Bugfixes * fix: `$narrowType` mishandling branded types. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1851 ##### 📖 Documentation ##### 📦 CICD & Tooling ##### ⚠️ Breaking Changes ##### 🐤 New Contributors ##### What's Changed **Full Changelog**: https://github.com/kysely-org/kysely/compare/v0.29.1...v0.29.2 ### v0.29.1 — 0.29.1 - Date: 2026-05-16 - Version: v0.29.1 - Original notes: https://github.com/kysely-org/kysely/releases/tag/v0.29.1 - Permalink: https://whatsnew.fyi/product/kysely/releases/v0.29.1 - **fixed** — Fix regression in piping of plugins' result transformations Hey 👋 A small batch of bug fixes. Please report any issues. 🤞😰🤞 ##### 🚀 Features ##### 🐞 Bugfixes * fix: regression in piping of plugins' result transformations. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1840 ##### 📖 Documentation ##### 📦 CICD & Tooling * ci: test node.js v26. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1841 * ci: harden github workflows with the help of `zizmor` scans. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1843 * ci: split node tests by variant. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1848 ##### ⚠️ Breaking Changes ##### 🐤 New Contributors ##### What's Changed **Full Changelog**: https://github.com/kysely-org/kysely/compare/v0.29.0...v0.29.1 ### v0.29.0 — 0.29.0 - Date: 2026-05-08 - Version: v0.29.0 - Original notes: https://github.com/kysely-org/kysely/releases/tag/v0.29.0 - Permalink: https://whatsnew.fyi/product/kysely/releases/v0.29.0 - **added** — Add `$pickTables` and `$omitTables` compile-time helpers to narrow the database schema view for downstream queries - **added** — Add `ReadonlyKysely` helper type to create compile-time readonly database instances - **added** — Add PGliteDialect for PGlite database support - **added** — Add `supportsMultipleConnections` adapter flag with centralized connection mutex for single-connection adapters - **added** — Enhance `$narrowType` to support nested narrowing and discriminated unions - **added** — Add web standards driven query cancellation support with `signal` parameter and `inflightQueryAbortStrategy` option - **added** — Add `SafeNullComparisonPlugin` to automatically convert equality operators to `is` and `is not` when comparing with null - **added** — Add `shouldParse(value, path)` option to `ParseJSONResultsPlugin` for granular control of JSON parsing using JSON paths - **added** — Add `thenRef` method in `eb.case` for case expressions - **added** — Add `whenRef(lhs, op, rhs)` method in `eb.case` for case expressions - **added** — Add `elseRef` method in `eb.case` for case expressions - **added** — Allow disabling transactions in migrate methods - **added** — Allow explicit undefined in Updateable type for exactOptionalPropertyTypes support - **deprecated** — Deprecate `withTables` in favor of `$pickTables`, `$omitTables`, and `$extendTables Hey 👋 This one's a banger! 💥 💥 💥 We got `$pickTables`, `$omitTables` compile-time helpers to narrow the world view of downstream queries, cutting down on compilation complexity/time while at it! ```ts const results = await db .$pickTables<'person' | 'pet'>() // <----- now `DB` is only { person: {...}, pet: {...} } for following methods. .selectFrom('person') .innerJoin('pet', 'pet.owner_id', 'person.id') .selectAll() .execute() const results = await db .$omitTables<'toy'>() // <----- now `DB` doesn't have a "toy" table description for following methods. .selectFrom('person') .innerJoin('pet', 'pet.owner_id', 'person.id') .selectAll() .execute() ``` We got a new `ReadonlyKysely` helper type that turns your instance into a compile-time readonly instance! ```ts import { Kysely } from 'kysely' import type { ReadonlyKysely } from 'kysely/readonly' export const db = new Kysely({...}) as never as ReadonlyKysely db.selectFrom('person').selectAll() // no problem. db.selectNoFrom(sql`now()`.as('now')) // no problem. db.deleteFrom('person') // compilation error + deprecation! db.insertInto('person').values({...}) // compilation error + deprecation! db.mergeInto('person')... // compilation error + deprecation! db.updateTable('person').set('first_name', 'Timmy') // compilation error + deprecation! sql`...`.execute(db) // compilation error! // etc. etc. ``` We got a brand new PGlite dialect. With it comes a new `supportsMultipleConnections` adapter flag that uses a new centralized connection mutex when `false` - should help simplify all SQLite dialects out here! ```ts import { PGlite } from '@electric-sql/pglite' import { Kysely, PGliteDialect } from 'kysely' const db = new Kysely({ // ... dialect: new PGliteDialect({ pglite: new PGlite(), }), // ... }) ``` We got `$narrowType` supporting nested narrowing and discriminated unions! ```ts db.selectFrom('person_metadata') .select(['discriminatedUnionProfile']) // output type inferred as: // // { // discriminatedUnionProfile: { // auth: // | { type: 'token'; token: string } // | { type: 'session'; session_id: string } // tags: string[] // } // }[] .$narrowType<{ discriminatedUnionProfile: { auth: { type: 'token' } } }>() // output type narrowed to: // // { // discriminatedUnionProfile: { // auth: { type: 'token'; token: string } // tags: string[] // } // }[] .execute() ``` We got web standards driven query cancellation support. Pass an abort `signal` to `execute*` methods and similar. Pick between different inflight query abort strategies - ignore the query, cancel it on the database side or even kill the session on the database side. ```ts import { Kysely, PostgresDialect } from 'kysely' import { Client, ... } from 'pg' const db = new Kysely({ dialect: new PostgresDialect({ // ... controlClient: Client, // optional, for out-of-pool connections for database side query aborts. // ... }) }) const options = { signal: AbortSignal.timeout(3_000) } // throw abort/timeout errors and ignore query reuslts query.execute(options) query.stream(options) sql`...`.execute(db, options) db.executeQuery(compiledQuery, options) // etc. etc. query.execute({ ...options, inflightQueryAbortStrategy: 'cancel query' }) // also cancel query database side query.execute({ ...options, inflightQueryAbortStrategy: 'kill session' }) // also kill session database side ``` We got `SafeNullComparisonPlugin` to flip (in)equality operators to `is` and `is not` when right hand side argument is `null`. ```ts import { Kysely, SafeNullComparisonPlugin } from 'kysely' const db = new Kysely({ // ... plugins: [new SafeNullComparisonPlugin()], // ... }) db.selectFrom('pet') .where( _[Truncated at 4000 characters — full notes: https://github.com/kysely-org/kysely/releases/tag/v0.29.0]_ ### v0.28.17 — 0.28.17 - Date: 2026-05-03 - Version: v0.28.17 - Original notes: https://github.com/kysely-org/kysely/releases/tag/v0.28.17 - Permalink: https://whatsnew.fyi/product/kysely/releases/v0.28.17 - **fixed** — Further harden JSON path .key(...) and .at(...) against SQL injections and exfiltrations Hey 👋 A small batch of bug fixes. Please report any issues. 🤞😰🤞 [0.29](https://github.com/kysely-org/kysely/releases/tag/v0.29.0-rc.0) is right around the corner. Try the latest RC version! ##### 🚀 Features ##### 🐞 Bugfixes * fix: further harden JSON path `.key(...)` and `.at(...)` against SQL injections and exfiltrations. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1804 ##### 📖 Documentation * docs(returning): remove outdated SQLite alias workaround by @aymenhmaidiwastaken in https://github.com/kysely-org/kysely/pull/1793 ##### 📦 CICD & Tooling ##### ⚠️ Breaking Changes ##### 🐤 New Contributors * @aymenhmaidiwastaken made their first contribution in https://github.com/kysely-org/kysely/pull/1793 ##### What's Changed **Full Changelog**: https://github.com/kysely-org/kysely/compare/v0.28.16...v0.28.17 ### v0.29.0-rc.0 — 0.29.0-rc.0 - Date: 2026-04-24 - Version: v0.29.0-rc.0 - Original notes: https://github.com/kysely-org/kysely/releases/tag/v0.29.0-rc.0 - Permalink: https://whatsnew.fyi/product/kysely/releases/v0.29.0-rc.0 - Labels: Pre-release - **added** — Add `$pickTables` and `$omitTables` compile-time helpers to narrow the table view of downstream queries - **added** — Add `ReadonlyKysely` helper type to turn instances into compile-time readonly instances - **added** — Add PGliteDialect for PGlite support - **added** — Add `supportsMultipleConnections` adapter flag for centralized connection mutex in single-connection adapters - **added** — Add support for nested narrowing and discriminated unions in `$narrowType` - **added** — Add web standards driven query cancellation support with abort signal and configurable inflight query abort strategies - **added** — Add `SafeNullComparisonPlugin` to convert equality operators to `is` and `is not` when comparing with null - **added** — Add `shouldParse(value, path)` option in `ParseJSONResultsPlugin` for granular control of JSON parsing using JSON paths - **added** — Allow explicit undefined in Updateable type for exactOptionalPropertyTypes support - **added** — Allow disabling transactions in migrate methods - **added** — Add `thenRef` method in `eb.case` - **added** — Add `whenRef(lhs, op, rhs)` in `eb.case` - **added** — Add `elseRef` in `eb.case()` - **added** — Add `$extendTables` method - **deprecated** — Deprecate `withTables` in favor of `$pickTables`, `$omitTables`, and `$extendTables` Hey 👋 This one's a banger! 💥 💥 💥 ```bash pnpm i kysely@next ``` We got `$pickTables`, `$omitTables` compile-time helpers to narrow the world view of downstream queries, cutting down on compilation complexity/time while at it! ```ts const results = await db .$pickTables<'person' | 'pet'>() // <----- now `DB` is only { person: {...}, pet: {...} } for following methods. .selectFrom('person') .innerJoin('pet', 'pet.owner_id', 'person.id') .selectAll() .execute() const results = await db .$omitTables<'toy'>() // <----- now `DB` doesn't have a "toy" table description for following methods. .selectFrom('person') .innerJoin('pet', 'pet.owner_id', 'person.id') .selectAll() .execute() ``` We got a new `ReadonlyKysely` helper type that turns your instance into a compile-time readonly instance! ```ts import { Kysely } from 'kysely' import type { ReadonlyKysely } from 'kysely/readonly' export const db = new Kysely({...}) as never as ReadonlyKysely db.selectFrom('person').selectAll() // no problem. db.selectNoFrom(sql`now()`.as('now')) // no problem. db.deleteFrom('person') // compilation error + deprecation! db.insertInto('person').values({...}) // compilation error + deprecation! db.mergeInto('person')... // compilation error + deprecation! db.updateTable('person').set('first_name', 'Timmy') // compilation error + deprecation! sql`...`.execute(db) // compilation error! // etc. etc. ``` We got a brand new PGlite dialect. With it comes a new `supportsMultipleConnections` adapter flag that uses a new centralized connection mutex when `false` - should help simplify all SQLite dialects out here! ```ts import { PGlite } from '@electric-sql/pglite' import { Kysely, PGliteDialect } from 'kysely' const db = new Kysely({ // ... dialect: new PGliteDialect({ pglite: new PGlite(), }), // ... }) ``` We got `$narrowType` supporting nested narrowing and discriminated unions! ```ts db.selectFrom('person_metadata') .select(['discriminatedUnionProfile']) // output type inferred as: // // { // discriminatedUnionProfile: { // auth: // | { type: 'token'; token: string } // | { type: 'session'; session_id: string } // tags: string[] // } // }[] .$narrowType<{ discriminatedUnionProfile: { auth: { type: 'token' } } }>() // output type narrowed to: // // { // discriminatedUnionProfile: { // auth: { type: 'token'; token: string } // tags: string[] // } // }[] .execute() ``` We got web standards driven query cancellation support. Pass an abort `signal` to `execute*` methods and similar. Pick between different inflight query abort strategies - ignore the query, cancel it on the database side or even kill the session on the database side. ```ts import { Kysely, PostgresDialect } from 'kysely' import { Client, ... } from 'pg' const db = new Kysely({ dialect: new PostgresDialect({ // ... controlClient: Client, // optional, for out-of-pool connections for database side query aborts. // ... }) }) const options = { signal: AbortSignal.timeout(3_000) } // throw abort/timeout errors and ignore query reuslts query.execute(options) query.stream(options) sql`...`.execute(db, options) db.executeQuery(compiledQuery, options) // etc. etc. query.execute({ ...options, inflightQueryAbortStrategy: 'cancel query' }) // also cancel query database side query.execute({ ...options, inflightQueryAbortStrategy: 'kill session' }) // also kill session database side ``` We got `SafeNullComparisonPlugin` to flip (in)equality operators to `is` and `is not` when right hand side argument is `null`. ```ts import { Kysely, SafeNullComparisonPlugin } from 'kysely' const db = new Kysely({ // ... plugins: [new SafeNullComparisonPlugin()], // ... } _[Truncated at 4000 characters — full notes: https://github.com/kysely-org/kysely/releases/tag/v0.29.0-rc.0]_ ### v0.28.16 — 0.28.16 - Date: 2026-04-10 - Version: v0.28.16 - Original notes: https://github.com/kysely-org/kysely/releases/tag/v0.28.16 - Permalink: https://whatsnew.fyi/product/kysely/releases/v0.28.16 - **fixed** — FilterObject allows any defined value when query context has no tables (TB is never) Hey 👋 A small batch of bug fixes. Please report any issues. 🤞😰🤞 [0.29](https://github.com/kysely-org/kysely/pull/1583) is getting closer btw. 🌶️ ##### 🚀 Features ##### 🐞 Bugfixes * fix: `FilterObject` allows any defined value when query context has no tables (`TB` is `never`). by @igalklebanov in https://github.com/kysely-org/kysely/pull/1791 ##### 📖 Documentation * add socket security badge. by @igalklebanov in https://github.com/kysely-org/kysely/commit/db646ac479c9fa5b6e092db05ec54607c20b32dc * chore: make socket security badge reflect current specific version. by @igalklebanov in https://github.com/kysely-org/kysely/commit/559714438986f602f1b1ada90aa7b8a83336b6f3 * support multi-entry point tsdoc without index module. by @igalklebanov in https://github.com/kysely-org/kysely/commit/699891593c4d7888940dd7539282a0444fb4bd45 * fix broken tsdoc references. by @igalklebanov in https://github.com/kysely-org/kysely/commit/5a0f14b84bf1658bff83babc71e3bf039797b4d9 ##### 📦 CICD & Tooling * chore(pnpm): add strictDepBuilds: true. by @igalklebanov in https://github.com/kysely-org/kysely/commit/2301610e760bddd593ee2277dc975ced51dd05b4 * chore: harden dependencies, pnpm. by @igalklebanov in https://github.com/kysely-org/kysely/commit/f4f1d9e7acaea471098a4a4aa0938c71210c5a2e * chore: re-add ignore-workspace-root-check. by @igalklebanov in https://github.com/kysely-org/kysely/commit/ab6d00ef0603bcfb0361adcd035c5e3b22678529 * add openssf scorecard. by @igalklebanov in https://github.com/kysely-org/kysely/commit/521156b1edcaff69763c52114928c429d3a4ac89 * chore: bump dependencies and github actions. by @igalklebanov in https://github.com/kysely-org/kysely/pull/1789 * chore: change `verifyDepsBeforeRun` to "prompt". by @igalklebanov in https://github.com/kysely-org/kysely/commit/20548bca896ea6907f584cad7677974f97205148 ##### ⚠️ Breaking Changes ##### 🐤 New Contributors ##### What's Changed **Full Changelog**: https://github.com/kysely-org/kysely/compare/v0.28.15...v0.28.16