github zenstackhq/zenstack v3.7.0
ZenStack Release v3.7.0

5 hours ago

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/AnyNull to 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.TimeZ fields 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 pull issue 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 ❤️ !

Don't miss a new zenstack release

NewReleases is sending notifications on new releases.