New Features
Several cool additions landed in this release 🥳 !
Full-Text Search (Postgres Only)
You can now use the fts and _ftsRelevance query fields to do full-text queries against Postgres database doc. Mark fields you want to search with the @fullText attribute and enjoy effortless queries.
model Article {
id Int @id @default(autoincrement())
title String @fullText
body String @fullText
subtitle String? @fullText
notes String? // not full-text-searchable
}await db.article.findMany({
where: { title: { fts: { search: 'cat & dog' } } },
});
await db.article.findMany({
orderBy: {
_ftsRelevance: { fields: ['body'], search: 'cat & dog', sort: 'desc' },
},
});Fuzzy Search (Postgres Only)
You can now use the fuzzy and _fuzzyRelevance query fields to do fuzzy search against Postgres database doc. Mark fields you want to search with the @fuzzy attribute and enjoy effortless queries. This feature requires the pg_trgm extension. Read the docs for more details.
This awesome feature is contributed by @docloulou .
model Flavor {
id Int @id @default(autoincrement())
name String? @fuzzy
description String @fuzzy
notes String? // not fuzzy-searchable
}await db.flavor.findMany({
where: { name: { fuzzy: { search: 'Aple' } } },
});
await db.flavor.findMany({
orderBy: {
_fuzzyRelevance: { fields: ['name'], search: 'Apple', sort: 'desc' },
},
});Fetch-Based API Client
A new @zenstackhq/fetch-client package is added to provide a simple fetch-based client for consuming the automated CRUD services (RPC-style only). Think of it as the sibling of the @zenstackhq/tanstack-query package, but without framework dependency and complexity of reactive state management. Ideal when you just need a simple, promise-based client. doc
import { createClient } from '@zenstackhq/fetch-client';
import { schema } from '~/zenstack/schema-lite';
const client = createClient(schema, {
endpoint: 'https://example.com/api/model',
});
const users = await client.user.findMany({ include: { posts: true } });
const post = await client.post.create({ data: { title: 'Hello' } });TanStack Query Sequential Transactions
You can now use the $transaction.useSequential hook to execute sequential transactions from the frontend doc.
const client = useClientQueries(schema);
const tx = client.$transaction.useSequential();
function onSubmit() {
tx.mutate([
{ model: 'User', op: 'create', args: { data: { email: 'foo@bar.com' } } },
{ model: 'Post', op: 'create', args: { data: { title: 'Hello' } } },
]);
}Kysely Version Bumped to v0.29.x
We've bumped Kysely dependency version to its latest. Please note that the new version appears to be ESM-only. Please double-check compatibility after the upgrade.
Fixes and Improvements
- [tanstack-query] You can now use
DbNull/JsonNull/AnyNullto filter JSON fields with the query hooks doc - [zod] Fixed a JSON field typing inconsistency between zod schemas and ORM types by @Azzerty23 #2639
- [orm] Fixed several issues related to using
@db.Time/@db.TimeZfields by @erwan-joly #2633 #2631 - [orm] Fixed an infinite recursion issue when validating cyclic strongly-typed JSON #2654
- [better-auth] Fixed adapter loading issues when targeting CJS #2646
- [policy] Fixed policy plugin detection issue with certain bundlers by @Albatrosso #2662
- [cli] Fixed
db pullissue with multiple FK fields targeting the same model by @svetch - Upgraded to TypeScript 6
Full Changelog: v3.6.4...v3.7.0
Welcome @docloulou and @Albatrosso as our new contributors ❤️ !